/* * Re-escape SMASI ASCII representation of binary data with the * original binary data octet string. * XXX this may be done by the internal parser routines too. */ static void decode_binary_data(Octstr *data) { long pos = 0; while (pos < octstr_len(data)) { int check = octstr_get_char(data, pos); if (check == ':') { Octstr *byte; int msb = octstr_get_char(data, pos + 1); int lsb = octstr_get_char(data, pos + 2); if (msb != -1 && lsb != -1) { byte = octstr_create(""); octstr_append_char(byte, msb); octstr_append_char(byte, lsb); if (octstr_hex_to_binary(byte) != -1) { /* Do inplace unescaping. */ octstr_delete(data, pos, 3); octstr_insert(data, byte, pos); } else { error(0, "Malformed binary encoded data."); } octstr_destroy(byte); } } pos++; } }
int main(int argc, char **argv) { Octstr *data, *filename, *hex; gwlib_init(); get_and_set_debugs(argc, argv, NULL); if (argc < 2) panic(0, "Syntax: %s <file>\n", argv[0]); filename = octstr_create(argv[1]); data = octstr_read_file(octstr_get_cstr(filename)); if (data == NULL) panic(0, "Cannot read file."); /* * We test if this is a text/plain file with hex values in it. * Therefore copy the data and trail off any CR and LF from * beginning and end and test if the result is only hex chars. * If yes, then convert to binary before dumping. */ hex = octstr_duplicate(data); octstr_strip_crlfs(hex); if (octstr_is_all_hex(hex)) { debug("",0,"Trying to converting from hex to binary."); if (octstr_hex_to_binary(hex) == 0) { FILE *f = fopen(argv[2], "w"); debug("",0,"Convertion was successfull. Writing binary content to file `%s'", argv[2]); octstr_destroy(data); data = octstr_duplicate(hex); octstr_print(f, data); fclose(f); } else { debug("",0,"Failed to convert from hex?!"); } } debug("",0,"Dumping file `%s':", octstr_get_cstr(filename)); octstr_dump(data, 0); octstr_destroy(data); octstr_destroy(hex); gwlib_shutdown(); return 0; }
static Octstr *push_content_create(void) { Octstr *push_content, *wap_content; Octstr *wap_file_content, *pap_content, *pap_file_content, *bpos, *bcos; wap_content = NULL; push_content = NULL; if (use_hardcoded) { push_content = octstr_create("\r\n\r\n" "--asdlfkjiurwgasf\r\n" "Content-Type: application/xml\r\n\r\n" "<?xml version=\"1.0\"?>" "<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP//EN\"" " \"http://www.wapforum.org/DTD/pap_1.0.dtd\">" "<pap>" "<push-message push-id=\"[email protected]\"" " deliver-before-timestamp=\"2002-11-01T06:45:00Z\"" " deliver-after-timestamp=\"2000-02-27T06:45:00Z\"" " progress-notes-requested=\"false\">" "<address address-value=\"WAPPUSH=+358408676001/" "[email protected]\">" "</address>" "<quality-of-service" " priority=\"low\"" " delivery-method=\"unconfirmed\"" " network-required=\"true\"" " network=\"GSM\"" " bearer-required=\"true\"" " bearer=\"SMS\">" "</quality-of-service>" "</push-message>" "</pap>\r\n\r\n" "--asdlfkjiurwgasf\r\n" "Content-Type: text/vnd.wap.si\r\n\r\n" "<?xml version=\"1.0\"?>" "<!DOCTYPE si PUBLIC \"-//WAPFORUM//DTD SI 1.0//EN\" " " \"http://www.wapforum.org/DTD/si.dtd\">" "<si>" "<indication href=\"http://wap.iobox.fi\"" " si-id=\"[email protected]\"" " action=\"signal-high\"" " created=\"1999-06-25T15:23:15Z\"" " si-expires=\"2002-12-30T00:00:00Z\">" "Want to test a fetch?" "</indication>" "</si>\r\n\r\n" "--asdlfkjiurwgasf--\r\n\r\n" ""); } else { add_content_type(content_flag, &wap_content); add_content_transfer_encoding_type(content_transfer_encoding, wap_content); add_part_header(content_header, &wap_content); /* Read the content file. (To be pushed)*/ if ((wap_file_content = octstr_read_file(octstr_get_cstr(content_file))) == NULL) panic(0, "Stopping"); if (accept_binary) { octstr_delete_matching(wap_file_content, octstr_imm(" ")); octstr_delete_matching(wap_file_content, octstr_imm("\n")); octstr_delete_matching(wap_file_content, octstr_imm("\r")); if (!octstr_is_all_hex(wap_file_content)) panic(0, "non-hex chars in the content file, cannot continue"); octstr_hex_to_binary(wap_file_content); } transfer_encode(content_transfer_encoding, wap_file_content); octstr_append(wap_content, wap_file_content); octstr_destroy(wap_file_content); /* Read the control file. (To control pushing)*/ pap_content = octstr_format("%s", "Content-Type: application/xml"); add_delimiter(&pap_content); add_delimiter(&pap_content); if ((pap_file_content = octstr_read_file(octstr_get_cstr(pap_file))) == NULL) panic(0, "Stopping"); octstr_append(pap_content, pap_file_content); octstr_destroy(pap_file_content); if (wap_content == NULL || pap_content == NULL) panic(0, "Cannot open the push content files"); push_content = octstr_create(""); if (add_preamble) octstr_append(push_content, octstr_imm("the parser should discard this")); octstr_append(push_content, bpos = make_part_delimiter(octstr_imm(boundary))); /*octstr_append(push_content, octstr_imm("\r\n"));*/ /* Do we accept an additional * clrf ? */ octstr_append(push_content, pap_content); octstr_append(push_content, bpos); octstr_destroy(bpos); octstr_append(push_content, wap_content); octstr_append(push_content, bcos = make_close_delimiter(octstr_imm(boundary))); if (add_epilogue) { octstr_append(push_content, octstr_imm("\r\n")); octstr_append(push_content, octstr_imm("the parser should discard this")); } octstr_destroy(bcos); octstr_destroy(pap_content); octstr_destroy(wap_content); } return push_content; }
static Octstr *store_file_status(int status_type) { char *frmt; Octstr *ret, *key; unsigned long l; struct tm tm; Msg *msg; List *keys; char id[UUID_STR_LEN + 1]; ret = octstr_create(""); /* set the type based header */ if (status_type == BBSTATUS_HTML) { octstr_append_cstr(ret, "<table border=1>\n" "<tr><td>SMS ID</td><td>Type</td><td>Time</td><td>Sender</td><td>Receiver</td>" "<td>SMSC ID</td><td>BOX ID</td><td>UDH</td><td>Message</td>" "</tr>\n"); } else if (status_type == BBSTATUS_TEXT) { octstr_append_cstr(ret, "[SMS ID] [Type] [Time] [Sender] [Receiver] [SMSC ID] [BOX ID] [UDH] [Message]\n"); } /* if there is no store-file, then don't loop in sms_store */ if (filename == NULL) goto finish; keys = dict_keys(sms_dict); for (l = 0; l < gwlist_len(keys); l++) { key = gwlist_get(keys, l); msg = dict_get(sms_dict, key); if (msg == NULL) continue; if (msg_type(msg) == sms) { if (status_type == BBSTATUS_HTML) { frmt = "<tr><td>%s</td><td>%s</td>" "<td>%04d-%02d-%02d %02d:%02d:%02d</td>" "<td>%s</td><td>%s</td><td>%s</td>" "<td>%s</td><td>%s</td><td>%s</td></tr>\n"; } else if (status_type == BBSTATUS_XML) { frmt = "<message>\n\t<id>%s</id>\n\t<type>%s</type>\n\t" "<time>%04d-%02d-%02d %02d:%02d:%02d</time>\n\t" "<sender>%s</sender>\n\t" "<receiver>%s</receiver>\n\t<smsc-id>%s</smsc-id>\n\t" "<box-id>%s</box-id>\n\t" "<udh-data>%s</udh-data>\n\t<msg-data>%s</msg-data>\n\t" "</message>\n"; } else { frmt = "[%s] [%s] [%04d-%02d-%02d %02d:%02d:%02d] [%s] [%s] [%s] [%s] [%s] [%s]\n"; } /* transform the time value */ #if LOG_TIMESTAMP_LOCALTIME tm = gw_localtime(msg->sms.time); #else tm = gw_gmtime(msg->sms.time); #endif if (msg->sms.udhdata) octstr_binary_to_hex(msg->sms.udhdata, 1); if (msg->sms.msgdata && (msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2 || (msg->sms.coding == DC_UNDEF && msg->sms.udhdata))) octstr_binary_to_hex(msg->sms.msgdata, 1); uuid_unparse(msg->sms.id, id); octstr_format_append(ret, frmt, id, (msg->sms.sms_type == mo ? "MO" : msg->sms.sms_type == mt_push ? "MT-PUSH" : msg->sms.sms_type == mt_reply ? "MT-REPLY" : msg->sms.sms_type == report_mo ? "DLR-MO" : msg->sms.sms_type == report_mt ? "DLR-MT" : ""), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (msg->sms.sender ? octstr_get_cstr(msg->sms.sender) : ""), (msg->sms.receiver ? octstr_get_cstr(msg->sms.receiver) : ""), (msg->sms.smsc_id ? octstr_get_cstr(msg->sms.smsc_id) : ""), (msg->sms.boxc_id ? octstr_get_cstr(msg->sms.boxc_id) : ""), (msg->sms.udhdata ? octstr_get_cstr(msg->sms.udhdata) : ""), (msg->sms.msgdata ? octstr_get_cstr(msg->sms.msgdata) : "")); if (msg->sms.udhdata) octstr_hex_to_binary(msg->sms.udhdata); if (msg->sms.msgdata && (msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2 || (msg->sms.coding == DC_UNDEF && msg->sms.udhdata))) octstr_hex_to_binary(msg->sms.msgdata); } } gwlist_destroy(keys, octstr_destroy_item); finish: /* set the type based footer */ if (status_type == BBSTATUS_HTML) { octstr_append_cstr(ret,"</table>"); } return ret; }
int main (int argc, char **argv) { Octstr *message, *whoami; struct emimsg *emimsg; printf("/* This tool can decode an UCP/EMI packet. <*****@*****.**> */\n\n"); gwlib_init(); if (argc < 2) panic(0, "Syntax: %s <packet_without_STX/ETX>\n", argv[0]); message = octstr_format("\02%s\03", argv[1]); // fit the UCP specs. whoami = octstr_create("DECODE"); emimsg = get_fields(message, whoami); if (emimsg != NULL) { printf("\n"); printf("TRN \t%d\n", emimsg->trn); printf("TYPE \t%c (%s)\n", emimsg->or, emimsg->or == 'R' ? "Result" : "Operation"); printf("OPERATION\t%d (%s)\n", emimsg->ot, emi_typeop (emimsg->ot)); if (emimsg->ot == 01) { printf("E01_ADC \t%s\n", octstr_get_cstr(emimsg->fields[E01_ADC])); printf("E01_OADC \t%s\n", octstr_get_cstr(emimsg->fields[E01_OADC])); printf("E01_AC \t%s\n", octstr_get_cstr(emimsg->fields[E01_AC])); printf("E01_ADC \t%s\n", octstr_get_cstr(emimsg->fields[E01_ADC])); printf("E01_MT \t%s\n", octstr_get_cstr(emimsg->fields[E01_MT])); if (octstr_get_char(emimsg->fields[E01_MT], 0) == '3') { charset_gsm_to_latin1(emimsg->fields[E01_AMSG]); } printf("E01_AMSG \t%s\n", octstr_get_cstr(emimsg->fields[E01_AMSG])); } if ((emimsg->ot == 31 || (emimsg->ot >= 50 && emimsg->ot <= 60)) && emimsg->or == 'R' && (octstr_get_char(emimsg->fields[E50_ADC], 0) == 'A' || octstr_get_char(emimsg->fields[E50_ADC], 0) == 'N')) { printf("E%d_ACK \t%s\n", emimsg->ot, octstr_get_cstr(emimsg->fields[E50_ADC])); printf("E%d_SM \t%s\n", emimsg->ot, octstr_get_cstr(emimsg->fields[E50_OADC])); } if (emimsg->ot == 31 && emimsg->or == 'O') { printf("E50_ADC \t%s\n", octstr_get_cstr(emimsg->fields[E50_ADC])); printf("E50_PID \t%s\n", octstr_get_cstr(emimsg->fields[E50_OADC])); } if (emimsg->ot >= 50 && emimsg->ot <= 59 && octstr_get_char(emimsg->fields[E50_ADC], 0) != 'A' && octstr_get_char(emimsg->fields[E50_ADC], 0) != 'N') { printf("E50_ADC \t%s\n", octstr_get_cstr(emimsg->fields[E50_ADC])); printf("E50_OADC \t%s\n", octstr_get_cstr(emimsg->fields[E50_OADC])); printf("E50_AC \t%s\n", octstr_get_cstr(emimsg->fields[E50_AC])); printf("E50_NRQ \t%s\n", octstr_get_cstr(emimsg->fields[E50_NRQ])); printf("E50_NADC \t%s\n", octstr_get_cstr(emimsg->fields[E50_NADC])); printf("E50_NT \t%s\n", octstr_get_cstr(emimsg->fields[E50_NT])); printf("E50_NPID \t%s\n", octstr_get_cstr(emimsg->fields[E50_NPID])); printf("E50_LRQ \t%s\n", octstr_get_cstr(emimsg->fields[E50_LRQ])); printf("E50_LRAD \t%s\n", octstr_get_cstr(emimsg->fields[E50_LRAD])); printf("E50_LPID \t%s\n", octstr_get_cstr(emimsg->fields[E50_LPID])); printf("E50_DD \t%s\n", octstr_get_cstr(emimsg->fields[E50_DD])); printf("E50_DDT \t%s\n", octstr_get_cstr(emimsg->fields[E50_DDT])); printf("E50_VP \t%s\n", octstr_get_cstr(emimsg->fields[E50_VP])); printf("E50_RPID \t%s\n", octstr_get_cstr(emimsg->fields[E50_RPID])); printf("E50_SCTS \t%s\n", octstr_get_cstr(emimsg->fields[E50_SCTS])); printf("E50_DST \t%s\n", octstr_get_cstr(emimsg->fields[E50_DST])); printf("E50_RSN \t%s\n", octstr_get_cstr(emimsg->fields[E50_RSN])); printf("E50_DSCTS\t%s\n", octstr_get_cstr(emimsg->fields[E50_DSCTS])); printf("E50_MT \t%s\n", octstr_get_cstr(emimsg->fields[E50_MT])); printf("E50_NB \t%s\n", octstr_get_cstr(emimsg->fields[E50_NB])); printf("E50_NMSG \t%s\n", octstr_get_cstr(emimsg->fields[E50_NMSG])); if (emimsg->fields[E50_AMSG]) octstr_hex_to_binary (emimsg->fields[E50_AMSG]); if (octstr_get_char(emimsg->fields[E50_MT], 0) == '3') { charset_gsm_to_latin1(emimsg->fields[E50_AMSG]); } printf("E50_AMSG \t%s\n", octstr_get_cstr(emimsg->fields[E50_AMSG])); printf("E50_TMSG \t%s\n", octstr_get_cstr(emimsg->fields[E50_TMSG])); printf("E50_MMS \t%s\n", octstr_get_cstr(emimsg->fields[E50_MMS])); printf("E50_PR \t%s\n", octstr_get_cstr(emimsg->fields[E50_PR])); printf("E50_DCS \t%s\n", octstr_get_cstr(emimsg->fields[E50_DCS])); printf("E50_MCLS \t%s\n", octstr_get_cstr(emimsg->fields[E50_MCLS])); printf("E50_RPI \t%s\n", octstr_get_cstr(emimsg->fields[E50_RPI])); printf("E50_CPG \t%s\n", octstr_get_cstr(emimsg->fields[E50_CPG])); printf("E50_RPLY \t%s\n", octstr_get_cstr(emimsg->fields[E50_RPLY])); printf("E50_OTOA \t%s\n", octstr_get_cstr(emimsg->fields[E50_OTOA])); printf("E50_HPLMN\t%s\n", octstr_get_cstr(emimsg->fields[E50_HPLMN])); printf("E50_XSER \t%s\n", octstr_get_cstr(emimsg->fields[E50_XSER])); printf("E50_RES4 \t%s\n", octstr_get_cstr(emimsg->fields[E50_RES4])); printf("E50_RES5 \t%s\n", octstr_get_cstr(emimsg->fields[E50_RES5])); } if ((emimsg->ot == 60 || emimsg->ot == 61) && (octstr_get_char(emimsg->fields[E50_ADC], 0) != 'A' && octstr_get_char(emimsg->fields[E50_ADC], 0) != 'N')) { printf("E60_OADC \t%s\n", octstr_get_cstr(emimsg->fields[E60_OADC])); printf("E60_OTON \t%s\n", octstr_get_cstr(emimsg->fields[E60_OTON])); printf("E60_ONPI \t%s\n", octstr_get_cstr(emimsg->fields[E60_ONPI])); printf("E60_STYP \t%s\n", octstr_get_cstr(emimsg->fields[E60_STYP])); if (emimsg->fields[E60_PWD]) octstr_hex_to_binary (emimsg->fields[E60_PWD]); printf("E60_PWD \t%s\n", octstr_get_cstr(emimsg->fields[E60_PWD])); printf("E60_NPWD \t%s\n", octstr_get_cstr(emimsg->fields[E60_NPWD])); printf("E60_VERS \t%s\n", octstr_get_cstr(emimsg->fields[E60_VERS])); printf("E60_LADC \t%s\n", octstr_get_cstr(emimsg->fields[E60_LADC])); printf("E60_LTON \t%s\n", octstr_get_cstr(emimsg->fields[E60_LTON])); printf("E60_LNPI \t%s\n", octstr_get_cstr(emimsg->fields[E60_LNPI])); printf("E60_OPID \t%s\n", octstr_get_cstr(emimsg->fields[E60_OPID])); printf("E60_RES1 \t%s\n", octstr_get_cstr(emimsg->fields[E60_RES1])); } } octstr_destroy(message); octstr_destroy(whoami); gwlib_shutdown(); return 0; }