1
0
Fork 0

fixes to detokenizer, added detonizer func + adding of token to url

sent in notification
fixed issue with dlsym when using fink's dlopen
removed token comparison in fetch (i.e. rationalised use of fetch url parameters)
This commit is contained in:
bagyenda 2005-04-04 13:47:03 +00:00
parent 3a5ac7c59e
commit 17fc190e29
7 changed files with 101 additions and 46 deletions

View File

@ -31,9 +31,16 @@ static Octstr *mms_detokenize(Octstr * token)
return octstr_create("+45xxxxxx"); return octstr_create("+45xxxxxx");
} }
static Octstr *mms_gettoken(Octstr *msisdn)
{
/* Return the MSISDN matching the token as a new Octstr */
return octstr_create("yy");
}
/* The function itself. */ /* The function itself. */
MmsTokenize mms_detokenizefuncs = { MmsTokenize mms_detokenizefuncs = {
mms_detokenizer_init, mms_detokenizer_init,
mms_detokenize, mms_detokenize,
mms_gettoken,
mms_detokenize_fini mms_detokenize_fini
}; };

View File

@ -33,6 +33,11 @@ typedef struct MmsDetokenizerFuncStruct {
*/ */
Octstr *(*mms_detokenize)(Octstr * token); Octstr *(*mms_detokenize)(Octstr * token);
/* Given an msisdn, returns the token associated
* Return NULL on error, otherwise an Octstr
*/
Octstr *(*mms_gettoken)(Octstr *msisdn);
int (*mms_detokenizer_fini)(void); int (*mms_detokenizer_fini)(void);
} MmsDetokenizerFuncStruct; } MmsDetokenizerFuncStruct;

View File

@ -48,13 +48,24 @@ static Octstr *mms_detokenize(Octstr * token)
} }
pclose(fp); pclose(fp);
} }
info(0, "%s \"%s\", returned msisdn = %s",
fp ? "Called" : "Failed to call",
octstr_get_cstr(cmd),
msisdn ? octstr_get_cstr(msisdn) : "null");
octstr_destroy(cmd); octstr_destroy(cmd);
return msisdn; return msisdn;
} }
static Octstr *mms_gettoken(Octstr *msisdn)
{
/* Dummy. */
return octstr_create("y");
}
/* The function itself. */ /* The function itself. */
MmsDetokenizerFuncStruct mms_detokenizefuncs = { MmsDetokenizerFuncStruct mms_detokenizefuncs = {
mms_detokenizer_init, mms_detokenizer_init,
mms_detokenize, mms_detokenize,
mms_gettoken,
mms_detokenizer_fini mms_detokenizer_fini
}; };

View File

@ -38,6 +38,13 @@ static Octstr *cfg_getx(CfgGroup *grp, Octstr *item)
return v ? v : octstr_create(""); return v ? v : octstr_create("");
} }
/* We seem to require this on OSX */
#ifdef __APPLE__
#define SYMPREFIX ""
#else
#define SYMPREFIX ""
#endif
static void *load_module(CfgGroup *grp, char *config_key, char *symbolname) static void *load_module(CfgGroup *grp, char *config_key, char *symbolname)
{ {
Octstr *s; Octstr *s;
@ -47,8 +54,16 @@ static void *load_module(CfgGroup *grp, char *config_key, char *symbolname)
if (s) { if (s) {
void *x = dlopen(octstr_get_cstr(s), RTLD_LAZY); void *x = dlopen(octstr_get_cstr(s), RTLD_LAZY);
void *y = NULL; void *y = NULL;
#ifdef __APPLE__
char sbuf[512];
if (x == NULL || (y = dlsym(x, symbolname)) == NULL) sprintf(sbuf, "_%s", symbolname);
#endif;
if (x == NULL || ((y = dlsym(x, symbolname)) == NULL
#ifdef __APPLE__ /* fink version of dlsym has issues it seems. */
&& (y = dlsym(x, sbuf)) == NULL
#endif
))
panic(0, panic(0,
"Error, unable to load dynamic libary (%s): " "Error, unable to load dynamic libary (%s): "
@ -181,7 +196,7 @@ MmsBoxSettings *mms_load_mmsbox_settings(Cfg *cfg)
octstr_imm("billing-module-parameters")); octstr_imm("billing-module-parameters"));
/* Get and load the billing lib if any. */ /* Get and load the billing lib if any. */
if ((m->mms_billfuncs = load_module(grp, "billing-library", "mms_billfuncs"))) { if ((m->mms_billfuncs = load_module(grp, "billing-library", SYMPREFIX "mms_billfuncs"))) {
if (m->mms_billfuncs->mms_billingmodule_init == NULL || if (m->mms_billfuncs->mms_billingmodule_init == NULL ||
m->mms_billfuncs->mms_billmsg == NULL || m->mms_billfuncs->mms_billmsg == NULL ||
m->mms_billfuncs->mms_billingmodule_fini == NULL || m->mms_billfuncs->mms_billingmodule_fini == NULL ||
@ -196,7 +211,7 @@ MmsBoxSettings *mms_load_mmsbox_settings(Cfg *cfg)
octstr_imm("resolver-module-parameters")); octstr_imm("resolver-module-parameters"));
/* Get and load the resolver lib if any. */ /* Get and load the resolver lib if any. */
if ((m->mms_resolvefuncs = load_module(grp, "resolver-library", "mms_resolvefuncs"))) { if ((m->mms_resolvefuncs = load_module(grp, "resolver-library", SYMPREFIX "mms_resolvefuncs"))) {
if (m->mms_resolvefuncs->mms_resolvermodule_init == NULL || if (m->mms_resolvefuncs->mms_resolvermodule_init == NULL ||
m->mms_resolvefuncs->mms_resolve == NULL || m->mms_resolvefuncs->mms_resolve == NULL ||
m->mms_resolvefuncs->mms_resolvermodule_fini == NULL) m->mms_resolvefuncs->mms_resolvermodule_fini == NULL)
@ -209,9 +224,10 @@ MmsBoxSettings *mms_load_mmsbox_settings(Cfg *cfg)
m->detokenizer_params = cfg_getx(grp, octstr_imm("detokenizer-module-parameters")); m->detokenizer_params = cfg_getx(grp, octstr_imm("detokenizer-module-parameters"));
/* Get and load the detokenizer lib if any. */ /* Get and load the detokenizer lib if any. */
if ((m->mms_detokenizefuncs = load_module(grp, "detokenizer-library", "mms_detokenizefuncs"))) { if ((m->mms_detokenizefuncs = load_module(grp, "detokenizer-library", SYMPREFIX "mms_detokenizefuncs"))) {
if (m->mms_detokenizefuncs->mms_detokenizer_init == NULL || if (m->mms_detokenizefuncs->mms_detokenizer_init == NULL ||
m->mms_detokenizefuncs->mms_detokenize == NULL || m->mms_detokenizefuncs->mms_detokenize == NULL ||
m->mms_detokenizefuncs->mms_gettoken == NULL ||
m->mms_detokenizefuncs->mms_detokenizer_fini == NULL) m->mms_detokenizefuncs->mms_detokenizer_fini == NULL)
panic(0, "Missing or NULL functions in detokenizer module!"); panic(0, "Missing or NULL functions in detokenizer module!");
if (m->mms_detokenizefuncs->mms_detokenizer_init(octstr_get_cstr(m->detokenizer_params))) if (m->mms_detokenizefuncs->mms_detokenizer_init(octstr_get_cstr(m->detokenizer_params)))
@ -254,57 +270,65 @@ List *mms_proxy_relays(Cfg *cfg)
Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc, Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc,
Octstr *to,
MmsBoxSettings *settings) MmsBoxSettings *settings)
{ {
Octstr *url = octstr_create(""); Octstr *url = octstr_create("");
Octstr *host_alias = settings->host_alias; Octstr *host_alias = settings->host_alias;
Octstr *hstr; Octstr *hstr;
Octstr *endtoken, *x;
MmsDetokenizerFuncStruct *tfs = settings->mms_detokenizefuncs;
if (host_alias && octstr_len(host_alias) > 0) if (host_alias && octstr_len(host_alias) > 0)
hstr = octstr_duplicate(host_alias); hstr = octstr_duplicate(host_alias);
else else
hstr = octstr_format("%S:%d", hstr = octstr_format("%S:%d",
settings->hostname, settings->port); settings->hostname, settings->port);
octstr_format_append(url, "http://%S/%s@%d/%S", octstr_format_append(url, "http://%S/%s@%d",
hstr, hstr,
qf, loc, qf, loc);
token ? token : octstr_imm("x"));
if (tfs && tfs->mms_gettoken) { /* we append the recipient token or we append the message token. */
endtoken = tfs->mms_gettoken(to);
if (!endtoken) endtoken = octstr_create("x");
} else {
if (!token)
token = octstr_create("x");
else
endtoken = octstr_duplicate(token);
}
x = octstr_duplicate(endtoken); /* might be immutable, so we duplicate it. */
octstr_url_encode(x);
octstr_format_append(url, "/%S", x);
octstr_destroy(endtoken);
octstr_destroy(x);
octstr_destroy(hstr); octstr_destroy(hstr);
return url; return url;
} }
Octstr *mms_find_sender_msisdn(Octstr **send_url, List *request_hdrs, Octstr *msisdn_header, MmsDetokenizerFuncStruct* detokenizerfuncs) Octstr *mms_find_sender_msisdn(Octstr *send_url, List *request_hdrs, Octstr *msisdn_header,
MmsDetokenizerFuncStruct* detokenizerfuncs)
{ {
/* Either we have a WAP gateway header as defined, or we look for /* Either we have a WAP gateway header as defined, or we look for
* last part of url as our number. * last part of url, pass it to detokenizer lib if defined, and back comes our number.
*/ */
Octstr *xsend_url = *send_url;
Octstr *phonenum = http_header_value(request_hdrs, Octstr *phonenum = http_header_value(request_hdrs,
msisdn_header); msisdn_header);
if (!phonenum || octstr_len(phonenum) == 0) { if (!phonenum || octstr_len(phonenum) == 0) {
List *l = octstr_split(xsend_url, octstr_imm("/")); List *l = octstr_split(send_url, octstr_imm("/"));
if (l && list_len(l) > 1) { if (l && list_len(l) > 1) {
int i, n = list_len(l); int i, n = list_len(l);
Octstr *s; Octstr *s;
if (detokenizerfuncs) if (detokenizerfuncs)
phonenum = detokenizerfuncs->mms_detokenize(list_get(l, list_len(l) - 1)); phonenum = detokenizerfuncs->mms_detokenize(list_get(l, list_len(l) - 1));
else
phonenum = octstr_duplicate(list_get(l, list_len(l) - 1));
/* After getting it, remove it from the end... */
for (i = 0, s = octstr_create(""); i < n-1; i++) {
Octstr *p = list_get(l, i);
if (octstr_len(p) > 0)
octstr_format_append(s, "/%S", p);
}
octstr_destroy(*send_url);
*send_url = s;
} }
if (l) if (l)
list_destroy(l, (list_item_destructor_t *)octstr_destroy); list_destroy(l, (list_item_destructor_t *)octstr_destroy);

View File

@ -118,6 +118,7 @@ MmsBoxSettings *mms_load_mmsbox_settings(Cfg *cfg);
extern List *mms_proxy_relays(Cfg *cfg); extern List *mms_proxy_relays(Cfg *cfg);
extern Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc, extern Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc,
Octstr *to,
MmsBoxSettings *settings); MmsBoxSettings *settings);
extern Octstr *mms_maketransid(char *qf, Octstr *mmscname); extern Octstr *mms_maketransid(char *qf, Octstr *mmscname);
@ -127,7 +128,7 @@ extern Octstr *mms_getqf_fromtransid(Octstr *transid);
extern int mms_decodefetchurl(Octstr *fetch_url, extern int mms_decodefetchurl(Octstr *fetch_url,
Octstr **qf, Octstr **token, int *loc); Octstr **qf, Octstr **token, int *loc);
Octstr *mms_find_sender_msisdn(Octstr **send_url, List *request_hdrs, Octstr *msisdn_header, MmsDetokenizerFuncStruct *detokenizerfuncs); Octstr *mms_find_sender_msisdn(Octstr *send_url, List *request_hdrs, Octstr *msisdn_header, MmsDetokenizerFuncStruct *detokenizerfuncs);
Octstr *mms_find_sender_ip(List *request_hdrs, Octstr *ip_header, Octstr *ip, int *isv6); Octstr *mms_find_sender_ip(List *request_hdrs, Octstr *ip_header, Octstr *ip, int *isv6);
extern Octstr *mms_isodate(time_t t); extern Octstr *mms_isodate(time_t t);

View File

@ -365,6 +365,7 @@ static int sendNotify(MmsEnvelope *e)
/* To get here means we can send Ind. */ /* To get here means we can send Ind. */
url = mms_makefetchurl(e->qf.name, e->token, MMS_LOC_MQUEUE, url = mms_makefetchurl(e->qf.name, e->token, MMS_LOC_MQUEUE,
to,
settings); settings);
transid = mms_maketransid(e->qf.name, settings->host_alias); transid = mms_maketransid(e->qf.name, settings->host_alias);

View File

@ -143,7 +143,7 @@ int main(int argc, char *argv[])
/* Get the sender address. */ /* Get the sender address. */
h.base_client_addr = mms_find_sender_msisdn(&h.url, h.headers, settings->wap_gw_msisdn_header, settings->mms_detokenizefuncs); h.base_client_addr = mms_find_sender_msisdn(h.url, h.headers, settings->wap_gw_msisdn_header, settings->mms_detokenizefuncs);
if (!h.base_client_addr) { /* Set to IP sender... XXXX assumes ipv4 only for now*/ if (!h.base_client_addr) { /* Set to IP sender... XXXX assumes ipv4 only for now*/
if (settings->allow_ip_type) { if (settings->allow_ip_type) {
@ -156,11 +156,28 @@ int main(int argc, char *argv[])
} else } else
h.client_addr = NULL; h.client_addr = NULL;
} else { } else if (octstr_search_char(h.base_client_addr, '.', 0) >= 0 ||
octstr_search_char(h.base_client_addr, ':', 0) >= 0) { /* We got back an IP address above, so normalise. */
if (octstr_case_search(h.base_client_addr, octstr_imm("TYPE="),0) < 0)
h.client_addr = octstr_format("%S/TYPE=IPv%s", h.base_client_addr,
octstr_search_char(h.base_client_addr, ':', 0) >= 0 ? "6" : "4");
else
h.client_addr = octstr_duplicate(h.base_client_addr);
} else { /* A bare number, normalise it. */
normalize_number(octstr_get_cstr(settings->unified_prefix), &h.base_client_addr); normalize_number(octstr_get_cstr(settings->unified_prefix), &h.base_client_addr);
h.client_addr = octstr_format("%S/TYPE=PLMN", h.base_client_addr); if (octstr_case_search(h.base_client_addr, octstr_imm("TYPE="),0) < 0)
h.client_addr = octstr_format("%S/TYPE=PLMN", h.base_client_addr);
else
h.client_addr = octstr_duplicate(h.base_client_addr);
} }
debug("mmsproxy", 0,
" Request, ip=%s, base_client_addr=%s, client_addr=%s ",
h.ip ? octstr_get_cstr(h.ip) : "",
h.base_client_addr ? octstr_get_cstr(h.base_client_addr) : "",
h.client_addr ? octstr_get_cstr(h.client_addr) : "");
/* Dump headers, url etc. */ /* Dump headers, url etc. */
#if 0 #if 0
http_header_dump(h.headers); http_header_dump(h.headers);
@ -296,17 +313,6 @@ void fetchmms_proxy(MmsHTTPClientInfo *h)
(e) ? e->from : h->client_addr, menc); (e) ? e->from : h->client_addr, menc);
s = mms_tobinary(mr); s = mms_tobinary(mr);
if (loc == MMS_LOC_MQUEUE)
if ((token == NULL && e->token != NULL) ||
(e->token == NULL && token != NULL) ||
(octstr_compare(e->token, token) != 0)) {
error(0, "MMS Fetch interface: token mismatch, did client mod the fetch url?? "
" env=%s for request url (%s) from %s!",
octstr_get_cstr(qf), octstr_get_cstr(h->url), octstr_get_cstr(h->ip));
goto failed;
}
if (!m) { if (!m) {
error(0, "MMS Fetch interface: Failed to get message, url=%s, loc=%d from %s!", error(0, "MMS Fetch interface: Failed to get message, url=%s, loc=%d from %s!",
octstr_get_cstr(h->url), loc, octstr_get_cstr(h->ip)); octstr_get_cstr(h->url), loc, octstr_get_cstr(h->ip));
@ -499,7 +505,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
goto done; goto done;
} }
m = mms_frombinary(h->body, h->client_addr ? h->client_addr : octstr_imm("") ); m = mms_frombinary(h->body, h->client_addr ? h->client_addr : octstr_imm("anon@anon"));
if (!m) { if (!m) {
http_header_add(rh, "Content-Type", "text/plain"); http_header_add(rh, "Content-Type", "text/plain");
@ -566,7 +572,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
/* XXX perhaps qualify errors better? */ /* XXX perhaps qualify errors better? */
mmbox_store_status = sdf ? "Success" : "Error-permanent-failure"; mmbox_store_status = sdf ? "Success" : "Error-permanent-failure";
if (sdf) if (sdf)
mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL, MMS_LOC_MMBOX, settings); mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL, MMS_LOC_MMBOX, from, settings);
} }
if (x) if (x)
@ -799,7 +805,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
mmbox_store_status = sdf ? "Success" : "Error-permanent-failure"; mmbox_store_status = sdf ? "Success" : "Error-permanent-failure";
if (sdf) if (sdf)
mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL, mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL,
MMS_LOC_MMBOX, settings); MMS_LOC_MMBOX, from, settings);
} else { /* otherwise simply mod it. */ } else { /* otherwise simply mod it. */
int xret; int xret;
@ -812,7 +818,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
mmbox_store_status = (xret == 0) ? "Success" : "Error-permanent-failure"; mmbox_store_status = (xret == 0) ? "Success" : "Error-permanent-failure";
if (xret == 0) if (xret == 0)
mmbox_loc = mms_makefetchurl(octstr_get_cstr(qf), NULL, mmbox_loc = mms_makefetchurl(octstr_get_cstr(qf), NULL,
MMS_LOC_MMBOX, settings); MMS_LOC_MMBOX, from, settings);
} }
} }
@ -1110,7 +1116,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
mmbox_store_status = sdf ? "Success" : "Error-permanent-failure"; mmbox_store_status = sdf ? "Success" : "Error-permanent-failure";
if (sdf) if (sdf)
mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL, mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL,
MMS_LOC_MMBOX, settings); MMS_LOC_MMBOX, h->client_addr, settings);
} else { /* it is in mmbox, just update. */ } else { /* it is in mmbox, just update. */
int xret; int xret;
@ -1124,7 +1130,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
mmbox_store_status = (xret == 0) ? "Success" : "Error-permanent-failure"; mmbox_store_status = (xret == 0) ? "Success" : "Error-permanent-failure";
if (xret == 0) if (xret == 0)
mmbox_loc = mms_makefetchurl(octstr_get_cstr(qf), NULL, mmbox_loc = mms_makefetchurl(octstr_get_cstr(qf), NULL,
MMS_LOC_MMBOX, settings); MMS_LOC_MMBOX, h->client_addr, settings);
} }
@ -1226,7 +1232,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
mmbox_store_status = sdf ? "Success" : "Error-permanent-failure"; mmbox_store_status = sdf ? "Success" : "Error-permanent-failure";
if (sdf) if (sdf)
mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL, mmbox_loc = mms_makefetchurl(octstr_get_cstr(sdf), NULL,
MMS_LOC_MMBOX, settings); MMS_LOC_MMBOX, h->client_addr, settings);
if (mmbox_loc) { if (mmbox_loc) {
mresp = mms_storeconf("Success", mresp = mms_storeconf("Success",
@ -1446,7 +1452,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
Octstr *sdf = list_get(msgrefs, i); Octstr *sdf = list_get(msgrefs, i);
list_append(msglocs, list_append(msglocs,
mms_makefetchurl(octstr_get_cstr(sdf), mms_makefetchurl(octstr_get_cstr(sdf),
NULL, MMS_LOC_MMBOX, settings)); NULL, MMS_LOC_MMBOX, h->client_addr, settings));
} }
} else /* Profile not loaded... */ } else /* Profile not loaded... */
err = "Error-transient-network-problem"; err = "Error-transient-network-problem";