00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 #include <string.h>
00073
00074 #include "gwlib/gwlib.h"
00075
00076 #ifdef HAVE_LIBSSL
00077 #include <openssl/hmac.h>
00078 #endif
00079
00080 #include "msg.h"
00081 #include "sms.h"
00082 #include "ota_prov.h"
00083 #include "ota_prov_attr.h"
00084 #include "ota_compiler.h"
00085
00086 #include "wap/wsp_headers.h"
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 static void ota_pack_udh(Msg **msg, Octstr *doc_type)
00100 {
00101 (*msg)->sms.udhdata = octstr_create("");
00102 if (octstr_case_compare(doc_type, octstr_imm("oma-settings")) == 0)
00103 octstr_append_from_hex((*msg)->sms.udhdata, "0605040B840B84");
00104 else if (octstr_case_compare(doc_type, octstr_imm("syncsettings")) == 0) {
00105 octstr_append_from_hex((*msg)->sms.udhdata, "060504C34CC002");
00106 } else
00107 octstr_append_from_hex((*msg)->sms.udhdata, "060504C34FC002");
00108 }
00109
00110
00111
00112
00113
00114 static int ota_pack_push_headers(Msg **msg, Octstr *mime_type, Octstr *sec,
00115 Octstr *pin, Octstr *ota_binary)
00116 {
00117 (*msg)->sms.msgdata = octstr_create("");
00118 if (octstr_case_compare(mime_type, octstr_imm("settings")) == 0) {
00119
00120
00121 octstr_append_from_hex((*msg)->sms.msgdata, "01062C1F2A");
00122
00123 octstr_format_append((*msg)->sms.msgdata, "%s",
00124 "application/x-wap-prov.browser-settings");
00125 octstr_append_from_hex((*msg)->sms.msgdata, "00");
00126
00127 octstr_append_from_hex((*msg)->sms.msgdata, "81EA");
00128
00129 } else if (octstr_case_compare(mime_type, octstr_imm("bookmarks")) == 0) {
00130
00131
00132 octstr_append_from_hex((*msg)->sms.msgdata, "01062D1F2B");
00133
00134 octstr_format_append((*msg)->sms.msgdata, "%s",
00135 "application/x-wap-prov.browser-bookmarks");
00136 octstr_append_from_hex((*msg)->sms.msgdata, "00");
00137
00138 octstr_append_from_hex((*msg)->sms.msgdata, "81EA");
00139
00140 } else if (octstr_case_compare(mime_type, octstr_imm("syncsettings")) == 0) {
00141
00142 octstr_append_from_hex((*msg)->sms.msgdata, "3406060502020b81EA");
00143
00144 } else if (octstr_case_compare(mime_type, octstr_imm("oma-settings")) == 0) {
00145 Octstr *hdr = octstr_create(""), *mac;
00146 unsigned char *p;
00147 unsigned int mac_len;
00148 #ifdef HAVE_LIBSSL
00149 unsigned char macbuf[EVP_MAX_MD_SIZE];
00150 #endif
00151
00152
00153 octstr_append_from_hex((*msg)->sms.msgdata, "0106");
00154
00155 octstr_append_from_hex(hdr, "1f2db6");
00156 wsp_pack_short_integer(hdr, 0x11);
00157 if (octstr_case_compare(sec, octstr_imm("netwpin")) == 0)
00158 wsp_pack_short_integer(hdr, 0x0);
00159 else if (octstr_case_compare(sec, octstr_imm("userpin")) == 0)
00160 wsp_pack_short_integer(hdr, 0x01);
00161 else if (octstr_case_compare(sec, octstr_imm("usernetwpin")) == 0)
00162 wsp_pack_short_integer(hdr, 0x02);
00163 else if (octstr_case_compare(sec, octstr_imm("userpinmac")) == 0)
00164 wsp_pack_short_integer(hdr, 0x03);
00165 else {
00166 warning(0, "OMA ProvCont: Unknown SEC pin type '%s'.", octstr_get_cstr(sec));
00167 wsp_pack_short_integer(hdr, 0x01);
00168 }
00169 wsp_pack_short_integer(hdr, 0x12);
00170
00171 #ifdef HAVE_LIBSSL
00172 p = HMAC(EVP_sha1(), octstr_get_cstr(pin), octstr_len(pin),
00173 (unsigned char *)octstr_get_cstr(ota_binary), octstr_len(ota_binary),
00174 macbuf, &mac_len);
00175 #else
00176 mac_len = 0;
00177 p = "";
00178 warning(0, "OMA ProvCont: No SSL Support, '%s' not supported!", octstr_get_cstr(mime_type));
00179 #endif
00180 mac = octstr_create_from_data((char *)p, mac_len);
00181 octstr_binary_to_hex(mac, 1);
00182
00183 octstr_append(hdr, mac);
00184 octstr_append_from_hex(hdr, "00");
00185
00186 octstr_append_uintvar((*msg)->sms.msgdata, octstr_len(hdr));
00187 octstr_append((*msg)->sms.msgdata, hdr);
00188
00189 octstr_destroy(hdr);
00190 octstr_destroy(mac);
00191
00192 } else {
00193 warning(0, "Unknown MIME type in OTA request, type '%s' is unsupported.",
00194 octstr_get_cstr(mime_type));
00195 return 0;
00196 }
00197
00198 return 1;
00199 }
00200
00201
00202
00203
00204
00205
00206
00207 int ota_pack_message(Msg **msg, Octstr *ota_doc, Octstr *doc_type,
00208 Octstr *from, Octstr *phone_number, Octstr *sec, Octstr *pin)
00209 {
00210 Octstr *ota_binary;
00211
00212 *msg = msg_create(sms);
00213 (*msg)->sms.sms_type = mt_push;
00214
00215 ota_pack_udh(msg, doc_type);
00216
00217 if (ota_compile(ota_doc, octstr_imm("UTF-8"), &ota_binary) == -1)
00218 goto cerror;
00219
00220 if (!ota_pack_push_headers(msg, doc_type, sec, pin, ota_binary))
00221 goto herror;
00222
00223 octstr_format_append((*msg)->sms.msgdata, "%S", ota_binary);
00224 (*msg)->sms.sender = octstr_duplicate(from);
00225 (*msg)->sms.receiver = octstr_duplicate(phone_number);
00226 (*msg)->sms.coding = DC_8BIT;
00227 (*msg)->sms.time = time(NULL);
00228
00229 octstr_dump((*msg)->sms.msgdata, 0);
00230 info(0, "/cgi-bin/sendota: XML request for target <%s>", octstr_get_cstr(phone_number));
00231
00232 octstr_destroy(ota_binary);
00233 octstr_destroy(ota_doc);
00234 octstr_destroy(doc_type);
00235 octstr_destroy(from);
00236 octstr_destroy(sec);
00237 octstr_destroy(pin);
00238 return 0;
00239
00240 herror:
00241 octstr_destroy(ota_binary);
00242 octstr_destroy(ota_doc);
00243 octstr_destroy(doc_type);
00244 octstr_destroy(from);
00245 octstr_destroy(sec);
00246 octstr_destroy(pin);
00247 return -2;
00248
00249 cerror:
00250 octstr_destroy(ota_doc);
00251 octstr_destroy(doc_type);
00252 octstr_destroy(from);
00253 octstr_destroy(sec);
00254 octstr_destroy(pin);
00255 return -1;
00256 }
00257
00258
00259 Msg *ota_tokenize_settings(CfgGroup *grp, Octstr *from, Octstr *receiver)
00260 {
00261 Octstr *url, *desc, *ipaddr, *phonenum, *username, *passwd;
00262 int speed, bearer, calltype, connection, security, authent;
00263 Msg *msg;
00264 Octstr *p;
00265
00266 url = NULL;
00267 desc = NULL;
00268 ipaddr = NULL;
00269 phonenum = NULL;
00270 username = NULL;
00271 passwd = NULL;
00272 bearer = -1;
00273 calltype = WBXML_TOK_VALUE_CONN_ISDN;
00274 connection = WBXML_TOK_VALUE_PORT_9201;
00275 security = 0;
00276 authent = WBXML_TOK_VALUE_AUTH_PAP;
00277
00278 url = cfg_get(grp, octstr_imm("location"));
00279 desc = cfg_get(grp, octstr_imm("service"));
00280 ipaddr = cfg_get(grp, octstr_imm("ipaddress"));
00281 phonenum = cfg_get(grp, octstr_imm("phonenumber"));
00282 p = cfg_get(grp, octstr_imm("bearer"));
00283 if (p != NULL) {
00284 if (strcasecmp(octstr_get_cstr(p), "data") == 0)
00285 bearer = WBXML_TOK_VALUE_GSM_CSD;
00286 else
00287 bearer = -1;
00288 octstr_destroy(p);
00289 }
00290 p = cfg_get(grp, octstr_imm("calltype"));
00291 if (p != NULL) {
00292 if (strcasecmp(octstr_get_cstr(p), "analog") == 0)
00293 calltype = WBXML_TOK_VALUE_CONN_ANALOGUE;
00294 else
00295 calltype = WBXML_TOK_VALUE_CONN_ISDN;
00296 octstr_destroy(p);
00297 }
00298
00299 speed = WBXML_TOK_VALUE_SPEED_9600;
00300 p = cfg_get(grp, octstr_imm("speed"));
00301 if (p != NULL) {
00302 if (octstr_compare(p, octstr_imm("14400")) == 0)
00303 speed = WBXML_TOK_VALUE_SPEED_14400;
00304 octstr_destroy(p);
00305 }
00306
00307
00308 p = cfg_get(grp, octstr_imm("connection"));
00309 if (p != NULL) {
00310 if (strcasecmp(octstr_get_cstr(p), "temp") == 0)
00311 connection = WBXML_TOK_VALUE_PORT_9200;
00312 else
00313 connection = WBXML_TOK_VALUE_PORT_9201;
00314 octstr_destroy(p);
00315 }
00316
00317
00318 p = cfg_get(grp, octstr_imm("pppsecurity"));
00319 if (p != NULL) {
00320 if (strcasecmp(octstr_get_cstr(p), "on") == 0)
00321 authent = WBXML_TOK_VALUE_AUTH_CHAP;
00322 else
00323 authent = WBXML_TOK_VALUE_AUTH_PAP;
00324 octstr_destroy(p);
00325 }
00326
00327
00328 p = cfg_get(grp, octstr_imm("authentication"));
00329 if (p != NULL) {
00330 if (strcasecmp(octstr_get_cstr(p), "secure") == 0)
00331 security = 1;
00332 else
00333 security = WBXML_TOK_VALUE_PORT_9201;
00334 octstr_destroy(p);
00335 }
00336 if (security == 1)
00337 connection = (connection == WBXML_TOK_VALUE_PORT_9201)?
00338 WBXML_TOK_VALUE_PORT_9203 : WBXML_TOK_VALUE_PORT_9202;
00339
00340 username = cfg_get(grp, octstr_imm("login"));
00341 passwd = cfg_get(grp, octstr_imm("secret"));
00342
00343 msg = msg_create(sms);
00344
00345
00346
00347
00348
00349
00350 msg->sms.sms_type = mt_push;
00351 msg->sms.udhdata = octstr_create("");
00352
00353
00354
00355
00356
00357 octstr_append_from_hex(msg->sms.udhdata, "060504C34FC002");
00358
00359
00360
00361
00362
00363
00364 msg->sms.msgdata = octstr_create("");
00365
00366 octstr_append_from_hex(msg->sms.msgdata, "01062C1F2A");
00367
00368 octstr_format_append(msg->sms.msgdata, "%s",
00369 "application/x-wap-prov.browser-settings");
00370 octstr_append_from_hex(msg->sms.msgdata, "00");
00371
00372 octstr_append_from_hex(msg->sms.msgdata, "81EA");
00373
00374
00375
00376
00377
00378
00379
00380 octstr_append_from_hex(msg->sms.msgdata, "0101");
00381
00382 octstr_append_from_hex(msg->sms.msgdata, "6A00");
00383
00384
00385 octstr_append_from_hex(msg->sms.msgdata, "45");
00386
00387 octstr_append_from_hex(msg->sms.msgdata, "C6");
00388
00389 octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_ADDRESS);
00390 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00391
00392
00393 if (bearer != -1) {
00394
00395 octstr_append_from_hex(msg->sms.msgdata, "87");
00396
00397 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_BEARER);
00398 octstr_append_char(msg->sms.msgdata, bearer);
00399 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00400 }
00401
00402 if (ipaddr != NULL) {
00403
00404 octstr_append_from_hex(msg->sms.msgdata, "87");
00405
00406 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PROXY);
00407 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00408 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00409 octstr_append(msg->sms.msgdata, octstr_duplicate(ipaddr));
00410 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00411 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00412 }
00413
00414 if (connection != -1) {
00415
00416 octstr_append_from_hex(msg->sms.msgdata, "87");
00417
00418 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PORT);
00419 octstr_append_char(msg->sms.msgdata, connection);
00420 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00421 }
00422
00423 if (phonenum != NULL) {
00424
00425 octstr_append_from_hex(msg->sms.msgdata, "87");
00426
00427 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_CSD_DIALSTRING);
00428 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00429 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00430 octstr_append(msg->sms.msgdata, octstr_duplicate(phonenum));
00431 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00432 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00433 }
00434
00435
00436 octstr_append_from_hex(msg->sms.msgdata, "87");
00437
00438 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PPP_AUTHTYPE);
00439 octstr_append_char(msg->sms.msgdata, authent);
00440 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00441
00442 if (username != NULL) {
00443
00444 octstr_append_from_hex(msg->sms.msgdata, "87");
00445
00446 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PPP_AUTHNAME);
00447 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00448 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00449 octstr_append(msg->sms.msgdata, octstr_duplicate(username));
00450 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00451 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00452 }
00453
00454 if (passwd != NULL) {
00455
00456 octstr_append_from_hex(msg->sms.msgdata, "87");
00457
00458 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PPP_AUTHSECRET);
00459 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00460 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00461 octstr_append(msg->sms.msgdata, octstr_duplicate(passwd));
00462 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00463 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00464 }
00465
00466 if (calltype != -1) {
00467
00468 octstr_append_from_hex(msg->sms.msgdata, "87");
00469
00470 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_CSD_CALLTYPE);
00471 octstr_append_char(msg->sms.msgdata, calltype);
00472 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00473 }
00474
00475
00476 octstr_append_from_hex(msg->sms.msgdata, "87");
00477
00478 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_CSD_CALLSPEED);
00479 octstr_append_char(msg->sms.msgdata, speed);
00480 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00481
00482
00483 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00484
00485
00486 if (url != NULL) {
00487
00488 octstr_append_from_hex(msg->sms.msgdata, "86");
00489
00490 octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_URL);
00491 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00492 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00493 octstr_append(msg->sms.msgdata, url);
00494 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00495 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00496 }
00497
00498
00499 octstr_append_from_hex(msg->sms.msgdata, "C6");
00500
00501 octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_NAME);
00502 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00503
00504
00505 if (desc != NULL) {
00506
00507 octstr_append_from_hex(msg->sms.msgdata, "87");
00508
00509 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_NAME);
00510 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00511 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00512 octstr_append(msg->sms.msgdata, desc);
00513 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00514 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00515 }
00516
00517
00518 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00519
00520 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00521
00522
00523 msg->sms.sender = from;
00524 msg->sms.receiver = octstr_duplicate(receiver);
00525 msg->sms.coding = DC_8BIT;
00526
00527 msg->sms.time = time(NULL);
00528
00529 octstr_destroy(url);
00530 octstr_destroy(desc);
00531 octstr_destroy(ipaddr);
00532 octstr_destroy(phonenum);
00533 octstr_destroy(username);
00534 octstr_destroy(passwd);
00535
00536 return msg;
00537 }
00538
00539
00540 Msg *ota_tokenize_bookmarks(CfgGroup *grp, Octstr *from, Octstr *receiver)
00541 {
00542 Octstr *url, *name;
00543 Msg *msg;
00544
00545 url = NULL;
00546 name = NULL;
00547
00548 url = cfg_get(grp, octstr_imm("url"));
00549 name = cfg_get(grp, octstr_imm("name"));
00550
00551 msg = msg_create(sms);
00552
00553
00554
00555
00556
00557
00558 msg->sms.sms_type = mt_push;
00559 msg->sms.udhdata = octstr_create("");
00560
00561 octstr_append_from_hex(msg->sms.udhdata, "060504C34FC002");
00562
00563
00564
00565
00566
00567
00568 msg->sms.msgdata = octstr_create("");
00569
00570 octstr_append_from_hex(msg->sms.msgdata, "01062D1F2B");
00571
00572 octstr_format_append(msg->sms.msgdata, "%s",
00573 "application/x-wap-prov.browser-bookmarks");
00574 octstr_append_from_hex(msg->sms.msgdata, "00");
00575
00576 octstr_append_from_hex(msg->sms.msgdata, "81EA");
00577
00578
00579
00580
00581
00582
00583
00584 octstr_append_from_hex(msg->sms.msgdata, "0101");
00585
00586 octstr_append_from_hex(msg->sms.msgdata, "6A00");
00587
00588
00589 octstr_append_from_hex(msg->sms.msgdata, "45");
00590
00591 octstr_append_from_hex(msg->sms.msgdata, "C6");
00592
00593 octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_BOOKMARK);
00594 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00595
00596
00597 if (name != NULL) {
00598
00599 octstr_append_from_hex(msg->sms.msgdata, "87");
00600
00601 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_NAME);
00602 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00603 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00604 octstr_append(msg->sms.msgdata, octstr_duplicate(name));
00605 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00606 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00607 }
00608
00609 if (url != NULL) {
00610
00611 octstr_append_from_hex(msg->sms.msgdata, "87");
00612
00613 octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_URL);
00614 octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00615 octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00616 octstr_append(msg->sms.msgdata, octstr_duplicate(url));
00617 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00618 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00619 }
00620
00621
00622 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00623
00624 octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00625
00626
00627 msg->sms.sender = from;
00628 msg->sms.receiver = octstr_duplicate(receiver);
00629 msg->sms.coding = DC_8BIT;
00630
00631 msg->sms.time = time(NULL);
00632
00633 octstr_destroy(name);
00634 octstr_destroy(url);
00635
00636 return msg;
00637 }
00638
See file LICENSE for details about the license agreement for using,
modifying, copying or deriving work from this software.