Files
WrenchBoradWeb/wrenchboard/src/shared_tool/account.cc
T
CHIEFSOFT\ameye d26872effe wallet fix
2023-09-24 18:56:17 -04:00

2793 lines
104 KiB
C++

// Account management toosl
#include "clog.h"
#include "cgi.h"
#include "input.h"
#include "wrenchboard_api.h"
#include "account.h"
#include "email.h"
#include "safestring.h"
#include <string>
#include "pgsql.h"
#include "pgsql_wrapper.h"
#include "cfg.h"
#include <curl/curl.h>
#include "smoney.h"
#include "account_mngt.h"
#include "creditcards.h"
#include "payments.h"
#include "sel_data.h"
#include "history.h"
#include "recent_data.h";
#include "jobs.h"
#include "reco_engine.h" //error in file name
#define CREATE_BY_EMAIL 1000
#define CREATE_BY_PHONE 2000
struct MemoryStruct {
char *memory;
size_t size;
};
static size_t
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *) userp;
mem->memory = (char*) realloc(mem->memory, mem->size + realsize + 1);
if (mem->memory == NULL) {
/* out of memory! */
logfmt(logINFO, "not enough memory (realloc returned NULL)");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
static const string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
static inline bool is_base64(unsigned char c) {
return (isalnum(c) || (c == '+') || (c == '/'));
}
string base64_decode(string const& encoded_string) {
int in_len = encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
std::string ret;
while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
char_array_4[i++] = encoded_string[in_];
in_++;
if (i == 4) {
for (i = 0; i < 4; i++)
char_array_4[i] = base64_chars.find(char_array_4[i]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (i = 0; (i < 3); i++)
ret += char_array_3[i];
i = 0;
}
}
if (i) {
for (j = i; j < 4; j++)
char_array_4[j] = 0;
for (j = 0; j < 4; j++)
char_array_4[j] = base64_chars.find(char_array_4[j]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
}
return ret;
}
/*
CREATE TABLE members_log (
id SERIAL,
member_id INT REFERENCES members(id),
mlog TEXT,
loc INET,
status INT DEFAULT 1,
created timestamp without time zone DEFAULT now()
);
*/
long LoginLogger( long member_id, long login_mode);
long WrenchBoardMobileSendMoney(CVars in, CVars &out);
long WrenchBoardMobileSendJobInterest(CVars in, CVars &out);
long WrenchReturnPendingJobList(CVars in, CVars &out);
long WrenchBoardMobileSendUserWallet(CVars in, CVars &out);
long WrenchBoardStartBalanceTopup(CVars in, CVars &out);
long WrenchBoardCompleteBalanceTopup(CVars in, CVars &out);
long WrenchResendSendReferLoadLink(CVars in, CVars &out);
long WrenchBoardDeleteAccount(CVars in, CVars &out);
long VerifyWrenchAccountLink(CVars in, CVars &out);
long LoginWrenchBoardAuxAccount(CVars in, CVars &out);
long WrenchDeleteUsersCCard(CVars in, CVars &out);
long WrenchFlutterCreditHook(CVars in, CVars &out);
long WrenchBoardTopupResult(CVars in, CVars &out);
long WrenchRegisterMyFileUpload(CVars in, CVars &out);
long WrenchGetRecentDash(CVars in, CVars &out);
long LoginWrenchBoardQRAccount(CVars in, CVars &out);
long test() {
FILE* oldFile = Output2FILE::Stream();
FILE* pFile = fopen(WRENCHBOARD_CONFIG"/../logs/somefile.log", "a");
Output2FILE::Stream() = pFile;
//...
FILE_LOG(logINFO) << "Some text...";
logfmt(logINFO, "Some text...");
//...
fclose(pFile);
Output2FILE::Stream() = oldFile;
return 0L;
}
long account_calls(CVars in, CVars &out) {
logfmt(logINFO, "account_calls()");
out["result"] = "YES I GET TO BACK END";
long action = REQ_LONG(in, "action", 0, -1);
CVars x;
long ret = 0;
const char * loc = getenv("REMOTE_ADDR");
const PGresult *res;
logfmt(logINFO, "action = %ld", action);
logfmt(logINFO, "google = %ld", WRENCHBOARD_GOOGLE_LOGIN);
//test();
switch (action) {
case WRENCHBOARD_CREATE_MOBILEUSER:
return CreateMobileWrenchBoardAccount(in, out);
break;
case WRENCHBOARD_COMPLETE_MOBILEUSER:
return CompleteMobileAccountCreation(in, out);
break;
case WRENCHBOARD_RESET_PASSWORD:
return WrenchResetMemberPass(in, out);
break;
case WRENCHBOARD_MOBILE_MESSAGE:
return WrenchReturnMemberMessages(in, out);
break;
case WRENCHBOARD_MOBILE_ACTIVEJOB:
return WrenchMemberActiveJobs(in, out);
break;
case WRENCHBOARD_ACCOUNT_TESTEMAIL:
break;
case WRENCHBOARD_SAVE_GALLERY:
return WrenchUpdateSiteGallery(in, out);
break;
case WRENCHBOARD_SEND_CONTACTUS:
logfmt(logINFO, "ContactUS()");
REQ_STRING(in, "email", 5, 49, "(.*)");
REQ_STRING(in, "firstname", 1, 49, "(.*)");
REQ_STRING(in, "lastname", 1, 40, "(.*)");
REQ_STRING(in, "your_message", 4, 400, "(.*)");
//OPTIONAL( in, "loc" ) REQ_STRING (in, "loc", 3, 15, "(.*)");
in["loc"] = loc;
in["loc"].set_valid(true);
x["firstname"] = in["firstname"];
x["firstname"].set_valid(true);
x["lastname"] = in["lastname"];
x["lastname"].set_valid(true);
x["email"] = in["email"];
x["email"].set_valid(true);
x["your_message"] = in["your_message"];
x["your_message"].set_valid(true);
if (in["loc"].length() > 0) x["loc"] = in["loc"];
x["loc"].set_valid(true);
ret = insert_db_record(DBS_VALID, "contacts", "contacts_id_seq", x);
if (ret > 0) {
x["contact_id"] = ret;
x["contact_id"].set_valid(true);
//ContactMessage(x); RETIRED
account_email(ACCOUNT_CONTACT_ALERT, x, out);
}
break;
case WRENCHBOARD_ACCOUNT_QRLOGIN:
return LoginWrenchBoardQRAccount(in, out);
break;
case WRENCHBOARD_ACCOUNT_LOGIN:
return LoginWrenchBoardAccount(in, out);
break;
case WRENCHBOARD_ACCOUNT_AUXLOGIN:
return LoginWrenchBoardAuxAccount(in, out);
break;
case WRENCHBOARD_FACEBOOK_LOGIN:
return LoginWrenchBoardFacebook(in, out);
break;
case WRENCHBOARD_GOOGLE_LOGIN:
return LoginWrenchBoardGoogle(in, out);
break;
case WRENCHBOARD_APPLE_LOGIN:
return LoginWrenchBoardApple(in, out);
break;
case WRENCHBOARD_ACCOUNT_PENDING:
/*
if ( load_db_record(out, "SELECT uid FROM members_pending WHERE LOWER(username)=LOWER('%s')",in["username"].c_str()) ){
out["acc"]="DULPICATE";
return -1;
}
if ( load_db_record(out, "SELECT uid FROM members WHERE LOWER(username)=LOWER('%s')",in["username"].c_str()) ){
out["acc"]="DULPICATE";
return -1;
}*/
return CreateWrenchBoardAccountPending(in, out);
break;
case WRENCHBOARD_ACCOUNT_CREATEACC:
/*if ( load_db_record(out, "SELECT uid FROM members_pending WHERE LOWER(username)=LOWER('%s')",in["username"].c_str()) ){
out["acc"]="DULPICATE";
return -1;
}
if ( load_db_record(out, "SELECT uid FROM members WHERE LOWER(username)=LOWER('%s')",in["username"].c_str()) ){
out["acc"]="DULPICATE";
return -1;
}*/
return CreateWrenchBoardAccount(in, out);
break;
case WRENCHBOARD_LOG_MEMBER:
return LogWrenchBoardMember(in, out);
break;
case WRENCHBOARD_ACCOUNT_RESETPASS:
return WrenchResetMemberPass(in, out);
break;
case WRENCHBOARD_RESEND_PENDING_LINK:
REQ_LONG(in, "pending_id", 1, -1);
account_email(ACCOUNT_RESEND_PENDING, in, out); // ALERT CUSTOMER OF LOGIN
break;
case WRENCHBOARD_DELETE_PENDING_LINK:
REQ_LONG(in, "pending_id", 1, -1);
pgsql_exec("UPDATE members_pending SET status=7,username='DEL-%lu' WHERE id=%lu AND status = 1", in["pending_id"].Long(), in["pending_id"].Long());
break;
case WRENCHBOARD_ACCOUNT_SENDREFER:
return WrenchSendRefer(in, out);
break;
case WRENCHBOARD_ACCOUNT_REFERLINK:
return WrenchSendReferLoadLink(in, out);
break;
case WRENCHBOARD_ACCOUNT_REFRESENDLNK:
return WrenchResendSendReferLoadLink(in, out);
break;
case WRENCHBOARD_SESSION_VERIFY:
return VerifySession(in, out);
break;
case WRENCHBOARD_UPDATE_PROFILE:
return WrenchUpdateProfile(in, out);
break;
case WRENCHBOARD_ACCOUNT_TERMS:
return WrenchUpdateAccountTerms(in, out);
break;
case WRENCHBOARD_ACCOUNT_MDESCRIPTION:
return WrenchUpdateAccountDescription(in, out);
break;
case WRENCHBOARD_ACCOUNT_SETPASSWD:
return WrenchResetPass(in, out);
break;
case WRENCHBOARD_ACCOUNT_SAVESKILL:
return WrenchSaveSkill(in, out);
break;
case WRENCHBOARD_ACCOUNT_DELSKILL:
return WrenchDeleteSaveSkill(in, out);
break;
case WRENCHBOARD_DELETE_RECACC:
REQ_LONG(in, "recipient_id", 1, -1);
REQ_LONG(in, "member_id", 1, -1);
if (pgsql_exec("UPDATE sendmoney_recipient SET status=7 WHERE member_id=%lu AND id=%lu AND status = 1", in["member_id"].Long(), in["recipient_id"].Long())) {
ret = PHP_API_OK;
}
break;
// case WRENCHBOARD_START_JOBLIST:
// return WrenchReturnStartJobList(in, out);
// break;
//
case WRENCHBOARD_START_JOBLIST:
case WRENCHBOARD_ACCOUNT_JOBLIST:
return WrenchReturnJobList(in, out);
break;
case WRENCHBOARD_ACCOUNT_PENDJOB: // user pending job
return WrenchReturnPendingJobList(in, out);
break;
case WRENCHBOARD_ACCOUNT_DASHDATA:
return WrenchLoadDashData(in, out);
break;
case WRENCHBOARD_USER_GETBANKLIST:
return WrenchReturnMemberBankAccount(in, out);
break;
case WRENCHBOARD_USER_SENDMONEY:
return WrenchBoardMobileSendMoney(in, out);
break;
case WRENCHBOARD_USER_SENDJOBINT:
return WrenchBoardMobileSendJobInterest(in, out);
break;
case WRECNH_CREDIT_HOOKS_FULUTTER:
return WrenchFlutterCreditHook(in, out);
break;
case WRENCHBOARD_USER_STARTCREDIT:
return WrenchStartPayment(in, out);
break;
case WRENCHBOARD_USER_ADNEWCC:
return WrenchNewCardPayment(in, out);
break;
case WRENCHBOARD_USER_CARDLIST:
return WrenchUsersCCardList(in, out);
break;
case WRENCHBOARD_USER_CARDREMV:
return WrenchDeleteUsersCCard(in, out);
break;
case WRENCHBOARD_USER_USESAVEDCC:
return WrenchCardRechargePayment(in, out);
break;
case WRENCHBOARD_GETUSER_SETTINGS:
return WrenchAccountSettings(in, out);
break;
case WRENCHBOARD_USER_SETTINGS:
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "pref_id", 4, 6, "(.*)");
REQ_LONG(in, "status", 1, -1);
res = pgsql_query("SELECT id FROM members_settings WHERE member_id=%lu AND pref_id='%s' ", in["member_id"].Long(), in["pref_id"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
pgsql_exec("UPDATE members_settings SET status=%lu WHERE member_id=%lu AND pref_id='%s' ",in["status"].Long(), in["member_id"].Long(), in["pref_id"].c_str());
out["status"] = "completed";
}
else{
CVars xx;
xx["member_id"] = in["member_id"]; xx["member_id"].set_valid(true);
xx["pref_id"] = in["pref_id"]; xx["pref_id"].set_valid(true);
xx["status"] = in["status"]; xx["status"].set_valid(true);
insert_db_record(DBS_VALID, "members_settings", "members_settings_id_seq", xx);
out["status"] = "completed";
}
ret = PHP_API_OK;
break;
case WRENCHBOARD_ACCOUNT_WALLETS:
logfmt(logINFO, "/WRENCHBOARD_ACCOUNT_WALLETS()");
return WrenchBoardMobileSendUserWallet(in, out);
break;
case WRENCHBOARD_ACCOUNT_TOPUP_RESULT:
logfmt(logINFO, "/WRENCHBOARD_ACCOUNT_TOPUP_RESULT()");
//return WrenchBoardStartBalanceTopup(in, out);
return WrenchBoardTopupResult(in, out);
break;
case WRENCHBOARD_ACCOUNT_PREPARE_TOPUP:
logfmt(logINFO, "/WRENCHBOARD_ACCOUNT_PREPARE_TOPUP()");
return WrenchBoardStartBalanceTopup(in, out);
break;
case WRENCHBOARD_ACCOUNT_COMPLETE_TOPUP:
logfmt(logINFO, "/WRENCHBOARD_ACCOUNT_COMPLETE_TOPUP()");
return WrenchBoardCompleteBalanceTopup(in, out);
break;
case WRENCHBOARD_USER_DELETEACC:
return WrenchBoardDeleteAccount(in, out);
break;
case WRENCHBOARD_ACCOUNT_PRICE_COMBO:
return getJobPriceCombo(in, out);
break;
case WRENCHBOARD_ACCOUNT_JOBPOST_DURATION:
return getJobPostDuration(in, out);
break;
case WRENCHBOARD_ACCOUNT_USER_RECIPEINT:
return getUserRecipientCombo(in, out);
break;
case WRENCHBOARD_ACCOUNT_ADD_RECIPEINT:
return member_addrecipient(in, out);
break;
case WRENCHBOARD_ACCOUNT_ACCOUNT_TYPES:
return getAccountTypeCombo(in, out);
break;
case WRENCHBOARD_ACCOUNT_COUNTRY_COMBO:
return getCountryCombo(in, out);
break;
case WRENCHBOARD_ACCOUNT_JOB_COUNTRY:
return getCountryJobCombo(in, out);
break;
case WRENCHBOARD_ACCOUNT_COUNTRY_BANKS:
return getBankCombo(in, out);
break;
case WRENCHBOARD_ACCOUNT_REFFERHX:
return WrenchRefferHx( in, out);
break;
case WRENCHBOARD_VERIFY_PENDING_LINK:
return VerifyWrenchAccountLink( in, out);
break;
case WRENCHBOARD_ACCOUNT_HOMEBANNERS:
return WrenchHomeBanners(in, out);
break;
case WRENCHBOARD_ACCOUNT_RECENTS:
return WrenchGetRecentDash(in, out);
break;
case WRENCHBOARD_ACCOUNT_DASHRECENT:
return WrenchRecentDash(in, out);
break;
case WRENCHBOARD_RESOURCE_MYFILES:
return WrenchRegisterMyFileUpload(in, out);
break;
case WRENCHBOARD_MYFILES_LIST:
return WrenchMyFilesList(in, out);
break;
}
logfmt(logINFO, "/account_calls()");
return ret;
}
#define PHP_API_TRANSFER_COMPLETE 200
/*
CREATE TABLE members_recentactivities (
id SERIAL,
member_id INT REFERENCES members(id) NOT NULL,
uid uuid DEFAULT uuid_generate_v4(),
title VARCHAR(35) NOT NULL,
description VARCHAR(100),
status INT DEFAULT 1,
added timestamp without time zone DEFAULT now()
);
ALTER TABLE ONLY members_recentactivities
ADD CONSTRAINT members_recentactivities_id_key UNIQUE (id);
CREATE TABLE members_myfiles (
id SERIAL,
member_id INT REFERENCES members(id) NOT NULL,
uid uuid DEFAULT uuid_generate_v4(),
file_name VARCHAR(35),
saved_file_name VARCHAR(35) UNIQUE NOT NULL,
file_size INT DEFAULT 0,
file_type VARCHAR(15),
title VARCHAR(35),
description VARCHAR(100),
status INT DEFAULT 1,
added timestamp without time zone DEFAULT now(),
updated timestamp without time zone DEFAULT now()
);
ALTER TABLE ONLY members_myfiles
ADD CONSTRAINT members_myfiles_id_key UNIQUE (id);
*/
long WrenchGetRecentDash(CVars in, CVars &out) {
logfmt(logINFO, "WrenchGetRecentDash()");
char vname[30];
long ret = PHP_API_BAD_PARAM;
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "sessionid", 2, 149, "(.*)");
try {
REQ_LONG(in, "member_id", 1, -1);
out["total_record"] = "0";
const PGresult *res;
res = pgsql_query("SELECT * FROM members_recentactivities WHERE member_id = %lu ORDER BY added DESC LIMIT 6", in["member_id"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
out["total_record"] = pgsql_num_rows(res);
for (int i = 0, n = pgsql_num_rows(res); i < n; i++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "title_%05d", i);
out[vname] = rec["title"];
snprintf(vname, sizeof (vname), "description_%05d", i);
out[vname] = rec["description"];
snprintf(vname, sizeof (vname), "status_%05d", i);
out[vname] = rec["status"];
snprintf(vname, sizeof (vname), "added_%05d", i);
out[vname] = rec["added"];
snprintf(vname, sizeof (vname), "uid_%05d", i);
out[vname] = rec["uid"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchGetRecentDash(CVars in, CVars &out)");
}
logfmt(logINFO, "/WrenchGetRecentDash()");
return ret;
}
long WrenchRegisterMyFileUpload(CVars in, CVars &out) {
long ret = PHP_API_BAD_PARAM;
logfmt(logINFO, "WrenchRegisterMyFileUpload()");
try {
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "file_name", 5, 35, "(.*)");
REQ_STRING(in, "message", 5, 35, "(.*)"); //message
REQ_STRING(in, "title", 5, 35, "(.*)");
REQ_STRING(in, "description", 5, 100, "(.*)");
CVars xx;
xx["member_id"] = in["member_id"]; xx["member_id"].set_valid(true);
xx["file_name"] = in["file_name"]; xx["file_name"].set_valid(true);
xx["saved_file_name"] = in["message"]; xx["saved_file_name"].set_valid(true);
xx["file_size"] = in["file_size"]; xx["file_size"].set_valid(true);
xx["file_type"] = in["file_type"]; xx["file_type"].set_valid(true);
xx["title"] = in["title"]; xx["title"].set_valid(true);
xx["description"] = in["description"]; xx["description"].set_valid(true);
out["saved_id"] = insert_db_record(DBS_VALID, "members_myfiles", "members_myfiles_id_seq", xx);
if ( out["saved_id"].Long() > 0){
// lets find teh customer now
if ( load_db_record(out, "SELECT uid AS myfile_uid, * FROM members_myfiles WHERE id = %lu ", out["saved_id"].Long()) > 0){
ret = PHP_API_OK;
}
}
} catch (bad_parameter) {
out["log_status"] = "Something went wrong";
}
logfmt(logINFO, "WrenchRegisterMyFileUpload()");
return ret;
}
long WrenchFlutterCreditHook(CVars in, CVars &out) {
long ret = PHP_API_BAD_PARAM;
logfmt(logINFO, "WrenchFlutterCreditHook()");
try {
REQ_STRING(in, "txRef", 2, 50, "(.*)");
REQ_STRING(in, "flwRef", 2, 50, "(.*)");
CVars xx;
xx["event_type"] = in["event_type"]; xx["event_type"].set_valid(true);
xx["status"] = in["status"]; xx["status"].set_valid(true);
xx["txRef"] = in["txRef"]; xx["txRef"].set_valid(true);
xx["flwRef"] = in["flwRef"]; xx["flwRef"].set_valid(true);
xx["orderRef"] = in["orderRef"]; xx["orderRef"].set_valid(true);
xx["amount"] = in["amount"]; xx["amount"].set_valid(true);
xx["appfee"] = in["appfee"]; xx["appfee"].set_valid(true);
xx["AccountId"] = in["AccountId"]; xx["AccountId"].set_valid(true);
xx["customer_id"] = in["customer_id"]; xx["customer_id"].set_valid(true);
xx["fullName"] = in["fullName"]; xx["fullName"].set_valid(true);
xx["raw_result"] = in["raw_result"]; xx["raw_result"].set_valid(true);
out["hook_id"] = insert_db_record(DBS_VALID, "flutterwave_hooks", "flutterwave_hooks_id_seq", xx);
if ( out["hook_id"].Long() > 0 && in["status"] == "successful"){
// lets find teh customer now
CVars cc;
if ( load_db_record(cc, "SELECT member_id, uid,amount,currency FROM members_credit WHERE uid = '%s'", xx["txRef"].c_str()) > 0){
CVars xn;
xn["member_id"] = cc["member_id"]; xn["member_id"].set_valid(true);
xn["amount"] = cc["amount"]; xn["amount"].set_valid(true);
xn["currency"] = cc["currency"]; xn["currency"].set_valid(true);
xn["transaction_id"] = xx["txRef"]; xn["transaction_id"].set_valid(true);
long trx_id = WrenchBoardStartBalanceTopup(xn, out);
if ( trx_id > 0 ){
CVars tx;
tx["return_status"] = in["status"]; tx["return_status"].set_valid(true);
tx["status"] = "5"; tx["status"].set_valid(true);
tx["tx_ref"] = xx["txRef"]; tx["tx_ref"].set_valid(true);
tx["transaction_id"] = xx["txRef"]; tx["transaction_id"].set_valid(true);
tx["flutterwave_payments_id"] = trx_id; tx["flutterwave_payments_id"].set_valid(true);
long credit_id = WrenchBoardCompleteBalanceTopup(tx, out);
}
}
}
} catch (bad_parameter) {
out["log_status"] = "Something went wrong";
}
logfmt(logINFO, "WrenchFlutterCreditHook()");
return ret;
}
long WrenchBoardStartBalanceTopup(CVars in, CVars &out){
logfmt(logINFO, "WrenchBoardStartBalanceTopup()");
long trx_id = 0;
/*
$data['tx_ref'] = 'wrench-'.rand(1000000000,9999999999);
$data['currency'] = "NGN";
$data['customer_email'] = $_SESSION['username'];
$data['customer_phone_number'] = '';
$data['customer_name'] = $_SESSION['firstname'].' '.$_SESSION['lastname'];
$data['consumer_id'] = $_SESSION['member_id'];
$data['consumer_mac'] = $_SESSION['member_id']."-912ba-1192a";
$data['redirect_url'] = base_url() . "dash"; //"https://oameye.work.wrenchboard.com/dash";
$data['public_key'] = "FLWPUBK_TEST-54c90141b028789d671067bd72f781a9-X";
*/
out["public_key"] = CfgReadChar("flutterwave.public_key");
try {
REQ_LONG(in, "member_id", 1, -1);
REQ_LONG(in, "amount", 1, -1);
REQ_STRING(in, "currency", 2, 10, "(.*)");
REQ_STRING(in, "transaction_id", 2, 50, "(.*)");
CVars x;
x["member_id"] = in["member_id"];
x["member_id"].set_valid(true);
x["amount"] = in["amount"];
x["amount"].set_valid(true);
x["currency"] = in["currency"];
x["currency"].set_valid(true);
x["transaction_id"] = in["transaction_id"];
x["transaction_id"].set_valid(true);
trx_id = insert_db_record(DBS_VALID, "flutterwave_payments", "flutterwave_payments_id_seq", x);
if (trx_id > 0) {
load_db_record(out, "SELECT fp.member_id AS consumer_id,fp.tx_ref,fp.tx_ref,fp.currency,m.phone,m.uid AS consumer_mac " \
"FROM flutterwave_payments fp LEFT JOIN members m ON m.id=fp.member_id WHERE fp.id =%lu",trx_id);
}
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchBoardStartBalanceTopup(CVars in, CVars &out)");
}
return trx_id;
}
long WrenchDeleteUsersCCard(CVars in, CVars &out) {
logfmt(logINFO, "VerifyWrenchAccountLink()");
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
try {
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "card_uid", 3, 150, "(.*)");
long delete_status = 0;
res = pgsql_query("SELECT id FROM creditcard WHERE member_id=%lu AND uid='%s' AND active = 1 ", in["member_id"].Long(), in["card_uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
pgsql_exec("UPDATE creditcard SET active=%lu WHERE member_id=%lu AND uid='%s' AND active = 1 ",delete_status, in["member_id"].Long(), in["card_uid"].c_str());
out["status"] = "completed";
}
ret = PHP_API_OK;
} catch (bad_parameter) {
out["status"] = "ERROR";
}
return ret;
}
long VerifyWrenchAccountLink(CVars in, CVars &out) {
logfmt(logINFO, "VerifyWrenchAccountLink()");
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
REQ_STRING(in, "verify_link", 2, 120, "(.*)");
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
out["status_text"] = "Start";
out["status"] = "-1";
try {
res = pgsql_query("SELECT uid AS pending_uid,id AS pending_id,username "
" FROM members_pending WHERE verify_link ='%s' AND expire > now() "
" AND status = 1 LIMIT 1",in["verify_link"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
out["pending_uid"] = rec["pending_uid"]; out["pending_uid"].set_valid( true );
out["pending_id"] = rec["pending_id"]; out["pending_id"].set_valid( true );
out["username"] = rec["username"];
out["status_text"] = "Link Verified";
out["status"] = "0";
ret = PHP_API_OK;
}
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/VerifyWrenchAccountLink()");
return ret;
}
long WrenchBoardDeleteAccount(CVars in, CVars &out)
{
long ret = 0;
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "reason", 2, 149, "(.*)");
CVars xx;
xx["member_id"] = in["member_id"]; xx["member_id"].set_valid(true);
xx["reason"] = in["reason"]; xx["reason"].set_valid(true);
out["delete_id"] = insert_db_record(DBS_VALID, "members_delete", "members_delete_id_seq", xx);
ret = PHP_API_OK;
/*
DO THE DELETE HERE NOW
*/
return ret;
}
long WrenchBoardTopupResult(CVars in, CVars &out){
logfmt(logINFO, "WrenchBoardTopupResult()");
const PGresult *res;
const PGresult *res0;
long ret = PHP_API_BAD_PARAM;
try {
REQ_STRING(in, "tx_ref", 2, 50, "(.*)");
REQ_STRING(in, "uid", 3, 50, "(.*)");
REQ_LONG(in, "member_id", 1, -1);
res0 = pgsql_query("SELECT * FROM members_credit WHERE uid ='%s' AND member_id=%lu",in["tx_ref"].c_str(),in["member_id"].Long());
if (res0 != NULL && pgsql_num_rows(res0) > 0) {
}
else{
out["status_message"] = "invalid_reference_for_member";
return PHP_API_BAD_PARAM;
}
res = pgsql_query("SELECT return_status,payment_id from flutterwave_payments where transaction_id='%s'",in["tx_ref"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
out["return_status"] = rec["return_status"]; out["return_status"].set_valid( true );
in["payment_id"] = rec["payment_id"]; in["payment_id"].set_valid( true );
if ( in["payment_id"] !="" && in["payment_id"].Long() > 0 ){
load_db_record( out, "SELECT confirmation FROM members_payments WHERE id = %lu", in["payment_id"].Long());
}
ret = PHP_API_OK;
}
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchBoardTopupResult(CVars in, CVars &out)");
}
return ret;
}
long WrenchBoardCompleteBalanceTopup(CVars in, CVars &out){
logfmt(logINFO, "WrenchBoardCompleteBalanceTopup()");
long trx_id = 0;
const PGresult *res;
try {
REQ_STRING(in, "tx_ref", 2, 50, "(.*)");
// REQ_STRING(in, "transaction_id", 2, 50, "(.*)"); Handled else where
REQ_LONG(in, "status", 1, -1);
REQ_LONG(in, "flutterwave_payments_id", 1, -1);
//res = pgsql_query("SELECT id AS trx_id,member_id FROM flutterwave_payments WHERE tx_ref = '%s' AND status=0",in["tx_ref"].c_str());
res = pgsql_query("SELECT id AS trx_id,member_id,tx_ref FROM flutterwave_payments WHERE id = %lu AND status=0",in["flutterwave_payments_id"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
in["member_id"] = rec["member_id"]; in["member_id"].set_valid( true );
in["trx_id"] = rec["trx_id"]; in["trx_id"].set_valid( true );
/* pgsql_exec("UPDATE flutterwave_payments SET transaction_id = '%s', " \
"status=%lu,updated=now(),return_status='%s' WHERE id = %lu AND status=0 AND " \
"tx_ref='%s' ", in["transaction_id"].c_str(),in["status"].Long(),in["return_status"].c_str(),rec["trx_id"].Long(), in["tx_ref"].c_str());
*/
pgsql_exec("UPDATE flutterwave_payments SET " \
"status=%lu,updated=now(),return_status='%s' WHERE status=0 AND " \
" id= %lu ",in["status"].Long(),in["return_status"].c_str(), in["flutterwave_payments_id"].Long());
if ( in["status"].Long() == 5){
in["tx_ref"] = rec["tx_ref"]; in["tx_ref"].set_valid( true ); // note we change tx_ref here
return WrenchMemberTopupPayment( in, out ); // This start the actual crediting
}
}
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchBoardCompleteBalanceTopup(CVars in, CVars &out)");
}
return trx_id;
}
long WrenchBoardMobileSendUserWallet(CVars in, CVars &out) {
logfmt(logINFO, "WrenchBoardMobileSendUserWallet()");
char vname[30];
long ret = PHP_API_BAD_PARAM;
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "sessionid", 2, 149, "(.*)");
logfmt(logINFO, "WrenchBoardMobileSendUserWallet() Verify Session ");
if ( VerifySession(in, out) != PHP_API_OK ){
return 0;
}
try {
REQ_LONG(in, "member_id", 1, -1);
out["total_record"] = "0";
const PGresult *res;
res = pgsql_query("SELECT w.amount,c.*,w.amount AS current_balance,c.country,w.transfer_limit,w.uid AS wallet_uid "
"FROM members_wallet w LEFT JOIN currency c ON c.code=w.currency "
"WHERE w.member_id = %lu ORDER BY c.lorder DESC", in["member_id"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
out["total_record"] = pgsql_num_rows(res);
for (int i = 0, n = pgsql_num_rows(res); i < n; i++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "amount_%05d", i);
out[vname] = rec["amount"];
snprintf(vname, sizeof (vname), "currency_%05d", i);
out[vname] = rec["currency"];
// amount | id | code | description | symbol | action_type | lorder | current_balance
snprintf(vname, sizeof (vname), "description_%05d", i);
out[vname] = rec["description"];
snprintf(vname, sizeof (vname), "symbol_%05d", i);
out[vname] = rec["symbol"];
snprintf(vname, sizeof (vname), "action_type_%05d", i);
out[vname] = rec["action_type"];
snprintf(vname, sizeof (vname), "code_%05d", i);
out[vname] = rec["code"];
snprintf(vname, sizeof (vname), "country_%05d", i);
out[vname] = rec["country"];
snprintf(vname, sizeof (vname), "transfer_limit_%05d", i);
out[vname] = rec["transfer_limit"];
snprintf(vname, sizeof (vname), "wallet_uid_%05d", i);
out[vname] = rec["wallet_uid"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchBoardMobileSendUserWallet(CVars in, CVars &out)");
}
logfmt(logINFO, "/WrenchBoardMobileSendUserWallet()");
return ret;
}
long WrenchBoardMobileSendJobInterest(CVars in, CVars &out) {
long ret = PHP_API_BAD_PARAM;
try {
REQ_LONG(in, "job_id", 1, -1);
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "sessionid", 2, 149, "(.*)");
if ( load_db_record(out, "SELECT offer_code FROM members_jobs_offer WHERE id ='%lu' AND expire>= now() AND status = 1 AND public_view > 0", in["job_id"].Long())> 0){
in["offer_code"] = out["offer_code"];
in["offer_code"].set_valid( true );
ret = WrenchJobsOfferInterest(in, out);
if ( ret == PHP_CREATED_OK ){
ret = 200;
}
else{
ret = 100; // message will be in the status string to display
}
}
/*
$data = $this->getSessionArray();
$data['offer_code'] = $this->input->get('job_contract');
$data['member_id'] = $_SESSION['member_id']; // just maing sure
$data['action'] = WRENCHBOARD_JOB_SEND_INTEREST;
$this->load->model('backend_model');
$out = array();
$res = $this->backend_model->wrenchboard_api($data, $out);
if ($res == PHP_CREATED_OK) {
echo 'Success - ' . $out['status'];
} else {
echo 'Error - ' . $out['status'];
}
*/
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
return ret;
}
long WrenchBoardMobileSendMoney(CVars in, CVars &out){
logfmt(logINFO, "long *************** WrenchBoardMobileSendMoney(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
try{
REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "wallet_uid", 3, 150, "(.*)");
long mode = REQ_LONG(in, "mode", 1, -1);
REQ_STRING(in, "TerminatingCountryCode", 2, 5, "(.*)");
REQ_LONG(in, "amount", 1, -1);
in["senderid"] = in["member_id"]; // some parts uses senderid
in["senderid"].set_valid( true );
// $in["TerminatingCountryCode"] = 'NG'; // NG - Nigeria
// LET CHECK IF YOU HAVE THE WALLET
CVars wl;
if ( load_db_record(wl, "SELECT w.*,c.country from members_wallet w LEFT join currency c ON c.code=w.currency"
" WHERE c.country='%s' AND w.member_id=%lu AND w.uid='%s' ",in["TerminatingCountryCode"].c_str(), in["member_id"].Long(),in["wallet_uid"].c_str())> 0){
if (in["amount"].Long() > wl["transfer_limit"].Long() )
{ out["status_message"] = "tranfer_amount_limit_error";
return ret;
}
}
else
{
out["status_message"] = "wallet_not_found_error";
return ret;
}
switch(mode){
case WRENCH_EXISTING_ACCOUNT:
REQ_STRING(in, "recipient_uid", 3, 150, "(.*)");
if ( load_db_record(out, "SELECT id AS recipientid FROM sendmoney_recipient "
" WHERE uid ='%s' AND member_id = %lu AND status = 1 "
" AND country='%s' ",in["recipient_uid"].c_str(), in["member_id"].Long(),in["TerminatingCountryCode"].c_str())> 0){
in["recipientid"] = out["recipientid"]; in["recipientid"].set_valid( true );
in["bankid"] = out["recipientid"]; in["bankid"].set_valid( true );
}
else
{
out["status_message"] = "invalid_recipient_error";
return ret;
}
break;
case WRENCH_NEWBANK_ACCOUNT:
CVars rp;
REQ_STRING(in, "bank_uid", 3, 150, "(.*)");
REQ_STRING(in, "account_no", 5, 15, "(.*)");
REQ_STRING(in, "country", 2, 3, "(.*)");
REQ_STRING(in, "state", 2, 49, "(.*)");
REQ_STRING(in, "city", 2, 49, "(.*)");
long account_type = REQ_LONG(in, "account_type", 1, -1);
if ( load_db_record(wl, "SELECT firstname,lastname FROM members WHERE uid = '%s' ",in["uid"].c_str())> 0){
rp["firstname"] = wl["firstname"]; rp["firstname"].set_valid( true );
rp["lastname"] = wl["lastname"]; rp["lastname"].set_valid( true );
/*
wrenchboard=> SELECT * FROM bank_entity_codes WHERE uid = 'a2c6c1a2-5cf2-4396-8630-50c47da15316';
country | channel | name | code | gid | status | bank_codes | uid
---------+---------+-------------+------+-----+--------+------------+--------------------------------------
NG | INTERSW | Access Bank | 044 | 1 | 1 | ACC044 | a2c6c1a2-5cf2-4396-8630-50c47da15316
(1 row)
/var/www/html/public/wrenchboard/wrenchboard_class.php:208:
array (size=12)
'member_id' => int 1
'sessionid' => string 'F9A1FB1098B7542EA6AFB627DBD5263638171883CA0CC951DC6C4FB184280EB3' (length=64)
'uid' => string '3119b744-42ad-4834-bb83-b737588754ca' (length=36)
'firstname' => string 'Firstn' (length=6)
'lastname' => string 'Lastn' (length=5)
'bank_code' => string '033' (length=3)
'account_no' => string '1234567890' (length=10)
'account_type' => int 1
'country' => string 'NG' (length=2)
'state' => string 'Lagos' (length=5)
'city' => string 'Lagos' (length=5)
'accitytion' => int 11176
*/
// Lets find the bank now
if ( load_db_record(wl, "SELECT * FROM bank_entity_codes WHERE uid = '%s' AND country ='%s' ",in["bank_uid"].c_str(),in["TerminatingCountryCode"].c_str())> 0){
rp["account_no"] = in["account_no"]; rp["account_no"].set_valid( true );
rp["account_type"] = in["lastname"]; rp["account_type"].set_valid( true );
rp["bank_code"] = wl["code"]; rp["bank_code"].set_valid( true );
rp["country"] = in["TerminatingCountryCode"]; rp["country"].set_valid( true );
rp["state"] = in["state"]; rp["state"].set_valid( true );
rp["city"] = in["city"]; rp["city"].set_valid( true );
rp["member_id"] = in["member_id"]; rp["member_id"].set_valid( true );
rp["uid"] = in["uid"]; rp["uid"].set_valid( true );
rp["account_type"] = in["account_type"]; rp["account_type"].set_valid( true );
long recipientid = member_addrecipient(rp, out);
if (recipientid > 0 ){
in["recipientid"] =recipientid; in["recipientid"].set_valid( true );
in["bankid"] =recipientid; in["bankid"].set_valid( true );
}
else{
out["status_message"] = "recipient_add_error";
return ret;
}
}
}
break;
}
int r1, r2, r3;
char send_trxid[25];
srand(time(NULL));
r1 = abs(rand()*1000);
srand(time(NULL));
r2 = abs(rand() * r1);
srand(time(NULL));
r3 = abs(rand() * r2);
sprintf(send_trxid, "T%04lu", r1);
logfmt(logINFO, "Recipient ID =====() %lu",in["bankid"].Long() );
out["sendmoney_message"] ="Processing...";
REQ_LONG(in, "bankid", 1, -1);
REQ_LONG(in, "recipientid", 1, -1);
REQ_STRING(in, "sessionid", 2, 149, "(.*)");
OPTIONAL(in, "comment") REQ_STRING(in, "comment", 2, 149, "(.*)");
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
in["action"] = WRENCHBOARD_SMONEY_MEMBER;
in["InitiatingEntityCode"] = "MBA";
in["InitiatingAmount"] = in["amount"];
long fee = member_sendmoney_fee(in, out);
in["Fee"] = fee;
in["InitiatingChannel"] = "7";
in["InitiatingPaymentMethodCode"] = "CA";
in["InitiatingCurrencyCode"] = "566";
//in["recipientid"] = in["bankid"]; in["recipientid"].set_valid( true );
in["transaction_id"] = send_trxid; in["transaction_id"].set_valid( true );
in["TerminatingPaymentMethodCode"] = "AC";
in["TerminatingAmount"] = in["amount"];
in["TerminatingCurrencyCode"] = "566";
in["TerminatingCountryCode"] = "NG";
logfmt(logINFO, "Recipient ID Final =====() %lu",in["recipientid"].Long() );
ret = smoney_calls(in, out);
if ( ret == PHP_API_OK){
out["sendmoney_message"] ="Completed - Estimated delivery time is 2 to 4 Hours.";
out["status_message"] = "complete_standard_processing";
ret = PHP_API_TRANSFER_COMPLETE;
}
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
logfmt(logINFO, "/long WrenchBoardMobileSendMoney(CVars in, CVars out)");
return ret;
}
long WrenchLoadDashData(CVars in, CVars &out) {
logfmt(logINFO, "WrenchLoadDashData()");
char vname[30];
long ret = PHP_API_BAD_PARAM;
try {
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
// REQ_LONG(in, "page", 1, -1);
// const PGresult *res;
const PGresult *res = pgsql_query("SELECT * FROM members WHERE id=%lu AND uid='%s'", member_id, in["uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
ret = PHP_API_OK;
out["status"] = "OK";
out = rec;
}
// LET SEE IF YOU HAVE NEXT DUE ITEM NOW
out["next_due_status"] = "0";
const PGresult *res2 = pgsql_query( "SELECT mj.contract AS item_code,mj.delivery_date AS due_date,mj.price,mj.client_id ,c.description AS currency "
" FROM members_jobs_contract mj "
" LEFT JOIN members_jobs j ON j.id = mj.job_id "
" LEFT JOIN currency c ON c.country=j.country "
" WHERE mj.member_id = %lu AND mj.status =1 AND mj.delivery_date > now() "
" UNION "
" SELECT mj.contract AS item_code,mj.delivery_date AS due_date,mj.price,mj.client_id ,c.description AS currency "
" FROM members_jobs_contract mj "
" LEFT JOIN members_jobs j ON j.id = mj.job_id "
" LEFT JOIN currency c ON c.country=j.country "
" WHERE mj.client_id = %lu AND mj.status =1 AND mj.delivery_date > now() "
" ORDER BY due_date ASC",member_id,member_id);
if (res2 != NULL && pgsql_num_rows(res2) > 0) {
out["next_due_status"] = "1";
map<const char*, const char*>f = pgsql_fetch_assoc(res2, 0);
CVars rec;
map_to_cvars(f, rec);
out["item_code"] = rec["item_code"];
out["due_date"] = rec["due_date"];
out["price"] = rec["price"];
out["currency"] = rec["currency"];
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long medTrReasonList(CVars in, CVars &out)");
}
logfmt(logINFO, "/WrenchLoadDashData()");
return ret;
}
char *pin_generator(char *pin, int pin_length) {
int base_number = 10;
srand(time(0));
for(int i = 0; i < pin_length; i++)
{
const char ch = 48 + (rand() % base_number);
*(pin+i) = (char)ch;
}
return pin;
}
long WrenchResetMemberPass(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchResetMemberPass(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
const char * loc = getenv("REMOTE_ADDR");
long member_id = 0;
try {
REQ_STRING(in, "email", 2, 49, "(.*)");
CVars yy;
if (load_db_record(yy, "SELECT id AS member_id, uid AS member_uid FROM members WHERE username = '%s'", in["email"].c_str())) {
member_id = yy["member_id"].Long();
}
char reset_pin[10]; // Please make sure there is enough space to hold the generated pin or you will get a "Segmentation fault" crash
bzero(reset_pin, sizeof (reset_pin)); // Make it clean with zeroes or you likely to get a "Segmentation fault" crash on dirty RAM
pin_generator(reset_pin, 5); // I am trying to generate 4 or 5 digits random numbers here
CVars xx;
if (member_id > 0) {
int r1, r2, r3;
char verify_link[100];
srand(time(NULL));
r1 = abs(rand()*100000000);
xx["member_id"] = member_id;
xx["member_id"].set_valid(true);
xx["email"] = in["email"];
xx["email"].set_valid(true);
xx["loc"] = loc;
xx["loc"].set_valid(true);
xx["reset_pin"] = reset_pin;
xx["reset_pin"].set_valid(true);
out["password_reset_id"] = insert_db_record(DBS_VALID, "password_reset", "password_reset_id_seq", xx);
if (out["password_reset_id"].Long() > 0) {
in["password_reset_id"] = out["password_reset_id"];
in["password_reset_id"].set_valid(true);
pgsql_exec("UPDATE password_reset SET expired = now() + '1 day',pass_link=md5(now()::text)||''||md5(%d::text) WHERE id = %lu", r1, out["password_reset_id"].Long());
account_email(ACCOUNT_PASSWORD_RESET, in, out);
if ( load_db_record(out, "SELECT uid AS reset_uid, id AS password_reset_id FROM password_reset WHERE id = %lu ",in["password_reset_id"].Long())> 0){
out["m_uid"] = yy["member_uid"];
ret = PHP_API_OK;
}
}
}// if member_id
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
logfmt(logINFO, "/long WrenchResetMemberPass(CVars in, CVars out)");
return ret;
}
long LogWrenchBoardMember(CVars in, CVars &out) {
logfmt(logINFO, "long LogWrenchBoardMember(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
const char * loc = getenv("REMOTE_ADDR");
try {
REQ_STRING(in, "mlog", 2, 149, "(.*)");
REQ_LONG(in, "member_id", 1, -1);
CVars xx;
xx["member_id"] = in["member_id"];
xx["member_id"].set_valid(true);
xx["mlog"] = in["mlog"];
xx["mlog"].set_valid(true);
xx["loc"] = loc;
xx["loc"].set_valid(true);
out["request_id"] = insert_db_record(DBS_VALID, "members_log", "members_log_id_seq", xx);
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
logfmt(logINFO, "/long LogWrenchBoardMember(CVars in, CVars out)");
return 0;
}
long LogManagerAction(CVars in, CVars &out) {
logfmt(logINFO, "long LogManagerAction(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
try {
REQ_STRING(in, "log_msg", 2, 149, "(.*)");
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
REQ_LONG(in, "managers_id", 1, -1);
CVars xx;
xx["managers_id"] = in["managers_id"];
xx["managers_id"].set_valid(true);
xx["log_msg"] = in["log_msg"];
xx["log_msg"].set_valid(true);
xx["loc"] = in["loc"];
xx["loc"].set_valid(true);
out["request_id"] = insert_db_record(DBS_VALID, "managers_actions", "managers_actions_id_seq", xx);
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
logfmt(logINFO, "/long LogManagerAction(CVars in, CVars out)");
return 0;
}
/* This return the list of jobs on the home page of the apps*/
long WrenchReturnPendingJobList(CVars in, CVars &out) {
logfmt(logINFO, "WrenchReturnPendingJobList()");
char vname[30];
long ret = PHP_API_BAD_PARAM;
try {
long limit = REQ_LONG(in, "limit", 1, -1);
// REQ_LONG(in, "page", 1, -1);
REQ_LONG(in, "member_id", 1, -1);
out["total_record"] = "0";
const PGresult *res;
/*
res = pgsql_query("SELECT j.title,j.description,m.job_id,m.expire "
"FROM members_jobs_offer m "
"LEFT JOIN members_jobs j ON j.id=m.job_id "
"WHERE m.status = 1 AND m.client_id=0 "
"AND m.expire IS NOT NULL "
"AND m.public_view = 1 "
"ORDER BY m.expire DESC LIMIT %lu", in["limit"].Long());
*/
res = pgsql_query("SELECT mo.member_id, to_char(mo.added, 'Dy Mon dd, yyyy HH:MI AM') AS sent,"
" j.title,j.description,m.job_id,to_char( m.expire, 'Dy Mon dd, yyyy HH:MI AM') AS expire, "
" c.code AS currency_code, c.description AS currency_description,j.country "
" FROM members_offer_interest mo "
" LEFT JOIN members_jobs_offer m ON m.id = mo.offer_id "
" LEFT JOIN members_jobs j ON j.id=m.job_id "
" LEFT JOIN currency c ON c.country=j.country "
" WHERE m.status = 1 AND m.client_id=0 "
" AND m.expire IS NOT NULL AND m.expire> now() AND m.public_view = 1 "
" AND mo.member_id = %lu ORDER BY mo.added DESC LIMIT %lu", in["member_id"].Long(), in["limit"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
out["total_record"] = pgsql_num_rows(res);
for (int i = 0, n = pgsql_num_rows(res); i < n; i++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "title_%05d", i);
out[vname] = rec["title"];
snprintf(vname, sizeof (vname), "description_%05d", i);
out[vname] = rec["description"];
snprintf(vname, sizeof (vname), "id_%05d", i);
out[vname] = rec["job_id"];
snprintf(vname, sizeof (vname), "expire_%05d", i);
out[vname] = rec["expire"];
snprintf(vname, sizeof (vname), "sent_%05d", i);
out[vname] = rec["sent"];
snprintf(vname, sizeof (vname), "job_country_%05d", i);
out[vname] = rec["country"];
snprintf(vname, sizeof (vname), "currency_%05d", i);
out[vname] = rec["currency_description"];
snprintf(vname, sizeof (vname), "currency_code_%05d", i);
out[vname] = rec["currency_code"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchReturnPendingJobList(CVars in, CVars &out)");
}
logfmt(logINFO, "/WrenchReturnPendingJobList()");
return ret;
}
/* This return the list of jobs on the home page of the apps*/
long WrenchReturnStartJobList(CVars in, CVars &out) {
logfmt(logINFO, "WrenchReturnStartJobList()");
char vname[30];
long ret = PHP_API_BAD_PARAM;
try {
long limit = REQ_LONG(in, "limit", 1, -1);
REQ_LONG(in, "page", 1, -1);
out["total_record"] = "0";
const PGresult *res;
res = pgsql_query("SELECT j.title,j.description,m.job_id,m.expire "
"FROM members_jobs_offer m "
"LEFT JOIN members_jobs j ON j.id=m.job_id "
"WHERE m.status = 1 AND m.client_id=0 "
"AND m.expire IS NOT NULL "
"AND m.public_view = 1 "
"AND m.expire > now() "
"ORDER BY m.expire DESC LIMIT %lu", in["limit"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
out["total_record"] = pgsql_num_rows(res);
for (int i = 0, n = pgsql_num_rows(res); i < n; i++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "title_%05d", i);
out[vname] = rec["title"];
snprintf(vname, sizeof (vname), "description_%05d", i);
out[vname] = rec["description"];
snprintf(vname, sizeof (vname), "expire_%05d", i);
out[vname] = rec["expire"];
snprintf(vname, sizeof (vname), "id_%05d", i);
out[vname] = rec["job_id"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long medTrReasonList(CVars in, CVars &out)");
}
logfmt(logINFO, "/WrenchReturnStartJobList()");
return ret;
}
long WrenchUpdateSiteGallery(CVars in, CVars &out) {
long ret = PHP_API_BAD_PARAM;
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_LONG(in, "gallery_type", 1, -1);
OPTIONAL(in, "gallery") REQ_STRING(in, "gallery", 4, 150, "(.*)");
const char * loc = getenv("REMOTE_ADDR");
const PGresult *res = pgsql_query("SELECT id FROM members_site_gallery WHERE member_id=%lu AND gallery_type = %lu", in["member_id"].Long(), in["gallery_type"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
pgsql_exec("UPDATE members_site_gallery SET gallery = '%s' WHERE member_id=%ld AND id=%lu", in["gallery"].c_str(), in["member_id"].Long(), in["gallery_type"].Long());
ret = PHP_API_OK;
// NO WAY FOR DUPLICATE
} else {
CVars x;
x["member_id"] = member_id;
x["member_id"].set_valid(true);
x["gallery"] = in["gallery"];
x["gallery"].set_valid(true);
x["loc"] = loc;
x["loc"].set_valid(true);
x["gallery_type"] = in["gallery_type"];
x["gallery_type"].set_valid(true);
long sid = insert_db_record(DBS_VALID, "members_site_gallery", "members_site_gallery_id_seq", x);
ret = PHP_API_OK;
}
return ret;
}
long WrenchDeleteSaveSkill(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchDeleteSaveSkill(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
const char * loc = getenv("REMOTE_ADDR");
long member_id = 0;
try {
long savedskill_id = REQ_LONG(in, "savedskill_id", 1, -1);
long member_id = REQ_LONG(in, "member_id", 1, -1);
CVars x;
const PGresult *res = pgsql_query("SELECT * FROM members_skills WHERE member_id=%lu AND id=%lu ", in["member_id"].Long(), in["savedskill_id"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
pgsql_exec("UPDATE members_skills SET status = 0 WHERE member_id=%ld AND id=%lu", in["member_id"].Long(), in["savedskill_id"].Long());
ret = PHP_API_OK;
// NO WAY FOR DUPLICATE
} else {
}
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
logfmt(logINFO, "/long WrenchDeleteSaveSkill(CVars in, CVars out)");
return ret;
}
long WrenchSaveSkill(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchSaveSkill(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
const char * loc = getenv("REMOTE_ADDR");
long member_id = 0;
try {
long category_id = REQ_LONG(in, "category_id", 1, -1);
long skill_id = REQ_LONG(in, "skill_id", 1, -1);
long member_id = REQ_LONG(in, "member_id", 1, -1);
CVars x;
const PGresult *res = pgsql_query("SELECT * FROM members_skills WHERE member_id=%lu AND skill_id=%lu AND category_id=%lu", in["member_id"].Long(), in["skill_id"].Long(), in["category_id"].Long());
if (res != NULL && pgsql_num_rows(res) > 0) {
// NO WAY FOR DUPLICATE
// let us see the status
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
//if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
if (rec["status"].Long() == 0) {
logfmt(logINFO, "~~~~~**** Update the status");
pgsql_exec("UPDATE members_skills SET status = 1 WHERE status = 0 AND member_id=%ld AND id=%lu", in["member_id"].Long(), rec["id"].Long());
ret = PHP_API_OK;
}
} else {
CVars x;
x["member_id"] = member_id;
x["member_id"].set_valid(true);
x["category_id"] = in["category_id"];
x["category_id"].set_valid(true);
x["skill_id"] = in["skill_id"];
x["skill_id"].set_valid(true);
long sid = insert_db_record(DBS_VALID, "members_skills", "members_skills_id_seq", x);
ret = PHP_API_OK;
}
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
logfmt(logINFO, "/long WrenchSaveSkill(CVars in, CVars out)");
return ret;
}
long WrenchResetPass(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchResetMemberPass(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
const char * loc = getenv("REMOTE_ADDR");
long member_id = 0;
try {
REQ_STRING(in, "pass_link", 10, 350, "(.*)");
REQ_STRING(in, "newpass", 8, 15, "(.*)");
CVars x;
const PGresult *res = pgsql_query("SELECT * FROM password_reset WHERE expired>now() AND status = 0 AND pass_link='%s'", in["pass_link"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
//if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
in["reset_id"] = rec["id"];
in["reset_id"].set_valid(true);
// good to go
if (pgsql_exec("UPDATE members SET password = md5('%s') WHERE id = %lu AND status = 1 ", in["newpass"].c_str(), rec["member_id"].Long())) {
pgsql_exec("UPDATE password_reset SET status = 5 WHERE member_id=%ld AND pass_link='%s'", rec["member_id"].Long(), in["pass_link"].c_str());
ret = PHP_API_OK;
account_email(ACCOUNT_PASSWORD_COMPLT, in, out);
out["status"] = "Completed";
}
} else {
out["status"] = "Inavlid Process";
}
} catch (bad_parameter) {
out["log_status"] = "Invalid Log Action";
}
logfmt(logINFO, "/long WrenchResetMemberPass(CVars in, CVars out)");
return ret;
}
long WrenchUpdateAccountDescription(CVars in, CVars &out) {
long ret = PHP_API_BAD_PARAM;
logfmt(logINFO, "long WrenchUpdateAccountDescription(CVars in, CVars out)");
REQ_STRING(in, "description", 0, 500, "(.*)");
long member_id = REQ_LONG(in, "member_id", 1, -1);
CVars x;
const PGresult *res = pgsql_query("SELECT id AS detail_id FROM members_detail WHERE member_id=%lu", member_id);
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
x["description"] = in["description"];
x["description"].set_valid(true);
update_db_record(DBS_VALID, "members_detail", x, rec["detail_id"].Long());
ret = PHP_API_OK;
} else {
x["member_id"] = member_id;
x["member_id"].set_valid(true);
x["description"] = in["description"];
x["description"].set_valid(true);
long sid = insert_db_record(DBS_VALID, "members_detail", "members_detail_id_seq", x); //members_session_id_seq
ret = PHP_API_OK;
}
return ret;
}
long WrenchUpdateAccountTerms(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchUpdateAccountTerms(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
out["terms_update"] = "";
try {
long action_item = REQ_LONG(in, "action_item", 1, -1);
long member_id = REQ_LONG(in, "member_id", 1, -1);
switch (action_item) {
case ACCOUNT_AGREE_JOBS:
pgsql_exec("UPDATE members SET post_jobs=NOW() WHERE id=%lu ", member_id);
ret = PHP_API_OK;
out["terms_update"] = "completed";
break;
case ACCOUNT_AGREE_REFER:
pgsql_exec("UPDATE members SET refer=NOW() WHERE id=%lu ", member_id);
ret = PHP_API_OK;
out["terms_update"] = "completed";
break;
}
} catch (bad_parameter) {
out["status"] = "Invalid Parameters";
}
logfmt(logINFO, "/long WrenchUpdateAccountTerms(CVars in, CVars out)");
return ret;
}
long WrenchUpdateProfile(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchUpdateProfile(CVars in, CVars out) ******* RETIRE THIS FUNCTION - no country change");
long ret = PHP_API_BAD_PARAM;
try {
REQ_STRING(in, "firstname", 3, 49, "(.*)");
REQ_STRING(in, "lastname", 3, 49, "(.*)");
REQ_STRING(in, "email", 5, 150, "(.*)");
REQ_STRING(in, "state", 3, 150, "(.*)");
REQ_STRING(in, "city", 3, 150, "(.*)");
REQ_STRING(in, "country", 1, 3, "(.*)");
long member_id = REQ_LONG(in, "member_id", 1, -1);
CVars x;
x["firstname"] = in["firstname"];
x["firstname"].set_valid(true);
x["lastname"] = in["lastname"];
x["lastname"].set_valid(true);
x["email"] = in["email"];
x["email"].set_valid(true);
x["state"] = in["state"];
x["state"].set_valid(true);
x["city"] = in["city"];
x["city"].set_valid(true);
x["country"] = in["country"];
x["country"].set_valid(true);
update_db_record(DBS_VALID, "members", x, member_id);
ret = PHP_API_OK;
} catch (bad_parameter) {
out["status"] = "Invalid Parameters";
}
logfmt(logINFO, "/long WrenchUpdateProfile(CVars in, CVars out)");
return ret;
}
long WrenchResendSendReferLoadLink(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchResendSendReferLoadLink(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
try {
REQ_STRING(in, "uid", 3, 45, "(.*)");
if (load_db_record(out, "SELECT id AS refer_id, * FROM members_refer_friend WHERE status<>5 AND uid ='%s'", in["uid"].c_str()) > 0)
{
const PGresult *res = pgsql_query("UPDATE members_refer_friend SET sent=now() WHERE uid='%s'", out["uid"].c_str());
in["refer_id"] = out["refer_id"];
in["refer_id"].set_valid(true);
account_email(ACCOUNT_SEND_REFEREMAIL, in, out);
out["status"] = "Refer message sent";
ret = PHP_API_OK;
}
} catch (bad_parameter) {
out["status"] = "Invalid Parameters";
}
logfmt(logINFO, "/long WrenchResendSendReferLoadLink(CVars in, CVars out)");
return ret;
}
long WrenchSendReferLoadLink(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchSendReferLoadLink(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
try {
REQ_STRING(in, "refer_link", 3, 45, "(.*)");
if (load_db_record(out, "SELECT uid FROM members_refer_friend WHERE updated IS NULL AND refer_link ='%s'", in["refer_link"].c_str()) > 0)
{
const PGresult *res = pgsql_query("UPDATE members_refer_friend SET updated=now() WHERE uid='%s'", out["uid"].c_str());
}
} catch (bad_parameter) {
out["status"] = "Invalid Parameters";
}
logfmt(logINFO, "/long WrenchSendReferLoadLink(CVars in, CVars out)");
return ret;
}
/**************************************************************************************************************************/
long WrenchSendRefer(CVars in, CVars &out) {
logfmt(logINFO, "long WrenchSendRefer(CVars in, CVars out)");
long ret = PHP_API_BAD_PARAM;
try {
//out = in;
out["status"] = "";
REQ_STRING(in, "ref_firstname", 3, 49, "(.*)");
REQ_STRING(in, "ref_lastname", 3, 49, "(.*)");
REQ_STRING(in, "ref_email", 5, 150, "(.*)");
long member_id = REQ_LONG(in, "member_id", 1, -1);
const PGresult *res = pgsql_query("SELECT * FROM members_pending WHERE email='%s'", in["ref_email"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
out["status"] = "Unable to add this email";
return ret;
}
const PGresult *res1 = pgsql_query("SELECT * FROM members WHERE email='%s'", in["ref_email"].c_str());
if (res1 != NULL && pgsql_num_rows(res1) > 0) {
out["status"] = "Unable to add this email";
return ret;
}
const PGresult *res2 = pgsql_query("SELECT * FROM members_refer_friend WHERE email='%s' AND status IN (1,4,5)", in["ref_email"].c_str());
if (res2 != NULL && pgsql_num_rows(res2) > 0) {
out["status"] = "Unable to add this email";
return ret;
}
CVars x;
x["member_id"] = in["member_id"];
x["member_id"].set_valid(true);
x["firstname"] = in["ref_firstname"];
x["firstname"].set_valid(true);
x["email"] = in["ref_email"];
x["email"].set_valid(true);
x["lastname"] = in["ref_lastname"];
x["lastname"].set_valid(true);
int r1, r2, r3;
char refer_link[100];
srand(time(NULL));
r1 = abs(rand()*100000000);
srand(time(NULL));
r2 = abs(rand() * r1);
srand(time(NULL));
r3 = abs(rand() * r2);
sprintf(refer_link, "WRENREF-%09lu-%08lu-%08lu", r1, r2, r3);
x["refer_link"] = refer_link;
x["refer_link"].set_valid(true);
long refer_id = 0;
refer_id = insert_db_record(DBS_VALID, "members_refer_friend", "members_refer_friend_id_seq", x);
if (refer_id > 0) {
const PGresult *res4 = pgsql_query("UPDATE members_refer_friend SET sent=now() WHERE id=%lu", refer_id);
in["refer_id"] = refer_id;
in["refer_id"].set_valid(true);
account_email(ACCOUNT_SEND_REFEREMAIL, in, out); // ALERT REFER EMAIL
out["status"] = "Refer message sent";
ret = PHP_API_OK;
}
} catch (bad_parameter) {
out["status"] = "Invalid Parameters";
}
logfmt(logINFO, "/long WrenchSendRefer(CVars in, CVars out)");
return ret;
}
/**************************************************************************************************************************/
long account_session_check(CVars in, CVars out) {
logfmt(logINFO, "long account_session_check(CVars in, CVars out)");
long ret = PHP_INVALID_SESSION;
try {
REQ_STRING(in, "sessionid", 4, 140, "(.*)");
long member_id = REQ_LONG(in, "member_id", 1, -1);
if (load_db_record(out, "SELECT uid FROM members_session WHERE session='%s' AND member_id = %lu", in["sessionid"].c_str(),member_id) > 0) {
if (SessionCheck(out["uid"].Long(), in["sessionid"].c_str(), 0) > 0) {
out["status"] = "Session valid";
ret = PHP_API_OK;
}
}
} catch (bad_parameter) {
out["status"] = "Invalid session ID";
}
logfmt(logINFO, "/long account_session_check(CVars in, CVars out)");
return ret;
}
/**************************************************************************************************************************/
long VerifySession(CVars in, CVars &out) {
long ret = PHP_API_BAD_PARAM;
logfmt(logINFO, "long SessionCheck(long uid, const char *sessionid, int create )");
try {
REQ_STRING(in, "sessionid", 4, 140, "(.*)");
long member_id = REQ_LONG(in, "member_id", 1, -1);
long session_expire_minutes = 15;
if (load_db_record(out, "SELECT s.* FROM members_session s LEFT JOIN members m ON m.id=s.member_id WHERE s.member_id=%lu AND s.updated > (now() - interval '%lu minutes') AND s.session='%s'", member_id, session_expire_minutes, in["sessionid"].c_str()) > 0) {
pgsql_exec("UPDATE members_session SET updated=NOW() WHERE member_id=%ld AND session='%s'", member_id, in["sessionid"].c_str());
ret = PHP_API_OK;
} else {
// Clean old sessions
pgsql_exec("DELETE FROM members_session WHERE member_id=%lu AND session='%s'", member_id, in["sessionid"].c_str());
ret = PHP_API_BAD_PARAM;
}
} catch (bad_parameter) {
out["status"] = "ERROR";
ret = PHP_API_BAD_PARAM;
}
logfmt(logINFO, "/long SessionCheck(CVars in, CVars &out )");
return ret; // No route
}
/**************************************************************************************************************************/
long SessionCheck(long uid, const char *sessionid, int create) {
logfmt(logINFO, "long SessionCheck(long uid, const char *sessionid, int create )");
// Sanity check
if (uid < 1 || sessionid == NULL || strlen(sessionid) < 4) {
return -1L; // Invalif parameters
}
long session_expire_minutes = 15;
// Clean old sessions
pgsql_exec("DELETE FROM members_session WHERE member_id=%ld AND updated < (now() - interval '%lu minutes')", uid, session_expire_minutes);
// Update/check existing session
if (create == 0) {
// do we still have this session
const PGresult *res = pgsql_query("SELECT * FROM members_session WHERE member_id=%ld AND session='%s'", uid, sessionid);
if (res == NULL && pgsql_num_rows(res) == 0) {
return -2L; // Active sessions found Already deleted
}
//Udate the session if you get here
pgsql_exec("UPDATE members_session SET updated=NOW() WHERE member_id=%ld AND session='%s'", uid, sessionid);
return 1L; // Session updated
}
if (create > 0) {
// Check session i?
const PGresult *res = pgsql_query("SELECT * FROM members_session WHERE member_id=%ld AND session<>'%s'", uid, sessionid);
if (res != NULL && pgsql_num_rows(res) > 0) {
return -2L; // Active sessions found
}
CVars sess; // Do we have the same session already?
if (load_db_record(sess, "SELECT * FROM members_session WHERE member_id=%lu AND session='%s'", uid, sessionid) > 0) {
pgsql_exec("UPDATE members_session SET updated=NOW() WHERE member_id=%ld AND session='%s'", uid, sessionid);
return sess["id"].Long();
}
// Create a new session
const char * loc = getenv("REMOTE_ADDR");
sess["loc"] = loc;
sess["loc"].set_valid(true);
sess["member_id"] = uid;
sess["member_id"].set_valid(true);
sess["session"] = sessionid;
sess["session"].set_valid(true);
long sid = insert_db_record(DBS_VALID, "members_session", "members_session_id_seq", sess); //members_session_id_seq
if (sid > 0) {
return sid; // New session created
}
return -3L; // Failed to create new session
}
logfmt(logINFO, "/long SessionCheck(long uid, const char *sessionid, int create )");
return 0L; // No route
}
/*
CREATE TABLE mobile_login (
id SERIAL,
member_id INT REFERENCES members(id) UNIQUE NOT NULL,
added timestamp without time zone DEFAULT now(),
updated timestamp without time zone DEFAULT now()
);
ALTER TABLE ONLY mobile_login
ADD CONSTRAINT mobile_login_id_key UNIQUE (id);
*/
long LoginLogger( long member_id, long login_mode){
CVars sess;
long ret = 0;
try {
switch( login_mode ){
case MOBILE_LOGIN:
if (load_db_record(sess, "SELECT * FROM mobile_login WHERE member_id=%lu", member_id) > 0) {
pgsql_exec("UPDATE mobile_login SET updated=NOW() WHERE member_id=%ld", member_id);
}else{
sess["member_id"] = member_id;
sess["member_id"].set_valid(true);
insert_db_record(DBS_VALID, "mobile_login", "mobile_login_id_seq", sess); //members_session_id_seq
}
break;
}
} catch (bad_parameter) {
ret = PHP_API_BAD_PARAM;
}
return ret;
}
/*
#define WEBSITE_LOGIN 1100
#define MOBILE_LOGIN 1101
#define FACEBOOK_LOGIN 1102
#define APPLE_LOGIN 1103
#define GOOGLE_LOGIN 1104
#define LOGIN_MODE_GENERAL 1100
#define LOGIN_MODE_FAMILY 1105
*/
long LoginWrenchBoardFamilyLogin(CVars in, CVars &out);
long WrenchBoardCreateFamilyAcc(CVars in, CVars &out);
long WrenchBoardCreateFamilyAcc(CVars in, CVars &out){
long ret = 0;
try {
CVars x;
x["username"] = in["uid"];
x["username"].set_valid(true);
x["email"] = in["uid"];
x["email"].set_valid(true);
x["password"] = in["uid"];
x["password"].set_valid(true);
x["firstname"] = in["firstname"];
x["firstname"].set_valid(true);
x["lastname"] = in["lastname"];
x["lastname"].set_valid(true);
x["account_type"] = "FAMILY";
x["account_type"].set_valid(true);
// x["loc"] = out["loc"];
// x["loc"].set_valid(true);
ret = insert_db_record(DBS_VALID, "members", "members_id_seq", x);
if ( ret > 0 ){
pgsql_exec("UPDATE members_family SET family_member_id=%lu WHERE uid='%s'",ret, in["uid"].c_str() );
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchBoardCreateFamilyAcc(CVars in, CVars &out)");
}
return ret;
}
long LoginWrenchBoardFamilyLogin(CVars in, CVars &out){
long ret = PHP_API_BAD_PARAM;
long family_member_id = 0;
logfmt(logINFO, "********~~~~~~~~ ------LoginWrenchBoardFamilyLogin()");
try {
REQ_STRING(in, "username", 5, 49, "(.*)");
REQ_STRING(in, "pin", 4, 10, "(.*)");
const PGresult *res = pgsql_query(" SELECT id AS family_id,* FROM members_family "
" WHERE username='%s' AND pin='%s' ", in["username"].c_str(),in["pin"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
if( rec["family_member_id"]==""){
logfmt(logINFO, "LoginWrenchBoardFamilyLogin()- Need to Construct Account Now------->");
family_member_id = WrenchBoardCreateFamilyAcc(rec,out);
}
else{
family_member_id = rec["family_member_id"].Long();
}
if (family_member_id > 0){
load_db_record(out, "SELECT *,id AS member_id , to_char(last_login, 'Day Mon dd, yyyy HH:MI AM') AS last_login2 "
" FROM members WHERE status=1 AND id = %lu",family_member_id);
CVars vw;
vw["currency"] = "NAIRA"; // this might become a variable based on the country
vw["currency"].set_valid( true );
long wallet_id = CheckWallet(out["member_id"].Long(),vw);
load_db_record( out, "SELECT amount AS balance FROM members_wallet WHERE member_id = %lu AND currency='%s' ", out["member_id"].Long(), vw["currency"].c_str());
pgsql_exec("DELETE FROM members_session WHERE member_id=%ld ", out["member_id"].Long());
// remove all existing session
load_db_record(in, "SELECT upper(md5(now()::text))||''|| upper(md5(now()::date::text)) AS sessionid");
if (SessionCheck(out["id"].Long(), in["sessionid"].c_str(), 1) > 0) {
out["stauts"] = "OK";
/*LOAD THE SESSION INTO OUT now */
load_db_record(out, "SELECT session FROM members_session WHERE member_id=%lu ORDER BY id DESC LIMIT 1", out["member_id"].Long());
//===============================================================================================================================
pgsql_query("UPDATE members SET last_login = now() WHERE id = %lu", out["member_id"].Long());
// pgsql_query("UPDATE members SET last_login = now() , loc='%s' WHERE id = %lu",loc, out["member_id"].Long());
pgsql_exec("UPDATE members_family SET last_login = now() WHERE family_member_id=%lu",family_member_id );
ret = PHP_LOGIN_OK;
LoginLogger(out["member_id"].Long(),LOGIN_MODE_FAMILY);
} else {
out["status"] = "Session check failed";
}
}
}
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyUpdate(CVars in, CVars &out)");
}
return ret;
}
long LoginWrenchBoardAuxAccount(CVars in, CVars &out) {
long login_channel = REQ_LONG(in, "login_channel", 1, -1);
switch(login_channel){
case LOGIN_GOOGLE:
return LoginWrenchBoardGoogle(in, out);
break;
case LOGIN_FACEBOOK:
return LoginWrenchBoardFacebook(in, out);
break;
case LOGIN_APPLE:
return LoginWrenchBoardApple(in, out);
break;
}
return 0;
}
long LoginWrenchBoardQRAccount(CVars in, CVars &out) {
/*
$in['member_uid'] = $pieces[0];
$in['member_username'] = $pieces[1];
$in['family_uid'] = $pieces[2];
*/
logfmt(logINFO, "LoginWrenchBoardQRAccount()");
long ret = PHP_API_BAD_PARAM;
try {
// REQ_LONG( in, "whattodo", 1, -1 );
REQ_STRING(in, "member_username", 5, 49, "(.*)");
REQ_STRING(in, "member_uid", 5, 140, "(.*)");
REQ_STRING(in, "family_uid", 4, 140, "(.*)");
const PGresult* res = pgsql_query("SELECT f.username, f.pin FROM members_family f LEFT JOIN members m ON m.id=f.member_id "
" WHERE f.uid = '%s' AND f.username = '%s' AND m.uid = '%s' ", in["family_uid"].c_str(), in["member_username"].c_str(), in["member_uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res,0);
CVars rec;
map_to_cvars(f, rec);
CVars inx;
inx["username"] = rec["username"]; inx["username"].set_valid( true );
inx["pin"] = rec["pin"]; inx["pin"].set_valid( true );
inx["login_mode"] = LOGIN_MODE_FAMILY; inx["login_mode"].set_valid( true );
return LoginWrenchBoardAccount(inx, out);
}
else{
ret = PHP_API_BAD_PARAM;
}
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/LoginWrenchBoardQRAccount()");
return ret;
}
long LoginWrenchBoardAccount(CVars in, CVars &out) {
long ret = PHP_API_BAD_PARAM;
logfmt(logINFO, "LoginWrenchBoardAccount()");
long login_mode = REQ_LONG(in, "login_mode", 1, -1);
if( login_mode == LOGIN_MODE_FAMILY){
return LoginWrenchBoardFamilyLogin(in, out);
}
REQ_STRING(in, "username", 5, 49, "(.*)");
REQ_STRING(in, "password", 5, 49, "(.*)");
REQ_STRING(in, "sessionid", 4, 140, "(.*)");
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
// $in["login_mode"] = MOBILE_LOGIN;
// long login_mode = REQ_LONG(in, "login_mode", 0, -1);
const char * loc = getenv("REMOTE_ADDR");
in["loc"] = loc;
in["loc"].set_valid(true);
load_db_record(in, "SELECT upper(md5(now()::text))||''|| upper(md5(now()::date::text)) AS sessionid");
ret = load_db_record(out, "SELECT *,id AS member_id , to_char(last_login, 'Day Mon dd, yyyy HH:MI AM') AS last_login2,country FROM members WHERE status=1 AND LOWER(username)=LOWER('%s') AND password= md5('%s')", in["username"].c_str(), in["password"].c_str());
if (ret) {
if ( out["country"] !=""){
CVars vw;
load_db_record(vw, "SELECT code AS currency FROM currency WHERE country='%s'",out["country"].c_str());
if ( vw["currency"] !=""){
//vw["currency"] = "NAIRA"; // this might become a variable based on the country
vw["currency"].set_valid( true );
long wallet_id = CheckWallet(out["member_id"].Long(),vw);
}
}
load_db_record( out, "SELECT amount AS balance FROM members_wallet WHERE member_id = %lu AND currency='%s' ", out["member_id"].Long(), vw["currency"].c_str());
pgsql_exec("DELETE FROM members_session WHERE member_id=%ld ", out["member_id"].Long());
// remove all existing session
if (SessionCheck(out["id"].Long(), in["sessionid"].c_str(), 1) > 0) {
out["stauts"] = "OK";
/*LOAD THE SESSION INTO OUT now */
load_db_record(out, "SELECT session FROM members_session WHERE member_id=%lu ORDER BY id DESC LIMIT 1", out["member_id"].Long());
//===============================================================================================================================
pgsql_query("UPDATE members SET last_login = now() , loc='%s' WHERE id = %lu",loc, out["member_id"].Long());
account_email(ACCOUNT_LOGIN_ALERT, out, out); // ALERT CUSTOMER OF LOGIN
ret = PHP_LOGIN_OK;
out["profile_pic_url"] = "https://www.wrenchboard.com/assets/images/profile.jpg";
out["password"] = "";
LoginLogger(out["member_id"].Long(),login_mode);
} else {
out["status"] = "Session check failed";
}
} else {
out["status"] = "Invalid username and/or password";
}
logfmt(logINFO, "/LoginWrenchBoardAccount()");
return ret;
}
long LoginWrenchBoardFacebook(CVars in, CVars &out) {
long res = PHP_API_BAD_PARAM;
logfmt(logINFO, "LoginWrenchBoardFacebook()");
REQ_STRING(in, "fb_id", 5, 49, "(.*)");
in["external_idp_provider_id"] = in["fb_id"].Long();
in["external_idp_provider"] = 1L; // Facebook
in["fb_id"].set_valid(false);
REQ_STRING(in, "email", 6, 49, "(.*)");
OPTIONAL(in, "firstname") REQ_STRING(in, "firstname", 1, 49, "(.*)");
else in["firstname"] = "";
OPTIONAL(in, "lastname") REQ_STRING(in, "lastname", 1, 49, "(.*)");
else in["lastname"] = "";
REQ_STRING(in, "sessionid", 4, 40, "(.*)");
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
long retL = load_db_record(out, "SELECT uid, * FROM members WHERE LOWER(email)=LOWER('%s') AND password IS NOT NULL", in["email"].c_str());
if (retL > 0 && out["uid"] !="") {
out["status"] = "Email may be already registered, Try Login";
return PHP_API_BAD_PARAM;
}
res = LoginWrenchBoardExternal(in, out);
logfmt(logINFO, "/LoginWrenchBoardFacebook()");
return res;
}
long LoginWrenchBoardGoogle(CVars in, CVars &out) {
long res = PHP_API_BAD_PARAM;
logfmt(logINFO, "LoginWrenchBoardGoogle()");
REQ_STRING(in, "google_id", 5, 49, "(.*)");
in["external_idp_provider_id"] = in["google_id"].Long();
in["external_idp_provider"] = 2L; // Google
in["google_id"].set_valid(false);
REQ_STRING(in, "email", 6, 49, "(.*)");
OPTIONAL(in, "firstname") REQ_STRING(in, "firstname", 1, 49, "(.*)");
else in["firstname"] = "";
OPTIONAL(in, "lastname") REQ_STRING(in, "lastname", 1, 49, "(.*)");
else in["lastname"] = "";
REQ_STRING(in, "sessionid", 4, 40, "(.*)");
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
long retL = load_db_record(out, "SELECT uid, * FROM members WHERE LOWER(email)=LOWER('%s') AND password IS NOT NULL", in["email"].c_str());
if (retL > 0 && out["uid"] !="") {
out["status"] = "Email may be already registered, Try Login";
return PHP_API_BAD_PARAM;
}
res = LoginWrenchBoardExternal(in, out);
logfmt(logINFO, "/LoginWrenchBoardGoogle()");
return res;
}
long LoginWrenchBoardApple(CVars in, CVars &out) {
long res = PHP_API_BAD_PARAM;
logfmt(logINFO, "LoginWrenchBoardApple()");
REQ_STRING(in, "apple_id", 5, 49, "(.*)");
in["external_idp_provider_id"] = in["apple_id"];
in["external_idp_provider"] = 3L; // Apple
in["apple_id"].set_valid(false);
REQ_STRING(in, "email", 6, 49, "(.*)");
OPTIONAL(in, "firstname") REQ_STRING(in, "firstname", 1, 49, "(.*)");
else in["firstname"] = "";
OPTIONAL(in, "lastname") REQ_STRING(in, "lastname", 1, 49, "(.*)");
else in["lastname"] = "";
REQ_STRING(in, "sessionid", 4, 40, "(.*)");
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
long retL = load_db_record(out, "SELECT uid, * FROM members WHERE LOWER(email)=LOWER('%s') AND password IS NOT NULL", in["email"].c_str());
if (retL > 0 && out["uid"] !="") {
out["status"] = "Email may be already registered, Try Login";
return PHP_API_BAD_PARAM;
}
res = LoginWrenchBoardExternal(in, out);
logfmt(logINFO, "/LoginWrenchBoardApple()");
return res;
}
long LoginWrenchBoardExternal(CVars in, CVars &out) {
long res = PHP_API_BAD_PARAM;
logfmt(logINFO, "LoginWrenchBoardExternal()");
const char * loc = getenv("REMOTE_ADDR");
in["loc"] = loc;
in["loc"].set_valid(true);
long ret = load_db_record(out, "SELECT * FROM members WHERE LOWER(email)=LOWER('%s') AND password IS NOT NULL", in["email"].c_str());
if (ret > 0) {
out["status"] = "Email is already registered";
} else {
load_db_record(in, "SELECT upper(md5(now()::text))||''|| upper(md5(now()::date::text)) AS sessionid");
ret = load_db_record(out, "SELECT *,id AS member_id FROM members WHERE LOWER(email)=LOWER('%s') AND external_idp_provider_id='%s' AND external_idp_provider=%ld", in["email"].c_str(), in["external_idp_provider_id"].c_str(), in["external_idp_provider"].Long());
if (ret > 0) {
logfmt(logINFO, "External account already exists");
} else {
logfmt(logINFO, "Create new FB account");
CVars xx;
xx["username"] = in["email"];
xx["username"].set_valid(true);
xx["firstname"] = in["firstname"];
xx["firstname"].set_valid(true);
xx["lastname"] = in["lastname"];
xx["lastname"].set_valid(true);
xx["email"] = in["email"];
xx["email"].set_valid(true);
xx["loc"] = in["loc"];
xx["loc"].set_valid(true);
xx["external_idp_provider"] = in["external_idp_provider"];
xx["external_idp_provider"].set_valid(true);
xx["external_idp_provider_id"] = in["external_idp_provider_id"];
xx["external_idp_provider_id"].set_valid(true);
out["member_id"] = insert_db_record(DBS_VALID, "members", "members_id_seq", xx);
ret = load_db_record(out, "SELECT *,id AS member_id FROM members WHERE id='%ld'", out["member_id"].Long());
}
if (out["member_id"].Long() > 0) {
pgsql_exec("DELETE FROM members_session WHERE member_id=%ld ", out["member_id"].Long());
// remove all existing session
if (SessionCheck(out["id"].Long(), in["sessionid"].c_str(), 1) > 0) {
out["stauts"] = "OK";
pgsql_query("UPDATE members SET last_login = now() WHERE id = %lu", out["member_id"].Long());
/*LOAD THE SESSION INTO OUT now */
load_db_record(out, "SELECT session FROM members_session WHERE member_id=%lu ORDER BY id DESC LIMIT 1", out["member_id"].Long());
//===============================================================================================================================
account_email(ACCOUNT_LOGIN_ALERT, out, out); // ALERT CUSTOMER OF LOGIN
out["profile_pic_url"] = "https://www.wrenchboard.com/assets/images/profile.jpg";
res = PHP_LOGIN_OK;
} else {
out["status"] = "Session check failed";
}
}
}
logfmt(logINFO, "/LoginWrenchBoardExternal()");
return res;
}
//******************************************************************************
long AddMobileTopuNumber(CVars in, CVars &out) {
long ret = -1;
long pin = REQ_LONG(in, "pin", 1, -1);
long customer_id = REQ_LONG(in, "customer_id", 1, -1);
OPTIONAL(in, "loc") REQ_STRING(in, "loc", 3, 15, "(.*)");
REQ_STRING(in, "seller_number", 10, 11, "(.*)");
CVars x;
x["pin"] = in["pin"];
x["pin"].set_valid(true);
x["customer_id"] = in["customer_id"];
x["customer_id"].set_valid(true);
x["loc"] = in["loc"];
x["loc"].set_valid(true);
x["seller_number"] = in["seller_number"];
x["seller_number"].set_valid(true);
ret = insert_db_record(DBS_VALID, "mobile_sales_auth", "mobile_sales_auth_id_seq", x);
out["status"] = ret;
out["auth_id"] = ret;
return ret;
}
//******************************************************************************
long InitiateAddCustomerBalance(CVars in, CVars &out) {
logfmt(logINFO, "AddCustomerBalance()");
long ret = PHP_API_BAD_PARAM;
try {
// REQ_LONG( in, "whattodo", 1, -1 );
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/AddCustomerBalance()");
return ret;
}
long CompleteAddCustomerBalance(CVars in, CVars &out) {
logfmt(logINFO, "AddCustomerBalance()");
long ret = PHP_API_BAD_PARAM;
try {
// REQ_LONG( in, "whattodo", 1, -1 );
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/AddCustomerBalance()");
return ret;
}
//******************************************************************************
//******************************************************************************
long VerifyEmailWrenchBoardAccount(CVars in, CVars &out) {
logfmt(logINFO, "VerifyEmailWrenchBoardAccount()");
long ret = PHP_API_BAD_PARAM;
try {
long account_id = REQ_LONG(in, "account_id", 1, -1);
// ret = load_db_record( out, "SELECT * FROM members WHERE id = %lu", account_id );
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/VerifyEmailWrenchBoardAccount()");
return ret;
}
//******************************************************************************
long VerifyPhoneWrenchBoardAccount(CVars in, CVars &out) {
logfmt(logINFO, "VerifyPhoneWrenchBoardAccount()");
long ret = PHP_API_BAD_PARAM;
try {
// REQ_LONG( in, "whattodo", 1, -1 );
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/VerifyPhoneWrenchBoardAccount()");
return ret;
}
//******************************************************************************
long EditProfileWrenchBoardAccount(CVars in, CVars &out) {
logfmt(logINFO, "EditProfileWrenchBoardAccount()");
long ret = PHP_API_BAD_PARAM;
try {
long account_id = REQ_LONG(in, "account_id", 1, -1);
REQ_STRING(in, "State", 2, 20, "(.*)");
REQ_STRING(in, "Zipcode", 3, 15, "(.*)");
REQ_STRING(in, "Country", 2, 5, "(.*)");
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/EditProfileWrenchBoardAccount()");
return ret;
}
//******************************************************************************
long LoadProfileWrenchBoardAccount(CVars in, CVars &out) {
logfmt(logINFO, "LoadProfileWrenchBoardAccount()");
long ret = PHP_API_BAD_PARAM;
try {
long account_id = REQ_LONG(in, "account_id", 1, -1);
const PGresult* res = pgsql_query("SELECT * FROM members WHERE id = %lu", account_id);
if (res && pgsql_num_rows(res) > 0) {
}
} catch (bad_parameter) {
out["status"] = "ERROR";
}
logfmt(logINFO, "/LoadProfileWrenchBoardAccount()");
return ret;
}
//******************************************************************************
//*****************************************************************************/
long ETSL_configure(CVars in, CVars &out) {
logfmt(logINFO, "long ETSL_configure(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
out["etisalat_endpoint"] = "http://etisalat.service.chiefsoft.com/etisalat_payquic.php";
ret = PHP_API_OK;
} catch (bad_parameter) {
out["status"] = "Bad parameter";
} catch (...) {
out["status"] = "Unhandled exception in INTW_configure";
}
logfmt(logINFO, "/long ETSL_configure(CVars in, CVars &out)");
return ret;
}
long DeliverMobilseEtisalat(CVars in, CVars &out) {
logfmt(logINFO, "long INTW_sendBillPaymentAdvice(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
try {
int customerId = REQ_LONG(in, "customerid", 1, -1);
int paymentItemId = REQ_LONG(in, "paymentitemid", 1, -1);
int amount = REQ_LONG(in, "amount", 0, -1);
REQ_STRING(in, "customermobile", 5, 15, "(.*)");
OPTIONAL(in, "customeremail") REQ_STRING(in, "customeremail", 1, 100, "(.*)");
OPTIONAL(in, "order_id") REQ_STRING(in, "order_id", 1, 25, "(.*)");
char CustomerMobile[15];
char CustomerEmail[100];
sprintf(CustomerEmail, "%s", in["customeremail"].c_str());
sprintf(CustomerMobile, "%s", in["customermobile"].c_str());
//topalert = "sales@payquic.com";
out["topalert"] = CfgReadChar("transnotif.topalert");
sprintf(CustomerEmail, "%s", out["topalert"].c_str());
CVars customer; // Load customer
ret = load_db_record(customer, "SELECT email,firstname,lastname FROM customer WHERE status=1 AND id = %lu", customerId);
if (ret < 1L) {
throw new bad_parameter(out, "customerid");
}
CVars paymentitem; // Load payment item
ret = load_db_record(paymentitem, "SELECT id,billerid,billername,name,amount,paymentcode FROM interswitch_biller_payment_items WHERE gid = %lu", paymentItemId);
if (ret < 1L) {
out["advice"] = "PaymentID not found or not valid !!!";
throw new bad_parameter(out, "paymentitemid");
}
// Check amount
if (amount < 1L) {
amount = paymentitem["amount"].Long();
}
// Create record
CVars advice;
advice["customerid"] = customerId;
advice["customerid"].set_valid(true);
advice["billerid"] = paymentitem["billerid"];
advice["billerid"].set_valid(true);
advice["billerpaymentitemgid"] = paymentItemId;
advice["billerpaymentitemgid"].set_valid(true);
advice["amount"] = amount;
advice["amount"].set_valid(true);
advice["paymentcode"] = paymentitem["paymentcode"];
advice["paymentcode"].set_valid(true);
advice["order_id"] = in["order_id"];
advice["order_id"].set_valid(true);
advice["customeremail"] = in["customeremail"];
advice["customeremail"].set_valid(true);
advice["customermobile"] = in["customermobile"];
advice["customermobile"].set_valid(true);
out["bill_payment_advice_id"] = insert_db_record(DBS_VALID, "interswitch_bill_payment_advice", "interswitch_bill_payment_advice_id_seq", advice);
if (out["bill_payment_advice_id"].Long() < 1L) {
//throw new runtime_error("Failed to create interswitch bill payment advice record");
return PHP_API_BAD_PARAM;
}
// Initiate interswitch session
CVars setup;
ETSL_configure(in, setup);
CVars transaction;
transaction["detail_id"] = out["bill_payment_advice_id"];
transaction["detail_id"].set_valid(true);
transaction["type"] = 1L;
/* SendBillPaymentAdvice */ transaction["type"].set_valid(true);
out["transaction_id"] = insert_db_record(DBS_VALID, "interswitch_transaction", "interswitch_transaction_id_seq", transaction);
if (out["transaction_id"].Long() < 1L) {
// throw new runtime_error("Failed to create interswitch transaction record");
return PHP_API_BAD_PARAM;
}
char uniqueRef[20];
memset(uniqueRef, 0, 20);
// TransferCode - RequestReference - UniqueRef => request prefix for terminal owner + ID
sprintf(uniqueRef, "ETSL%08lu", out["transaction_id"].Long());
//sprintf( uniqueRef, "%s%09s", setup["interswitch_pfix"].c_str(), out["transaction_id"].c_str() );
transaction["transfer_code"] = uniqueRef;
transaction["transfer_code"].set_valid(true);
CVars cxc;
cxc["transfer_code"] = transaction["transfer_code"];
cxc["transfer_code"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_transaction", cxc, out["transaction_id"].Long());
logfmt(logINFO, "Here -> 1");
logfmt(logINFO, "SENDING TRANSACTION - setup[interswitch_tid].c_str() ->%s", setup["interswitch_tid"].c_str());
// Prepare call
const int statusSize = 1024;
char status[statusSize];
char transactionRef[statusSize];
memset(status, 0, statusSize); // Clear?
memset(transactionRef, 0, statusSize); // Clear?
char xtid[12];
sprintf(xtid, "%s", setup["interswitch_tid"].c_str());
logfmt(logINFO, "SENDING PAQUIC ETISALAT TRANSACTION->%s", xtid);
out["ResponseCode"] = "99999";
long ret1 = GateDeliverMobilseEtisalat(in, out);
if (out["statusCode"].Long() == 0 && out["errorCode"].Long() == 0) {
ret = 90000L;
//'message' => '<?xml version="1.0" encoding="utf-8"?><result><statusCode>0</statusCode><errorCode>0</errorCode><errorDescription>Successful Transaction 0305055755074473</errorDescription><instanceId>0305055755074473</instanceId></result>'
try {
CVars txt;
txt["responsecode"] = "90000";
txt["responsecode"].set_valid(true);
txt["transactionref"] = out["errorDescription"];
txt["transactionref"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_transaction", txt, out["transaction_id"].Long());
} catch (...) {
out["status"] = "I see no good response from interswitch";
}
CVars fr0;
fr0["status"] = "5";
fr0["status"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_bill_payment_advice", fr0, out["bill_payment_advice_id"].Long());
} else {
try {
CVars txt0;
txt0["responsecode"] = "99999";
txt0["responsecode"].set_valid(true);
txt0["transactionref"] = out["errorDescription"];
txt0["transactionref"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_transaction", txt0, out["transaction_id"].Long());
} catch (...) {
out["status"] = "I see no good response from interswitch";
}
CVars fr1;
fr1["status"] = "7";
fr1["status"].set_valid(true);
update_db_record(DBS_VALID, "interswitch_bill_payment_advice", fr1, out["bill_payment_advice_id"].Long());
}
out["statusCode"].set_valid(true);
} catch (bad_parameter) {
out["status"] = "Incorrect parameter";
ret = PHP_API_BAD_PARAM;
} catch (...) {
out["status"] = "Unhandled exception in INTW_sendBillPaymentAdvice";
}
logfmt(logINFO, "/long INTW_sendBillPaymentAdvice(CVars in, CVars &out)");
return ret;
}
long GateDeliverMobilseEtisalat(CVars in, CVars &out) {
logfmt(logINFO, "long DeliverMobilseEtisalat(CVars in, CVars &out)");
long ret = PHP_API_BAD_PARAM;
CURL *curl;
CURLcode res;
struct MemoryStruct chunk;
chunk.memory = (char*) malloc(1); /* will be grown as needed by the realloc above */
chunk.size = 0; /* no data at this point */
curl_global_init(CURL_GLOBAL_ALL);
/* get a curl handle */
curl = curl_easy_init();
if (curl) {
// Prepare data
string data = "";
CVars::iterator i;
int j = 0; // Will limit to 200 variables
for (i = in.begin(); i != in.end() && j < 200; i++) {
logfmt(logINFO, "IN: %s=%s", i->first.c_str(), i->second.c_str());
if (j > 0) {
data += "&";
}
data += i->first.c_str();
data += "=";
data += i->second.c_str();
j++;
}
logfmt(logINFO, "DATA: %s", data.c_str());
curl_easy_setopt(curl, CURLOPT_URL, "http://etisalat.service.chiefsoft.com/etisalat_payquic.php");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
// Error
out["status"] = curl_easy_strerror(res);
logfmt(logINFO, "ERROR: %s", out["status"].c_str());
ret = PHP_API_BAD_PARAM;
} else {
logfmt(logINFO, "%lu bytes retrieved\n", (long) chunk.size);
data = (const char *) chunk.memory;
istringstream buffer(data);
string temp, key, val;
size_t found;
while (std::getline(buffer, temp)) {
logfmt(logINFO, "line: %s", temp.c_str());
found = temp.find_first_of("=");
key = temp.substr(0, found);
val = temp.substr(found + 1);
out[key] = base64_decode(val);
logfmt(logINFO, "'%s' => '%s'", key.c_str(), out[key].c_str());
}
ret = PHP_API_OK;
}
curl_easy_cleanup(curl);
if (chunk.memory) {
free(chunk.memory);
}
}
curl_global_cleanup();
logfmt(logINFO, "/long DeliverMobilseEtisalat(CVars in, CVars &out)");
return ret;
}
/*
void TeleSignAddJob(const char *CustomerId, const char *AutheticationId, const char *CountryCode, const char *PhoneNumber, const char *PIN) {
// I make sure that headerlist is erased before rebuilding it with the soap function
curl_slist_free_all(headerlist);
headerlist = curl_slist_append(headerlist, "Host: www.telesign.com");
headerlist = curl_slist_append(headerlist, "Content-Type: text/xml");
headerlist = curl_slist_append(headerlist, "SOAPAction: \"https://www.telesign.com/api/RequestCALL\"");
sprintf(TeleSignSoapReq, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\
<soap:Body>\
<RequestCALL xmlns=\"https://www.telesign.com/api/\">\
<CustomerID>%s</CustomerID>\
<AuthenticationID>%s</AuthenticationID>\
<CountryCode>%s</CountryCode>\
<PhoneNumber>%s</PhoneNumber>\
<VerificationCode>%s</VerificationCode>\
<RedialCount>1</RedialCount>\
</RequestCALL>\
</soap:Body>\
</soap:Envelope>", CustomerId, AutheticationId, CountryCode, PhoneNumber, PIN);
//FILE_LOG(logINFO) << TeleSignSoapReq;
curl_easy_setopt(ch, CURLOPT_POSTFIELDS, TeleSignSoapReq);
curl_easy_setopt(ch, CURLOPT_HTTPHEADER, headerlist);
curl_easy_perform(ch);
}
*/
/*
* vi:ts=2
*/