Skip to content

Commit

Permalink
[SSJS] Renaming "control" cmd by "inlinepush"
Browse files Browse the repository at this point in the history
[SSJS] Add "registerHookBadCmd()" <= Handle unknown commands
[Core] Message queue/Connection are now managed like a "NEED_SESSID" command if the user give its sessid when it's not needed
  • Loading branch information
paraboul committed Oct 28, 2009
1 parent ec78521 commit 61edee5
Show file tree
Hide file tree
Showing 7 changed files with 150 additions and 43 deletions.
File renamed without changes.
77 changes: 59 additions & 18 deletions modules/libape-spidermonkey.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ static JSBool ape_sm_stub(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
typedef enum {
APE_EVENT,
APE_CMD,
APE_HOOK
APE_HOOK,
APE_BADCMD
} ape_sm_callback_t;

typedef struct _ape_sm_callback ape_sm_callback;
Expand Down Expand Up @@ -1087,7 +1088,7 @@ static unsigned int ape_sm_cmd_wrapper(callbackp *callbacki)

hl = JS_DefineObject(cx, cb, "http", NULL, NULL, 0);

for(hlines = callbacki->client->http.hlines; hlines != NULL; hlines = hlines->next) {
for (hlines = callbacki->client->http.hlines; hlines != NULL; hlines = hlines->next) {
s_tolower(hlines->key.val, hlines->key.len);
jval = STRING_TO_JSVAL(JS_NewStringCopyN(cx, hlines->value.val, hlines->value.len));
JS_SetProperty(cx, hl, hlines->key.val, &jval);
Expand Down Expand Up @@ -1125,6 +1126,38 @@ static unsigned int ape_sm_cmd_wrapper(callbackp *callbacki)
return (RETURN_NOTHING);
}

APE_JS_NATIVE(ape_sm_register_bad_cmd)
//{
ape_sm_callback *ascb;

ascb = xmalloc(sizeof(*ascb));

if (!JS_ConvertValue(cx, argv[0], JSTYPE_FUNCTION, &ascb->func)) {
free(ascb);
return JS_TRUE;
}
JS_AddRoot(cx, &ascb->func);

/* TODO : Effacer si déjà existant (RemoveRoot & co) */
ascb->next = NULL;
ascb->type = APE_BADCMD;
ascb->cx = cx;
ascb->callbackname = NULL;

if (asc->callbacks.head == NULL) {
asc->callbacks.head = ascb;
asc->callbacks.foot = ascb;
} else {
asc->callbacks.foot->next = ascb;
asc->callbacks.foot = ascb;
}

register_bad_cmd(ape_sm_cmd_wrapper, ascb, g_ape);

return JS_TRUE;

}

APE_JS_NATIVE(ape_sm_register_cmd)
//{
const char *cmd;
Expand All @@ -1150,7 +1183,6 @@ APE_JS_NATIVE(ape_sm_register_cmd)
}
JS_AddRoot(cx, &ascb->func);


/* TODO : Effacer si déjà existant (RemoveRoot & co) */
ascb->next = NULL;
ascb->type = APE_CMD;
Expand Down Expand Up @@ -1194,6 +1226,7 @@ APE_JS_NATIVE(ape_sm_hook_cmd)
}

if (!register_hook_cmd(cmd, ape_sm_cmd_wrapper, ascb, g_ape)) {
/* CMD doesn't exist */
free(ascb);
return JS_TRUE;
}
Expand Down Expand Up @@ -1341,7 +1374,7 @@ APE_JS_NATIVE(ape_sm_sha1_str)
}

for (i = 0; i < 20; i++) {
sprintf(output + (i*2), "%x", digest[i]);
sprintf(output + (i*2), "%02x", digest[i]);
}

*rval = STRING_TO_JSVAL(JS_NewStringCopyN(cx, output, 40));
Expand Down Expand Up @@ -1548,7 +1581,7 @@ APE_JS_NATIVE(ape_sm_set_timeout)

JS_AddRoot(cx, &params->func);

for(i = 0; i < argc-2; i++) {
for (i = 0; i < argc-2; i++) {
params->argv[i] = argv[i+2];
}

Expand Down Expand Up @@ -1582,7 +1615,7 @@ APE_JS_NATIVE(ape_sm_set_interval)

JS_AddRoot(cx, &params->func);

for(i = 0; i < argc-2; i++) {
for (i = 0; i < argc-2; i++) {
params->argv[i] = argv[i+2];
}

Expand Down Expand Up @@ -1794,6 +1827,7 @@ APE_JS_NATIVE(ape_sm_xorize)
static JSFunctionSpec ape_funcs[] = {
JS_FS("addEvent", ape_sm_addEvent, 2, 0, 0), /* Ape.addEvent('name', function() { }); */
JS_FS("registerCmd", ape_sm_register_cmd, 3, 0, 0),
JS_FS("registerHookBadCmd", ape_sm_register_bad_cmd, 1, 0, 0),
JS_FS("registerHookCmd", ape_sm_hook_cmd, 2, 0, 0),
JS_FS("log", ape_sm_echo, 1, 0, 0),/* Ape.echo('stdout\n'); */
JS_FS("HTTPRequest", ape_sm_http_request, 2, 0, 0),
Expand Down Expand Up @@ -1904,13 +1938,13 @@ static int process_cmd_return(JSContext *cx, jsval rval, callbackp *callbacki, a

JS_GetProperty(cx, op, "name", &rawname);
JS_GetProperty(cx, op, "data", &data);

if (rawname != JSVAL_VOID && JSVAL_IS_STRING(rawname) && data != JSVAL_VOID && JSVAL_IS_OBJECT(data)) {
json_item *rawdata = NULL;

if ((rawdata = jsobj_to_ape_json(cx, JSVAL_TO_OBJECT(data))) != NULL) {
RAW *newraw = forge_raw(JS_GetStringBytes(JSVAL_TO_STRING(rawname)), rawdata);

send_raw_inline(callbacki->client, callbacki->transport, newraw, g_ape);

return RETURN_NULL;
Expand Down Expand Up @@ -1953,7 +1987,7 @@ static int ape_fire_cmd(const char *name, JSObject *obj, JSObject *cb, callbackp
{
ape_sm_compiled *asc = ASMR->scripts;
jsval params[2];

if (asc == NULL) {
return RETURN_CONTINUE;
}
Expand All @@ -1964,11 +1998,12 @@ static int ape_fire_cmd(const char *name, JSObject *obj, JSObject *cb, callbackp
ape_sm_callback *cbk;

for (cbk = asc->callbacks.head; cbk != NULL; cbk = cbk->next) {
if (cbk->type == APE_CMD && strcasecmp(name, cbk->callbackname) == 0) {
if ((cbk->type == APE_CMD && strcasecmp(name, cbk->callbackname) == 0)) {
jsval rval;
if (JS_CallFunctionValue(cbk->cx, JS_GetGlobalObject(cbk->cx), (cbk->func), 2, params, &rval) == JS_FALSE) {
return RETURN_BAD_PARAMS;
}
return (cbk->type == APE_CMD ? RETURN_BAD_PARAMS : RETURN_BAD_CMD);
}

return process_cmd_return(cbk->cx, rval, callbacki, g_ape);
}
}
Expand All @@ -1980,21 +2015,27 @@ static int ape_fire_cmd(const char *name, JSObject *obj, JSObject *cb, callbackp
static int ape_fire_hook(ape_sm_callback *cbk, JSObject *obj, JSObject *cb, callbackp *callbacki, acetables *g_ape)
{
ape_sm_compiled *asc = ASMR->scripts;
jsval params[2];
jsval params[3];
jsval rval;
int flagret;

if (asc == NULL) {
return RETURN_CONTINUE;
}

params[0] = OBJECT_TO_JSVAL(obj);
params[1] = OBJECT_TO_JSVAL(cb);
if (cbk->type == APE_BADCMD) {
params[2] = STRING_TO_JSVAL(JS_NewStringCopyZ(cbk->cx, callbacki->cmd));
}

if (JS_CallFunctionValue(cbk->cx, JS_GetGlobalObject(cbk->cx), (cbk->func), (cbk->type == APE_BADCMD ? 3 : 2), params, &rval) == JS_FALSE) {
return (cbk->type != APE_BADCMD ? RETURN_BAD_PARAMS : RETURN_BAD_CMD);
}

flagret = process_cmd_return(cbk->cx, rval, callbacki, g_ape);

if (JS_CallFunctionValue(cbk->cx, JS_GetGlobalObject(cbk->cx), (cbk->func), 2, params, &rval) == JS_FALSE) {
return RETURN_BAD_PARAMS;
}
return process_cmd_return(cbk->cx, rval, callbacki, g_ape);

return (cbk->type == APE_BADCMD && flagret == RETURN_CONTINUE ? RETURN_BAD_CMD : flagret);
}

static void ape_fire_callback(const char *name, uintN argc, jsval *argv, acetables *g_ape)
Expand Down
17 changes: 14 additions & 3 deletions scripts/commands/inlinepush.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
Ape.registerCmd("control", false, function(params, infos) {
if (params.password == Ape.config("control.conf", "password")) {
var chan = Ape.getChannelByName(params.channel).pipe.sendRaw(params.raw, params.data);
Ape.registerCmd("inlinepush", false, function(params, infos) {
if (params.password == Ape.config("inlinepush.conf", "password")) {

if ($defined(params.channel) && $defined(params.data) && $defined(params.raw)) {
var chan = Ape.getChannelByName(params.channel);
if (!$defined(chan)) return ["401", "UNKNOWN_CHANNEL"];

chan.pipe.sendRaw(params.raw, params.data);

} else {
return 0;
}
} else {
return ["400", "BAD_PASSWORD"];
}
})
91 changes: 71 additions & 20 deletions src/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,24 @@ void register_cmd(const char *cmd, unsigned int (*func)(callbackp *), unsigned i

}

void register_bad_cmd(unsigned int (*func)(callbackp *), void *data, acetables *g_ape)
{
callback_hook *new_cmd;

new_cmd = xmalloc(sizeof(*new_cmd));

new_cmd->func = func;
new_cmd->next = g_ape->bad_cmd_callbacks;
new_cmd->data = data;

g_ape->bad_cmd_callbacks = new_cmd;

}

int register_hook_cmd(const char *cmd, unsigned int (*func)(callbackp *), void *data, acetables *g_ape)
{
callback_hook *hook;

if (hashtbl_seek(g_ape->hCallback, cmd) == NULL) {
return 0;
}
Expand All @@ -72,7 +86,9 @@ int register_hook_cmd(const char *cmd, unsigned int (*func)(callbackp *), void *
hook->next = g_ape->cmd_hook;
hook->func = func;
hook->data = data;

g_ape->cmd_hook = hook;

return 1;
}

Expand All @@ -96,11 +112,30 @@ void unregister_cmd(const char *cmd, acetables *g_ape)
hashtbl_erase(g_ape->hCallback, cmd);
}

static unsigned int handle_bad_cmd(callbackp *callbacki)
{
callback_hook *hook_bad;
int flagret;

for (hook_bad = callbacki->g_ape->bad_cmd_callbacks; hook_bad != NULL; hook_bad = hook_bad->next) {
callbacki->data = hook_bad->data;
if ((flagret = hook_bad->func(callbacki)) != RETURN_BAD_CMD) {
return flagret;
} else {
;
}
}
callbacki->data = NULL;

return RETURN_BAD_CMD;
}


unsigned int checkcmd(clientget *cget, transport_t transport, subuser **iuser, acetables *g_ape)
{
unsigned short int attach = 1;
callback *cmdback, tmpback = {NEED_NOTHING, handle_bad_cmd};

int attach = 1;
callback *cmdback;
json_item *ijson, *ojson, *rjson, *jchl;

unsigned int flag;
Expand All @@ -125,29 +160,23 @@ unsigned int checkcmd(clientget *cget, transport_t transport, subuser **iuser, a

rjson = json_lookup(ijson->jchild.child, "cmd");

if (rjson != NULL && rjson->jval.vu.str.value != NULL && (cmdback = (callback *)hashtbl_seek(g_ape->hCallback, rjson->jval.vu.str.value)) != NULL) {
if (rjson != NULL && rjson->jval.vu.str.value != NULL) {
callbackp cp;
cp.client = NULL;
cp.cmd = rjson->jval.vu.str.value;
cp.cmd = rjson->jval.vu.str.value;
cp.data = NULL;
cp.properties = NULL;
json_item *jsid;

switch(cmdback->need) {
case NEED_SESSID:
{
json_item *jsid;
if ((cmdback = (callback *)hashtbl_seek(g_ape->hCallback, rjson->jval.vu.str.value)) == NULL) {
cmdback = &tmpback;
}

if (guser == NULL && (jsid = json_lookup(ijson->jchild.child, "sessid")) != NULL && jsid->jval.vu.str.value != NULL) {
guser = seek_user_id(jsid->jval.vu.str.value, g_ape);
}
}
break;
case NEED_NOTHING:
//guser = NULL;
break;
if ((guser == NULL && (jsid = json_lookup(ijson->jchild.child, "sessid")) != NULL && jsid->jval.vu.str.value != NULL)) {
guser = seek_user_id(jsid->jval.vu.str.value, g_ape);
}
if (cmdback->need != NEED_NOTHING) {

if (cmdback->need != NEED_NOTHING || guser != NULL) { // We process the connection like a "NEED_SESSID" if the user provide its key

if (guser == NULL) {

Expand Down Expand Up @@ -255,6 +284,26 @@ unsigned int checkcmd(clientget *cget, transport_t transport, subuser **iuser, a
send_raw_inline(cget->client, transport, newraw, g_ape);
}
//guser = NULL;
} else if (flag & RETURN_BAD_CMD) {
RAW *newraw;
json_item *jlist = json_new_object();

if (cp.chl) {
json_set_property_intN(jlist, "chl", 3, cp.chl);
}
json_set_property_strZ(jlist, "code", "003");
json_set_property_strZ(jlist, "value", "BAD_CMD");

newraw = forge_raw(RAW_ERR, jlist);

if (cp.call_user != NULL) {
if (sub == NULL) {
sub = getsubuser(guser, cget->host);
}
post_raw_sub(newraw, sub, g_ape);
} else {
send_raw_inline(cget->client, transport, newraw, g_ape);
}
}

if (guser != NULL) {
Expand All @@ -279,11 +328,12 @@ unsigned int checkcmd(clientget *cget, transport_t transport, subuser **iuser, a
return (CONNECT_SHUTDOWN);
}
} else {

RAW *newraw;
json_item *jlist = json_new_object();

json_set_property_strZ(jlist, "code", "002");
json_set_property_strZ(jlist, "value", "BAD_CMD");
json_set_property_strZ(jlist, "code", "003");
json_set_property_strZ(jlist, "value", "NO_CMD");

newraw = forge_raw(RAW_ERR, jlist);

Expand All @@ -301,6 +351,7 @@ unsigned int checkcmd(clientget *cget, transport_t transport, subuser **iuser, a
return (CONNECT_SHUTDOWN);
}


unsigned int cmd_connect(callbackp *callbacki)
{
USERS *nuser;
Expand Down
3 changes: 2 additions & 1 deletion src/cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ void do_register(acetables *g_ape);
#define RETURN_NOTHING 0x10
#define RETURN_BAD_PARAMS 0x20
#define RETURN_CONTINUE 0x40
#define RETURN_BAD_CMD 0x80

typedef struct _callbackp callbackp;

Expand Down Expand Up @@ -125,7 +126,7 @@ unsigned int cmd_proxy_write(struct _callbackp *);
///////////////////////////////////////////////////////////////////////////////////////////////
void register_cmd(const char *cmd, unsigned int (*func)(callbackp *), unsigned int need, acetables *g_ape);
void unregister_cmd(const char *cmd, acetables *g_ape);

void register_bad_cmd(unsigned int (*func)(callbackp *), void *data, acetables *g_ape);
int register_hook_cmd(const char *cmd, unsigned int (*func)(callbackp *), void *data, acetables *g_ape);
int call_cmd_hook(const char *cmd, callbackp *cp, acetables *g_ape);
#endif
Expand Down
3 changes: 2 additions & 1 deletion src/entry.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ int main(int argc, char **argv)

g_ape->co = xmalloc(sizeof(*g_ape->co) * g_ape->basemem);
memset(g_ape->co, 0, sizeof(*g_ape->co) * g_ape->basemem);


g_ape->bad_cmd_callbacks = NULL;
g_ape->bufout = xmalloc(sizeof(struct _socks_bufout) * g_ape->basemem);

g_ape->timers.timers = NULL;
Expand Down
2 changes: 2 additions & 0 deletions src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ typedef struct _acetables

struct apeconfig *srv;

struct _callback_hook *bad_cmd_callbacks;

struct _callback_hook *cmd_hook;

struct _ape_transports transports;
Expand Down

0 comments on commit 61edee5

Please sign in to comment.