From 83a36343155a2f17d29ff1c706809bf56382a9ec Mon Sep 17 00:00:00 2001 From: jongfoster Date: Sun, 16 Sep 2001 17:08:54 +0000 Subject: [PATCH] Moving simple CGI functions from cgi.c to new file cgisimple.c --- cgi.c | 536 +--------------------------------- cgi.h | 34 +-- cgisimple.c | 810 ++++++++++++++++++++++++++++++++++++++++++++++++++++ cgisimple.h | 87 ++++++ 4 files changed, 917 insertions(+), 550 deletions(-) create mode 100644 cgisimple.c create mode 100644 cgisimple.h diff --git a/cgi.c b/cgi.c index de82743d..383c3393 100644 --- a/cgi.c +++ b/cgi.c @@ -1,10 +1,12 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.25 2001/09/16 15:02:35 jongfoster Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.26 2001/09/16 15:47:37 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $ * * Purpose : Declares functions to intercept request, generate * html or gif answers, and to compose HTTP resonses. + * This only contains the framework functions, the + * actual handler functions are declared elsewhere. * * Functions declared include: * @@ -36,6 +38,12 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.25 2001/09/16 15:02:35 jongfoster Exp $"; * * Revisions : * $Log: cgi.c,v $ + * Revision 1.26 2001/09/16 15:47:37 jongfoster + * First version of CGI-based edit interface. This is very much a + * work-in-progress, and you can't actually use it to edit anything + * yet. You must #define FEATURE_CGI_EDIT_ACTIONS for these changes + * to have any effect. + * * Revision 1.25 2001/09/16 15:02:35 jongfoster * Adding i.j.b/robots.txt. * Inlining add_stats() since it's only ever called from one place. @@ -197,13 +205,9 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.25 2001/09/16 15:02:35 jongfoster Exp $"; #include "list.h" #include "encode.h" #include "ssplit.h" -#include "jcc.h" -#include "filters.h" -#include "actions.h" #include "errlog.h" #include "miscutil.h" -#include "showargs.h" -#include "loadcfg.h" +#include "cgisimple.h" #ifdef FEATURE_CGI_EDIT_ACTIONS #include "cgiedit.h" #endif /* def FEATURE_CGI_EDIT_ACTIONS */ @@ -422,483 +426,6 @@ struct map *parse_cgi_parameters(char *argstring) } -/********************************************************************* - * - * Function : cgi_default - * - * Description : CGI function that is called if no action was given. - * Lists menu of available unhidden CGIs. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * Returns : 0 - * - *********************************************************************/ -int cgi_default(struct client_state *csp, struct http_response *rsp, - struct map *parameters) -{ - char *p; - char *tmp = NULL; - struct map * exports = default_exports(csp, ""); - - /* If there were other parameters, export a dump as "cgi-parameters" */ - if(parameters) - { - p = dump_map(parameters); - tmp = strsav(tmp, "

What made you think this cgi takes parameters?\n" - "Anyway, here they are, in case you're interested:

\n"); - tmp = strsav(tmp, p); - map(exports, "cgi-parameters", 1, tmp, 0); - free(p); - } - else - { - map(exports, "cgi-parameters", 1, "", 1); - } - - rsp->body = template_load(csp, "default"); - template_fill(&rsp->body, exports); - free_map(exports); - return(0); - -} - - -/********************************************************************* - * - * Function : cgi_send_banner - * - * Description : CGI function that returns a banner. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * type : Selects the type of banner between "trans" and "jb". - * Defaults to "jb" if absent or != "trans". - * - * Returns : 0 - * - *********************************************************************/ -int cgi_send_banner(struct client_state *csp, struct http_response *rsp, - struct map *parameters) -{ - if(strcmp(lookup(parameters, "type"), "trans")) - { - rsp->body = bindup(image_junkbuster_gif_data, image_junkbuster_gif_length); - rsp->content_length = image_junkbuster_gif_length; - } - else - { - rsp->body = bindup(image_blank_gif_data, image_blank_gif_length); - rsp->content_length = image_blank_gif_length; - } - - enlist(rsp->headers, "Content-Type: image/gif"); - rsp->is_static = 1; - - return(0); - -} - - -/********************************************************************* - * - * Function : cgi_show_version - * - * Description : CGI function that returns a a web page describing the - * file versions of IJB. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * type : Selects the type of banner between "trans" and "jb". - * Defaults to "jb" if absent or != "trans". - * - * Returns : 0 - * - *********************************************************************/ -int cgi_show_version(struct client_state *csp, struct http_response *rsp, - struct map *parameters) -{ - struct map * exports = default_exports(csp, "show-version"); - - map(exports, "sourceversions", 1, show_rcs(), 0); - - rsp->body = template_load(csp, "show-version"); - template_fill(&rsp->body, exports); - free_map(exports); - return(0); - -} - - -/********************************************************************* - * - * Function : cgi_show_status - * - * Description : CGI function that returns a a web page describing the - * current status of IJB. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * type : Selects the type of banner between "trans" and "jb". - * Defaults to "jb" if absent or != "trans". - * - * Returns : 0 - * - *********************************************************************/ -int cgi_show_status(struct client_state *csp, struct http_response *rsp, - struct map *parameters) -{ - char *s = NULL; - int i; - - FILE * fp; - char buf[BUFFER_SIZE]; - char * p; - const char * filename = NULL; - char * file_description = NULL; -#ifdef FEATURE_STATISTICS - float perc_rej; /* Percentage of http requests rejected */ - int local_urls_read; - int local_urls_rejected; -#endif /* ndef FEATURE_STATISTICS */ - - struct map * exports = default_exports(csp, "show-status"); - - switch (*(lookup(parameters, "file"))) - { - case 'p': - if (csp->actions_list) - { - filename = csp->actions_list->filename; - file_description = "Actions List"; - } - break; - - case 'r': - if (csp->rlist) - { - filename = csp->rlist->filename; - file_description = "Regex Filter List"; - } - break; - -#ifdef FEATURE_TRUST - case 't': - if (csp->tlist) - { - filename = csp->tlist->filename; - file_description = "Trust List"; - } - break; -#endif /* def FEATURE_TRUST */ - } - - if (NULL != filename) - { - map(exports, "file-description", 1, file_description, 1); - map(exports, "filepath", 1, html_encode(filename), 0); - - if ((fp = fopen(filename, "r")) == NULL) - { - map(exports, "content", 1, "

ERROR OPENING FILE!

", 1); - } - else - { - while (fgets(buf, sizeof(buf), fp)) - { - p = html_encode(buf); - if (p) - { - s = strsav(s, p); - freez(p); - s = strsav(s, "
"); - } - } - fclose(fp); - map(exports, "contents", 1, s, 0); - } - rsp->body = template_load(csp, "show-status-file"); - template_fill(&rsp->body, exports); - free_map(exports); - return(0); - - } - - map(exports, "redirect-url", 1, REDIRECT_URL, 1); - - s = NULL; - for (i=0; i < Argc; i++) - { - s = strsav(s, Argv[i]); - s = strsav(s, " "); - } - map(exports, "invocation", 1, s, 0); - - map(exports, "options", 1, csp->config->proxy_args, 1); - show_defines(exports); - -#ifdef FEATURE_STATISTICS - local_urls_read = urls_read; - local_urls_rejected = urls_rejected; - - /* - * Need to alter the stats not to include the fetch of this - * page. - * - * Can't do following thread safely! doh! - * - * urls_read--; - * urls_rejected--; * This will be incremented subsequently * - */ - - if (local_urls_read == 0) - { - map_block_killer(exports, "have-stats"); - } - else - { - map_block_killer(exports, "have-no-stats"); - - perc_rej = (float)local_urls_rejected * 100.0F / - (float)local_urls_read; - - sprintf(buf, "%d", local_urls_read); - map(exports, "requests-received", 1, buf, 1); - - sprintf(buf, "%d", local_urls_rejected); - map(exports, "requests-blocked", 1, buf, 1); - - sprintf(buf, "%6.2f", perc_rej); - map(exports, "percent-blocked", 1, buf, 1); - } - -#else /* ndef FEATURE_STATISTICS */ - map_block_killer(exports, "statistics"); -#endif /* ndef FEATURE_STATISTICS */ - - if (csp->actions_list) - { - map(exports, "actions-filename", 1, csp->actions_list->filename, 1); - } - else - { - map(exports, "actions-filename", 1, "None specified", 1); - } - - if (csp->rlist) - { - map(exports, "re-filter-filename", 1, csp->rlist->filename, 1); - } - else - { - map(exports, "re-filter-filename", 1, "None specified", 1); - } - -#ifdef FEATURE_TRUST - if (csp->tlist) - { - map(exports, "trust-filename", 1, csp->tlist->filename, 1); - } - else - { - map(exports, "trust-filename", 1, "None specified", 1); - } -#else - map_block_killer(exports, "trust-support"); -#endif /* ndef FEATURE_TRUST */ - - rsp->body = template_load(csp, "show-status"); - template_fill(&rsp->body, exports); - free_map(exports); - return(0); - -} - - -/********************************************************************* - * - * Function : cgi_show_url_info - * - * Description : CGI function that determines and shows which actions - * junkbuster will perform for a given url, and which - * matches starting from the defaults have lead to that. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * url : The url whose actions are to be determined. - * If url is unset, the url-given conditional will be - * set, so that all but the form can be suppressed in - * the template. - * - * Returns : 0 - * - *********************************************************************/ -int cgi_show_url_info(struct client_state *csp, struct http_response *rsp, - struct map *parameters) -{ - char *url_param; - char *host = NULL; - struct map * exports = default_exports(csp, "show-url-info"); - - if (NULL == (url_param = strdup(lookup(parameters, "url"))) || *url_param == '\0') - { - map_block_killer(exports, "url-given"); - map(exports, "url", 1, "", 1); - } - else - { - char *matches = NULL; - char *path; - char *s; - int port = 80; - int hits = 0; - struct file_list *fl; - struct url_actions *b; - struct url_spec url[1]; - struct current_action_spec action[1]; - - host = url_param; - host += (strncmp(url_param, "http://", 7)) ? 0 : 7; - - map(exports, "url", 1, host, 1); - map(exports, "url-html", 1, html_encode(host), 0); - - init_current_action(action); - - s = current_action_to_text(action); - map(exports, "default", 1, s , 0); - - if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL)) - { - map(exports, "matches", 1, "none" , 1); - map(exports, "final", 1, lookup(exports, "default"), 1); - - freez(url_param); - free_current_action(action); - - rsp->body = template_load(csp, "show-url-info"); - template_fill(&rsp->body, exports); - free_map(exports); - - return 0; - } - - s = strchr(host, '/'); - if (s != NULL) - { - path = strdup(s); - *s = '\0'; - } - else - { - path = strdup(""); - } - s = strchr(host, ':'); - if (s != NULL) - { - *s++ = '\0'; - port = atoi(s); - s = NULL; - } - - *url = dsplit(host); - - /* if splitting the domain fails, punt */ - if (url->dbuf == NULL) - { - map(exports, "matches", 1, "none" , 1); - map(exports, "final", 1, lookup(exports, "default"), 1); - - freez(url_param); - freez(path); - free_current_action(action); - - rsp->body = template_load(csp, "show-url-info"); - template_fill(&rsp->body, exports); - free_map(exports); - - return 0; - } - - for (b = b->next; NULL != b; b = b->next) - { - if ((b->url->port == 0) || (b->url->port == port)) - { - if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0)) - { - if ((b->url->path == NULL) || -#ifdef REGEX - (regexec(b->url->preg, path, 0, NULL, 0) == 0) -#else - (strncmp(b->url->path, path, b->url->pathlen) == 0) -#endif - ) - { - s = actions_to_text(b->action); - matches = strsav(matches, "{"); - matches = strsav(matches, s); - matches = strsav(matches, " }
\n"); - matches = strsav(matches, b->url->spec); - matches = strsav(matches, "
\n
\n"); - freez(s); - - merge_current_action(action, b->action); - hits++; - } - } - } - } - - if (hits) - { - map(exports, "matches", 1, matches , 0); - } - else - { - map(exports, "matches", 1, "none", 1); - } - matches = NULL; - - freez(url->dbuf); - freez(url->dvec); - - freez(url_param); - freez(path); - - s = current_action_to_text(action); - map(exports, "final", 1, s, 0); - s = NULL; - - free_current_action(action); - } - - rsp->body = template_load(csp, "show-url-info"); - template_fill(&rsp->body, exports); - free_map(exports); - return 0; - -} - - /********************************************************************* * * Function : error_response @@ -966,7 +493,7 @@ struct http_response *error_response(struct client_state *csp, const char *templ * Returns : N/A * *********************************************************************/ -static void get_http_time(int time_offset, char * buf) +void get_http_time(int time_offset, char * buf) { static const char day_names[7][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; @@ -1480,47 +1007,6 @@ char *dump_map(const struct map *the_map) } -/********************************************************************* - * - * Function : cgi_robots_txt - * - * Description : CGI function to return "/robots.txt". - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : 0 - * - *********************************************************************/ -int cgi_robots_txt(struct client_state *csp, struct http_response *rsp, - struct map *parameters) -{ - char buf[100]; - - rsp->body = strdup( - "# This is the Internet Junkbuster control interface.\n" - "# It isn't very useful to index it, and you're likely to break stuff.\n" - "# So go away!\n" - "\n" - "User-agent: *\n" - "Disallow: /\n" - "\n"); - - enlist_unique(rsp->headers, "Content-Type: text/plain", 13); - - rsp->is_static = 1; - - get_http_time(7 * 24 * 60 * 60, buf); /* 7 days into future */ - enlist_unique_header(rsp->headers, "Expires", buf); - - return 0; -} - - /* Local Variables: tab-width: 3 diff --git a/cgi.h b/cgi.h index 4f155d64..064c8b89 100644 --- a/cgi.h +++ b/cgi.h @@ -1,6 +1,6 @@ #ifndef CGI_H_INCLUDED #define CGI_H_INCLUDED -#define CGI_H_VERSION "$Id: cgi.h,v 1.14 2001/09/16 11:38:02 jongfoster Exp $" +#define CGI_H_VERSION "$Id: cgi.h,v 1.15 2001/09/16 15:02:35 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ @@ -38,6 +38,10 @@ * * Revisions : * $Log: cgi.h,v $ + * Revision 1.15 2001/09/16 15:02:35 jongfoster + * Adding i.j.b/robots.txt. + * Inlining add_stats() since it's only ever called from one place. + * * Revision 1.14 2001/09/16 11:38:02 jongfoster * Splitting fill_template() into 2 functions: * template_load() loads the file @@ -110,28 +114,6 @@ extern "C" { extern struct http_response *dispatch_cgi(struct client_state *csp); extern struct map *parse_cgi_parameters(char *argstring); -/* - * CGI functions - */ -extern int cgi_default (struct client_state *csp, - struct http_response *rsp, - struct map *parameters); -extern int cgi_robots_txt (struct client_state *csp, - struct http_response *rsp, - struct map *parameters); -extern int cgi_send_banner (struct client_state *csp, - struct http_response *rsp, - struct map *parameters); -extern int cgi_show_status (struct client_state *csp, - struct http_response *rsp, - struct map *parameters); -extern int cgi_show_url_info (struct client_state *csp, - struct http_response *rsp, - struct map *parameters); -extern int cgi_show_version (struct client_state *csp, - struct http_response *rsp, - struct map *parameters); - /* Not exactly a CGI */ extern struct http_response * error_response(struct client_state *csp, const char *templatename, @@ -146,12 +128,14 @@ extern void free_http_response(struct http_response *rsp); extern struct http_response *finish_http_response(struct http_response *rsp); extern struct map * default_exports(const struct client_state *csp, const char *caller); -extern void map_block_killer(struct map *map, const char *name); -extern void map_conditional(struct map *exports, const char *name, int choose_first); + +extern void map_block_killer (struct map *exports, const char *name); +extern void map_conditional (struct map *exports, const char *name, int choose_first); extern char *template_load(struct client_state *csp, const char *templatename); extern void template_fill(char ** template_ptr, struct map *exports); +extern void get_http_time(int time_offset, char * buf); /* * Text generators diff --git a/cgisimple.c b/cgisimple.c new file mode 100644 index 00000000..058faa11 --- /dev/null +++ b/cgisimple.c @@ -0,0 +1,810 @@ +const char cgisimple_rcs[] = "$Id: cgi.c,v 1.26 2001/09/16 15:47:37 jongfoster Exp $"; +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $ + * + * Purpose : Simple CGIs to get information about JunkBuster's + * status. + * + * Functions declared include: + * + * + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net + * + * Based on the Internet Junkbuster originally written + * by and Copyright (C) 1997 Anonymous Coders and + * Junkbusters Corporation. http://www.junkbusters.com + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * The GNU General Public License should be included with + * this file. If not, you can view it at + * http://www.gnu.org/copyleft/gpl.html + * or write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Revisions : + * $Log: cgi.c,v $ + * + **********************************************************************/ + + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define snprintf _snprintf +#endif /* def _WIN32 */ + +#include "project.h" +#include "cgi.h" +#include "cgisimple.h" +#include "list.h" +#include "encode.h" +#include "ssplit.h" +#include "jcc.h" +#include "filters.h" +#include "actions.h" +#include "errlog.h" +#include "miscutil.h" +#include "loadcfg.h" + +const char cgisimple_h_rcs[] = CGISIMPLE_H_VERSION; + + +static char *show_rcs(void); +static void show_defines(struct map *exports); + + +/********************************************************************* + * + * Function : cgi_default + * + * Description : CGI function that is called if no action was given. + * Lists menu of available unhidden CGIs. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters + * + * Returns : 0 + * + *********************************************************************/ +int cgi_default(struct client_state *csp, struct http_response *rsp, + struct map *parameters) +{ + char *p; + char *tmp = NULL; + struct map * exports = default_exports(csp, ""); + + /* If there were other parameters, export a dump as "cgi-parameters" */ + if(parameters) + { + p = dump_map(parameters); + tmp = strsav(tmp, "

What made you think this cgi takes parameters?\n" + "Anyway, here they are, in case you're interested:

\n"); + tmp = strsav(tmp, p); + map(exports, "cgi-parameters", 1, tmp, 0); + free(p); + } + else + { + map(exports, "cgi-parameters", 1, "", 1); + } + + rsp->body = template_load(csp, "default"); + template_fill(&rsp->body, exports); + free_map(exports); + return(0); + +} + + +/********************************************************************* + * + * Function : cgi_send_banner + * + * Description : CGI function that returns a banner. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters + * + * CGI Parameters : + * type : Selects the type of banner between "trans" and "jb". + * Defaults to "jb" if absent or != "trans". + * + * Returns : 0 + * + *********************************************************************/ +int cgi_send_banner(struct client_state *csp, struct http_response *rsp, + struct map *parameters) +{ + if(strcmp(lookup(parameters, "type"), "trans")) + { + rsp->body = bindup(image_junkbuster_gif_data, image_junkbuster_gif_length); + rsp->content_length = image_junkbuster_gif_length; + } + else + { + rsp->body = bindup(image_blank_gif_data, image_blank_gif_length); + rsp->content_length = image_blank_gif_length; + } + + enlist(rsp->headers, "Content-Type: image/gif"); + rsp->is_static = 1; + + return(0); + +} + + +/********************************************************************* + * + * Function : cgi_show_version + * + * Description : CGI function that returns a a web page describing the + * file versions of IJB. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters + * + * CGI Parameters : + * type : Selects the type of banner between "trans" and "jb". + * Defaults to "jb" if absent or != "trans". + * + * Returns : 0 + * + *********************************************************************/ +int cgi_show_version(struct client_state *csp, struct http_response *rsp, + struct map *parameters) +{ + struct map * exports = default_exports(csp, "show-version"); + + map(exports, "sourceversions", 1, show_rcs(), 0); + + rsp->body = template_load(csp, "show-version"); + template_fill(&rsp->body, exports); + free_map(exports); + return(0); + +} + + +/********************************************************************* + * + * Function : cgi_show_status + * + * Description : CGI function that returns a a web page describing the + * current status of IJB. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters + * + * CGI Parameters : + * type : Selects the type of banner between "trans" and "jb". + * Defaults to "jb" if absent or != "trans". + * + * Returns : 0 + * + *********************************************************************/ +int cgi_show_status(struct client_state *csp, struct http_response *rsp, + struct map *parameters) +{ + char *s = NULL; + int i; + + FILE * fp; + char buf[BUFFER_SIZE]; + char * p; + const char * filename = NULL; + char * file_description = NULL; +#ifdef FEATURE_STATISTICS + float perc_rej; /* Percentage of http requests rejected */ + int local_urls_read; + int local_urls_rejected; +#endif /* ndef FEATURE_STATISTICS */ + + struct map * exports = default_exports(csp, "show-status"); + + switch (*(lookup(parameters, "file"))) + { + case 'p': + if (csp->actions_list) + { + filename = csp->actions_list->filename; + file_description = "Actions List"; + } + break; + + case 'r': + if (csp->rlist) + { + filename = csp->rlist->filename; + file_description = "Regex Filter List"; + } + break; + +#ifdef FEATURE_TRUST + case 't': + if (csp->tlist) + { + filename = csp->tlist->filename; + file_description = "Trust List"; + } + break; +#endif /* def FEATURE_TRUST */ + } + + if (NULL != filename) + { + map(exports, "file-description", 1, file_description, 1); + map(exports, "filepath", 1, html_encode(filename), 0); + + if ((fp = fopen(filename, "r")) == NULL) + { + map(exports, "content", 1, "

ERROR OPENING FILE!

", 1); + } + else + { + while (fgets(buf, sizeof(buf), fp)) + { + p = html_encode(buf); + if (p) + { + s = strsav(s, p); + freez(p); + s = strsav(s, "
"); + } + } + fclose(fp); + map(exports, "contents", 1, s, 0); + } + rsp->body = template_load(csp, "show-status-file"); + template_fill(&rsp->body, exports); + free_map(exports); + return(0); + + } + + map(exports, "redirect-url", 1, REDIRECT_URL, 1); + + s = NULL; + for (i=0; i < Argc; i++) + { + s = strsav(s, Argv[i]); + s = strsav(s, " "); + } + map(exports, "invocation", 1, s, 0); + + map(exports, "options", 1, csp->config->proxy_args, 1); + show_defines(exports); + +#ifdef FEATURE_STATISTICS + local_urls_read = urls_read; + local_urls_rejected = urls_rejected; + + /* + * Need to alter the stats not to include the fetch of this + * page. + * + * Can't do following thread safely! doh! + * + * urls_read--; + * urls_rejected--; * This will be incremented subsequently * + */ + + if (local_urls_read == 0) + { + map_block_killer(exports, "have-stats"); + } + else + { + map_block_killer(exports, "have-no-stats"); + + perc_rej = (float)local_urls_rejected * 100.0F / + (float)local_urls_read; + + sprintf(buf, "%d", local_urls_read); + map(exports, "requests-received", 1, buf, 1); + + sprintf(buf, "%d", local_urls_rejected); + map(exports, "requests-blocked", 1, buf, 1); + + sprintf(buf, "%6.2f", perc_rej); + map(exports, "percent-blocked", 1, buf, 1); + } + +#else /* ndef FEATURE_STATISTICS */ + map_block_killer(exports, "statistics"); +#endif /* ndef FEATURE_STATISTICS */ + + if (csp->actions_list) + { + map(exports, "actions-filename", 1, csp->actions_list->filename, 1); + } + else + { + map(exports, "actions-filename", 1, "None specified", 1); + } + + if (csp->rlist) + { + map(exports, "re-filter-filename", 1, csp->rlist->filename, 1); + } + else + { + map(exports, "re-filter-filename", 1, "None specified", 1); + } + +#ifdef FEATURE_TRUST + if (csp->tlist) + { + map(exports, "trust-filename", 1, csp->tlist->filename, 1); + } + else + { + map(exports, "trust-filename", 1, "None specified", 1); + } +#else + map_block_killer(exports, "trust-support"); +#endif /* ndef FEATURE_TRUST */ + + rsp->body = template_load(csp, "show-status"); + template_fill(&rsp->body, exports); + free_map(exports); + return(0); + +} + + +/********************************************************************* + * + * Function : cgi_show_url_info + * + * Description : CGI function that determines and shows which actions + * junkbuster will perform for a given url, and which + * matches starting from the defaults have lead to that. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters + * + * CGI Parameters : + * url : The url whose actions are to be determined. + * If url is unset, the url-given conditional will be + * set, so that all but the form can be suppressed in + * the template. + * + * Returns : 0 + * + *********************************************************************/ +int cgi_show_url_info(struct client_state *csp, struct http_response *rsp, + struct map *parameters) +{ + char *url_param; + char *host = NULL; + struct map * exports = default_exports(csp, "show-url-info"); + + if (NULL == (url_param = strdup(lookup(parameters, "url"))) || *url_param == '\0') + { + map_block_killer(exports, "url-given"); + map(exports, "url", 1, "", 1); + } + else + { + char *matches = NULL; + char *path; + char *s; + int port = 80; + int hits = 0; + struct file_list *fl; + struct url_actions *b; + struct url_spec url[1]; + struct current_action_spec action[1]; + + host = url_param; + host += (strncmp(url_param, "http://", 7)) ? 0 : 7; + + map(exports, "url", 1, host, 1); + map(exports, "url-html", 1, html_encode(host), 0); + + init_current_action(action); + + s = current_action_to_text(action); + map(exports, "default", 1, s , 0); + + if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL)) + { + map(exports, "matches", 1, "none" , 1); + map(exports, "final", 1, lookup(exports, "default"), 1); + + freez(url_param); + free_current_action(action); + + rsp->body = template_load(csp, "show-url-info"); + template_fill(&rsp->body, exports); + free_map(exports); + + return 0; + } + + s = strchr(host, '/'); + if (s != NULL) + { + path = strdup(s); + *s = '\0'; + } + else + { + path = strdup(""); + } + s = strchr(host, ':'); + if (s != NULL) + { + *s++ = '\0'; + port = atoi(s); + s = NULL; + } + + *url = dsplit(host); + + /* if splitting the domain fails, punt */ + if (url->dbuf == NULL) + { + map(exports, "matches", 1, "none" , 1); + map(exports, "final", 1, lookup(exports, "default"), 1); + + freez(url_param); + freez(path); + free_current_action(action); + + rsp->body = template_load(csp, "show-url-info"); + template_fill(&rsp->body, exports); + free_map(exports); + + return 0; + } + + for (b = b->next; NULL != b; b = b->next) + { + if ((b->url->port == 0) || (b->url->port == port)) + { + if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0)) + { + if ((b->url->path == NULL) || +#ifdef REGEX + (regexec(b->url->preg, path, 0, NULL, 0) == 0) +#else + (strncmp(b->url->path, path, b->url->pathlen) == 0) +#endif + ) + { + s = actions_to_text(b->action); + matches = strsav(matches, "{"); + matches = strsav(matches, s); + matches = strsav(matches, " }
\n"); + matches = strsav(matches, b->url->spec); + matches = strsav(matches, "
\n
\n"); + freez(s); + + merge_current_action(action, b->action); + hits++; + } + } + } + } + + if (hits) + { + map(exports, "matches", 1, matches , 0); + } + else + { + map(exports, "matches", 1, "none", 1); + } + matches = NULL; + + freez(url->dbuf); + freez(url->dvec); + + freez(url_param); + freez(path); + + s = current_action_to_text(action); + map(exports, "final", 1, s, 0); + s = NULL; + + free_current_action(action); + } + + rsp->body = template_load(csp, "show-url-info"); + template_fill(&rsp->body, exports); + free_map(exports); + return 0; + +} + + +/********************************************************************* + * + * Function : cgi_robots_txt + * + * Description : CGI function to return "/robots.txt". + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters + * + * CGI Parameters : None + * + * Returns : 0 + * + *********************************************************************/ +int cgi_robots_txt(struct client_state *csp, struct http_response *rsp, + struct map *parameters) +{ + char buf[100]; + + rsp->body = strdup( + "# This is the Internet Junkbuster control interface.\n" + "# It isn't very useful to index it, and you're likely to break stuff.\n" + "# So go away!\n" + "\n" + "User-agent: *\n" + "Disallow: /\n" + "\n"); + + enlist_unique(rsp->headers, "Content-Type: text/plain", 13); + + rsp->is_static = 1; + + get_http_time(7 * 24 * 60 * 60, buf); /* 7 days into future */ + enlist_unique_header(rsp->headers, "Expires", buf); + + return 0; +} + + +/********************************************************************* + * + * Function : show_defines + * + * Description : Create a string with all conditional #defines used + * when building + * + * Parameters : None + * + * Returns : string + * + *********************************************************************/ +static void show_defines(struct map *exports) +{ + +#ifdef FEATURE_ACL + map_conditional(exports, "FEATURE_ACL", 1); +#else /* ifndef FEATURE_ACL */ + map_conditional(exports, "FEATURE_ACL", 0); +#endif /* ndef FEATURE_ACL */ + +#ifdef FEATURE_COOKIE_JAR + map_conditional(exports, "FEATURE_COOKIE_JAR", 1); +#else /* ifndef FEATURE_COOKIE_JAR */ + map_conditional(exports, "FEATURE_COOKIE_JAR", 0); +#endif /* ndef FEATURE_COOKIE_JAR */ + +#ifdef FEATURE_DENY_GZIP + map_conditional(exports, "FEATURE_DENY_GZIP", 1); +#else /* ifndef FEATURE_DENY_GZIP */ + map_conditional(exports, "FEATURE_DENY_GZIP", 0); +#endif /* ndef FEATURE_DENY_GZIP */ + +#ifdef FEATURE_FAST_REDIRECTS + map_conditional(exports, "FEATURE_FAST_REDIRECTS", 1); +#else /* ifndef FEATURE_FAST_REDIRECTS */ + map_conditional(exports, "FEATURE_FAST_REDIRECTS", 0); +#endif /* ndef FEATURE_FAST_REDIRECTS */ + +#ifdef FEATURE_FORCE_LOAD + map_conditional(exports, "FEATURE_FORCE_LOAD", 1); +#else /* ifndef FEATURE_FORCE_LOAD */ + map_conditional(exports, "FEATURE_FORCE_LOAD", 0); +#endif /* ndef FEATURE_FORCE_LOAD */ + +#ifdef FEATURE_IMAGE_BLOCKING + map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 1); +#else /* ifndef FEATURE_IMAGE_BLOCKING */ + map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 0); +#endif /* ndef FEATURE_IMAGE_BLOCKING */ + +#ifdef FEATURE_IMAGE_DETECT_MSIE + map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 1); +#else /* ifndef FEATURE_IMAGE_DETECT_MSIE */ + map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 0); +#endif /* ndef FEATURE_IMAGE_DETECT_MSIE */ + +#ifdef FEATURE_KILL_POPUPS + map_conditional(exports, "FEATURE_KILL_POPUPS", 1); +#else /* ifndef FEATURE_KILL_POPUPS */ + map_conditional(exports, "FEATURE_KILL_POPUPS", 0); +#endif /* ndef FEATURE_KILL_POPUPS */ + +#ifdef FEATURE_PTHREAD + map_conditional(exports, "FEATURE_PTHREAD", 1); +#else /* ifndef FEATURE_PTHREAD */ + map_conditional(exports, "FEATURE_PTHREAD", 0); +#endif /* ndef FEATURE_PTHREAD */ + +#ifdef FEATURE_STATISTICS + map_conditional(exports, "FEATURE_STATISTICS", 1); +#else /* ifndef FEATURE_STATISTICS */ + map_conditional(exports, "FEATURE_STATISTICS", 0); +#endif /* ndef FEATURE_STATISTICS */ + +#ifdef FEATURE_TOGGLE + map_conditional(exports, "FEATURE_TOGGLE", 1); +#else /* ifndef FEATURE_TOGGLE */ + map_conditional(exports, "FEATURE_TOGGLE", 0); +#endif /* ndef FEATURE_TOGGLE */ + +#ifdef FEATURE_TRUST + map_conditional(exports, "FEATURE_TRUST", 1); +#else /* ifndef FEATURE_TRUST */ + map_conditional(exports, "FEATURE_TRUST", 0); +#endif /* ndef FEATURE_TRUST */ + +#ifdef REGEX_GNU + map_conditional(exports, "REGEX_GNU", 1); +#else /* ifndef REGEX_GNU */ + map_conditional(exports, "REGEX_GNU", 0); +#endif /* def REGEX_GNU */ + +#ifdef REGEX_PCRE + map_conditional(exports, "REGEX_PCRE", 1); +#else /* ifndef REGEX_PCRE */ + map_conditional(exports, "REGEX_PCRE", 0); +#endif /* def REGEX_PCRE */ + +#ifdef STATIC_PCRE + map_conditional(exports, "STATIC_PCRE", 1); +#else /* ifndef STATIC_PCRE */ + map_conditional(exports, "STATIC_PCRE", 0); +#endif /* ndef STATIC_PCRE */ + +#ifdef STATIC_PCRS + map_conditional(exports, "STATIC_PCRS", 1); +#else /* ifndef STATIC_PCRS */ + map_conditional(exports, "STATIC_PCRS", 0); +#endif /* ndef STATIC_PCRS */ + + map(exports, "FORCE_PREFIX", 1, FORCE_PREFIX, 1); +} + + +/********************************************************************* + * + * Function : show_rcs + * + * Description : Create a string with the rcs info for all sourcefiles + * + * Parameters : None + * + * Returns : string + * + *********************************************************************/ +static char *show_rcs(void) +{ + char *b = NULL; + char buf[BUFFER_SIZE]; + + /* Instead of including *all* dot h's in the project (thus creating a + * tremendous amount of dependencies), I will concede to declaring them + * as extern's. This forces the developer to add to this list, but oh well. + */ + +#define SHOW_RCS(__x) \ + { \ + extern const char __x[]; \ + sprintf(buf, "%s\n", __x); \ + b = strsav(b, buf); \ + } + + /* In alphabetical order */ + SHOW_RCS(actions_h_rcs) + SHOW_RCS(actions_rcs) + SHOW_RCS(cgi_h_rcs) + SHOW_RCS(cgi_rcs) +#ifdef FEATURE_CGI_EDIT_ACTIONS + SHOW_RCS(cgiedit_h_rcs) + SHOW_RCS(cgiedit_rcs) +#endif /* def FEATURE_CGI_EDIT_ACTIONS */ + SHOW_RCS(cgisimple_h_rcs) + SHOW_RCS(cgisimple_rcs) +#ifdef __MINGW32__ + SHOW_RCS(cygwin_h_rcs) +#endif + SHOW_RCS(deanimate_h_rcs) + SHOW_RCS(deanimate_rcs) + SHOW_RCS(encode_h_rcs) + SHOW_RCS(encode_rcs) + SHOW_RCS(errlog_h_rcs) + SHOW_RCS(errlog_rcs) + SHOW_RCS(filters_h_rcs) + SHOW_RCS(filters_rcs) + SHOW_RCS(gateway_h_rcs) + SHOW_RCS(gateway_rcs) +#ifdef GNU_REGEX + SHOW_RCS(gnu_regex_h_rcs) + SHOW_RCS(gnu_regex_rcs) +#endif /* def GNU_REGEX */ + SHOW_RCS(jbsockets_h_rcs) + SHOW_RCS(jbsockets_rcs) + SHOW_RCS(jcc_h_rcs) + SHOW_RCS(jcc_rcs) +#ifdef FEATURE_KILL_POPUPS + SHOW_RCS(killpopup_h_rcs) + SHOW_RCS(killpopup_rcs) +#endif /* def FEATURE_KILL_POPUPS */ + SHOW_RCS(list_h_rcs) + SHOW_RCS(list_rcs) + SHOW_RCS(loadcfg_h_rcs) + SHOW_RCS(loadcfg_rcs) + SHOW_RCS(loaders_h_rcs) + SHOW_RCS(loaders_rcs) + SHOW_RCS(miscutil_h_rcs) + SHOW_RCS(miscutil_rcs) + SHOW_RCS(parsers_h_rcs) + SHOW_RCS(parsers_rcs) + SHOW_RCS(pcrs_rcs) + SHOW_RCS(pcrs_h_rcs) + SHOW_RCS(project_h_rcs) + SHOW_RCS(ssplit_h_rcs) + SHOW_RCS(ssplit_rcs) +#ifdef _WIN32 +#ifndef _WIN_CONSOLE + SHOW_RCS(w32log_h_rcs) + SHOW_RCS(w32log_rcs) + SHOW_RCS(w32res_h_rcs) + SHOW_RCS(w32taskbar_h_rcs) + SHOW_RCS(w32taskbar_rcs) +#endif /* ndef _WIN_CONSOLE */ + SHOW_RCS(win32_h_rcs) + SHOW_RCS(win32_rcs) +#endif /* def _WIN32 */ + +#undef SHOW_RCS + + return(b); +} + + +/* + Local Variables: + tab-width: 3 + end: +*/ diff --git a/cgisimple.h b/cgisimple.h new file mode 100644 index 00000000..d5aa6282 --- /dev/null +++ b/cgisimple.h @@ -0,0 +1,87 @@ +#ifndef CGISIMPLE_H_INCLUDED +#define CGISIMPLE_H_INCLUDED +#define CGISIMPLE_H_VERSION "$Id: cgi.h,v 1.15 2001/09/16 15:02:35 jongfoster Exp $" +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ + * + * Purpose : Declares functions to intercept request, generate + * html or gif answers, and to compose HTTP resonses. + * + * Functions declared include: + * + * + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net + * + * Based on the Internet Junkbuster originally written + * by and Copyright (C) 1997 Anonymous Coders and + * Junkbusters Corporation. http://www.junkbusters.com + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * The GNU General Public License should be included with + * this file. If not, you can view it at + * http://www.gnu.org/copyleft/gpl.html + * or write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Revisions : + * $Log: cgi.h,v $ + * + **********************************************************************/ + + +#include "project.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * CGI functions + */ +extern int cgi_default (struct client_state *csp, + struct http_response *rsp, + struct map *parameters); +extern int cgi_robots_txt (struct client_state *csp, + struct http_response *rsp, + struct map *parameters); +extern int cgi_send_banner (struct client_state *csp, + struct http_response *rsp, + struct map *parameters); +extern int cgi_show_status (struct client_state *csp, + struct http_response *rsp, + struct map *parameters); +extern int cgi_show_url_info (struct client_state *csp, + struct http_response *rsp, + struct map *parameters); +extern int cgi_show_version (struct client_state *csp, + struct http_response *rsp, + struct map *parameters); + +/* Revision control strings from this header and associated .c file */ +extern const char cgisimple_rcs[]; +extern const char cgisimple_h_rcs[]; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ndef CGISIMPLE_H_INCLUDED */ + +/* + Local Variables: + tab-width: 3 + end: +*/ -- 2.39.2