void bb_alog_sms(SMSCConn *conn, Msg *msg, const char *message) { Octstr *text = NULL; gw_assert(msg_type(msg) == sms); /* if we don't have any custom log, then use our "default" one */ if (custom_log_format == NULL) { Octstr *udh; const Octstr *cid; text = msg->sms.msgdata ? octstr_duplicate(msg->sms.msgdata) : octstr_create(""); udh = msg->sms.udhdata ? octstr_duplicate(msg->sms.udhdata) : octstr_create(""); if (conn && smscconn_id(conn)) cid = smscconn_id(conn); else if (conn && smscconn_name(conn)) cid = smscconn_name(conn); else if (msg->sms.smsc_id) cid = msg->sms.smsc_id; else cid = octstr_imm(""); if ((msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2)) octstr_binary_to_hex(text, 1); else octstr_convert_printable(text); octstr_binary_to_hex(udh, 1); alog("%s [SMSC:%s] [SVC:%s] [ACT:%s] [BINF:%s] [FID:%s] [META:%s] [from:%s] [to:%s] [flags:%ld:%ld:%ld:%ld:%ld] " "[msg:%ld:%s] [udh:%ld:%s]", message, octstr_get_cstr(cid), msg->sms.service ? octstr_get_cstr(msg->sms.service) : "", msg->sms.account ? octstr_get_cstr(msg->sms.account) : "", msg->sms.binfo ? octstr_get_cstr(msg->sms.binfo) : "", msg->sms.foreign_id ? octstr_get_cstr(msg->sms.foreign_id) : "", msg->sms.meta_data ? octstr_get_cstr(msg->sms.meta_data) : "", msg->sms.sender ? octstr_get_cstr(msg->sms.sender) : "", msg->sms.receiver ? octstr_get_cstr(msg->sms.receiver) : "", msg->sms.mclass, msg->sms.coding, msg->sms.mwi, msg->sms.compress, msg->sms.dlr_mask, octstr_len(msg->sms.msgdata), octstr_get_cstr(text), octstr_len(msg->sms.udhdata), octstr_get_cstr(udh) ); octstr_destroy(udh); } else { text = get_pattern(conn, msg, message); alog("%s", octstr_get_cstr(text)); } octstr_destroy(text); }
/* * Calculates a SHA1 hash digest, if openssl library was available * on the system, or a less secure MD5 hash digest. */ static Octstr *our_hash_func(Octstr *os) { #ifdef HAVE_LIBSSL /* use openssl's SHA1 */ EVP_MD_CTX mdctx; const EVP_MD *md; unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned int md_len; Octstr *ret; md = EVP_get_digestbyname("sha1"); EVP_MD_CTX_init(&mdctx); EVP_DigestInit_ex(&mdctx, md, NULL); EVP_DigestUpdate(&mdctx, octstr_get_cstr(os), octstr_len(os)); EVP_DigestFinal_ex(&mdctx, md_value, &md_len); EVP_MD_CTX_cleanup(&mdctx); ret = octstr_create_from_data((char*) md_value, md_len); octstr_binary_to_hex(ret, 0); return ret; #else /* fallback to our own MD5 if we don't have openssl available */ return md5digest(os); #endif }
static void status_cb(const Octstr *filename, void *d) { struct status *data = d; struct tm tm; char id[UUID_STR_LEN + 1]; Octstr *msg_s; Msg *msg; msg_s = octstr_read_file(octstr_get_cstr(filename)); msg = store_msg_unpack(msg_s); octstr_destroy(msg_s); if (msg == NULL) return; /* 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(data->status, data->format, 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) : "")); msg_destroy(msg); }
static struct cgwop *msg_to_cgwop(PrivData *privdata, Msg *msg, int trn) { struct cgwop *cgwop; Octstr *sender, *udh, *dta; cgwop = cgwop_create(CGW_OP_MSG, trn); if (cgwop == NULL) return NULL; if (!octstr_check_range(msg->sms.sender, 0, octstr_len(msg->sms.sender), gw_isdigit)) { /* If alphanumeric, simply prefix sender with '$' char */ sender = octstr_create("$"); octstr_append(sender, msg->sms.sender); } else sender = octstr_duplicate(msg->sms.sender); cgwop_add(cgwop, octstr_imm("app"), privdata->appname); cgwop_add(cgwop, octstr_imm("from"), sender); cgwop_add(cgwop, octstr_imm("to"), msg->sms.receiver); /* If delivery reports are asked, ask for them by adding a nrq:anything field */ if (DLR_IS_ENABLED_DEVICE(msg->sms.dlr_mask)) cgwop_add(cgwop, octstr_imm("nrq"), octstr_imm("true")); octstr_destroy(sender); if (octstr_len(msg->sms.udhdata)) { udh = octstr_duplicate(msg->sms.udhdata); octstr_binary_to_hex(udh, 1); cgwop_add(cgwop, octstr_imm("udh"), udh); octstr_destroy(udh); dta = octstr_duplicate(msg->sms.msgdata); octstr_binary_to_hex(dta, 1); cgwop_add(cgwop, octstr_imm("msg"), dta); cgwop_add(cgwop, octstr_imm("type"), octstr_imm("bin")); octstr_destroy(dta); } else { cgwop_add(cgwop, octstr_imm("msg"), cgw_encode_msg(msg->sms.msgdata)); } return cgwop; }
int main(int argc, char **argv) { Octstr *data, *filename, *mac, *key; unsigned char macbuf[EVP_MAX_MD_SIZE], *p; int mac_len; #ifdef HAVE_LIBSSL HMAC_CTX ctx; #endif gwlib_init(); get_and_set_debugs(argc, argv, NULL); if (argc < 3) panic(0, "Syntax: %s <key> <file>\n", argv[0]); key = octstr_create(argv[1]); filename = octstr_create(argv[2]); data = octstr_read_file(octstr_get_cstr(filename)); if (data == NULL) panic(0, "Cannot read file."); debug("",0,"Dumping file `%s':", octstr_get_cstr(filename)); octstr_dump(data, 0); #ifdef HAVE_LIBSSL HMAC_Init(&ctx, octstr_get_cstr(key), octstr_len(key), EVP_sha1()); p = HMAC(EVP_sha1(), octstr_get_cstr(key), octstr_len(key), octstr_get_cstr(data), octstr_len(data), macbuf, &mac_len); HMAC_cleanup(&ctx); #else macbuf[0] = 0; mac_len = 0; p = macbuf; warning(0, "No SSL support. Can't calculate HMAC value."); #endif mac = octstr_create_from_data(p, mac_len); octstr_binary_to_hex(mac, 0); debug("",0,"HMAC of file `%s' and key `%s' is:", octstr_get_cstr(filename), octstr_get_cstr(key)); octstr_dump(mac, 0); octstr_destroy(data); octstr_destroy(mac); octstr_destroy(key); gwlib_shutdown(); return 0; }
int main(int argc, char **argv) { Octstr *data, *enc; gwlib_init(); get_and_set_debugs(argc, argv, NULL); if (argc < 2) panic(0, "Syntax: %s <txt>\n", argv[0]); data = octstr_create(argv[1]); enc = md5(data); debug("",0,"MD5:"); octstr_dump(enc, 0); octstr_destroy(enc); enc = md5digest(data); debug("",0,"MD5 (digest):"); octstr_dump(enc, 0); #ifdef HAVE_LIBSSL OpenSSL_add_all_digests(); octstr_destroy(enc); enc = our_hash_func(data); debug("",0,"SHA1:"); octstr_dump(enc, 0); octstr_binary_to_hex(enc, 0); debug("",0,"SHA1 (digest):"); octstr_dump(enc, 0); #endif octstr_destroy(data); octstr_destroy(enc); gwlib_shutdown(); return 0; }
static Octstr *get_pattern(SMSCConn *conn, Msg *msg, const char *message) { int nextarg, j; struct tm tm; int num_words; List *word_list; Octstr *result; const char *pattern; Octstr *temp, *text, *udh; size_t n; long i; text = msg->sms.msgdata ? octstr_duplicate(msg->sms.msgdata) : octstr_create(""); udh = msg->sms.udhdata ? octstr_duplicate(msg->sms.udhdata) : octstr_create(""); if ((msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2)) octstr_binary_to_hex(text, 1); else octstr_convert_printable(text); octstr_binary_to_hex(udh, 1); if (octstr_len(text)) { word_list = octstr_split_words(text); num_words = gwlist_len(word_list); } else { word_list = gwlist_create(); num_words = 0; } result = octstr_create(""); pattern = octstr_get_cstr(custom_log_format); nextarg = 1; while(*pattern != '\0') { n = strcspn(pattern, "%"); octstr_append_data(result, pattern, n); pattern += n; gw_assert(*pattern == '%' || *pattern == '\0'); if (*pattern == '\0') break; pattern++; switch (*pattern) { case 'k': if (num_words <= 0) break; octstr_append(result, gwlist_get(word_list, 0)); break; case 's': if (nextarg >= num_words) break; octstr_append(result, gwlist_get(word_list, nextarg)); ++nextarg; break; case 'S': if (nextarg >= num_words) break; temp = gwlist_get(word_list, nextarg); for (i = 0; i < octstr_len(temp); ++i) { if (octstr_get_char(temp, i) == '*') octstr_append_char(result, '~'); else octstr_append_char(result, octstr_get_char(temp, i)); } ++nextarg; break; case 'r': for (j = nextarg; j < num_words; ++j) { if (j != nextarg) octstr_append_char(result, '+'); octstr_append(result, gwlist_get(word_list, j)); } break; case 'l': if (message) octstr_append_cstr(result, message); break; case 'P': if (msg->sms.receiver) octstr_append(result, msg->sms.receiver); break; case 'p': if (msg->sms.sender) octstr_append(result, msg->sms.sender); break; case 'a': for (j = 0; j < num_words; ++j) { if (j > 0) octstr_append_char(result, ' '); octstr_append(result, gwlist_get(word_list, j)); } break; case 'b': if (text) octstr_append(result, text); break; case 'L': octstr_append_decimal(result, octstr_len(msg->sms.msgdata)); break; case 't': tm = gw_gmtime(msg->sms.time); octstr_format_append(result, "%04d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); break; case 'T': if (msg->sms.time != MSG_PARAM_UNDEFINED) octstr_format_append(result, "%ld", msg->sms.time); break; case 'i': if (conn && smscconn_id(conn)) octstr_append(result, smscconn_id(conn)); else if (conn && smscconn_name(conn)) octstr_append(result, smscconn_name(conn)); else if (msg->sms.smsc_id) octstr_append(result, msg->sms.smsc_id); break; case 'I': if (!uuid_is_null(msg->sms.id)) { char id[UUID_STR_LEN + 1]; uuid_unparse(msg->sms.id, id); octstr_append_cstr(result, id); } break; case 'n': if (msg->sms.service != NULL) octstr_append(result, msg->sms.service); break; case 'd': octstr_append_decimal(result, msg->sms.dlr_mask); break; case 'c': octstr_append_decimal(result, msg->sms.coding); break; case 'm': octstr_append_decimal(result, msg->sms.mclass); break; case 'C': octstr_append_decimal(result, msg->sms.compress); break; case 'M': octstr_append_decimal(result, msg->sms.mwi); break; case 'u': if (octstr_len(udh)) { octstr_append(result, udh); } break; case 'U': octstr_append_decimal(result, octstr_len(msg->sms.udhdata)); break; case 'B': /* billing identifier/information */ if (octstr_len(msg->sms.binfo)) { octstr_append(result, msg->sms.binfo); } break; case 'A': /* account */ if (octstr_len(msg->sms.account)) { octstr_append(result, msg->sms.account); } break; /* XXX add more here if needed */ case '%': octstr_format_append(result, "%%"); break; default: warning(0, "Unknown escape code (%%%c) within custom-log-format, skipping!", *pattern); octstr_format_append(result, "%%%c", *pattern); break; } /* switch(...) */ pattern++; } /* for ... */ gwlist_destroy(word_list, octstr_destroy_item); return result; }
static int kannel_send_sms(SMSCConn *conn, Msg *sms) { ConnData *conndata = conn->data; Octstr *url; List *headers; if (!conndata->no_sep) { url = octstr_format("%S?" "username=%E&password=%E&to=%E&text=%E", conndata->send_url, conndata->username, conndata->password, sms->sms.receiver, sms->sms.msgdata); } else { Octstr *msgdata = octstr_duplicate(sms->sms.msgdata); octstr_binary_to_hex(msgdata, HEX_NOT_UPPERCASE); url = octstr_format("%S?" "username=%E&password=%E&to=%E&text=%S", conndata->send_url, conndata->username, conndata->password, sms->sms.receiver, msgdata); octstr_destroy(msgdata); } if (octstr_len(sms->sms.udhdata)) { if (!conndata->no_sep) { octstr_format_append(url, "&udh=%E", sms->sms.udhdata); } else { Octstr *udhdata = octstr_duplicate(sms->sms.udhdata); octstr_binary_to_hex(udhdata, HEX_NOT_UPPERCASE); octstr_format_append(url, "&udh=%S", udhdata); octstr_destroy(udhdata); } } if (!conndata->no_sender) octstr_format_append(url, "&from=%E", sms->sms.sender); if (sms->sms.mclass != MC_UNDEF) octstr_format_append(url, "&mclass=%d", sms->sms.mclass); if (!conndata->no_coding && sms->sms.coding != DC_UNDEF) octstr_format_append(url, "&coding=%d", sms->sms.coding); /* Obey that smsbox's sendsms HTTP interface is still expecting * WINDOWS-1252 as default charset, while all other internal parts * use UTF-8 as internal encoding. This means, when we pass a SMS * into a next Kannel instance, we need to let the smsbox know which * charset we have in use. * XXX TODO: change smsbox interface to use UTF-8 as default * in next major release. */ if (sms->sms.coding == DC_7BIT) octstr_append_cstr(url, "&charset=UTF-8"); else if (sms->sms.coding == DC_UCS2) octstr_append_cstr(url, "&charset=UTF-16BE"); if (sms->sms.mwi != MWI_UNDEF) octstr_format_append(url, "&mwi=%d", sms->sms.mwi); if (sms->sms.account) /* prepend account with local username */ octstr_format_append(url, "&account=%E:%E", sms->sms.service, sms->sms.account); if (sms->sms.binfo) /* prepend billing info */ octstr_format_append(url, "&binfo=%S", sms->sms.binfo); if (sms->sms.smsc_id) /* proxy the smsc-id to the next instance */ octstr_format_append(url, "&smsc=%S", sms->sms.smsc_id); if (conndata->dlr_url) { char id[UUID_STR_LEN + 1]; Octstr *mid; /* create Octstr from UUID */ uuid_unparse(sms->sms.id, id); mid = octstr_create(id); octstr_format_append(url, "&dlr-url=%E", conndata->dlr_url); /* encapsulate the original DLR-URL, escape code for DLR mask * and message id */ octstr_format_append(url, "%E%E%E%E%E", octstr_imm("&dlr-url="), sms->sms.dlr_url != NULL ? sms->sms.dlr_url : octstr_imm(""), octstr_imm("&dlr-mask=%d"), octstr_imm("&dlr-mid="), mid); octstr_destroy(mid); } else if (sms->sms.dlr_url != NULL) octstr_format_append(url, "&dlr-url=%E", sms->sms.dlr_url); if (sms->sms.dlr_mask != DLR_UNDEFINED && sms->sms.dlr_mask != DLR_NOTHING) octstr_format_append(url, "&dlr-mask=%d", sms->sms.dlr_mask); if (sms->sms.validity != SMS_PARAM_UNDEFINED) octstr_format_append(url, "&validity=%ld", (sms->sms.validity - time(NULL)) / 60); if (sms->sms.deferred != SMS_PARAM_UNDEFINED) octstr_format_append(url, "&deferred=%ld", (sms->sms.deferred - time(NULL)) / 60); headers = gwlist_create(); debug("smsc.http.kannel", 0, "HTTP[%s]: Start request", octstr_get_cstr(conn->id)); http_start_request(conndata->http_ref, HTTP_METHOD_GET, url, headers, NULL, 0, sms, NULL); octstr_destroy(url); http_destroy_headers(headers); return 0; }
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; }
/* * Adds a struct dlr_entry to the spool directory. */ static void dlr_spool_add(struct dlr_entry *dlr) { Msg *msg; Octstr *os, *hash, *dir, *filename; int fd; size_t wrc; #define MAP(to, from) \ to = from; \ from = NULL; /* create a common message structure to contain our values */ msg = msg_create(sms); msg->sms.sms_type = report_mt; MAP(msg->sms.smsc_id, dlr->smsc); MAP(msg->sms.foreign_id, dlr->timestamp); MAP(msg->sms.sender, dlr->source); MAP(msg->sms.receiver, dlr->destination); MAP(msg->sms.service, dlr->service); MAP(msg->sms.dlr_url, dlr->url); MAP(msg->sms.boxc_id, dlr->boxc_id); msg->sms.dlr_mask = dlr->mask; /* we got all values, destroy the structure now */ dlr_entry_destroy(dlr); /* create hash value */ os = octstr_duplicate(msg->sms.smsc_id); octstr_append(os, msg->sms.foreign_id); hash = our_hash_func(os); octstr_destroy(os); /* target directory */ dir = octstr_format("%S/%ld", spool_dir, octstr_hash_key(hash) % MAX_DIRS); if (mkdir(octstr_get_cstr(dir), S_IRUSR|S_IWUSR|S_IXUSR) == -1 && errno != EEXIST) { error(errno, "Could not create directory `%s'.", octstr_get_cstr(dir)); octstr_destroy(dir); octstr_destroy(hash); return; } /* * Now also add the hex value of the destination. * This will be the part we look later into while * DLR resolving. */ os = octstr_duplicate(msg->sms.receiver); octstr_binary_to_hex(os, 0); octstr_append(hash, os); octstr_destroy(os); /* target file */ filename = octstr_format("%S/%S", dir, hash); octstr_destroy(dir); octstr_destroy(hash); if ((fd = open(octstr_get_cstr(filename), O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_IWUSR)) == -1) { error(errno, "Could not open file `%s'.", octstr_get_cstr(filename)); octstr_destroy(filename); return; } /* pack and write content to file */ os = store_msg_pack(msg); msg_destroy(msg); for (wrc = 0; wrc < octstr_len(os); ) { size_t rc = write(fd, octstr_get_cstr(os) + wrc, octstr_len(os) - wrc); if (rc == -1) { /* remove file */ error(errno, "Could not write DLR message to `%s'.", octstr_get_cstr(filename)); close(fd); if (unlink(octstr_get_cstr(filename)) == -1) error(errno, "Oops, Could not remove failed file `%s'.", octstr_get_cstr(filename)); octstr_destroy(os); octstr_destroy(filename); return; } wrc += rc; } close(fd); counter_increase(counter); octstr_destroy(filename); octstr_destroy(os); }
/* * Our WSP headers: Push Id, PDU type, headers, charset. */ static int ota_pack_push_headers(Msg **msg, Octstr *mime_type, Octstr *sec, Octstr *pin, Octstr *ota_binary) { (*msg)->sms.msgdata = octstr_create(""); if (octstr_case_compare(mime_type, octstr_imm("settings")) == 0) { /* PUSH ID, PDU type, header length, value length */ octstr_append_from_hex((*msg)->sms.msgdata, "01062C1F2A"); /* MIME type for settings */ octstr_format_append((*msg)->sms.msgdata, "%s", "application/x-wap-prov.browser-settings"); octstr_append_from_hex((*msg)->sms.msgdata, "00"); /* charset UTF-8 */ octstr_append_from_hex((*msg)->sms.msgdata, "81EA"); } else if (octstr_case_compare(mime_type, octstr_imm("bookmarks")) == 0) { /* PUSH ID, PDU type, header length, value length */ octstr_append_from_hex((*msg)->sms.msgdata, "01062D1F2B"); /* MIME type for bookmarks */ octstr_format_append((*msg)->sms.msgdata, "%s", "application/x-wap-prov.browser-bookmarks"); octstr_append_from_hex((*msg)->sms.msgdata, "00"); /* charset UTF-8 */ octstr_append_from_hex((*msg)->sms.msgdata, "81EA"); } else if (octstr_case_compare(mime_type, octstr_imm("syncsettings")) == 0) { octstr_append_from_hex((*msg)->sms.msgdata, "3406060502020b81EA"); } else if (octstr_case_compare(mime_type, octstr_imm("oma-settings")) == 0) { Octstr *hdr = octstr_create(""), *mac; unsigned char *p; unsigned int mac_len; #ifdef HAVE_LIBSSL unsigned char macbuf[EVP_MAX_MD_SIZE]; #endif /* PUSH ID, PDU type, header length, value length */ octstr_append_from_hex((*msg)->sms.msgdata, "0106"); octstr_append_from_hex(hdr, "1f2db6"); /* Content type + other type + sec param */ wsp_pack_short_integer(hdr, 0x11); if (octstr_case_compare(sec, octstr_imm("netwpin")) == 0) wsp_pack_short_integer(hdr, 0x0); else if (octstr_case_compare(sec, octstr_imm("userpin")) == 0) wsp_pack_short_integer(hdr, 0x01); else if (octstr_case_compare(sec, octstr_imm("usernetwpin")) == 0) wsp_pack_short_integer(hdr, 0x02); else if (octstr_case_compare(sec, octstr_imm("userpinmac")) == 0) wsp_pack_short_integer(hdr, 0x03); /* XXXX Although not quite supported now.*/ else { warning(0, "OMA ProvCont: Unknown SEC pin type '%s'.", octstr_get_cstr(sec)); wsp_pack_short_integer(hdr, 0x01); } wsp_pack_short_integer(hdr, 0x12); /* MAC */ #ifdef HAVE_LIBSSL p = HMAC(EVP_sha1(), octstr_get_cstr(pin), octstr_len(pin), (unsigned char *)octstr_get_cstr(ota_binary), octstr_len(ota_binary), macbuf, &mac_len); #else mac_len = 0; p = ""; warning(0, "OMA ProvCont: No SSL Support, '%s' not supported!", octstr_get_cstr(mime_type)); #endif mac = octstr_create_from_data((char *)p, mac_len); octstr_binary_to_hex(mac, 1); octstr_append(hdr, mac); octstr_append_from_hex(hdr, "00"); octstr_append_uintvar((*msg)->sms.msgdata, octstr_len(hdr)); octstr_append((*msg)->sms.msgdata, hdr); octstr_destroy(hdr); octstr_destroy(mac); } else { warning(0, "Unknown MIME type in OTA request, type '%s' is unsupported.", octstr_get_cstr(mime_type)); return 0; } return 1; }