// Topup management toosl #include "clog.h" #include "cgi.h" #include "input.h" #include "mermsemr_api.h" #include "safestring.h" #include #include "pgsql.h" #include "pgsql_wrapper.h" #include #include "medTEmails.h" /* -- */ #include "function_members.h" #include "providers.h" #include "function_members.h" long provider_login(CVars in, CVars &out); long PracticeLogin(CVars in, CVars &out); long PracticeSessionCheck(long practice_id, long practice_users_id, const char *sessionid, int create); long providers_call(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[20]; logfmt(logINFO, "ERROR CALL long providers_call(CVars in, CVars &out)"); try { REQ_LONG(in, "action", 0, -1); switch (in["action"].Long()) { case MERMS_PROVIDERS_LOGIN: return provider_login(in, out); break; case EXISTING_CARD: REQ_LONG(in, "paymentid", 0, -1); // now we have to make sure the payment id is valid for this customer break; case INVOICED: const PGresult *res = pgsql_query("SELECT * FROM members WHERE invoiced =1 AND id=%lu", in["member_id"].Long()); if (res != NULL && pgsql_num_rows(res) > 0) { ret = PHP_API_OK; } else { out["error_status"] = "user not authorized to use invoice"; } break; } } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long providers_call(CVars in, CVars &out)"); } return ret; } long provider_login(CVars in, CVars &out) { long ret = -1; try{ REQ_STRING(in, "username", 2, 49, "(.*)"); REQ_STRING(in, "pass", 2, 49, "(.*)"); if ( load_db_record(out, "SELECT p.name AS practice_name,u.*,u.id AS user_id FROM practice_users u LEFT JOIN practice p ON p.id = u.practice_id WHERE u.id = 1 ") > 0 ){ ret = PracticeLogin( in, out ); } } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long provider_login(CVars in, CVars &out)"); } return ret; } long PracticeLogin(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; try { REQ_STRING(in, "username", 2, 49, "(.*)"); REQ_STRING(in, "pass", 2, 49, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); ret = load_db_record(out, "SELECT UPPER( md5( now()::text) ) AS sessionid,m.*,m.*,m.id AS practice_users_id FROM practice_users m \ WHERE m.status=1 AND LOWER(m.username)=LOWER('%s') AND m.password= md5('%s')", in["username"].c_str(), in["pass"].c_str()); if (ret && out["practice_users_id"].Long() > 0) { // remove all existing session pgsql_exec("DELETE FROM practice_users_session WHERE practice_users_id=%ld ", out["practice_users_id"].Long()); // Create New Session Now if (PracticeSessionCheck(out["practice_id"].Long(), out["practice_users_id"].Long(),out["sessionid"].c_str(), 1) > 0) { out["stauts"] = "OK"; /*LOAD THE SESSION INTO OUT now */ load_db_record(out, "SELECT session FROM practice_users_session WHERE practice_users_id=%lu ORDER BY id DESC LIMIT 1", out["practice_users_id"].Long()); provider_email_calls(in["action"].Long(), in, out); //=============================================================================================================================== pgsql_query("UPDATE practice_users SET last_login = now() WHERE id = %lu", out["practice_users_id"].Long()); // account_email(ACCOUNT_LOGIN_ALERT,out,out); // ALERT CUSTOMER OF LOGIN ret = PHP_LOGIN_OK; } else { out["status"] = "Practice Session Check Failed"; } } else { out["status_message"] = "Invalid Username/Password"; } } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long PracticeLogin(CVars in, CVars &out)"); } return ret; } long PracticeSessionCheck(long practice_id, long practice_users_id, const char *sessionid, int create) { logfmt(logINFO, "long PracticeSessionCheck(long uid, const char *sessionid, int create )"); // Sanity check long session_expired_minutes = 15; // load in the global if (practice_users_id < 1 || sessionid == NULL || strlen(sessionid) < 4) { return -1L; // Invalif parameters } logfmt(logINFO, "#######-#########-A"); // Clean old sessions if (create == 1) // Clean Previous session by force { pgsql_exec("DELETE FROM practice_users_session WHERE practice_user_id=%ld", practice_users_id); } logfmt(logINFO, "#######-#########-B"); pgsql_exec("DELETE FROM practice_users_session WHERE practice_user_id=%ld AND updated < (now() - interval '%lu minutes')", practice_users_id, session_expired_minutes); // Update/check existing session if (create == 0) { pgsql_exec("UPDATE practice_users_session SET updated=NOW() WHERE practice_users_id=%ld AND session='%s'", practice_users_id, sessionid); const PGresult *res = pgsql_query("SELECT * FROM practice_users_session WHERE practice_users_id=%ld AND session='%s'", practice_users_id, sessionid); if (res != NULL && pgsql_num_rows(res) > 0) { logfmt(logINFO, "VALID SESSION *****"); return 1L; // Session updated } else { logfmt(logINFO, "INVALID SESSION *****"); //INVALID SESSION DETECTED return -1L; // Invalid parameters } } if (create > 0) { // Check session i? const PGresult *res = pgsql_query("SELECT * FROM practice_users_session WHERE practice_user_id=%ld AND session<>'%s'", practice_users_id, 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 practice_users_session WHERE practice_user_id=%lu AND session='%s'", practice_users_id, sessionid) > 0) { pgsql_exec("UPDATE practice_users_session SET updated=NOW() WHERE practice_user_id=%ld AND session='%s'", practice_users_id, sessionid); return sess["id"].Long(); } // Create a new session const char * loc = getenv("REMOTE_ADDR"); sess["loc"] = loc; sess["loc"].set_valid(true); sess["practice_id"] = practice_id; sess["practice_id"].set_valid(true); sess["practice_user_id"] = practice_users_id; sess["practice_user_id"].set_valid(true); sess["session"] = sessionid; sess["session"].set_valid(true); long sid = insert_db_record(DBS_VALID, "practice_users_session", "practice_users_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 PracticeSessionCheck(long uid, const char *sessionid, int create )"); return 0L; // No route }