Send OneSignal push

This commit is contained in:
tokslaw7
2023-09-03 08:50:33 +00:00
parent 5cf5cb343c
commit ad6e54e652
2 changed files with 219 additions and 2 deletions
@@ -156,6 +156,8 @@ enum { PARTNER_STRIPE };
#define WRENCHBOARD_BKO_RESEND_OFFER 10025
#define WRENCHBOARD_BKO_SEND_PUSH 10035
#define WRENCHBOARD_BKO_END 10999
//**************************************************************
#define WRENCHBOARD_ACCOUNT_START 11000
+217 -2
View File
@@ -1,21 +1,49 @@
// Topup management toosl
#include "clog.h"
#include "cgi.h"
#include "cfg.h"
#include "input.h"
#include "wrenchboard_api.h"
#include "bko.h"
#include "account.h"
#include "email.h"
#include "safestring.h"
#include "hmac_sha2.h"
#include <string>
#include "pgsql.h"
#include "pgsql_wrapper.h"
#include "php.h"
#include <curl/curl.h>
#include "account.h"
long BkoCommonSessionCheck(long backoffice_id,long shop,long acc, const char *sessionid, int create );
long BkoResendOffer(CVars in, CVars &out);
long BkoSendPush(CVars in, CVars &out);
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;
}
long bko_calls(CVars in, CVars &out)
{
@@ -27,10 +55,14 @@ long bko_calls(CVars in, CVars &out)
case WRENCHBOARD_BKO_LOGIN:
return LoginBkoAdmin( in, out);
break;
case WRENCHBOARD_BKO_RESEND_OFFER:
return BkoResendOffer( in, out);
break;
case WRENCHBOARD_BKO_SEND_PUSH:
return BkoSendPush( in, out);
break;
}
logfmt( logINFO, "/bko_calls()" );
return 0;
@@ -54,6 +86,189 @@ long BkoResendOffer(CVars in, CVars &out)
return 0;
}
long BkoSendPush(CVars in, CVars &out)
{
logfmt( logINFO, "BkoSendPush()" );
long ret = PHP_API_BAD_PARAM;
REQ_STRING (in, "member_uid", 9, 49, "(.*)");
REQ_STRING (in, "push_text", 5, 249, "(.*)");
const char *onesignal_app_id = CfgReadChar("onesignal.app_id");
const char *onesignal_api_key = CfgReadChar("onesignal.api_key");
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 = "";
// https://www.php.net/hash_hmac
/*
zval algo, value, key, function_name;
ZVAL_STRING(&algo, "sha256");
ZVAL_STRING(&value, in["member_uid"].c_str());
ZVAL_STRING(&key, "YzczOTA0YmYtMjZkOC00MWFlLTgxMTYtNzNhMzg2NGY1Mjli");
ZVAL_STRING(&function_name, "hash_hmac");
// zval params = { algo, value, key };
zval params;
ZVAL_ARR(&params, zend_new_array(3));
int param_count = 3;
zval *retval_ptr;
// ZVAL_COPY(&params[0], &algo);
Z_TRY_ADDREF(algo);
add_index_zval(&params, 0, &algo);
Z_TRY_ADDREF(value);
add_index_zval(&params, 1, &value);
Z_TRY_ADDREF(key);
add_index_zval(&params, 2, &key);
*/
/*
if (call_user_function(CG(function_table), NULL, &function_name, retval_ptr, param_count, &params TSRMLS_CC) == SUCCESS) {
zend_string *member_uid_hash = Z_STR(*retval_ptr);
out["member_uid_hash"] = ZSTR_VAL(member_uid_hash);
}
zval_ptr_dtor(&value);
ZVAL_STRING(&value, in["push_text"].c_str());
//ZVAL_COPY(&params[1], &value);
Z_TRY_ADDREF(value);
add_index_zval(&params, 1, &value);
if (call_user_function(CG(function_table), NULL, &function_name, retval_ptr, param_count, &params TSRMLS_CC) == SUCCESS) {
zend_string *push_text_hash = Z_STR(*retval_ptr);
out["push_text_hash"] = ZSTR_VAL(push_text_hash);
}
*/
/*
zval_ptr_dtor(&algo);
zval_ptr_dtor(&value);
zval_ptr_dtor(&key);
zval_ptr_dtor(retval_ptr);
zval_ptr_dtor(&function_name);
//zval_ptr_dtor(params[0]);
//zval_ptr_dtor(params[1]);
//zval_ptr_dtor(params[2]);
//efree(params); // free container
zval_ptr_dtor(&params);
*/
//in["member_uid"] = "e30c6484-a70e-4d2b-9932-347999e81d7a";
//out["member_uid_hash"] = "71298987653243bc7b27f1e06b221a872203e7b78093e85c2a996f3b7885fde0";
//in["push_text"] = "English or Any Language Message";
//out["push_text_hash"] = "9ea7a84fdcc3682b60f2072536a24efedaa25fb5b4cad3a9c6c684533ce23967";
/*
hmac_sha256(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size);
*/
unsigned mac_size = SHA256_DIGEST_SIZE; // 256 / 8 = 32 bytes
unsigned char buffer[mac_size];
bzero(buffer, mac_size);
hmac_sha256((unsigned char*)onesignal_api_key, strlen(onesignal_api_key), (unsigned char*)in["member_uid"].c_str(), strlen(in["member_uid"].c_str()), buffer, mac_size);
std::size_t buffer_size = mac_size; // strlen((const char *)buffer);
char member_uid[buffer_size * 2 + 1];
bzero(member_uid, sizeof(member_uid));
for(int i = 0; i < buffer_size; i++)
{
sprintf(&member_uid[2*i], "%02X", buffer[i]);
}
out["member_uid_hash"] = member_uid;
logfmt(FLOG_MAX, "\nraw=%s\nencoder = %s\nout = %s\n", buffer, member_uid, out["member_uid_hash"].c_str());
bzero(buffer, mac_size);
hmac_sha256((unsigned char*)onesignal_api_key, strlen(onesignal_api_key), (unsigned char*)in["push_text"].c_str(), strlen(in["push_text"].c_str()), buffer, mac_size);
buffer_size = mac_size; // strlen((const char *)buffer);
char push_text[buffer_size * 2 + 1];
bzero(push_text, sizeof(push_text));
for(int i = 0; i < buffer_size; i++)
{
sprintf(&push_text[2*i], "%02X", buffer[i]);
}
out["push_text_hash"] = push_text;
logfmt(FLOG_MAX, "\nraw=%s\nencoded = %s\nout = %s\n", buffer, push_text, out["push_text_hash"].c_str());
data += "{\"include_aliases\": {\"external_id\": [\"";
data += in["member_uid"].c_str();
data += "\"],\"external_id_auth_hash\": [\"";
data += out["member_uid_hash"].c_str();
data += "\"]},\"target_channel\": \"push\",\"contents\": {\"en\": \"";
data += in["push_text"].c_str();
data += "\",\"en_auth_hash\": \"";
data += out["push_text_hash"].c_str();
data += "\"},\"app_id\": \"";
data += onesignal_app_id;
data += "\"}";
logfmt(logINFO, "DATA: %s", data.c_str());
string auth = "Authorization: Basic ";
auth += onesignal_api_key;
struct curl_slist *headerlist=NULL;
headerlist = curl_slist_append(headerlist, auth.c_str());
headerlist = curl_slist_append(headerlist, "accept: application/json");
headerlist = curl_slist_append(headerlist, "content-type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://onesignal.com/api/v1/notifications");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
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, val;
size_t found, found2;
while (std::getline(buffer, temp)) {
logfmt(logINFO, "line: %s", temp.c_str());
found = temp.find_first_of("\"id\":\"");
found2 = temp.find_first_of("\"", found + 7);
if (found > 0 && (found2 - found - 5) > 0) {
val = temp.substr(found + 8, found2 - found - 8);
out["onesignal_message_id"] = val;
logfmt(logINFO, "id => '%s'", out["onesignal_message_id"].c_str());
}
}
ret = PHP_API_OK;
}
curl_slist_free_all(headerlist);
curl_easy_cleanup(curl);
if (chunk.memory) {
free(chunk.memory);
}
}
curl_global_cleanup();
logfmt( logINFO, "/BkoSendPush()" );
return ret;
}
long LoginBkoAdmin(CVars in, CVars &out)
{
@@ -162,4 +377,4 @@ long BkoCommonSessionCheck(long backoffice_id,long shop,long acc, const char *se
);
*/
*/