⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wap-maps.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
字号:
/* ====================================================================  * The Kannel Software License, Version 1.0  *  * Copyright (c) 2001-2004 Kannel Group   * Copyright (c) 1998-2001 WapIT Ltd.    * All rights reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  *  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  *  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in  *    the documentation and/or other materials provided with the  *    distribution.  *  * 3. The end-user documentation included with the redistribution,  *    if any, must include the following acknowledgment:  *       "This product includes software developed by the  *        Kannel Group (http://www.kannel.org/)."  *    Alternately, this acknowledgment may appear in the software itself,  *    if and wherever such third-party acknowledgments normally appear.  *  * 4. The names "Kannel" and "Kannel Group" must not be used to  *    endorse or promote products derived from this software without  *    prior written permission. For written permission, please   *    contact org@kannel.org.  *  * 5. Products derived from this software may not be called "Kannel",  *    nor may "Kannel" appear in their name, without prior written  *    permission of the Kannel Group.  *  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,   * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT   * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  * ====================================================================  *  * This software consists of voluntary contributions made by many  * individuals on behalf of the Kannel Group.  For more information on   * the Kannel Group, please see <http://www.kannel.org/>.  *  * Portions of this software are based upon software originally written at   * WapIT Ltd., Helsinki, Finland for the Kannel project.   */ /* * gw/wap-maps.c - URL mapping  *  * Bruno Rodrigues  <bruno.rodrigues@litux.org> */#include "gwlib/gwlib.h"#include "wap-maps.h"struct url_map_struct {    Octstr *name;    Octstr *url;    Octstr *map_url;    Octstr *send_msisdn_query;    Octstr *send_msisdn_header;    Octstr *send_msisdn_format;    int accept_cookies;};struct user_map_struct {    Octstr *name;    Octstr *user;    Octstr *pass;    Octstr *msisdn;};/* * XXX All mapping functions should be implemented with Dicts instead of * Lists! Linear scans in lists are pretty slow against hash table lookups, * espacially when you have *lot* of entries, which is the case in URL re- * writting in general. * TODO: identify a hash key that can be used and use that as lookup. *//* mapping storrage */static List *url_map = NULL;static Dict *user_map = NULL;/******************************************************************** * Creation and destruction of mapping entries */void wap_map_add_url(Octstr *name, Octstr *url, Octstr *map_url,                     Octstr *send_msisdn_query,                     Octstr *send_msisdn_header,                     Octstr *send_msisdn_format,                     int accept_cookies) {    struct url_map_struct *entry;    if (url_map == NULL)         url_map = list_create();    entry = gw_malloc(sizeof(*entry));    entry->name = name;    entry->url = url;    entry->map_url = map_url;    entry->send_msisdn_query = send_msisdn_query;    entry->send_msisdn_header = send_msisdn_header;    entry->send_msisdn_format = send_msisdn_format;    entry->accept_cookies = accept_cookies;        list_append(url_map, entry);}static void wap_user_map_destroy(void *i) {    struct user_map_struct *entry = i;    octstr_destroy(entry->name);    octstr_destroy(entry->user);    octstr_destroy(entry->pass);    octstr_destroy(entry->msisdn);    gw_free(entry);}void wap_map_add_user(Octstr *name, Octstr *user, Octstr *pass,                      Octstr *msisdn) {    struct user_map_struct *entry;    if (user_map == NULL)         user_map = dict_create(32, wap_user_map_destroy);    entry = gw_malloc(sizeof(*entry));    entry->name = name;    entry->user = user;    entry->pass = pass;    entry->msisdn = msisdn;    dict_put(user_map, entry->user, entry);}void wap_map_destroy(void) {    long i;    struct url_map_struct *entry;    if (url_map != NULL) {        for (i = 0; i < list_len(url_map); i++) {            entry = list_get(url_map, i);            octstr_destroy(entry->name);            octstr_destroy(entry->url);            octstr_destroy(entry->map_url);            octstr_destroy(entry->send_msisdn_query);            octstr_destroy(entry->send_msisdn_header);            octstr_destroy(entry->send_msisdn_format);            gw_free(entry);        }        list_destroy(url_map, NULL);    }    url_map = NULL;}void wap_map_user_destroy(void){    dict_destroy(user_map);    user_map = NULL;}/******************************************************************** * Public functions */void wap_map_url_config(char *s){    char *in, *out;        s = gw_strdup(s);    in = strtok(s, " \t");    if (!in)         return;    out = strtok(NULL, " \t");    if (!out)         return;    wap_map_add_url(octstr_imm("unknown"), octstr_create(in),                      octstr_create(out), NULL, NULL, NULL, 0);    gw_free(s);}void wap_map_url_config_device_home(char *to){    wap_map_add_url(octstr_imm("Device Home"), octstr_imm("DEVICE:home*"),                     octstr_create(to), NULL, NULL, NULL, -1);}void wap_map_url(Octstr **osp, Octstr **send_msisdn_query,                  Octstr **send_msisdn_header,                  Octstr **send_msisdn_format, int *accept_cookies){    long i;    Octstr *newurl, *tmp1, *tmp2;    newurl = tmp1 = tmp2 = NULL;    *send_msisdn_query = *send_msisdn_header = *send_msisdn_format = NULL;    *accept_cookies = -1;    debug("wsp",0,"WSP: Mapping url <%s>", octstr_get_cstr(*osp));    for (i = 0; url_map && i < list_len(url_map); i++) {        struct url_map_struct *entry;        entry = list_get(url_map, i);        /*         debug("wsp",0,"WSP: matching <%s> with <%s>", 	          octstr_get_cstr(entry->url), octstr_get_cstr(entry->map_url));         */        /* DAVI: I only have '*' terminated entry->url implementation for now */        tmp1 = octstr_duplicate(entry->url);        octstr_delete(tmp1, octstr_len(tmp1)-1, 1); /* remove last '*' */        tmp2 = octstr_copy(*osp, 0, octstr_len(tmp1));        debug("wsp",0,"WSP: Matching <%s> with <%s>",               octstr_get_cstr(tmp1), octstr_get_cstr(tmp2));        if (octstr_case_compare(tmp2, tmp1) == 0) {            /* rewrite url if configured to do so */            if (entry->map_url != NULL) {                if (octstr_get_char(entry->map_url,                                     octstr_len(entry->map_url)-1) == '*') {                    newurl = octstr_duplicate(entry->map_url);                    octstr_delete(newurl, octstr_len(newurl)-1, 1);                    octstr_append(newurl, octstr_copy(*osp,                     octstr_len(entry->url)-1,                     octstr_len(*osp)-octstr_len(entry->url)+1));                } else {                    newurl = octstr_duplicate(entry->map_url);                }                debug("wsp",0,"WSP: URL Rewriten from <%s> to <%s>",                       octstr_get_cstr(*osp), octstr_get_cstr(newurl));                octstr_destroy(*osp);                *osp = newurl;            }            *accept_cookies = entry->accept_cookies;            *send_msisdn_query = octstr_duplicate(entry->send_msisdn_query);            *send_msisdn_header = octstr_duplicate(entry->send_msisdn_header);            *send_msisdn_format = octstr_duplicate(entry->send_msisdn_format);            octstr_destroy(tmp1);            octstr_destroy(tmp2);            break;        }        octstr_destroy(tmp1);        octstr_destroy(tmp2);    }}int wap_map_user(Octstr **msisdn, Octstr *user, Octstr *pass){    struct user_map_struct *entry;    entry = dict_get(user_map, user);    if (entry != NULL && octstr_compare(pass, entry->pass) == 0) {        *msisdn = octstr_duplicate(entry->msisdn);        return 1;    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -