El vie, 24-10-2003 a las 20:32, J�rg Pommnitz escribi�:

Hi!

This could be under the coverage of the WAP User Agent Profiles
(http://www.wapforum.org/what/technical/SPEC-UAProf-19991110.pdf), why
not to adapt it and let choose the system operator to include or not
include it?...

Best regards,

> Something like this has been suggested before. It has been
> discarded for different reasons, foremost security (don't
> start programs from servers that interact with untrusted
> clients). 
> Of course this was when Lars Wirzenius was the code dictator, 
> so the new leadership might have a different opinion.
> 
> Regards
>   Joerg
> 
> -----Urspr�ngliche Nachricht-----
> Von: Pavel Machek [mailto:[EMAIL PROTECTED]
> Gesendet: Freitag, 24. Oktober 2003 20:24
> An: [EMAIL PROTECTED]
> Betreff: wapbox -- support for external filters
> 
> 
> Hi!
> 
> Here's a patch to support external convertors for wapbox. With this,
> it is possible to call lynx -dump on text/html documents, so that they
> are at least somehow displayed.
> 
> What do you think? Could this or something similar go into CVS?
>       
> Pavel
> 
> diff -ur kannel-1.3.1-ofic/debian/kannel.conf
> kannel-1.3.1/debian/kannel.conf
> --- kannel-1.3.1-ofic/debian/kannel.conf      2003-02-17
> 16:50:56.000000000 +0100
> +++ kannel-1.3.1/debian/kannel.conf   2003-10-16 01:22:33.000000000 +0200
> @@ -20,3 +20,8 @@
>  group = wapbox
>  bearerbox-host = localhost
>  log-file = "/var/log/kannel/wapbox.log"
> +filters-num = 1
> +filter-from-0 = "text/html"
> +filter-to-0 = "text/vnd.wap.wml"
> +filter-command-0 = "/tmp/html2wml %s"
> +
> diff -ur kannel-1.3.1-ofic/gw/wap-appl.c kannel-1.3.1/gw/wap-appl.c
> --- kannel-1.3.1-ofic/gw/wap-appl.c   2003-02-17 16:50:56.000000000 +0100
> +++ kannel-1.3.1/gw/wap-appl.c        2003-10-16 01:22:50.000000000 +0200
> @@ -117,24 +117,11 @@
>  
>  static void  dev_null(const char *data, size_t len, void *context);
>  
> -static Octstr *convert_wml_to_wmlc(struct content *content);
> -static Octstr *convert_wmlscript_to_wmlscriptc(struct content *content);
>  static void wsp_http_map_url(Octstr **osp);
>  static List *negotiate_capabilities(List *req_caps);
>  
> -static struct {
> -    char *type;
> -    char *result_type;
> -    Octstr *(*convert)(struct content *);
> -} converters[] = {
> -    { "text/vnd.wap.wml",
> -      "application/vnd.wap.wmlc",
> -      convert_wml_to_wmlc },
> -    { "text/vnd.wap.wmlscript",
> -      "application/vnd.wap.wmlscriptc",
> -      convert_wmlscript_to_wmlscriptc },
> -};
> -#define NUM_CONVERTERS ((long)(sizeof(converters) / sizeof(converters[0])))
> +struct converter converters[NUM_CONVERTERS];
> +int cur_converter = 0;
>  
>  /*
>   * Following functions implement indications and conformations part of Push
> @@ -329,26 +316,29 @@
>  {
>      Octstr *new_body;
>      int failed = 0;
> -    int i;
> +    int succeeded = 0;
> +    int i = 0;
>      
> -    for (i = 0; i < NUM_CONVERTERS; i++) {
> -     if (octstr_str_compare(content->type, converters[i].type) == 0) {
> -         new_body = converters[i].convert(content);
> +    while (i < cur_converter) {
> +     if (octstr_compare(content->type, converters[i].type) == 0) {
> +         new_body = converters[i].convert(content, converters[i].data);
>           if (new_body != NULL) {
>               octstr_destroy(content->body);
>               content->body = new_body;
>               octstr_destroy(content->type);
> -             content->type = octstr_create(
> -             converters[i].result_type);
> -             return 1;
> +             content->type = octstr_duplicate(converters[i].result_type);
> +             succeeded = 1;
> +             i = 0;
> +             continue;
>           }
>           failed = 1;
>       }
> +     i++;
>      }
>      
>      if (failed)
>       return -1;
> -    return 0;
> +    return succeeded;
>  }
>  
> 
> @@ -382,10 +372,10 @@
>  {
>      int i;
>      
> -    for (i = 0; i < NUM_CONVERTERS; i++) {
> -     if (http_type_accepted(headers, converters[i].result_type)
> -         && !http_type_accepted(headers, converters[i].type)) {
> -         http_header_add(headers, "Accept", converters[i].type);
> +    for (i = 0; i < cur_converter; i++) {
> +     if (http_type_accepted(headers,
> octstr_get_cstr(converters[i].result_type))
> +         && !http_type_accepted(headers,
> octstr_get_cstr(converters[i].type))) {
> +         http_header_add(headers, "Accept",
> octstr_get_cstr(converters[i].type));
>       }
>      }
>  }
> @@ -857,20 +847,63 @@
>  }
>  
> 
> -static Octstr *convert_wml_to_wmlc(struct content *content) 
> +Octstr *convert_external(struct content *content, Octstr *data) 
> +{
> +    Octstr *res;
> +    char namebuf[128], cmd[1024];
> +#define MAXLEN 1024*1024
> +    char inbuf[MAXLEN];
> +    FILE *f;
> +
> +
> +    strcpy(namebuf, "/tmp/kannel.tmp.XXXXXXXX");
> +    if (mkstemp(namebuf) == -1)
> +        return NULL;
> +    f = fopen(namebuf, "w");
> +    octstr_print(f, content->body);
> +    fclose(f);
> +
> +    sprintf(cmd, octstr_get_cstr(data), namebuf);
> +    f = popen(cmd, "r");
> +    {        
> +        int len, pos = 0;
> +     while(1) {
> +         len = fread(inbuf + pos, 1, MAXLEN-pos-1, f);
> +         if (len <= 0)
> +             break;
> +         pos += len;
> +     }
> +     inbuf[pos] = 0;
> +    }
> +    pclose(f);
> +
> +    printf("Filter returned: %s\n", inbuf);
> +    res = octstr_create(inbuf);
> +    unlink(namebuf);
> +    
> +    printf("convert_external: returning\n");
> +    return res;
> +}
> +
> +
> +static Octstr *convert_wml_to_wmlc(struct content *content, Octstr *o) 
>  {
>      Octstr *wmlc;
>      int ret;
>      
> +    printf("convert_wml_to_wmlc\n");
> +    octstr_print(stdout, content->body);
>      ret = wml_compile(content->body, content->charset, &wmlc);
> -    if (ret == 0)
> +    if (ret == 0) {
> +        printf("converted okay\n");
>       return wmlc;
> +    }
>      warning(0, "WSP: WML compilation failed.");
>      return NULL;
>  }
>  
> 
> -static Octstr *convert_wmlscript_to_wmlscriptc(struct content *content) 
> +static Octstr *convert_wmlscript_to_wmlscriptc(struct content *content,
> Octstr *o) 
>  {
>      WsCompilerParams params;
>      WsCompilerPtr compiler;
> @@ -1410,7 +1443,13 @@
>      wsp_session_dispatch_event(wsp_event);
>  }
>  
> -
> -
> -
> -
> +void init_converters()
> +{
> +    converters[0].type =     octstr_create("text/vnd.wap.wml");
> +    converters[0].result_type = octstr_create("application/vnd.wap.wmlc");
> +    converters[0].convert =  convert_wml_to_wmlc;
> +    converters[1].type =     octstr_create("text/vnd.wap.wmlscript");
> +    converters[1].result_type =
> octstr_create("application/vnd.wap.wmlscriptc");
> +    converters[1].convert =  convert_wmlscript_to_wmlscriptc;
> +    cur_converter = 2;
> +}
> Only in kannel-1.3.1/gw: wap-appl.c~
> diff -ur kannel-1.3.1-ofic/gw/wap-appl.h kannel-1.3.1/gw/wap-appl.h
> --- kannel-1.3.1-ofic/gw/wap-appl.h   2003-02-17 16:50:56.000000000 +0100
> +++ kannel-1.3.1/gw/wap-appl.h        2003-10-16 01:06:08.000000000 +0200
> @@ -26,4 +26,20 @@
>  /* Free URL mapping table. */
>  void wsp_http_map_destroy(void);
>  
> +void init_converters(void);
> +
> +struct content;
> +struct converter {
> +    Octstr *type;
> +    Octstr *result_type;
> +    Octstr *(*convert)(struct content *, Octstr *data);
> +    Octstr *data;
> +};
> +
> +#define NUM_CONVERTERS 3
> +extern struct converter converters[NUM_CONVERTERS];
> +extern int cur_converter;
> +
> +Octstr *convert_external(struct content *, Octstr *);
> +
>  #endif
> diff -ur kannel-1.3.1-ofic/gw/wap_push_ppg.c kannel-1.3.1/gw/wap_push_ppg.c
> --- kannel-1.3.1-ofic/gw/wap_push_ppg.c       2003-02-17 16:50:56.000000000 +0100
> +++ kannel-1.3.1/gw/wap_push_ppg.c    2003-10-16 00:09:52.000000000 +0200
> @@ -1843,7 +1843,7 @@
>      char *type;
>      char *result_type;
>      Octstr *(*convert) (struct content *);
> -} converters[] = {
> +} push_converters[] = {
>      { "text/vnd.wap.wml",
>        "application/vnd.wap.wmlc",
>        convert_wml_to_wmlc },
> @@ -1855,7 +1855,7 @@
>        convert_sl_to_slc}
>  };
>  
> -#define NUM_CONVERTERS ((long) (sizeof(converters) /
> sizeof(converters[0])))
> +#define NUM_PUSH_CONVERTERS ((long) (sizeof(push_converters) /
> sizeof(push_converters[0])))
>  
>  static struct {
>      char *transfer_encoding;
> @@ -1876,16 +1876,16 @@
>      long i;
>      Octstr *new_body;
>  
> -    for (i = 0; i < NUM_CONVERTERS; i++) {
> +    for (i = 0; i < NUM_PUSH_CONVERTERS; i++) {
>          if (octstr_compare(content->type, 
> -                 octstr_imm(converters[i].type)) == 0) {
> -             new_body = converters[i].convert(content);
> +                 octstr_imm(push_converters[i].type)) == 0) {
> +             new_body = push_converters[i].convert(content);
>              if (new_body == NULL)
>                   return 0;
>              octstr_destroy(content->body);
>              content->body = new_body;
>              octstr_destroy(content->type); 
> -            content->type = octstr_create(converters[i].result_type);
> +            content->type = octstr_create(push_converters[i].result_type);
>              return 1;
>          }
>      }
> diff -ur kannel-1.3.1-ofic/gw/wapbox.c kannel-1.3.1/gw/wapbox.c
> --- kannel-1.3.1-ofic/gw/wapbox.c     2003-02-17 16:50:56.000000000 +0100
> +++ kannel-1.3.1/gw/wapbox.c  2003-10-16 00:59:32.000000000 +0200
> @@ -66,7 +66,7 @@
>      List *http_proxy_exceptions;
>      Octstr *http_proxy_username;
>      Octstr *http_proxy_password;
> -    long map_url_max;
> +    long map_url_max, filters_num;
>  
>      cfg_dump(cfg);
>      
> @@ -148,6 +148,40 @@
>          debug("wap", 0, "Could not open access-log");
>      }
>  
> +    /* configure filters */
> +    filters_num = -1;
> +    cfg_get_integer(&filters_num, grp, octstr_imm("filters-num"));
> +     
> +    printf("%d filters\n", filters_num);
> +
> +    init_converters();
> +
> +    for (i = 0; i < filters_num; i++) {
> +     Octstr *from, *to, *command, *name;
> +
> +     if (cur_converter == NUM_CONVERTERS)
> +         panic(0, "Too many converters, increase NUM_CONVERTERS");
> +     
> +        name = octstr_format("filter-from-%d", i);
> +        if ((from = cfg_get(grp, name)) == NULL)
> +         panic(0, "Filter with no from");
> +        octstr_destroy(name);
> +        name = octstr_format("filter-to-%d", i);
> +        if ((to = cfg_get(grp, name)) == NULL)
> +         panic(0, "Filter with no from");
> +        octstr_destroy(name);
> +        name = octstr_format("filter-command-%d", i);
> +        if ((command = cfg_get(grp, name)) == NULL)
> +         panic(0, "Filter with no from");
> +        octstr_destroy(name);
> +
> +     converters[cur_converter].type = from;
> +     converters[cur_converter].result_type = to;
> +     converters[cur_converter].data = command;
> +     converters[cur_converter].convert = convert_external;
> +     cur_converter++;
> +    }
> +
>      /* configure URL mappings */
>      map_url_max = -1;
>      cfg_get_integer(&map_url_max, grp, octstr_imm("map-url-max"));
> diff -ur kannel-1.3.1-ofic/gwlib/cfg.def kannel-1.3.1/gwlib/cfg.def
> --- kannel-1.3.1-ofic/gwlib/cfg.def   2003-02-17 16:50:56.000000000 +0100
> +++ kannel-1.3.1/gwlib/cfg.def        2003-10-15 23:48:52.000000000 +0200
> @@ -77,6 +77,16 @@
>      OCTSTR(syslog-level)
>      OCTSTR(smart-errors)
>      OCTSTR(access-log)
> +    OCTSTR(filters-num)
> +    OCTSTR(filter-from-0)
> +    OCTSTR(filter-to-0)
> +    OCTSTR(filter-command-0)
> +    OCTSTR(filter-from-1)
> +    OCTSTR(filter-to-1)
> +    OCTSTR(filter-command-1)
> +    OCTSTR(filter-from-2)
> +    OCTSTR(filter-to-2)
> +    OCTSTR(filter-command-2)
>  )
>  
-- 
--------------------------------------------------------------------------
|Juan Enrique Gomez Perez
|Metropoli2000 Networks, S.L.
| Phone: +34 914250023 Fax: +34 914250136
| email: [EMAIL PROTECTED]
--------------------------------------------------------------------------
PGP Fingerprint: 6B39 3A2B A17B 1E8E CFFD  FC14 678E 0A22 BD80 C486
Public Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xBD80C486

If this message hasn't a correct signature please notify 
it to [EMAIL PROTECTED] To get the public key please
use the above url. Thanks for your help.
--------------------------------------------------------------------------

Attachment: signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente

Reply via email to