Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

ota_prov.c

Go to the documentation of this file.
00001 /* ==================================================================== 
00002  * The Kannel Software License, Version 1.0 
00003  * 
00004  * Copyright (c) 2001-2008 Kannel Group  
00005  * Copyright (c) 1998-2001 WapIT Ltd.   
00006  * All rights reserved. 
00007  * 
00008  * Redistribution and use in source and binary forms, with or without 
00009  * modification, are permitted provided that the following conditions 
00010  * are met: 
00011  * 
00012  * 1. Redistributions of source code must retain the above copyright 
00013  *    notice, this list of conditions and the following disclaimer. 
00014  * 
00015  * 2. Redistributions in binary form must reproduce the above copyright 
00016  *    notice, this list of conditions and the following disclaimer in 
00017  *    the documentation and/or other materials provided with the 
00018  *    distribution. 
00019  * 
00020  * 3. The end-user documentation included with the redistribution, 
00021  *    if any, must include the following acknowledgment: 
00022  *       "This product includes software developed by the 
00023  *        Kannel Group (http://www.kannel.org/)." 
00024  *    Alternately, this acknowledgment may appear in the software itself, 
00025  *    if and wherever such third-party acknowledgments normally appear. 
00026  * 
00027  * 4. The names "Kannel" and "Kannel Group" must not be used to 
00028  *    endorse or promote products derived from this software without 
00029  *    prior written permission. For written permission, please  
00030  *    contact org@kannel.org. 
00031  * 
00032  * 5. Products derived from this software may not be called "Kannel", 
00033  *    nor may "Kannel" appear in their name, without prior written 
00034  *    permission of the Kannel Group. 
00035  * 
00036  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 
00037  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
00038  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00039  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS 
00040  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,  
00041  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  
00042  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR  
00043  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  
00044  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE  
00045  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  
00046  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
00047  * ==================================================================== 
00048  * 
00049  * This software consists of voluntary contributions made by many 
00050  * individuals on behalf of the Kannel Group.  For more information on  
00051  * the Kannel Group, please see <http://www.kannel.org/>. 
00052  * 
00053  * Portions of this software are based upon software originally written at  
00054  * WapIT Ltd., Helsinki, Finland for the Kannel project.  
00055  */ 
00056 
00057 /*
00058  * ota_prov.c: OTA settings and bookmarks provisioning routines
00059  *
00060  * This module contains routines for the SMS OTA (auto configuration) message 
00061  * creation and manipulation for the sendota HTTP interface.
00062  *
00063  * Official Nokia and Ericsson WAP OTA configuration settings coded 
00064  * by Stipe Tolj <stolj@kannel.org>, Wapme Systems AG.
00065  * 
00066  * Officual OMA ProvCont OTA provisioning coded 
00067  * by Paul Bagyenda, digital solutions Ltd.
00068  * 
00069  * XML compiler by Aarno Syvänen <aarno@wiral.com>, Wiral Ltd.
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  * Implementation of the internal function
00092  */
00093 
00094 /*
00095  * Append the User Data Header (UDH) including the lenght (UDHL). Only ports 
00096  * UDH here - SAR UDH is added when (or if) we split the message. This is our
00097  * *specific* WDP layer.
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  * Our WSP headers: Push Id, PDU type, headers, charset.
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         /* PUSH ID, PDU type, header length, value length */
00121         octstr_append_from_hex((*msg)->sms.msgdata, "01062C1F2A");
00122         /* MIME type for settings */
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         /* charset UTF-8 */
00127         octstr_append_from_hex((*msg)->sms.msgdata, "81EA");
00128 
00129     } else if (octstr_case_compare(mime_type, octstr_imm("bookmarks")) == 0) {
00130         
00131         /* PUSH ID, PDU type, header length, value length */
00132         octstr_append_from_hex((*msg)->sms.msgdata, "01062D1F2B");
00133         /* MIME type for bookmarks */
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         /* charset UTF-8 */
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         /* PUSH ID, PDU type, header length, value length */
00153         octstr_append_from_hex((*msg)->sms.msgdata, "0106");
00154     
00155         octstr_append_from_hex(hdr, "1f2db6"); /* Content type + other type + sec param */
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); /* XXXX Although not quite supported now.*/          
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); /* MAC */
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  * Implementation of the external function
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     /* connection mode: UDP (port 9200) or TCP (port 9201)*/
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     /* dial in security: CHAP or PAP */
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     /* WTLS: for UDP (port 9202) or TCP (port 9203) */
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      * Append the User Data Header (UDH) including the lenght (UDHL)
00347      * WDP layer (start WDP headers)
00348      */
00349     
00350     msg->sms.sms_type = mt_push;
00351     msg->sms.udhdata = octstr_create("");
00352 
00353     /* 
00354      * Within OTA spec this is "0B0504C34FC0020003040201", but it works
00355      * with the following too?!
00356      */
00357     octstr_append_from_hex(msg->sms.udhdata, "060504C34FC002");
00358     /* WDP layer (end WDP headers) */         
00359 
00360     /*
00361      * WSP layer (start WSP headers)
00362      */
00363     
00364     msg->sms.msgdata = octstr_create("");
00365     /* PUSH ID, PDU type, header length, value length */
00366     octstr_append_from_hex(msg->sms.msgdata, "01062C1F2A");
00367     /* MIME-type: application/x-wap-prov.browser-settings */
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     /* charset UTF-8 */
00372     octstr_append_from_hex(msg->sms.msgdata, "81EA");
00373     /* WSP layer (end WSP headers) */
00374 
00375     /*
00376      * WSP layer (start WSP data field)
00377      */
00378 
00379     /* WBXML version 1.1 */
00380     octstr_append_from_hex(msg->sms.msgdata, "0101");
00381     /* charset UTF-8 */
00382     octstr_append_from_hex(msg->sms.msgdata, "6A00");
00383 
00384     /* CHARACTERISTIC_LIST */
00385     octstr_append_from_hex(msg->sms.msgdata, "45");
00386     /* CHARACTERISTIC with content and attributes */
00387     octstr_append_from_hex(msg->sms.msgdata, "C6");
00388     /* TYPE=ADDRESS */
00389     octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_ADDRESS);
00390     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00391 
00392     /* bearer type */
00393     if (bearer != -1) {
00394         /* PARM with attributes */
00395         octstr_append_from_hex(msg->sms.msgdata, "87");
00396         /* NAME=BEARER, VALUE=GSM_CSD */
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     /* IP address */
00402     if (ipaddr != NULL) {
00403         /* PARM with attributes */
00404         octstr_append_from_hex(msg->sms.msgdata, "87");
00405         /* NAME=PROXY, VALUE, inline string */
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     /* connection type */
00414     if (connection != -1) {
00415         /* PARM with attributes */
00416         octstr_append_from_hex(msg->sms.msgdata, "87");
00417         /* NAME=PORT, VALUE */
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     /* phone number */
00423     if (phonenum != NULL) {
00424         /* PARM with attributes */
00425         octstr_append_from_hex(msg->sms.msgdata, "87");
00426         /* NAME=CSD_DIALSTRING, VALUE, inline string */
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     /* authentication */
00435     /* PARM with attributes */
00436     octstr_append_from_hex(msg->sms.msgdata, "87");
00437      /* NAME=PPP_AUTHTYPE, VALUE */
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     /* user name */
00442     if (username != NULL) {
00443         /* PARM with attributes */
00444         octstr_append_from_hex(msg->sms.msgdata, "87");
00445         /* NAME=PPP_AUTHNAME, VALUE, inline string */
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     /* password */
00454     if (passwd != NULL) {
00455         /* PARM with attributes */
00456         octstr_append_from_hex(msg->sms.msgdata, "87");
00457         /* NAME=PPP_AUTHSECRET, VALUE, inline string */
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     /* data call type */
00466     if (calltype != -1) {
00467         /* PARM with attributes */
00468         octstr_append_from_hex(msg->sms.msgdata, "87");
00469         /* NAME=CSD_CALLTYPE, VALUE */
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     /* speed */
00475     /* PARM with attributes */
00476     octstr_append_from_hex(msg->sms.msgdata, "87");
00477     /* NAME=CSD_CALLSPEED, VALUE */
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     /* end CHARACTERISTIC TYPE=ADDRESS */
00483     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00484 
00485     /* homepage */
00486     if (url != NULL) {
00487         /* CHARACTERISTIC with attributes */
00488         octstr_append_from_hex(msg->sms.msgdata, "86");
00489         /* TYPE=URL */
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     /* CHARACTERISTIC with content and attributes */
00499     octstr_append_from_hex(msg->sms.msgdata, "C6");
00500     /* TYPE=NAME */
00501     octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_NAME);
00502     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00503 
00504     /* service description */
00505     if (desc != NULL) {
00506         /* PARAM with attributes */
00507         octstr_append_from_hex(msg->sms.msgdata, "87");
00508         /* NAME=NAME, VALUE, inline */
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     /* end of CHARACTERISTIC */
00518     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00519     /* end of CHARACTERISTIC-LIST */
00520     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00521     /* WSP layer (end WSP data field) */
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      * Append the User Data Header (UDH) including the lenght (UDHL)
00555      * WDP layer (start WDP headers)
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     /* WDP layer (end WDP headers) */
00563 
00564     /*
00565      * WSP layer (start WSP headers)
00566      */
00567     
00568     msg->sms.msgdata = octstr_create("");
00569     /* PUSH ID, PDU type, header length, value length */
00570     octstr_append_from_hex(msg->sms.msgdata, "01062D1F2B");
00571     /* MIME-type: application/x-wap-prov.browser-bookmarks */
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     /* charset UTF-8 */
00576     octstr_append_from_hex(msg->sms.msgdata, "81EA");
00577     /* WSP layer (end WSP headers) */
00578 
00579     /*
00580      * WSP layer (start WSP data field)
00581      */
00582 
00583     /* WBXML version 1.1 */
00584     octstr_append_from_hex(msg->sms.msgdata, "0101");
00585     /* charset UTF-8 */
00586     octstr_append_from_hex(msg->sms.msgdata, "6A00");
00587 
00588     /* CHARACTERISTIC_LIST */
00589     octstr_append_from_hex(msg->sms.msgdata, "45");
00590     /* CHARACTERISTIC with content and attributes */
00591     octstr_append_from_hex(msg->sms.msgdata, "C6");
00592     /* TYPE=BOOKMARK */
00593     octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_BOOKMARK);
00594     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00595 
00596     /* name */
00597     if (name != NULL) {
00598         /* PARM with attributes */
00599         octstr_append_from_hex(msg->sms.msgdata, "87");
00600         /* NAME=PROXY, VALUE, inline string */
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     /* URL */
00609     if (url != NULL) {
00610         /* PARM with attributes */
00611         octstr_append_from_hex(msg->sms.msgdata, "87");
00612         /* NAME=PROXY, VALUE, inline string */
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     /* end of CHARACTERISTIC */
00622     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00623     /* end of CHARACTERISTIC-LIST */
00624     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00625     /* WSP layer (end WSP data field) */
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.