From 83b81b5fe4a3cce2928eb014cca8b181c3d4dd4c Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Wed, 27 Mar 2002 15:30:26 +0000 Subject: [PATCH] Synthetic commit for tag v_2_9_8 --- .gitignore | 14 +- AUTHORS | 53 - ChangeLog | 202 - GNUmakefile.in | 945 ---- Junkbuster Status.URL | Bin 0 -> 56 bytes LICENSE | 342 -- Makefile | 63 - Makefile.in | 363 ++ README | 181 - acconfig.h | 219 +- actionlist.h | 107 +- actions.c | 1039 ++--- actions.h | 92 +- default.action => actionsfile | 423 +- advanced.action | 90 - amiga.c | 64 +- amiga.h | 29 +- basic.action | 377 -- cgi.c | 1860 +++----- cgi.h | 167 +- cgiedit.c | 4522 ------------------- cgiedit.h | 154 - cgisimple.c | 1303 ------ cgisimple.h | 143 - config | 233 +- config.guess | 1314 ------ config.h.in | 311 ++ config.h.win | 267 +- config.h.win32threads.win | 272 +- config.sub | 1410 ------ configure | 2267 ++++++++++ configure.in | 826 +--- vc_console.dsp => console_junkbuster.dsp | 62 +- contrib.sh | 4035 ----------------- cygwin.h | 22 +- deanimate.c | 49 +- deanimate.h | 33 +- default.filter | 335 -- doc/.gitignore | 2 - doc/STANDARDS.txt | 1119 +++++ doc/USER_DOC_IS_WIDELY_OBSOLETED | 0 doc/changes.txt | 991 ++++ doc/{obsolete => }/fb.gif | Bin doc/gpl.html | 8 +- doc/{obsolete => }/ijbfaq.html | 2 +- doc/{obsolete => }/ijbman.html | 2 +- doc/pcrs.3 | 479 -- doc/source/.gitignore | 4 - doc/source/developer-manual.sgml | 1570 ------- doc/source/faq.sgml | 1431 ------ doc/source/ldp.dsl | 172 - doc/source/user-manual.sgml | 4197 ----------------- doc/text/developer-manual.txt | 1315 ------ doc/text/faq.txt | 881 ---- doc/text/user-manual.txt | 2097 --------- doc/{obsolete => }/top.gif | Bin doc/webserver/.gitignore | 4 - doc/webserver/.htaccess | 26 - doc/webserver/README.txt | 5 +- doc/webserver/config/.htaccess | 34 - doc/webserver/config/index.php | 22 - doc/webserver/default_page.php | 69 - doc/webserver/developer-manual.html | 71 + doc/webserver/documentation-guidelines.html | 86 + doc/webserver/faq.html | 115 + doc/webserver/index.html | 168 +- doc/webserver/p_doc.css | 11 - doc/webserver/p_web.css | 11 - doc/webserver/redirect.php | 42 +- doc/webserver/robots.txt | 15 - doc/webserver/swa.css | 9 + doc/webserver/testplan.html | 102 + doc/webserver/user-manual.html | 71 + encode.c | 100 +- encode.h | 29 +- errlog.c | 254 +- errlog.h | 48 +- filters.c | 1206 ++--- filters.h | 81 +- gateway.c | 143 +- gateway.h | 75 +- icons/denyrule.ico | Bin 0 -> 318 bytes icons/icon1.ico | Bin 0 -> 318 bytes icons/idle.ico | Bin 318 -> 318 bytes icons/{privoxy.ico => junkbust.ico} | Bin 318 -> 318 bytes icons/os2.ico | Bin 2456 -> 0 bytes icons/os20.ico | Bin 498 -> 0 bytes icons/os21.ico | Bin 498 -> 0 bytes icons/os22.ico | Bin 498 -> 0 bytes icons/os23.ico | Bin 498 -> 0 bytes icons/os24.ico | Bin 498 -> 0 bytes icons/os25.ico | Bin 498 -> 0 bytes icons/os26.ico | Bin 498 -> 0 bytes icons/os27.ico | Bin 498 -> 0 bytes icons/os28.ico | Bin 498 -> 0 bytes install-sh | 251 - intermediate.action | 90 - jbsockets.c | 370 +- jbsockets.h | 69 +- jcc.c | 1354 ++---- jcc.h | 77 +- junkbuster-rh.spec | 302 ++ junkbuster-suse.spec | 175 + junkbuster.1 | 871 ++++ junkbuster.init | 133 + junkbuster.init.suse | 76 + privoxy.logrotate => junkbuster.logrotate | 56 +- privoxy.monthly => junkbuster.monthly | 15 +- privoxy.weekly => junkbuster.weekly | 15 +- killpopup.c | 131 +- killpopup.h | 57 +- list.c | 868 +--- list.h | 95 +- loadcfg.c | 651 +-- loadcfg.h | 62 +- loaders.c | 1035 ++--- loaders.h | 121 +- miscutil.c | 1182 +---- miscutil.h | 76 +- parsers.c | 1384 ++---- parsers.h | 162 +- pcre/config.h | 2 +- pcre/pcre.in | 2 +- pcre/pcreposix.c | 2 +- pcrs.c | 597 +-- pcrs.h | 115 +- privoxy-rh.spec | 778 ---- privoxy-suse.spec | 382 -- privoxy.1 | 334 -- privoxy.init | 251 - privoxy.init.suse | 117 - project.h | 655 +-- re_filterfile | 175 + showargs.c | 486 ++ showargs.h | 75 + ssplit.c | 20 +- ssplit.h | 22 +- templates/blocked | 89 +- templates/blocked-compact | 20 +- templates/cgi-error-404 | 166 - templates/cgi-error-bad-param | 173 - templates/cgi-error-disabled | 160 - templates/cgi-error-file | 156 - templates/cgi-error-modified | 175 - templates/cgi-error-parse | 192 - templates/connect-failed | 86 +- templates/default | 72 +- templates/edit-actions-add-url-form | 169 - templates/edit-actions-for-url | 815 ---- templates/edit-actions-for-url-filter | 6 - templates/edit-actions-list | 260 -- templates/edit-actions-list-section | 103 - templates/edit-actions-list-url | 73 - templates/edit-actions-remove-url-form | 153 - templates/edit-actions-url-form | 171 - templates/no-such-domain | 98 +- templates/show-request | 172 - templates/show-status | 255 +- templates/show-status-file | 72 +- templates/show-url-info | 101 +- templates/show-version | 174 - templates/toggle | 199 - templates/toggle-mini | 90 - templates/untrusted | 92 +- testdrive.status | 31 - urlmatch.c | 824 ---- urlmatch.h | 97 - vc_privoxy.dsp => vc_junkbuster.dsp | 88 +- vc_privoxy.dsw => vc_junkbuster.dsw | 4 +- w32.rc | 158 +- w32log.c | 144 +- w32log.h | 32 +- w32res.h | 89 +- w32rulesdlg.c | 548 +++ w32rulesdlg.h | 72 + w32taskbar.c | 22 +- w32taskbar.h | 24 +- win32.c | 150 +- win32.h | 32 +- 179 files changed, 13699 insertions(+), 47854 deletions(-) delete mode 100644 AUTHORS delete mode 100644 ChangeLog delete mode 100644 GNUmakefile.in create mode 100644 Junkbuster Status.URL delete mode 100644 LICENSE delete mode 100644 Makefile create mode 100644 Makefile.in delete mode 100644 README rename default.action => actionsfile (76%) mode change 100644 => 100755 delete mode 100644 advanced.action delete mode 100644 basic.action delete mode 100644 cgiedit.c delete mode 100644 cgiedit.h delete mode 100644 cgisimple.c delete mode 100644 cgisimple.h delete mode 100755 config.guess create mode 100644 config.h.in delete mode 100755 config.sub create mode 100755 configure rename vc_console.dsp => console_junkbuster.dsp (83%) mode change 100644 => 100755 delete mode 100755 contrib.sh delete mode 100644 default.filter delete mode 100644 doc/.gitignore create mode 100644 doc/STANDARDS.txt create mode 100644 doc/USER_DOC_IS_WIDELY_OBSOLETED create mode 100644 doc/changes.txt rename doc/{obsolete => }/fb.gif (100%) rename doc/{obsolete => }/ijbfaq.html (97%) rename doc/{obsolete => }/ijbman.html (97%) delete mode 100644 doc/pcrs.3 delete mode 100644 doc/source/.gitignore delete mode 100644 doc/source/developer-manual.sgml delete mode 100644 doc/source/faq.sgml delete mode 100644 doc/source/ldp.dsl delete mode 100644 doc/source/user-manual.sgml delete mode 100644 doc/text/developer-manual.txt delete mode 100644 doc/text/faq.txt delete mode 100644 doc/text/user-manual.txt rename doc/{obsolete => }/top.gif (100%) delete mode 100644 doc/webserver/.gitignore delete mode 100644 doc/webserver/.htaccess delete mode 100644 doc/webserver/config/.htaccess delete mode 100644 doc/webserver/config/index.php delete mode 100644 doc/webserver/default_page.php create mode 100644 doc/webserver/developer-manual.html create mode 100644 doc/webserver/documentation-guidelines.html create mode 100644 doc/webserver/faq.html delete mode 100644 doc/webserver/p_doc.css delete mode 100644 doc/webserver/p_web.css delete mode 100644 doc/webserver/robots.txt create mode 100644 doc/webserver/swa.css create mode 100644 doc/webserver/testplan.html create mode 100644 doc/webserver/user-manual.html create mode 100644 icons/denyrule.ico create mode 100644 icons/icon1.ico rename icons/{privoxy.ico => junkbust.ico} (59%) delete mode 100644 icons/os2.ico delete mode 100644 icons/os20.ico delete mode 100644 icons/os21.ico delete mode 100644 icons/os22.ico delete mode 100644 icons/os23.ico delete mode 100644 icons/os24.ico delete mode 100644 icons/os25.ico delete mode 100644 icons/os26.ico delete mode 100644 icons/os27.ico delete mode 100644 icons/os28.ico delete mode 100755 install-sh delete mode 100644 intermediate.action create mode 100644 junkbuster-rh.spec create mode 100644 junkbuster-suse.spec create mode 100644 junkbuster.1 create mode 100644 junkbuster.init create mode 100644 junkbuster.init.suse rename privoxy.logrotate => junkbuster.logrotate (56%) rename privoxy.monthly => junkbuster.monthly (87%) rename privoxy.weekly => junkbuster.weekly (84%) delete mode 100644 privoxy-rh.spec delete mode 100644 privoxy-suse.spec delete mode 100644 privoxy.1 delete mode 100644 privoxy.init delete mode 100644 privoxy.init.suse create mode 100644 re_filterfile create mode 100644 showargs.c create mode 100644 showargs.h delete mode 100644 templates/cgi-error-404 delete mode 100644 templates/cgi-error-bad-param delete mode 100644 templates/cgi-error-disabled delete mode 100644 templates/cgi-error-file delete mode 100644 templates/cgi-error-modified delete mode 100644 templates/cgi-error-parse delete mode 100644 templates/edit-actions-add-url-form delete mode 100644 templates/edit-actions-for-url delete mode 100644 templates/edit-actions-for-url-filter delete mode 100644 templates/edit-actions-list delete mode 100644 templates/edit-actions-list-section delete mode 100644 templates/edit-actions-list-url delete mode 100644 templates/edit-actions-remove-url-form delete mode 100644 templates/edit-actions-url-form delete mode 100644 templates/show-request delete mode 100644 templates/show-version delete mode 100644 templates/toggle delete mode 100644 templates/toggle-mini delete mode 100644 testdrive.status delete mode 100644 urlmatch.c delete mode 100644 urlmatch.h rename vc_privoxy.dsp => vc_junkbuster.dsp (81%) rename vc_privoxy.dsw => vc_junkbuster.dsw (82%) create mode 100644 w32rulesdlg.c create mode 100644 w32rulesdlg.h diff --git a/.gitignore b/.gitignore index 9ea1fd22..4e10412d 100644 --- a/.gitignore +++ b/.gitignore @@ -26,30 +26,20 @@ _$* *.ln core # CVS default ignores end -*.txt -GNUmakefile +.\logfile Makefile -configure +config config.cache config.h -config.h.in config.log config.status -jarfile junkbstr.txt junkbuster junkbuster.log logfile permissionsfile -privoxy -privoxy.exe re_filterfile -vc_debug -vc_debug_winthr vc_junkbuster.ncb vc_junkbuster.opt vc_junkbuster.plg -vc_release -vc_release_winthr w32.aps -w32.res diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 9bece11a..00000000 --- a/AUTHORS +++ /dev/null @@ -1,53 +0,0 @@ - Authors of Privoxy v2.9.x and 3.x -=========================================================================== - -Current Project developers: - - Stefan Waldherr - Andreas Oesterhelt - Jon Foster - - Markus Breitenbach - Thomas Steudten - -Current Project Contributors (in alphabetical order): - - David Schmidt (OS/2, Mac OSX ports) - Gabriel L. Somlo - Hal Burgiss (docs) - Haroon Rafique - John Venvertloh - Joerg Strohmayer - Rodney Stromlund - Rodrigo Barbosa (RPM specfiles) - Sarantis Paskalis - Shamim Mohamed - -Originally developed by: - - Junkbusters Corp. - Anonymous Coders - -Thanks to the many people who have tested Privoxy, reported bugs, -or made suggestions. These include (in alphabetical order): - - Aaron Hamid - Alexander Lazic (FreeBSD patch) - Andrew J. Caines - Bart Schelstraete - Clifford Caoile - Darren Wiebe - Gabor Liptak - Guy - Ken Arromdee - Magnus Holmgren - Paul Lieverse - Peter E - Reiner Buehl - -If we've missed you off this list, please let us know! - -Privoxy team. http://www.privoxy.org/ -ijbswa-developers@lists.sourceforge.net - - diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index e16c454b..00000000 --- a/ChangeLog +++ /dev/null @@ -1,202 +0,0 @@ --------------------------------------------------------------------- -ChangeLog for Internet JunkBuster --------------------------------------------------------------------- - -*** Version 2.9.13 Beta *** - -- *NEWS*: The project has been renamed to Privoxy! The new name is -reflected throughout (file locations, etc). -- ijb.action is now default.action. re_filterfile is now -default.filter. -- http://i.j.b/ is now http://p.p/ -- The 'logo' option for replacing ad iamges is removed now. 'Pattern' -(checkerboard) is now the default. - - -*** Version 2.9.12 Beta *** - -- **READ**: The default listening PORT is NOW 8118!!! Changed from -8000 due to conflict with NAS (Network Audio Server, whatever that -is.) -- More CGI actions editor fixes and improvements. -- Win32 command line fix ups. -- re_filterfile now has modular sections that can be activated on a -per site basis. Some new goodies there too. -- +filter now takes arguments to match FILTER sections in re_filterfile -for even more flexibility. -- Added a new image blocker option: +image-blocker{pattern}, which -displays a checkerboard patthern and scales better than the logo. -- PNG images will be used in place of GIF for JB built-in images -if configured with --enable-no-gif. -- Clean up compiler warnings (mostly). -- Improved handling of failed DNS lookups & diagnostics for failed bind -to listen socket -- Made --no-daemon mode log to tty instead of logfile. -- Various spec file and init script cleanups and improvements (Redhat and -SuSE). -- CGI Editor works on OS/2 now. -- Fix restart failure where sockets were in TIME_WAIT. -- Fixes for actions cgi editor, make sure we have right file. -- A --pidfile command line option now, in addition to --help, ---version, --no-daemon, --user and configfile. --no-daemon replaces -the former -d option and _DEBUG define. --user will drop privileges -to the specified user. -- Signal handling cleanups (*nix). -- CGI actions editor improvements and fixes. -- Error handling improvements, especially out of memory. -- Default re_filterfile fix that caused spurious IJB logos -(instead of 'blank'). -- configure.in threading fixes for Solaris. -- Various other minor fixes. - - -*** Version 2.9.11 Beta Changes *** - -- Add "session" cookie concept where cookies exist for the life -of that browser session only (ie never goes to disk). -- Checks for correct header length. -- Fix user:pass@host.domain.com auth bug. -- Better signal handling on *nix. -- Fix CFLAGS hard-coded in configure.in -- Fix threading bug re: gethostbyname() that caused random -URLs to fail in some cases. - - -*** Version 2.9.11 Alpha Changes *** - -- A web-based editor for the actions file is included (go to http://i.j.b/). -- Web-based toggle IJB on/off support. -- Cookie handling has changed - the new +no-cookies-keep feature is now the -default. -- actionsfile is renamed to ijb.action. -- junkbstr.txt is now config.txt on Win32. -- Support for running IJB as a UNIX daemon process has improved. -- Unix daemon now returns error code on failed start. -- Timestamps in logfile and jarfile now. -- Fix for the Netscape bug reintroduced in 2.9.9. -- make should now abort if gmake (GNU make) not present. -- Many other minor bugfixes -- Start a ChangeLog :) - - - -*** Version 2.9.3 pre-Alpha Changes *** - -- Amiga support (completely untested by me - I don't have an Amiga) -- "tinygif 3" support (redirects blocked images to a specified URL, so -the browser doesn't have to load and cache many copies of the same -image). -- one case where there were both local and global "referrer" variables -(yuck!) clarified by renaming the local one to "refer". -- Fixed some places where close() was used instead of close_socket(). -Thanks to Jörg Strohmayer (joergs at users.sourceforge.net) for these. -- Temporary hack to get FORCE_LOAD to work with IE. I just lowercased the -FORCE_LOAD_PREFIX. Needs fixing properly. -- Most URLs hardcoded into JunkBuster were changed to go through a script -e.g. http://ijbswa.sourceforge.net/redirect.php?v=2.9.3&to=faq -The only other URLs left are the GNU GPL: - http://www.fsf.org/copyleft/gpl.html -and the home page: - http://ijbswa.sourceforge.net/ -... and various URLs which will be intercepted by JunkBuster anyway. -TODO: Still need to do something with the URLs in JunkBuster Corp's -copyright/trademark notice on the bottom of the show-proxy-args page. -- PCRE or GNU Regex is now a #define option. - - -*** Version 2.9.2 pre-Alpha Changes *** - -- Andreas applied the latest version of the FORCE patch. - - -*** Version 2.9.1 pre-Alpha Changes *** - -- in parsers.c, fixed two #ifdef FORCE to #ifdef FORCE_LOAD -(BTW: I think FORCE is precise enough, since loading remote -data is the whole purpose of a proxy..) -- Set the FORCE_PREFIX (back) to 'IJB-FORCE-LOAD-'. While 'noijb.' -is more elegant and looks like a hostname in the URL, it doesn't -make clear to the inexperienced user that the proxy is bypassed. It -also has a higher name collision risk. -- Filled in the function header templates for my functions in -parsers.c (again). They obviously got lost in our current -patch war ;-) -- Cut the credit for the §-referrer-option from the config file, -that Stefan had placed there. -- Improved the re_filterfile - - -*** Version 2.9.0 pre-Alpha Changes *** - -- Now use PCRE, not GNU REGEX. I have not yet had chance to check the -syntax of the block/image/cookie file to ensure that they match what -is expected - however they seem to work. -- Replaced "configure" script with one generated by "autoconf". Also -use a header "config.h" (was ijbconfig.h in my previous release) for -the #defines. "config.h" is now generated with "autoheader" from -"acconfig.h" and "configure.in". (Note that to install you do not -need autoconf or autoheader - just run "./configure".) -To see command-line options, run "./configure --help". -This is my first ever autoconf script, so it has some rough edges -(how PCRE is handled is the roughest). -- Error logging code replaced with new module errlog.c, based on the -one from JunkBusterMT (but with the threading code removed). -- Most of Rodney's 0.21 and 0.21A patches applied. (Marked *). I did not -apply all of these, since I had already independently done conditional -popup file, conditional image file, and integration of popup code. -- ACL, Jar and trust files conditionally compiled. -- New source file headers. -- Various cosmetic changes. (But I have not consistently ordered the -config files - I think that's worthwhile, but it's 1am and I want to -get this released!) -- RCS tags on .h files. -- RCS tags are const char[] rather than const char *. (Saves 4 bytes -per tag ;-) -- VC++ project files renamed to vc_junkbuster.*. -- show-proxy-args now shows status of all conditionals, not just REGEX -- Various functions moved around. Most notably all the system-specific -sockets code which was spread between jcc.c, bind.c, and connect.c, -has been moved to "jbsockets.c". The non-system-specific code from -connect.c and socks4.c has been movet to "gateway.c". Also, the -config file loader and the global variables it writes to have been -moved to "loadcfg.c". (Maybe this should go into loaders.c?) -And candidate for the "worst filename ever" award is "miscutil.c", -which contains, well, miscellaneous utility functions like zalloc. -(Suggestions for a better name for this file are welcome!) -- Loaders now use a common function to read a line and skip comments, -and this function also stores the proxy_args. -- Added ./junkbuster --help (Not for Win32 GUI) -- Added ./junkbuster --version (Not for Win32 GUI) -- Win32 resources are now all marked as "U.S. English", rather than -being a mix of "U.S. English", "U.K. English" and "Irish English". -- Version number changes to 2.9.0 - - - ----------------------------------------------------------------------- -Copyright : Written by and Copyright (C) 2001 the SourceForge - Privoxy team. http://www.privoxy.org/ - - 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. - - diff --git a/GNUmakefile.in b/GNUmakefile.in deleted file mode 100644 index 7726cc7e..00000000 --- a/GNUmakefile.in +++ /dev/null @@ -1,945 +0,0 @@ -# Note: Makefile is built automatically from Makefile.in -# -# $Id: GNUmakefile.in,v 1.36 2002/03/27 14:58:08 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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. -# - -############################################################################# -# Version number (for RPM) -############################################################################# - -VERSION_MAJOR = @VERSION_MAJOR@ -VERSION_MINOR = @VERSION_MINOR@ -VERSION_POINT = @VERSION_POINT@ -CODE_STATUS = @CODE_STATUS@ -VERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_POINT) -# will automatically be postfixed with -$(RPM_PACKAGEV) in the SPECfile -RPM_VERSION = $(VERSION) -RPM_PACKAGEV = @VERSION_RPM_PACKAGE@ - - -############################################################################# -# Directories for "make install" -############################################################################# - -DEST = @sysconfdir@/privoxy -SBIN_DEST = @sbindir@ -MAN_DEST = @mandir@ - - -############################################################################# -# Build tools -############################################################################# - -PROGRAM = privoxy@EXEEXT@ -CC = @CC@ -ECHO = echo -GZIP_PROG = gzip -INSTALL = cp -f -LD = @CC@ -RM = rm -f -STRIP_PROG = strip -SED = sed -CAT = cat -RPM = rpm -MV = mv -TAR = tar -MAKE = make -LN = ln -WDUMP = @WDUMP@ -dump -JADEBIN = @JADEBIN@ -DB = $(JADEBIN) -t sgml -ihtml -D.. -d ldpOK.dsl\#html -DB2HTML = @DB2HTML@ -DKPREFIX = @DKPREFIX@ -MAN2HTML = @MAN2HTML@ -TARGET_OS = foobar - -# Program to do LF->CRLF -# -# The sed version should be the most portable, but it doesn't for for me, -# the other two do. FIXME. -# - Jon -#DOSFILTER = $(SED) -e $$'s,$$,\r,' -#DOSFILTER = gawk -v ORS='\r\n' '{print $0;}' -DOSFILTER = perl -p -e 's/\n/\r\n/' - -############################################################################# -# Setup for make distribution rh and suse for now -############################################################################# - -TAR_ARCH = /tmp/privoxy-$(RPM_VERSION).tar.gz -RPM_BASE = @RPM_BASE@ - -############################################################################# -# Filenames and libraries -############################################################################# - -C_SRC = actions.c cgi.c cgiedit.c cgisimple.c deanimate.c encode.c \ - errlog.c filters.c gateway.c jbsockets.c jcc.c killpopup.c \ - list.c loadcfg.c loaders.c miscutil.c parsers.c ssplit.c \ - urlmatch.c - -C_OBJS = $(C_SRC:.c=.@OBJEXT@) -C_HDRS = $(C_SRC:.c=.h) project.h actionlist.h - -CONFIG_FILES = config trust \ - default.action \ - basic.action intermediate.action advanced.action \ - default.filter \ - templates/* - -DOC_FILES = AUTHORS LICENSE README ChangeLog doc/text/* privoxy.1 - -W32_SRC = @WIN_ONLY@w32log.c w32taskbar.c win32.c -W32_FILES = @WIN_ONLY@w32.res -W32_OBJS = @WIN_ONLY@$(W32_SRC:.c=.@OBJEXT@) $(W32_FILES) -W32_HDRS = @WIN_ONLY@w32log.h w32taskbar.h win32.h w32res.h -W32_LIB = @WIN_ONLY@-lwsock32 -lcomctl32 -W32_INIS = @WIN_ONLY@config.txt trust.txt - -PCRS_SRC = @STATIC_PCRS_ONLY@pcrs.c -PCRS_OBJS = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.@OBJEXT@) -PCRS_HDRS = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.h) - -PCRE_SRC = @STATIC_PCRE_ONLY@pcre/get.c pcre/maketables.c pcre/study.c pcre/pcre.c -PCRE_OBJS = @STATIC_PCRE_ONLY@$(PCRE_SRC:.c=.@OBJEXT@) -PCRE_HDRS = @STATIC_PCRE_ONLY@pcre/config.h pcre/chartables.c pcre/internal.h pcre/pcre.h - -# No REGEX (Either because dynamically linked pcreposix, or no regex at all): -REGEX_SRC = -# GNU REGEX: -@GNU_REGEX_ONLY@REGEX_SRC = gnu_regex.c -# PCRE REGEX: -@PCRE_REGEX_ONLY@@STATIC_PCRE_ONLY@REGEX_SRC = pcre/pcreposix.c - -REGEX_OBJS = $(REGEX_SRC:.c=.@OBJEXT@) -REGEX_HDRS = $(REGEX_SRC:.c=.h) - -# Dependencies introduced by #include "project.h". -PROJECT_H_DEPS = project.h $(REGEX_HDRS) $(PCRS_HDRS) @STATIC_PCRE_ONLY@pcre/pcre.h - -# Socket libraries for platforms that need them explicitly defined -SOCKET_LIB = @SOCKET_LIB@ - -# PThreads library, if needed. -PTHREAD_LIB = @PTHREAD_ONLY@@PTHREAD_LIB@ - -SRCS = $(C_SRC) $(W32_SRC) $(PCRS_SRC) $(PCRE_SRC) $(REGEX_SRC) -OBJS = $(C_OBJS) $(W32_OBJS) $(PCRS_OBJS) $(PCRE_OBJS) $(REGEX_OBJS) -HDRS = $(C_HDRS) $(W32_HDRS) $(PCRS_HDRS) $(PCRE_OBJS) $(REGEX_HDRS) -LIBS = @LIBS@ $(W32_LIB) $(SOCKET_LIB) $(PTHREAD_LIB) - - -############################################################################# -# Compiler switches -############################################################################# - -# The flag "-mno-win32" can be used by Cygwin to emulate a un?x type build. -# The flag "-mwindows -mno-cygwin" will cause Cygwin to use MingW32 for a -# Win32 GUI build. -# The flag "-pthread" is required if using Pthreads under Linux (and -# possibly other OSs). -SPECIAL_CFLAGS = @SPECIAL_CFLAGS@ - -# Add your flags here -OTHER_CFLAGS = - -CFLAGS = @CFLAGS@ @CPPFLAGS@ $(OTHER_CFLAGS) $(SPECIAL_CFLAGS) -Wall \ - @STATIC_PCRE_ONLY@ -Ipcre - -LDFLAGS = $(DEBUG_CFLAGS) $(SPECIAL_CFLAGS) - - -############################################################################# -# Build section. -# -# There should NOT be any targets above this line. -############################################################################# -all: $(PROGRAM) - - -############################################################################# -# Phony targets -############################################################################# -.PHONY: all inifiles redhat-dist redhat-upload solaris-dist suse-dist \ -suse-upload win-dist tarball-dist dok redhat-dok webserver clean clobber tags \ -install - - -############################################################################# -# Define this explicitly because Solaris is broken! -############################################################################# -%.o: %.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ - - -############################################################################# -# Win32 config files -############################################################################# - -inifiles: $(W32_INIS) - -config.txt: config - $(SED) -e 's!\trustfile trust!trustfile trust.txt!' \ - -e 's!\jarfile jarfile!jarfile jar.log!' \ - -e 's!\logfile logfile!logfile privoxy.log!' \ - -e 's!#Win32-only: !!' \ - < $< | \ - $(DOSFILTER) > $@ - # LF to CRLF in default.action - $(DOSFILTER) default.action.txt && mv default.action.txt default.action - # LF to CRLF in default.filter - $(DOSFILTER) default.filter.txt && mv default.filter.txt default.filter - -trust.txt: trust - $(DOSFILTER) < $< > $@ - -re_filterfile.txt: re_filterfile - $(DOSFILTER) < $< > $@ - - -############################################################################# -# redhat distribution alpha and x86 -############################################################################# - -redhat-dist: - for dir in RPMS SRPMS BUILD SOURCES SPECS; do \ - if [ ! -w $(RPM_BASE)/$$dir ]; then \ - $(ECHO) "$(RPM_BASE)/$$dir is not writable for you. Maybe try as root."; \ - $(ECHO) "Or add a suitable path to .rpmmacros like."; \ - $(ECHO) "%_topdir /home/foo/rpm-build"; \ - exit 1; \ - fi; \ - done; \ - - $(MAKE) clobber - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - - TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \ - if $(SED) -e 's/^\(Version:\).*/\1 $(RPM_VERSION)/g' \ - -e 's/^\(Release:\).*/\1 $(RPM_PACKAGEV)/g' \ - privoxy-rh.spec > $$TMPFILE ; then \ - $(MV) -f $$TMPFILE privoxy-rh.spec; \ - else \ - $(ECHO) "Could not set version info in specfile."; \ - exit 1;\ - fi - - $(TAR) --exclude "CVS" --exclude "privoxy-suse.spec" -czf $(TAR_ARCH) . - $(RPM) --clean -ta $(TAR_ARCH) - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - -# -# anonymously ncftps the rpms to sourceforge -# -redhat-upload: - ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/SRPMS/privoxy-$(RPM_VERSION)-$(RPM_PACKAGEV).src.rpm -# better should use `arch` here instead of ix86 to support other platforms too - ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/RPMS/*/privoxy-$(RPM_VERSION)-$(RPM_PACKAGEV).*.rpm - @$(ECHO) ------------------------------------------------------- - @$(ECHO) Now goto - @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118 - @$(ECHO) ... and release the files. - @$(ECHO) ------------------------------------------------------- - # w3m http://sourceforge.net/project/admin/editpackages.php?group_id=11118 - -############################################################################# -# sun solaris distribution -############################################################################# - -solaris-dist: - @$(ECHO) "" - @$(ECHO) "You have run autoconf && autoheader && ./configure right?" - @$(ECHO) "" - $(MAKE) $(PROGRAM) - $(STRIP_PROG) $(PROGRAM) - $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS) -# add program - $(TAR) -C.. -cvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$(PROGRAM) -# add config files - for foo in $(CONFIG_FILES); do \ - $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -uvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$$foo; \ - done; -# add documentation - for foo in $(DOC_FILES); do \ - $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -uvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$$foo; \ - done; -# and zip the archive - $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS) - $(GZIP_PROG) privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar - @$(ECHO) Distribution with binary created. - -# anonymously ncftps the tarball to sourceforge -solaris-upload: - ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar.gz - @$(ECHO) ------------------------------------------------------- - @$(ECHO) Now goto - @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118 - @$(ECHO) ... and release the files. - @$(ECHO) ------------------------------------------------------- - -# use with care -solaris-clean: - $(RM) privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar* - -############################################################################# -# hpux distribution -############################################################################# -hpux-dist: - @$(ECHO) coming soon. -hpux-upload: - @$(ECHO) coming soon. - -############################################################################# -# debian distribution -############################################################################# -debian-dist: - @$(ECHO) coming soon. -debian-upload: - @$(ECHO) coming soon. - -############################################################################# -# macosx distribution -############################################################################# -macosx-dist: - @$(ECHO) coming soon. -macosx-upload: - @$(ECHO) coming soon. - -############################################################################# -# amiga distribution -############################################################################# -amiga-dist: - @$(ECHO) coming soon. -amiga-upload: - @$(ECHO) coming soon. - -############################################################################# -# freebsd distribution -############################################################################# -freebsd-dist: - @$(ECHO) coming soon. -freebsd-upload: - @$(ECHO) coming soon. - -############################################################################# -# suse distribution. works fine. no need to be root. -############################################################################# -suse-dist: - for dir in RPMS SRPMS BUILD SOURCES SPECS; do \ - if [ ! -w $(RPM_BASE)/$$dir ]; then \ - $(ECHO) "$(RPM_BASE)/$$dir is not writable for you. Maybe try as root."; \ - $(ECHO) "Or add a suitable path to .rpmmacros like."; \ - $(ECHO) "%_topdir /home/foo/rpm-build"; \ - exit 1; \ - fi; \ - done; \ - - $(MAKE) clobber - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - - TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \ - if $(SED) -e 's/^\(Version:\).*/\1 $(RPM_VERSIO)/g' \ - -e 's/^\(Release:\).*/\1 $(RPM_PACKAGEV)/g' \ - privoxy-suse.spec > $$TMPFILE ; then \ - $(MV) -f $$TMPFILE privoxy-suse.spec; \ - else \ - $(ECHO) "Could not set version info in specfile."; \ - exit 1;\ - fi - - $(TAR) --exclude "CVS" --exclude "privoxy-rh.spec" -czf $(TAR_ARCH) . - $(RPM) --clean -ta $(TAR_ARCH) - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - -# -# anonymously ncftps the rpms to sourceforge -# -suse-upload: - ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/SRPMS/privoxy-suse-$(RPM_VERSION)-$(RPM_PACKAGEV).src.rpm -# better should use `arch` here instead of ix86 to support other platforms too - ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/RPMS/*/privoxy-suse-$(RPM_VERSION)-$(RPM_PACKAGEV).*.rpm - @$(ECHO) ------------------------------------------------------- - @$(ECHO) Now goto - @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118 - @$(ECHO) ... and release the files. - @$(ECHO) ------------------------------------------------------- - -# handle with care. use with root. -suse-clean: - rpm -e junkbuster-suse || true - rm -rf /etc/junkbuster - rm -rf /etc/rc.d/junkbuster* - rm -rf /var/run/junkbuster.pid - rm -rf /var/log/junkbuster - rm -f /etc/init.d/junkbuster - rm -f /usr/sbin/junkbuster - rm -f /usr/sbin/rcjunkbuster - rm -f /usr/share/man/man1/junkbuster.1.gz - rpm -e privoxy-suse || true - rm -rf /etc/privoxy - rm -rf /etc/rc.d/privoxy* - rm -rf /var/run/privoxy.pid - rm -rf /var/log/privoxy - rm -f /etc/init.d/privoxy - rm -f /usr/sbin/privoxy - rm -f /usr/sbin/rcprivoxy - rm -f /usr/share/man/man1/privoxy.1.gz - -############################################################################# -# Windows distribution -############################################################################# -win-dist: - $(ECHO) Not implemented. - - -############################################################################# -# Tarball distribution -############################################################################# -tarball-dist: clobber - $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS) - $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -cvhzf privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz privoxy-$(VERSION)-$(CODE_STATUS) - $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS) - @$(ECHO) Tarball (without any binary) created. - -# anonymously ncftps the tarball to sourceforge -tarball-upload: - ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz - @$(ECHO) ------------------------------------------------------- - @$(ECHO) Now goto - @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118 - @$(ECHO) ... and release the files. - @$(ECHO) ------------------------------------------------------- - -# handle with care -tarball-clean: - $(RM) privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz - -############################################################################# -# -# Documentation -# -# converts doc/source/*.sgml into html, text and man pages -# -############################################################################# -dok: doc/source/ldpOK.dsl man2html-swa - mkdir -p doc/text doc/man -# user manual - rm -rf doc/webserver/user-manual - cd doc/source && $(DB2HTML) -s ldpOK.dsl user-manual.sgml && mv user-manual ../webserver - cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks user-manual.sgml > tmp.html && lynx -dump tmp.html > ../text/user-manual.txt && rm -rf tmp.html user-manual -## developer manual - rm -rf doc/webserver/developer-manual - cd doc/source && $(DB2HTML) -s ldpOK.dsl developer-manual.sgml && mv developer-manual ../webserver - cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks developer-manual.sgml > tmp.html && lynx -dump tmp.html > ../text/developer-manual.txt && rm -rf tmp.html developer-manual -## faq - rm -rf doc/webserver/faq - cd doc/source && $(DB2HTML) -s ldpOK.dsl faq.sgml && mv faq ../webserver - cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks faq.sgml > tmp.html && lynx -dump tmp.html > ../text/faq.txt && rm -rf tmp.html faq - -man2html-swa: - if [ "$(MAN2HTML)" != "false" ]; then \ - mkdir -p doc/webserver/man-page; \ - $(ECHO) "Privoxy|Doc/Man page

NAME

" > doc/webserver/man-page/privoxy-man-page.html; \ - man ./privoxy.1 | $(MAN2HTML) -bare \ - >> doc/webserver/man-page/privoxy-man-page.html; \ - $(ECHO) "" >> doc/webserver/man-page/privoxy-man-page.html; \ - fi - -redhat-dok: doc/source/ldpOK.dsl man2html - mkdir -p doc/text doc/man doc/source/user-manual \ - doc/source/developer-manual doc/source/faq -## user manual - rm -rf doc/webserver/user-manual - cd doc/source/user-manual && $(DB) ../user-manual.sgml && cd .. &&\ - mv user-manual ../webserver - cd doc/source && $(DB) -V nochunks user-manual.sgml > tmp.html && \ - $(WDUMP) tmp.html > ../text/user-manual.txt && rm -rf tmp.html \ - user-manual -## developer manual - rm -rf doc/webserver/developer-manual - cd doc/source/developer-manual && $(DB) ../developer-manual.sgml &&\ - cd .. && mv developer-manual ../webserver - cd doc/source && $(DB) -V nochunks developer-manual.sgml > tmp.html && \ - $(WDUMP) tmp.html > ../text/developer-manual.txt && rm -rf tmp.html \ - developer-manual -## faq - rm -rf doc/webserver/faq - cd doc/source/faq && $(DB) ../faq.sgml && cd .. && mv faq ../webserver - cd doc/source && $(DB) -V nochunks faq.sgml > tmp.html && $(WDUMP) \ - tmp.html > ../text/faq.txt && rm -rf tmp.html faq - -doc/source/ldpOK.dsl: - if [ "$(DKPREFIX)" != "none" ]; then \ - sed -e "s@/usr/share/sgml/docbook/dsssl-stylesheets@$(DKPREFIX)@g" doc/source/ldp.dsl > doc/source/ldpOK.dsl; \ - else \ - cp doc/source/ldp.dsl doc/source/ldpOK.dsl; \ - fi - -man2html: - if [ "$(MAN2HTML)" != "false" ]; then \ - $(MAN2HTML) privoxy.1 |grep -v "^Content-type" > doc/webserver/man-page/privoxy-man-page.html; \ - fi - -############################################################################# -# -# Webserver -# -# moves dokumentation to webserver -# -############################################################################# -webserver: - @$(ECHO) ------------------------------------------------------- - @$(ECHO) You have run make dok/redhat-dok before, right? - @$(ECHO) Note that this command scps all stuff to the webserver, - @$(ECHO) it will not remove obsolete documents. - @$(ECHO) ------------------------------------------------------- - chmod -R a+r doc/webserver - find doc/webserver -type d -exec chmod a+rx {} \; - cd doc/webserver && scp -Cr . ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - -############################################################################# -# Source file dependencies -############################################################################# - -actions.@OBJEXT@: actions.c actions.h config.h $(PROJECT_H_DEPS) errlog.h jcc.h list.h loaders.h miscutil.h actionlist.h -cgi.@OBJEXT@: cgi.c cgi.h config.h $(PROJECT_H_DEPS) cgiedit.h cgisimple.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h -cgiedit.@OBJEXT@: cgiedit.c cgiedit.h config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h -cgisimple.@OBJEXT@: cgisimple.c cgisimple.h config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h -deanimate.@OBJEXT@: deanimate.c deanimate.h config.h $(PROJECT_H_DEPS) -encode.@OBJEXT@: encode.c encode.h config.h -errlog.@OBJEXT@: errlog.c errlog.h config.h $(PROJECT_H_DEPS) @WIN_ONLY@w32log.h -filters.@OBJEXT@: filters.c filters.h config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jbsockets.h jcc.h loadcfg.h parsers.h ssplit.h cgi.h deanimate.h @WIN_ONLY@win32.h -gateway.@OBJEXT@: gateway.c gateway.h config.h $(PROJECT_H_DEPS) errlog.h jbsockets.h jcc.h loadcfg.h -jbsockets.@OBJEXT@: jbsockets.c jbsockets.h config.h $(PROJECT_H_DEPS) filters.h -jcc.@OBJEXT@: jcc.c jcc.h config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h killpopup.h loadcfg.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h cgi.h -killpopup.@OBJEXT@: killpopup.c killpopup.h config.h $(PROJECT_H_DEPS) jcc.h loadcfg.h -list.@OBJEXT@: list.c list.h config.h $(PROJECT_H_DEPS) list.h miscutil.h -loadcfg.@OBJEXT@: loadcfg.c loadcfg.h config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h jcc.h killpopup.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h -loaders.@OBJEXT@: loaders.c loaders.h config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h ssplit.h -miscutil.@OBJEXT@: miscutil.c miscutil.h config.h -parsers.@OBJEXT@: parsers.c parsers.h config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h jbsockets.h jcc.h loadcfg.h loaders.h miscutil.h ssplit.h -ssplit.@OBJEXT@: ssplit.c ssplit.h config.h miscutil.h -urlmatch.@OBJEXT@: urlmatch.c urlmatch.h config.h $(PROJECT_H_DEPS) errlog.h miscutil.h ssplit.h - -# GNU regex -gnu_regex.@OBJEXT@: gnu_regex.c gnu_regex.h config.h - -# PCRS -pcrs.@OBJEXT@: pcrs.c pcre/pcre.h pcrs.h - -# PCRE -pcre/get.@OBJEXT@: pcre/get.c pcre/config.h pcre/internal.h pcre/pcre.h -pcre/maketables.@OBJEXT@: pcre/maketables.c pcre/config.h pcre/internal.h pcre/pcre.h -pcre/pcre.@OBJEXT@: pcre/pcre.c pcre/config.h pcre/internal.h pcre/pcre.h pcre/chartables.c -pcre/pcreposix.@OBJEXT@: pcre/pcreposix.c pcre/config.h pcre/internal.h pcre/pcre.h pcre/pcreposix.h -pcre/study.@OBJEXT@: pcre/study.c pcre/config.h pcre/internal.h pcre/pcre.h - -# An auxiliary program makes the PCRE default character table source - -pcre/chartables.c: pcre/dftables@EXEEXT@ - pcre/dftables@EXEEXT@ >pcre/chartables.c - -pcre/dftables@EXEEXT@: pcre/dftables.c pcre/maketables.c pcre/pcre.h pcre/internal.h pcre/config.h - $(CC) -o pcre/dftables@EXEEXT@ $(CFLAGS) pcre/dftables.c - -# Win32 -w32log.@OBJEXT@: w32log.c errlog.h config.h jcc.h loadcfg.h miscutil.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h w32taskbar.h win32.h -w32taskbar.@OBJEXT@: w32taskbar.c config.h w32log.h w32taskbar.h -win32.@OBJEXT@: win32.c config.h jcc.h loadcfg.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h win32.h - -w32.res: w32.rc w32res.h icons/ico00001.ico icons/ico00002.ico icons/ico00003.ico icons/ico00004.ico icons/ico00005.ico icons/ico00006.ico icons/ico00007.ico icons/ico00008.ico icons/idle.ico icons/privoxy.ico config.h - windres -D__MINGW32__=0.2 -O coff -i $< -o $@ - -# AmigaOS -@AMIGAOS_ONLY@OBJS += amiga.o -@AMIGAOS_ONLY@CFLAGS += -D__AMIGAVERSION__=\"$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)\" -D__AMIGADATE__=\"`date +%d.%m.%Y`\" -W -m68020 -noixemul -fbaserel -msmall-code -@AMIGAOS_ONLY@LDFLAGS += -m68020 -noixemul -fbaserel -@AMIGAOS_ONLY@LIBS = -lm /gg/lib/libb/libm020/libnix/swapstack.o -@AMIGAOS_ONLY@amiga.o: amiga.c amiga.h config.h - - -$(PROGRAM): $(OBJS) $(W32_FILES) - $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS) - -clean: - $(RM) a.out core $(OBJS) $(W32_FILES) $(W32_INIS) $(PROGRAM) junkbuster - -clobber: clean - $(RM) $(PROGRAM) cscope.* logfile *.pdb *.lib *.exp `find . -name tags` `find . -name TAGS` config.status config.h.in config.log junkbuster.log privoxy.log config.cache *~ *.tar.gz configure - -tags: $(SRCS) $(HDRS) - etags $(SRCS) $(HDRS) - -install: all - # - # FIXME: This is a dirty hack to have an install target - # that works at least for some setups. This needs - # to be fixed! - # - $(STRIP_PROG) $(PROGRAM) - $(INSTALL) $(PROGRAM) $(SBIN_DEST) - mkdir -p $(DEST)/user-manual - mkdir -p $(DEST)/templates - cp -r doc/webserver/user-manual $(DEST) - cp -r templates $(DEST) - $(INSTALL) config default.action default.filter trust $(DEST) - # FIXME $(ECHO) privoxy.logrotate privoxy.monthly privoxy.weekly - # FIXME: Need new manual! $(GZIP_PROG) -c privoxy.1 > $(MAN_DEST)/privoxy.1.gz - $(INSTALL) privoxy.init /etc/init.d/privoxy - - -############################################################################# - -## Local Variables: -## tab-width: 3 -## end: - -# $Log: GNUmakefile.in,v $ -# Revision 1.36 2002/03/27 14:58:08 swa -# can be used by mutilple targets -# -# Revision 1.35 2002/03/27 14:53:19 swa -# added solaris-dist -# -# Revision 1.34 2002/03/27 10:30:11 swa -# we want a html man file on the webserver -# -# Revision 1.33 2002/03/27 03:05:35 hal9 -# Added man2html target for docs (redhat-dok only for now) -# -# Revision 1.32 2002/03/26 22:29:54 swa -# we have a new homepage! -# -# Revision 1.31 2002/03/26 14:00:18 swa -# fixed make tarball, tarball-dist, tarball-clean -# -# Revision 1.30 2002/03/25 12:52:25 swa -# new targets -# -# Revision 1.29 2002/03/24 17:03:55 jongfoster -# Name change -# -# Revision 1.28 2002/03/24 16:19:48 swa -# configure needs to be generated. -# -# Revision 1.27 2002/03/24 16:13:57 swa -# generated files are a nono in cvs -# -# Revision 1.26 2002/03/24 15:36:02 swa -# did not build. -# -# Revision 1.25 2002/03/24 14:31:08 swa -# remove more crappy files. set RPM -# release version correctly. -# -# Revision 1.24 2002/03/24 14:19:55 swa -# set rpm package release in configure.in. nowhere else. -# -# Revision 1.23 2002/03/24 13:06:49 swa -# suse-clean now runs fine -# -# Revision 1.22 2002/03/24 12:56:21 swa -# name change related issues. -# -# Revision 1.21 2002/03/24 12:43:57 swa -# name change -# -# Revision 1.20 2002/03/24 11:39:17 jongfoster -# Renaming config files -# -# Revision 1.19 2002/03/22 20:53:03 morcego -# - Ongoing process to change name to JunkbusterNG -# - configure/configure.in: no change needed -# - GNUmakefile.in: -# - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz -# - PROGRAM = jbng@EXEEXT@ -# - rh-spec now references as junkbusterng-rh.spec -# - redhat-upload: references changed to junkbusterng-* (package names) -# - tarball-dist: references changed to JunkbusterNG-distribution-* -# - tarball-src: now JunkbusterNG-* -# - install: initscript now junkbusterng.init and junkbusterng (when -# installed) -# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec -# - junkbusterng.spec: -# - References to the expression ijb where changed where possible -# - New package name: junkbusterng (all in lower case, acording to -# the LSB recomendation) -# - Version changed to: 2.9.13 -# - Release: 1 -# - Added: junkbuster to obsoletes and conflicts (Not sure this is -# right. If it obsoletes, why conflict ? Have to check it later) -# - Summary changed: Stefan, please check and aprove it -# - Changes description to use the new name -# - Sed string was NOT changed. Have to wait to the manpage to -# change first -# - Keeping the user junkbuster for now. It will require some aditional -# changes on the script (scheduled for the next specfile release) -# - Added post entry to move the old logfile to the new log directory -# - Removing "chkconfig --add" entry (not good to have it automaticaly -# added to the startup list). -# - Added preun section to stop the service with the old name, as well -# as remove it from the startup list -# - Removed the chkconfig --del entry from the conditional block on -# the preun scriptlet (now handled on the %files section) -# - junkbuster.init: renamed to junkbusterng.init -# - junkbusterng.init: -# - Changed JB_BIN to jbng -# - Created JB_OBIN with the old value of JB_BIN (junkbuster), to -# be used where necessary (config dir) -# -# Aditional notes: -# - The config directory is /etc/junkbuster yet. Have to change it on the -# specfile, after it is changes on the code -# - The only files that got renamed on the cvs tree were the rh specfile and -# the init file. Some file references got changes on the makefile and on the -# rh-spec (as listed above) -# -# Revision 1.18 2002/03/21 23:00:00 swa -# want to autogenerate stuff. -# -# Revision 1.17 2002/03/19 19:30:04 morcego -# - Fixing stylesheet checking on configure. If it is found, no further checks -# should be done -# -# - configure will now check for db2html or docbook2html (should work now -# on SuSe without the docbktls package) -# -# Revision 1.16 2002/03/14 22:32:32 hal9 -# Bumped the RPM version. -# -# Revision 1.15 2002/03/08 20:00:28 swa -# some leftovers. -# -# Revision 1.14 2002/03/07 18:25:56 swa -# synced redhat and suse build process -# -# Revision 1.13 2002/03/07 17:17:56 oes -# (Hopefully) fixed for older make versions -# -# Revision 1.12 2002/03/07 15:28:27 swa -# more informative -# -# Revision 1.11 2002/03/06 14:33:18 sarantis -# Use proper temp file, not "abc". -# -# Revision 1.10 2002/03/06 14:19:35 sarantis -# Cleanup PID_FILE_PATH from redhat-dist target -# -# Revision 1.9 2002/03/05 17:31:11 morcego -# Search for docbook.dsl. Should solve portability problems for SuSe. -# -# Revision 1.8 2002/03/05 14:07:42 morcego -# configure now detects rpm topdir, and change GNUmakefile acordingly -# (based on sugestion by Sarantis Paskalis) -# -# Revision 1.7 2002/03/05 13:43:28 morcego -# Checking for text browser, so redhat-dok can work. -# -# Revision 1.6 2002/03/05 13:10:51 morcego -# Changes to implement redhat-dok (Hal Burgiss) -# Changes to make it work on other distros and out-of-the-shelf configurations -# -# Revision 1.5 2002/02/27 15:30:39 hal9 -# Reset $(RPM_PACKAGEV) to 1 (was 2) -# -# Revision 1.4 2002/01/17 21:44:04 jongfoster -# Adding urlmatch.[ch] -# -# Revision 1.3 2002/01/04 15:26:08 oes -# Added tarball-src target -# -# Revision 1.2 2001/12/30 14:07:31 steudten -# - Add signal handling (unix) -# - Add SIGHUP handler (unix) -# - Add creation of pidfile (unix) -# - Add action 'top' in rc file (RH) -# - Add entry 'SIGNALS' to manpage -# - Add exit message to logfile (unix) -# -# Revision 1.1 2001/12/01 11:22:57 jongfoster -# Renaming Makefile.in to GNUmakefile.in so that non-GNU versions of -# make break in a more obvious way. -# Adding .PHONY section. -# -# Revision 1.40 2001/12/01 00:24:11 jongfoster -# Renaming various config files -# Fixing CR->CRLF under Win32 (I hope) -# -# Revision 1.39 2001/11/06 12:07:30 steudten -# Add --clean for building rpm in target redhat-dist. -# -# Revision 1.38 2001/11/05 21:35:23 steudten -# Complete rewrite for the 'redhat-dist' target. -# Checks for writeable RPM build directories for calling user. -# So you must not be root, just set the modes to 1777 to -# build a RH package. -# Fix the upload-target to be arch independant. -# Add target for 'solaris-dist' - coming soon. -# -# Revision 1.37 2001/11/01 00:52:04 hal9 -# Redhat-upload stuff per Stefan. -# -# Revision 1.36 2001/10/31 19:26:13 swa -# automate process of uploading new releases -# to sf. -# -# Revision 1.35 2001/10/15 22:14:59 joergs -# Removed -O2 and -Wall from AmigaOS-only CFLAGS since they are now in -# the general CFLAGS already. -# -# Revision 1.34 2001/10/15 18:28:06 steudten -# remove config.cache for target clobber. -# Cleanup make dist for RH and S.u.S.E. -# -# Revision 1.33 2001/10/10 12:43:33 oes -# Added ugly hack to make install target work at least for some setups. -# -# Revision 1.32 2001/10/09 22:38:19 jongfoster -# Correcting actionsfile filename for Win32 INI build -# -# Revision 1.31 2001/09/23 10:13:48 swa -# upload process established. run make webserver and -# the documentation is moved to the webserver. documents -# are now linked correctly. -# -# Revision 1.30 2001/09/19 17:55:49 oes -# Fixed CFLAGS -# -# Revision 1.29 2001/09/16 17:34:27 jongfoster -# Removing showargs.[ch], adding cgi(simple|edit).[ch] -# Replacing $(OBJEXT) with @OBJEXT@ - this seems to be a common source -# of build problems. -# -# Revision 1.28 2001/09/13 15:19:08 swa -# we want text files as well. -# -# Revision 1.27 2001/09/13 13:11:37 steudten -# -# Replace DEBUG_CFLAGS with OTHER_CFLAGS -# -# Revision 1.26 2001/09/12 23:44:54 david__schmidt -# Mac OSX (Darwin) support added. -# -# Revision 1.25 2001/09/12 22:55:45 joergs -# AmigaOS support added. -# -# Revision 1.24 2001/09/12 17:28:59 david__schmidt -# -# OS/2 port: update autoconf'd support for the platform. -# -# Revision 1.23 2001/09/12 16:28:42 swa -# added "make dok" section to generate html pages from -# the sgml source documents. note that the we do not want -# generated stuff in cvs. -# -# Revision 1.22 2001/09/10 16:31:23 swa -# buildroot definition in the specfile fucks up the build -# process under suse. hence I moved it to the "rpm -ta" -# command -# -# Revision 1.21 2001/09/10 11:12:49 oes -# Turning on -Wall -# -# Revision 1.20 2001/08/02 22:04:29 jongfoster -# Removing some remaining references to obsolete w32rulesdlg.[ch] -# -# Revision 1.19 2001/07/30 22:14:03 jongfoster -# Removing obsolete w32rulesdlg.c and w32rulesdlg.h -# -# Revision 1.18 2001/07/29 17:09:17 jongfoster -# Major changes to build system in order to fix these bugs: -# - pthreads under Linux was broken - changed -lpthread to -pthread -# - Compiling in MinGW32 mode under CygWin now correctly detects -# which shared libraries are available -# - Solaris support (?) (Not tested under Solaris yet) -# -# Revision 1.17 2001/07/28 16:44:54 oes -# Fixed sed LF->CRLF conversion and removed deprecated files -# -# Revision 1.16 2001/07/15 19:45:33 jongfoster -# Added support for linking with POSIX threads library -# -# Revision 1.15 2001/07/13 13:48:07 oes -# - Moved STATIC #define for pcre to (ac)config.h -# - Made -Ipcre depandant on static pcre compilation to -# avoid version conflicts -# - Included compilation and depandancies for new deanimate.c -# - Made changes to the pcre/pcreposix/pcrs build process -# as required by the new library autodetection in -# configure.in -# -# Revision 1.14 2001/07/01 16:27:44 oes -# Fixed misplaced dependancy -# -# Revision 1.13 2001/06/29 13:18:36 oes -# - added depandancy of filters.o on cgi.h -# -# Revision 1.12 2001/06/12 17:15:56 swa -# fixes, because a clean build on rh6.1 was impossible. -# GZIP confuses make, %configure confuses rpm, etc. -# -# Revision 1.11 2001/06/11 11:26:35 sarantis -# RPM version should be the same as ijbswa version. The rpm release is -# specified in the specfile. -# -# Revision 1.10 2001/06/07 17:27:45 swa -# added suse build section -# -# Revision 1.9 2001/06/04 18:31:58 swa -# files are now prefixed with either `confdir' or `logdir'. -# `make redhat-dist' replaces both entries confdir and logdir -# with redhat values -# -# Revision 1.8 2001/06/04 10:44:57 swa -# `make redhatr-dist' now works. Except for the paths -# in the config file. -# -# Revision 1.7 2001/06/03 17:09:09 swa -# swa for oes: reversed my earlier change -# -# Revision 1.6 2001/06/03 17:07:27 swa -# swa for oes -# -# Revision 1.5 2001/06/03 13:57:26 swa -# compile cgi.c (for andreas' GUI) -# -# Revision 1.4 2001/05/31 21:18:45 jongfoster -# Added files actions.[ch], actionlist.h, list.[ch] to Makefile -# -# Revision 1.3 2001/05/29 20:02:48 joergs -# Changes for AmigaOS added. -# -# Revision 1.2 2001/05/17 22:23:23 oes -# - Added auto-generation of CRLFs for Win32 config files -# - Added comment-prefix to all Win32-only options in the config file -# and provided auto stripping of this prefix for the Win32 platform by make -# -# Revision 1.1.1.1 2001/05/15 13:59:00 oes -# Initial import of version 2.9.3 source tree -# -# diff --git a/Junkbuster Status.URL b/Junkbuster Status.URL new file mode 100644 index 0000000000000000000000000000000000000000..6c95de6d7dd1d98bf88e8084020edb372acbfdd1 GIT binary patch literal 56 zcma#{%qvMP%1bQ?&d4t+NiHpkC|D9W#> L)J-f(FJ=G$T<;X} literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 1bcc46f5..00000000 --- a/LICENSE +++ /dev/null @@ -1,342 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - - diff --git a/Makefile b/Makefile deleted file mode 100644 index c195c8dc..00000000 --- a/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -# $Id: Makefile,v 1.2 2002/03/24 13:25:42 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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. -# -# $Log: Makefile,v $ -# Revision 1.2 2002/03/24 13:25:42 swa -# name change related issues -# -# Revision 1.1 2001/12/01 11:24:29 jongfoster -# Will display a warning if non-GNU make is used -# -# - -############################################################################# - -error: GNUmakefile - @echo - @echo "ERROR!" - @echo "To build this program, you must run ./configure and then run GNU make." - @echo - @echo "You are not using the GNU version of Make - maybe it's called gmake" - @echo "or it's in a different directory?" - @echo - -GNUmakefile: - @echo - @echo "ERROR!" - @echo "To build this program, you must run ./configure and then run GNU make." - @echo - @echo "You haven't run ./configure yet." - @echo - @false - -.PHONY: error - -############################################################################# - -## Local Variables: -## tab-width: 3 -## end: diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..6dd9a26e --- /dev/null +++ b/Makefile.in @@ -0,0 +1,363 @@ +# Note: Makefile is built automatically from Makefile.in +# +# $Id: Makefile.in,v 1.15 2001/07/13 13:48:07 oes Exp $ +# +# 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. +# +# $Log: Makefile.in,v $ +# Revision 1.15 2001/07/13 13:48:07 oes +# - Moved STATIC #define for pcre to (ac)config.h +# - Made -Ipcre depandant on static pcre compilation to +# avoid version conflicts +# - Included compilation and depandancies for new deanimate.c +# - Made changes to the pcre/pcreposix/pcrs build process +# as required by the new library autodetection in +# configure.in +# +# Revision 1.14 2001/07/01 16:27:44 oes +# Fixed misplaced dependancy +# +# Revision 1.13 2001/06/29 13:18:36 oes +# - added depandancy of filters.o on cgi.h +# +# Revision 1.12 2001/06/12 17:15:56 swa +# fixes, because a clean build on rh6.1 was impossible. +# GZIP confuses make, %configure confuses rpm, etc. +# +# Revision 1.11 2001/06/11 11:26:35 sarantis +# RPM version should be the same as ijbswa version. The rpm release is +# specified in the specfile. +# +# Revision 1.10 2001/06/07 17:27:45 swa +# added suse build section +# +# Revision 1.9 2001/06/04 18:31:58 swa +# files are now prefixed with either `confdir' or `logdir'. +# `make redhat-dist' replaces both entries confdir and logdir +# with redhat values +# +# Revision 1.8 2001/06/04 10:44:57 swa +# `make redhatr-dist' now works. Except for the paths +# in the config file. +# +# Revision 1.7 2001/06/03 17:09:09 swa +# swa for oes: reversed my earlier change +# +# Revision 1.6 2001/06/03 17:07:27 swa +# swa for oes +# +# Revision 1.5 2001/06/03 13:57:26 swa +# compile cgi.c (for andreas' GUI) +# +# Revision 1.4 2001/05/31 21:18:45 jongfoster +# Added files actions.[ch], actionlist.h, list.[ch] to Makefile +# +# Revision 1.3 2001/05/29 20:02:48 joergs +# Changes for AmigaOS added. +# +# Revision 1.2 2001/05/17 22:23:23 oes +# - Added auto-generation of CRLFs for Win32 config files +# - Added comment-prefix to all Win32-only options in the config file +# and provided auto stripping of this prefix for the Win32 platform by make +# +# Revision 1.1.1.1 2001/05/15 13:59:00 oes +# Initial import of version 2.9.3 source tree +# +# + +# define version (will be wired into the rpm.) +VERSION_MAJOR = @VERSION_MAJOR@ +VERSION_MINOR = @VERSION_MINOR@ +VERSION_POINT = @VERSION_POINT@ +VERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_POINT) +# will automatically be postfixed with -$(RPM_PACKAGEV) in the SPECfile +RPM_VERSION = $(VERSION) +RPM_PACKAGEV = 1 + +# The version is currently specified in config.h, which is +# written by "configure". +# +#VERSION_CFLAGS = -DVERSION_MAJOR=$(VERSION_MAJOR) \ +# -DVERSION_MINOR=$(VERSION_MINOR) \ +# -DVERSION_POINT=$(VERSION_POINT) \ +# -DVERSION="$(VERSION)" + +# Directories for "make install" +DEST = /etc/junkbuster +SBIN_DEST = @sbindir@ +MAN_DEST = @mandir@ + +# The flag "-mno-win32" can be used by Cygwin to emulate a un?x type install. +# The flag "-mwindows -mno-cygwin" will cause Cygwin to use MingW32 for Win32 install. +CYGWIN_FLAGS = @CYGWIN_FLAGS@ + +# Either/Or of these next two lines +#DEBUG_CFLAGS = -g +DEBUG_CFLAGS = -O3 + +# Solaris needs a special define: +# FIXME: This is always commented out +SOLARIS_FLAGS = @SOLARIS_ONLY@-D__EXTENSIONS__=1 + +# -DSTDC_HEADERS Now in config.h +# Do we need -DHAVE_STRING ??? +CFLAGS = @CFLAGS@ @CPPFLAGS@ \ + -D__MT__=1 -D__STDC__=1 $(SOLARIS_FLAGS) -DHAVE_STRING $(DEBUG_CFLAGS) \ + $(CYGWIN_FLAGS) $(PCRE_WIN_FLAGS) @STATIC_PCRE_ONLY@ -Ipcre + +PROGRAM = junkbuster@EXEEXT@ +CC = gcc +ECHO = echo +GZIP_PROG = gzip +INSTALL = cp -f +LD = gcc +OBJEXT = @OBJEXT@ +RM = rm -f +STRIP_PROG = strip + +C_SRC = actions.c encode.c errlog.c filters.c gateway.c jbsockets.c \ + jcc.c killpopup.c list.c loadcfg.c loaders.c miscutil.c \ + parsers.c showargs.c ssplit.c cgi.c deanimate.c + +C_OBJS = $(C_SRC:.c=.$(OBJEXT)) +C_HDRS = $(C_SRC:.c=.h) project.h actionlist.h + +W32_SRC = @WIN_ONLY@w32log.c w32rulesdlg.c w32taskbar.c win32.c +W32_FILES = @WIN_ONLY@w32.res +W32_OBJS = @WIN_ONLY@$(W32_SRC:.c=.$(OBJEXT)) $(W32_FILES) +W32_HDRS = @WIN_ONLY@w32log.h w32res.h w32rulesdlg.h w32taskbar.h +W32_LIB = @WIN_ONLY@-lwsock32 -lcomctl32 +W32_INIS = @WIN_ONLY@junkbstr.txt saclfile.txt sblock.txt scookie.txt \ + @WIN_ONLY@sforward.txt simage.txt spopup.txt strust.txt sregexp.txt + +PCRS_SRC = @STATIC_PCRS_ONLY@pcrs.c +PCRS_OBJS = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.$(OBJEXT)) +PCRS_HDRS = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.h) + +PCRE_SRC = @STATIC_PCRE_ONLY@pcre/get.c pcre/maketables.c pcre/study.c pcre/pcre.c +PCRE_OBJS = @STATIC_PCRE_ONLY@$(PCRE_SRC:.c=.$(OBJEXT)) +PCRE_HDRS = @STATIC_PCRE_ONLY@pcre/config.h pcre/chartables.c pcre/internal.h pcre/pcre.h + +# No REGEX (Either because dynamically linked pcreposix, or no regex at all): +REGEX_SRC = +# GNU REGEX: +@GNU_REGEX_ONLY@REGEX_SRC = gnu_regex.c +# PCRE REGEX: +@PCRE_REGEX_ONLY@@STATIC_PCRE_ONLY@REGEX_SRC = pcre/pcreposix.c + +REGEX_OBJS = $(REGEX_SRC:.c=.$(OBJEXT)) +REGEX_HDRS = $(REGEX_SRC:.c=.h) + +# Dependencies introduced by #include "project.h". +PROJECT_H_DEPS = project.h $(REGEX_HDRS) $(PCRS_HDRS) @STATIC_PCRE_ONLY@pcre/pcre.h + +# Only need this on Solaris +# FIXME: This is always commented out +SOCKET_LIB = @SOLARIS_ONLY@-lsocket -lnsl + +# PThreads library, if needed. +PTHREAD_LIB = @PTHREAD_ONLY@@PTHREAD_LIB@ + +LIBS = @LIBS@ $(W32_LIB) $(SOCKET_LIB) $(PTHREAD_LIB) + +SRCS = $(C_SRC) $(W32_SRC) $(PCRS_SRC) $(PCRE_SRC) $(REGEX_SRC) +OBJS = $(C_OBJS) $(W32_OBJS) $(PCRS_OBJS) $(PCRE_OBJS) $(REGEX_OBJS) +HDRS = $(C_HDRS) $(W32_HDRS) $(PCRS_HDRS) $(PCRE_OBJS) $(REGEX_HDRS) + + +# ------------------------------------------------------------------------- +# Do not change anything below this line +# And there should NOT be any targets above this line. +# ------------------------------------------------------------------------- +LDFLAGS = $(DEBUG_CFLAGS) $(CYGWIN_FLAGS) + +all: $(PROGRAM) + +SUFFIX = .txt:o +.SUFFIXES : .txt + +%.txt: + sed -e 's/$$/& /' < $< > $@ + +inifiles: $(W32_INIS) + +junkbstr.txt: config + sed -e 's!\(/etc/junkbuster\|.\)/blocklist!sblock.txt!' \ + -e 's!\(/etc/junkbuster\|.\)/popup!spopup.txt!' \ + -e 's!\(/etc/junkbuster\|.\)/cookiefile!scookie.txt!' \ + -e 's!\(/etc/junkbuster\|.\)/forward!sforward.txt!' \ + -e 's!\(/etc/junkbuster\|.\)/trust!strust.txt!' \ + -e 's!\(/etc/junkbuster\|.\)/aclfile!sacl.txt!' \ + -e 's!\(/var/log/junkbuster\|.\)/jarfile!jar.log!' \ + -e 's!\(/var/log/junkbuster\|.\)/junkbuster\.log!junkbstr.log!' \ + -e 's!\(/etc/junkbuster\|.\)/imagelist!simage.txt!' \ + -e 's!\(/etc/junkbuster\|.\)/re_filterfile!sregexp.txt!' \ + -e 's!$$!& !' \ + -e 's!#Win32-only: !!' \ + < $< > $@ + +saclfile.txt: aclfile +sblock.txt: blocklist +scookie.txt: cookiefile +sforward.txt: forward +simage.txt: imagelist +spopup.txt: popup +strust.txt: trust +sregexp.txt: re_filterfile + + +# ------------------------------------------------------------------------- +# redhat distribution +# ------------------------------------------------------------------------- +redhat-dist: + @make clobber +# verify that i'm root needs to be done + rm -f ../ijbswa.tar.gz +# verify all version strings, FLAGS, etc. in the spec file + cat junkbuster-rh.spec | sed 's/^Version:.*/Version: $(RPM_VERSION)/g' | sed 's/^Release:.*/Release: $(RPM_PACKAGEV)/g' > /tmp/abc && cp -f /tmp/abc junkbuster-rh.spec + tar --exclude "CVS" --exclude "junkbuster-suse.spec" -cvzf ../ijbswa.tar.gz . +# verify all files in their correct location needs to be done + cd .. && rpm -ta ijbswa.tar.gz + +# ------------------------------------------------------------------------- +# suse distribution +# ------------------------------------------------------------------------- +suse-dist: + @make clobber +# verify that i'm root needs to be done + rm -f ../ijbswa.tar.gz +# verify all version strings, FLAGS, etc. in the spec file + cat junkbuster-suse.spec | sed 's/^Version:.*/Version: $(RPM_VERSION)/g' | sed 's/^Release:.*/Release: $(RPM_PACKAGEV)/g' > /tmp/abc && cp -f /tmp/abc junkbuster-suse.spec + tar --exclude "CVS" --exclude "junkbuster-rh.spec" -cvzf ../ijbswa.tar.gz . +# verify all files in their correct location needs to be done + cd .. && rpm -ta ijbswa.tar.gz + +# ------------------------------------------------------------------------- +# +# ------------------------------------------------------------------------- +win-dist: + $(ECHO) Not implemented. + +# ------------------------------------------------------------------------- +# +# ------------------------------------------------------------------------- +tarball-dist: + @make clean + make $(PROGRAM) +# remove all objects and create the tarball with the binary + cd .. && $(RM) ijb/a.out ijb/core ijb/*.$(OBJEXT) && tar --exclude "ijb/CVS" -cvzf ../ijb-distribution-$(VERSION).tar.gz ijb/ + chmod a+r ../../ijb-distribution-$(VERSION).tar.gz + @$(ECHO) Tarball with binary created. + +# ------------------------------------------------------------------------- +# +# ------------------------------------------------------------------------- + +actions.@OBJEXT@: actions.c actions.h config.h $(PROJECT_H_DEPS) errlog.h jcc.h list.h loaders.h miscutil.h actionlist.h +encode.@OBJEXT@: encode.c encode.h config.h +errlog.@OBJEXT@: errlog.c errlog.h config.h $(PROJECT_H_DEPS) @WIN_ONLY@w32log.h +filters.@OBJEXT@: filters.c filters.h config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jbsockets.h jcc.h loadcfg.h parsers.h showargs.h ssplit.h cgi.h deanimate.h @WIN_ONLY@win32.h +gateway.@OBJEXT@: gateway.c gateway.h config.h $(PROJECT_H_DEPS) errlog.h jbsockets.h jcc.h loadcfg.h +jbsockets.@OBJEXT@: jbsockets.c jbsockets.h config.h $(PROJECT_H_DEPS) filters.h +jcc.@OBJEXT@: jcc.c jcc.h config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h killpopup.h loadcfg.h loaders.h miscutil.h parsers.h showargs.h @WIN_ONLY@w32log.h win32.h cgi.h +killpopup.@OBJEXT@: killpopup.c killpopup.h config.h $(PROJECT_H_DEPS) jcc.h loadcfg.h +list.@OBJEXT@: list.c list.h config.h $(PROJECT_H_DEPS) list.h miscutil.h +loadcfg.@OBJEXT@: loadcfg.c loadcfg.h config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h jcc.h killpopup.h loaders.h miscutil.h parsers.h showargs.h @WIN_ONLY@w32log.h win32.h +loaders.@OBJEXT@: loaders.c loaders.h config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h ssplit.h +miscutil.@OBJEXT@: miscutil.c miscutil.h config.h +parsers.@OBJEXT@: parsers.c parsers.h config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h jbsockets.h jcc.h loadcfg.h loaders.h miscutil.h showargs.h ssplit.h +showargs.@OBJEXT@: showargs.c showargs.h config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h +ssplit.@OBJEXT@: ssplit.c ssplit.h config.h miscutil.h +cgi.@OBJEXT@: cgi.c cgi.h config.h $(PROJECT_H_DEPS) list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h +deanimate.@OBJEXT@: deanimate.c deanimate.h config.h $(PROJECT_H_DEPS) + +# GNU regex +gnu_regex.@OBJEXT@: gnu_regex.c gnu_regex.h config.h + +# PCRS +pcrs.@OBJEXT@: pcrs.c pcre/pcre.h pcrs.h + +# PCRE +pcre/get.@OBJEXT@: pcre/get.c pcre/config.h pcre/internal.h pcre/pcre.h +pcre/maketables.@OBJEXT@: pcre/maketables.c pcre/config.h pcre/internal.h pcre/pcre.h +pcre/pcre.@OBJEXT@: pcre/pcre.c pcre/config.h pcre/internal.h pcre/pcre.h pcre/chartables.c +pcre/pcreposix.@OBJEXT@: pcre/pcreposix.c pcre/config.h pcre/internal.h pcre/pcre.h pcre/pcreposix.h +pcre/study.@OBJEXT@: pcre/study.c pcre/config.h pcre/internal.h pcre/pcre.h + +# An auxiliary program makes the PCRE default character table source + +pcre/chartables.c: pcre/dftables + pcre/dftables >pcre/chartables.c + +pcre/dftables: pcre/dftables.c pcre/maketables.c pcre/pcre.h pcre/internal.h pcre/config.h + $(CC) -o pcre/dftables $(CFLAGS) pcre/dftables.c + +# Win32 +w32log.@OBJEXT@: w32log.c errlog.h config.h jcc.h loadcfg.h miscutil.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h w32rulesdlg.h w32taskbar.h win32.h +w32rulesdlg.@OBJEXT@: w32rulesdlg.c config.h w32rulesdlg.h win32.h +w32taskbar.@OBJEXT@: w32taskbar.c config.h w32log.h w32taskbar.h +win32.@OBJEXT@: win32.c config.h jcc.h loadcfg.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h win32.h + +w32.res: w32.rc w32res.h icons/denyrule.ico icons/ico00001.ico icons/ico00002.ico icons/ico00003.ico icons/ico00004.ico icons/ico00005.ico icons/ico00006.ico icons/ico00007.ico icons/ico00008.ico icons/icon1.ico icons/idle.ico icons/junkbust.ico config.h + windres -D__MINGW32__=0.2 -O coff -i $< -o $@ + +## AmigaOS, GCC 2.95.1 (or lower, 2.95.3 does NOT work!) +#ifeq ($(shell $(CC) $(CFLAGS) -dumpmachine), m68k-amigaos) +#OBJS += amiga.o +#CFLAGS += -D__AMIGAVERSION__=\"$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)\" -D__AMIGADATE__=\"`date +%d.%m.%Y`\" -W -Wall -m68020 -Os -noixemul -fbaserel -msmall-code +#LDFLAGS += -m68020 -noixemul -fbaserel +#LIBS = -lm /gg/lib/libb/libm020/libnix/swapstack.o +#amiga.o: amiga.c amiga.h config.h +#endif +# + +$(PROGRAM): $(OBJS) $(W32_FILES) + $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS) + +clean: + $(RM) a.out core $(OBJS) $(W32_FILES) $(W32_INIS) + +clobber: clean + $(RM) $(PROGRAM) *.pdb *.lib *.exp TAGS junkbuster.log + +tags: $(SRCS) $(HDRS) + etags $(SRCS) $(HDRS) + +install: all + $(STRIP_PROG) $(PROGRAM) + $(INSTALL) $(PROGRAM) $(SBIN_DEST) + $(INSTALL) README README.TOO README.WIN README.re_filter README.cygwin $(DEST) + $(INSTALL) aclfile blocklist config cookiefile forward imagelist \ + popup re_filterfile trust $(DEST) + # FIXME: On SuSE, these are not found. Where do they go? + $(ECHO) junkbuster.logrotate junkbuster.monthly junkbuster.weekly + $(GZIP_PROG) -c junkbuster.1 > $(MAN_DEST)/junkbuster.1.gz + $(INSTALL) junkbuster.init /sbin/init.d/junkbuster + + +## Local Variables: +## tab-width: 3 +## end: diff --git a/README b/README deleted file mode 100644 index 2c3fc2c4..00000000 --- a/README +++ /dev/null @@ -1,181 +0,0 @@ -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/README,v $ - * - * Purpose : README file to give a short intro. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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. - * - *********************************************************************/ - -This README is included with the development version of Privoxy, -which will eventually become Privoxy v3.0 (and soon we hope!). See -http://www.privoxy.org/. The current code level is BETA, and seems -stable to us :) - -Privoxy is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other -obnoxious Internet junk. Privoxy has a very flexible configuration and -can be customized to suit individual needs and tastes. Privoxy -has application for both stand-alone systems and multi-user -networks. - -Privoxy is based on the code of the Internet Junkbuster. Junkbuster -was originally written by JunkBusters Corporation, and was released as -free open-source software under the GNU GPL. Stefan Waldherr made many -improvements, and started the SourceForge project to continue -development. Several other developers are now contributing. - - - IMPORTANT CHANGES ------------------- - -NEWS! As of 03/24/02, the name of this project has been changed -from ijbswa/Junkbuster to Privoxy. This is reflected in many of the -included files. - -WARNING! If upgrading from earlier versions of this project via -RPM packages, the new package will delete any previously installed -'Junkbuster' packages. - -IMPORTANT! READ! Configuration Change as of 3 Apr 2002: The default -listening port is now 8118 due to conflicts with port 8000 assignment. -You will need to change your browser if upgrading!!! And maybe -firewall, etc. - - - INSTALL --------- - -For tarball, first unpack: - - tar xzvf privoxy-2.9.13-beta-src.tar.gz - cd privoxy-2.9.13-beta - - autoheader - autoconf - ./configure (--help to see options) - gmake (the make from gnu) - su - make -n install (to see where all the files will go) - make install (to really install) - -Redhat and SuSE src and binary RPMs can be built with 'make -redhat-dist' or 'make suse-dist' (run ./configure first) from unpacked -sources. BSD will (probably?) require gmake (from http://gnu.org). See -the user-manual for OS/2 build instructions. - -Privoxy is also available via anonymous CVS: - - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co current - -This will create a directory named 'current'. Then, 'cd current', and -then build as above. - - - RUN ----- - -privoxy [--help] [--version] [--no-daemon] [--pidfile PIDFILE] - [--user USER] [config_file] - -Or for RedHat: /etc/rc.d/init.d/privoxy start -Or for SuSE: /etc/rc.d/privoxy start - -See the man page or user-manual for a brief explanation of each. - - - CONFIGURATION --------------- - -See: 'config', '*.action', and 'default.filter'. These are all well -commented. Most of the magic is in '*.action', and there are several -of these included with varying degrees of aggressiveness. On Unix-like -systems, these files are installed in /etc/privoxy. On Windows, then wherever -the executable itself is installed. There are many significant changes and -advances since Junkbuster v2.0.x. The user-manual has a run down of -configuration options, and examples: http://www.privoxy.org/user-manual/. - -Be sure to set your browser(s) for HTTP/HTTPS Proxy at :, or -whatever you specify in the config file under 'listen-address'. -DEFAULT is localhost:8118. - -The default.action file can be configured via the web interface accessed -via http://p.p/, as well other options. - - - DOCUMENTATION --------------- - -There is a growing amount of documentation in the 'doc' subdirectory, -but it is not finished at this point. In particular, see the -user-manual there, and developers should look at developer-manual. - -The most up to date source of information on the current development version, -may still be either comments in the source code, or the included configuration -files, which are all well commented. These are 'config', '*.action', and -'default.filter' in the toplevel source directory. - -Some legacy Junkbuster documentation may also be included only to give an idea -of what Privoxy can do under doc/obsolete/*. Much has changed since these docs -were written, so beware. - -Included documentation may vary according to platform and packager. - - - CONTACTING THE DEVELOPERS, BUG REPORTING AND FEATURE REQUESTS --------------------------------------------------------------- - -We value your feedback. However, to provide you with the best support, -please note: - - * Use the support forum to get help: - http://sourceforge.net/tracker/?group_id=11118&atid=211118 - * Submit bugs only thru our bug forum: - http://sourceforge.net/tracker/?group_id=11118&atid=111118 - Make sure that the bug has not already been submitted. Please try - to verify that it is a Privoxy bug, and not a browser or site - bug first. If you are using your own custom configuration, please - try the stock configs to see if the problem is a configuration - related bug. And if not using the latest development snapshot, - please try the latest one. Or even better, CVS sources. - * Submit feature requests only thru our feature request forum: - http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse - -For any other issues, feel free to use the mailing lists: -http://sourceforge.net/mail/?group_id=11118 - -Anyone interested in actively participating in development and related -discussions can join the appropriate mailing list here: -http://sourceforge.net/mail/?group_id=11118. Archives are available -here too. - -------------------------------------------------------------------------- -ijbswa-developers@lists.sourceforge.net - -$Id: README,v 1.21 2002/03/26 22:29:54 swa Exp $ diff --git a/acconfig.h b/acconfig.h index bf746a61..a61d3f62 100644 --- a/acconfig.h +++ b/acconfig.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_H_INCLUDED -#define CONFIG_H_INCLUDED +#ifndef _CONFIG_H +#define _CONFIG_H /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/acconfig.h,v $ @@ -11,7 +11,7 @@ * getting ludicrously long with feature defines. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,68 +37,6 @@ * * Revisions : * $Log: acconfig.h,v $ - * Revision 1.21 2002/03/24 14:31:08 swa - * remove more crappy files. set RPM - * release version correctly. - * - * Revision 1.20 2002/03/24 13:46:44 swa - * name change related issue. - * - * Revision 1.19 2002/03/24 13:25:42 swa - * name change related issues - * - * Revision 1.18 2002/03/08 16:40:28 oes - * Added FEATURE_NO_GIFS - * - * Revision 1.17 2002/03/04 17:52:44 oes - * Deleted PID_FILE_PATH - * - * Revision 1.16 2002/01/10 12:36:18 oes - * Moved HAVE_*_R to acconfig.h, where they belong. - * - * Revision 1.15 2001/12/30 14:07:31 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.14 2001/10/23 21:24:09 jongfoster - * Support for FEATURE_CGI_EDIT_ACTIONS - * - * Revision 1.13 2001/10/07 15:30:41 oes - * Removed FEATURE_DENY_GZIP - * - * Revision 1.12 2001/09/13 19:56:37 jongfoster - * Reverting to revision 1.10 - previous checking was majorly broken. - * - * Revision 1.10 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.9 2001/07/29 19:08:52 jongfoster - * Changing _CONFIG_H to CONFIG_H_INCLUDED. - * Also added protection against using a MinGW32 or CygWin version of - * config.h from within MS Visual C++ - * - * Revision 1.8 2001/07/29 17:09:17 jongfoster - * Major changes to build system in order to fix these bugs: - * - pthreads under Linux was broken - changed -lpthread to -pthread - * - Compiling in MinGW32 mode under CygWin now correctly detects - * which shared libraries are available - * - Solaris support (?) (Not tested under Solaris yet) - * - * Revision 1.7 2001/07/25 22:53:59 jongfoster - * Will #error if pthreads is enabled under BeOs - * - * Revision 1.6 2001/07/15 17:54:29 jongfoster - * Renaming #define STATIC to STATIC_PCRE - * Adding new #define FEATURE_PTHREAD that will be used to enable - * POSIX threads support. - * * Revision 1.5 2001/07/13 13:48:37 oes * - (Fix:) Copied CODE_STATUS #define from config.h.in * - split REGEX #define into REGEX_GNU and REGEX_PCRE @@ -204,18 +142,13 @@ */ #undef VERSION_POINT -/* - * Version number - RPM-release - */ -#undef VERSION_RPM_PACKAGE - /* * Version number, as a string */ #undef VERSION /* - * Status of the code: "alpha", "beta" or "stable". + * Status of the code: alpha, beta or stable */ #undef CODE_STATUS @@ -244,45 +177,57 @@ #undef STATIC_PCRS /* - * Allows the use of an ACL to control access to the proxy by IP address. + * Allow JunkBuster to be "disabled" so it is just a normal non-blocking + * non-anonymizing proxy. This is useful if you're trying to access a + * blocked or broken site - just change the setting in the config file + * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows + * GUI). */ -#undef FEATURE_ACL +#undef TOGGLE /* - * Enables the web-based configuration (actionsfile) editor. If you - * have a shared proxy, you might want to turn this off. + * If a stream is compressed via gzip (Netscape specific I think), then + * it cannot be modified with Perl regexps. This forces it to be + * uncompressed. */ -#undef FEATURE_CGI_EDIT_ACTIONS +#undef DENY_GZIP /* - * Allows the use of jar files to capture cookies. + * Enables statistics function. */ -#undef FEATURE_COOKIE_JAR +#undef STATISTICS + +/* + * Bypass filtering for 1 page only + */ +#undef FORCE_LOAD /* * Locally redirect remote script-redirect URLs */ -#undef FEATURE_FAST_REDIRECTS +#undef FAST_REDIRECTS /* - * Bypass filtering for 1 page only + * Split the show-proxy-args page into a page for each config file. */ -#undef FEATURE_FORCE_LOAD +#undef SPLIT_PROXY_ARGS /* - * Allow blocking using images as well as HTML. - * If you do not define this then everything is blocked as HTML. - * - * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE. + * Kills JavaScript popups - window.open, onunload, etc. + */ +#undef KILLPOPUPS + +/* + * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail */ -#undef FEATURE_IMAGE_BLOCKING +#undef WEBDAV /* * Detect image requests automatically for MSIE. Will fall back to * other image-detection methods (i.e. "+image" permission) for other * browsers. * - * You must also define FEATURE_IMAGE_BLOCKING to use this feature. + * You must also define IMAGE_BLOCKING to use this feature. * * It detects the following header pair as an image request: * @@ -307,90 +252,45 @@ * These limitations are due to IE making inconsistent choices * about which "Accept:" header to send. */ -#undef FEATURE_IMAGE_DETECT_MSIE - -/* - * Kills JavaScript popups - window.open, onunload, etc. - */ -#undef FEATURE_KILL_POPUPS - -/* - * Use PNG instead of GIF for built-in images - */ -#undef FEATURE_NO_GIFS - -/* - * Use POSIX threads instead of native threads. - */ -#undef FEATURE_PTHREAD +#undef DETECT_MSIE_IMAGES /* - * Enables statistics function. + * Allow blocking using images as well as HTML. + * If you do not define this then everything is blocked as HTML. + * + * Note that this is required if you want to use DETECT_MSIE_IMAGES. */ -#undef FEATURE_STATISTICS +#undef IMAGE_BLOCKING /* - * Allow Privoxy to be "disabled" so it is just a normal non-blocking - * non-anonymizing proxy. This is useful if you're trying to access a - * blocked or broken site - just change the setting in the config file, - * or use the handy "Disable" menu option in the Windows GUI. + * Allows the use of ACL files to control access to the proxy by IP address. */ -#undef FEATURE_TOGGLE +#undef ACL_FILES /* * Allows the use of trust files. */ -#undef FEATURE_TRUST +#undef TRUST_FILES /* - * Defined on Solaris only. Makes the system libraries thread safe. + * Allows the use of jar files to capture cookies. */ -#undef _REENTRANT +#undef JAR_FILES /* - * Defined on Solaris only. Without this, many important functions are not - * defined in the system headers. + * Define this to use the Windows GUI for editing the blocklist. + * FIXME: This feature is only partially implemented and does not work + * FIXME: This #define can never be set by ./configure. */ -#undef __EXTENSIONS__ +#undef WIN_GUI_EDIT /* - * Defined always. - * FIXME: Don't know what it does or why we need it. - * (presumably something to do with MultiThreading?) - */ -#undef __MT__ - -/* If the (nonstandard and thread-safe) function gethostbyname_r - * is available, select which signature to use - */ -#undef HAVE_GETHOSTBYNAME_R_6_ARGS -#undef HAVE_GETHOSTBYNAME_R_5_ARGS -#undef HAVE_GETHOSTBYNAME_R_3_ARGS - -/* If the (nonstandard and thread-safe) function gethostbyaddr_r - * is available, select which signature to use - */ -#undef HAVE_GETHOSTBYADDR_R_8_ARGS -#undef HAVE_GETHOSTBYADDR_R_7_ARGS -#undef HAVE_GETHOSTBYADDR_R_5_ARGS - -/* Define if you have gmtime_r and localtime_r with a signature - * of (struct time *, struct tm *) + * Use POSIX threads instead of native threads. */ -#undef HAVE_GMTIME_R -#undef HAVE_LOCALTIME_R +#undef FEATURE_PTHREAD @BOTTOM@ -/* - * Defined always. - * FIXME: Don't know what it does or why we need it. - * (presumably something to do with ANSI Standard C?) - */ -#ifndef __STDC__ -#define __STDC__ 1 -#endif /* ndef __STDC__ */ - /* * Need to set up this define only for the Pthreads library for * Win32, available from http://sources.redhat.com/pthreads-win32/ @@ -399,23 +299,4 @@ #define __CLEANUP_C #endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */ -/* - * BEOS does not currently support POSIX threads. - * This *should* be detected by ./configure, but let's be sure. - */ -#if defined(FEATURE_PTHREAD) && defined(__BEOS__) -#error BEOS does not support pthread - please run ./configure again with "--disable-pthread" - -#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */ - - -/* - * It's too easy to accidentally use a Cygwin or MinGW32 version of config.h - * under VC++, and it usually gives many wierd error messages. Let's make - * the error messages understandable, by bailing out now. - */ -#ifdef _MSC_VER -#error For MS VC++, please use config.h.win or config.h.win32threads.win. You can usually do this by selecting the "Build", "Clean" menu option. -#endif /* def _MSC_VER */ - -#endif /* CONFIG_H_INCLUDED */ +#endif /* _CONFIG_H */ diff --git a/actionlist.h b/actionlist.h index c2ae6b48..cc65b2aa 100644 --- a/actionlist.h +++ b/actionlist.h @@ -13,7 +13,7 @@ * DEFINE_ACTION_ALIAS * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -39,40 +39,6 @@ * * Revisions : * $Log: actionlist.h,v $ - * Revision 1.14 2002/03/24 16:32:08 jongfoster - * Removing logo option - * - * Revision 1.13 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.12 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.11 2002/03/12 01:42:49 oes - * Introduced modular filters - * - * Revision 1.10 2002/03/08 18:19:14 jongfoster - * Adding +image-blocker{pattern} option to edit interface - * - * Revision 1.9 2001/11/22 21:58:41 jongfoster - * Adding action +no-cookies-keep - * - * Revision 1.8 2001/10/10 16:42:52 oes - * Fixed a bug, Added +limit-connect string action - * - * Revision 1.7 2001/10/07 15:33:59 oes - * Introduced a +no-compression action - * Introduced a +downgrade action - * - * Revision 1.6 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.5 2001/07/18 12:27:03 oes - * Changed deanimate-gifs to string action - * * Revision 1.4 2001/07/13 13:52:12 oes * - Formatting * - Introduced new action ACTION_DEANIMATE @@ -84,58 +50,23 @@ *********************************************************************/ -#if !(defined(DEFINE_ACTION_BOOL) && defined(DEFINE_ACTION_MULTI) && defined(DEFINE_ACTION_STRING)) -#error Please define lots of macros before including "actionlist.h". -#endif /* !defined(all the DEFINE_ACTION_xxx macros) */ - -#ifndef DEFINE_CGI_PARAM_RADIO -#define DEFINE_CGI_PARAM_RADIO(name, bit, index, value, is_default) -#define DEFINE_CGI_PARAM_CUSTOM(name, bit, index, default_val) -#define DEFINE_CGI_PARAM_NO_RADIO(name, bit, index, default_val) -#endif /* ndef DEFINE_CGI_PARAM_RADIO */ - -DEFINE_ACTION_MULTI ("add-header", ACTION_MULTI_ADD_HEADER) -DEFINE_ACTION_BOOL ("block", ACTION_BLOCK) -DEFINE_ACTION_STRING ("deanimate-gifs", ACTION_DEANIMATE, ACTION_STRING_DEANIMATE) -DEFINE_CGI_PARAM_RADIO ("deanimate-gifs", ACTION_DEANIMATE, ACTION_STRING_DEANIMATE, "first", 0) -DEFINE_CGI_PARAM_RADIO ("deanimate-gifs", ACTION_DEANIMATE, ACTION_STRING_DEANIMATE, "last", 1) -DEFINE_ACTION_BOOL ("downgrade", ACTION_DOWNGRADE) -DEFINE_ACTION_BOOL ("fast-redirects", ACTION_FAST_REDIRECTS) -DEFINE_ACTION_MULTI ("filter", ACTION_MULTI_FILTER) -DEFINE_ACTION_BOOL ("hide-forwarded", ACTION_HIDE_FORWARDED) -DEFINE_ACTION_STRING ("hide-from", ACTION_HIDE_FROM, ACTION_STRING_FROM) -DEFINE_CGI_PARAM_RADIO ("hide-from", ACTION_HIDE_FROM, ACTION_STRING_FROM, "block", 1) -DEFINE_CGI_PARAM_CUSTOM ("hide-from", ACTION_HIDE_FROM, ACTION_STRING_FROM, "spam_me_senseless@sittingduck.xyz") -DEFINE_ACTION_STRING ("hide-referer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER) -DEFINE_CGI_PARAM_RADIO ("hide-referer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "forge", 1) -DEFINE_CGI_PARAM_RADIO ("hide-referer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "block", 0) -DEFINE_CGI_PARAM_CUSTOM ("hide-referer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "http://www.google.com/") -DEFINE_ACTION_STRING ("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT) -DEFINE_CGI_PARAM_NO_RADIO("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT, "Privoxy/3.0 (Anonymous)") -DEFINE_ACTION_BOOL ("image", ACTION_IMAGE) -DEFINE_ACTION_STRING ("image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER) -DEFINE_CGI_PARAM_RADIO ("image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, "pattern", 1) -DEFINE_CGI_PARAM_RADIO ("image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, "blank", 0) -DEFINE_CGI_PARAM_CUSTOM ("image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, CGI_PREFIX "show-banner?type=pattern") -DEFINE_ACTION_STRING ("limit-connect", ACTION_LIMIT_CONNECT, ACTION_STRING_LIMIT_CONNECT) -DEFINE_CGI_PARAM_NO_RADIO("limit-connect", ACTION_LIMIT_CONNECT, ACTION_STRING_LIMIT_CONNECT, "443") -DEFINE_ACTION_BOOL ("no-compression", ACTION_NO_COMPRESSION) -DEFINE_ACTION_BOOL ("no-cookies-keep", ACTION_NO_COOKIE_KEEP) -DEFINE_ACTION_BOOL ("no-cookies-read", ACTION_NO_COOKIE_READ) -DEFINE_ACTION_BOOL ("no-cookies-set", ACTION_NO_COOKIE_SET) -DEFINE_ACTION_BOOL ("no-popups", ACTION_NO_POPUPS) -DEFINE_ACTION_BOOL ("vanilla-wafer", ACTION_VANILLA_WAFER) -DEFINE_ACTION_MULTI ("wafer", ACTION_MULTI_WAFER) +DEFINE_ACTION_MULTI ("add-header", ACTION_MULTI_ADD_HEADER) +DEFINE_ACTION_BOOL ("block", ACTION_BLOCK) +DEFINE_ACTION_STRING("deanimate-gifs", ACTION_DEANIMATE, ACTION_STRING_DEANIMATE) +DEFINE_ACTION_BOOL ("fast-redirects", ACTION_FAST_REDIRECTS) +DEFINE_ACTION_BOOL ("filter", ACTION_FILTER) +DEFINE_ACTION_BOOL ("hide-forwarded", ACTION_HIDE_FORWARDED) +DEFINE_ACTION_STRING("hide-from", ACTION_HIDE_FROM, ACTION_STRING_FROM) +DEFINE_ACTION_STRING("hide-referer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER) +DEFINE_ACTION_STRING("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT) +DEFINE_ACTION_BOOL ("image", ACTION_IMAGE) +DEFINE_ACTION_STRING("image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER) +DEFINE_ACTION_BOOL ("no-cookies-read", ACTION_NO_COOKIE_READ) +DEFINE_ACTION_BOOL ("no-cookies-set", ACTION_NO_COOKIE_SET) +DEFINE_ACTION_BOOL ("no-popups", ACTION_NO_POPUPS) +DEFINE_ACTION_BOOL ("vanilla-wafer", ACTION_VANILLA_WAFER) +DEFINE_ACTION_MULTI ("wafer", ACTION_MULTI_WAFER) #if DEFINE_ACTION_ALIAS -DEFINE_ACTION_BOOL ("no-popup", ACTION_NO_POPUPS) -DEFINE_ACTION_STRING ("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER) +DEFINE_ACTION_BOOL ("no-popup", ACTION_NO_POPUPS) +DEFINE_ACTION_STRING("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER) #endif /* if DEFINE_ACTION_ALIAS */ - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS -#undef DEFINE_CGI_PARAM_CUSTOM -#undef DEFINE_CGI_PARAM_RADIO -#undef DEFINE_CGI_PARAM_NO_RADIO - diff --git a/actions.c b/actions.c index e0f3fcad..e4e5aaf2 100644 --- a/actions.c +++ b/actions.c @@ -1,4 +1,4 @@ -const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"; +const char actions_rcs[] = "$Id: actions.c,v 1.7 2001/06/09 10:55:28 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/actions.c,v $ @@ -7,13 +7,13 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" * Functions declared include: FIXME * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -33,88 +33,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: actions.c,v $ - * Revision 1.25 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.24 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.23 2002/03/07 03:46:16 oes - * Fixed compiler warnings - * - * Revision 1.22 2002/01/21 00:27:02 jongfoster - * Allowing free_action(NULL). - * Moving the functions that #include actionlist.h to the end of the file, - * because the Visual C++ 97 debugger gets extremely confused if you try - * to debug any code that comes after them in the file. - * - * Revision 1.21 2002/01/17 20:54:44 jongfoster - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Revision 1.20 2001/11/22 21:56:49 jongfoster - * Making action_spec->flags into an unsigned long rather than just an - * unsigned int. - * Fixing a bug in the display of -add-header and -wafer - * - * Revision 1.19 2001/11/13 00:14:07 jongfoster - * Fixing stupid bug now I've figured out what || means. - * (It always returns 0 or 1, not one of it's paramaters.) - * - * Revision 1.18 2001/11/07 00:06:06 steudten - * Add line number in error output for lineparsing for - * actionsfile. - * - * Revision 1.17 2001/10/25 03:40:47 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.16 2001/10/23 21:30:30 jongfoster - * Adding error-checking to selected functions. - * - * Revision 1.15 2001/10/14 21:58:22 jongfoster - * Adding support for the CGI-based editor: - * - Exported get_actions() - * - Added new function free_alias_list() - * - Added support for {{settings}} and {{description}} blocks - * in the actions file. They are currently ignored. - * - Added restriction to only one {{alias}} block which must appear - * first in the file, to simplify the editor's rewriting rules. - * - Note that load_actions_file() is no longer used by the CGI-based - * editor, but some of the other routines in this file are. - * - * Revision 1.14 2001/09/22 16:36:59 jongfoster - * Removing unused parameter fs from read_config_line() - * - * Revision 1.13 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.12 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.11 2001/09/14 00:17:32 jongfoster - * Tidying up memory allocation. New function init_action(). - * - * Revision 1.10 2001/09/10 10:14:34 oes - * Removing unused variable - * - * Revision 1.9 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.8 2001/06/29 13:19:52 oes - * Removed logentry from cancelled commit - * * Revision 1.7 2001/06/09 10:55:28 jongfoster * Changing BUFSIZ ==> BUFFER_SIZE * @@ -146,8 +64,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" #include #include -#include -#include #include "project.h" #include "jcc.h" @@ -156,14 +72,27 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" #include "miscutil.h" #include "errlog.h" #include "loaders.h" -#ifdef FEATURE_CGI_EDIT_ACTIONS -#include "encode.h" -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ -#include "urlmatch.h" const char actions_h_rcs[] = ACTIONS_H_VERSION; +/* Turn off everything except forwarding */ +/* This structure is used to hold user-defined aliases */ +struct action_alias +{ + const char * name; + struct action_spec action[1]; + struct action_alias * next; +}; + + +/* + * Must declare this in this file for the above structure. + */ +static int get_actions (char *line, + struct action_alias * alias_list, + struct action_spec *cur_action); + /* * We need the main list of options. * @@ -178,10 +107,10 @@ const char actions_h_rcs[] = ACTIONS_H_VERSION; #define AV_ADD_STRING 1 /* +stropt{string} */ #define AV_REM_STRING 2 /* -stropt */ #define AV_ADD_MULTI 3 /* +multiopt{string} +multiopt{string2} */ -#define AV_REM_MULTI 4 /* -multiopt{string} -multiopt */ +#define AV_REM_MULTI 4 /* -multiopt{string} -multiopt{*} */ /* - * We need a structure to hold the name, flag changes, + * We need a structure to hold the name, flag changes, * type, and string index. */ struct action_name @@ -237,14 +166,13 @@ static const struct action_name action_names[] = * 1 : cur_action = Current actions, to modify. * 2 : new_action = Action to add. * - * Returns : JB_ERR_OK or JB_ERR_MEMORY + * Returns : N/A * *********************************************************************/ -jb_err merge_actions (struct action_spec *dest, - const struct action_spec *src) +void merge_actions (struct action_spec *dest, + const struct action_spec *src) { int i; - jb_err err; dest->mask &= src->mask; dest->add &= src->mask; @@ -257,10 +185,6 @@ jb_err merge_actions (struct action_spec *dest, { freez(dest->string[i]); dest->string[i] = strdup(str); - if (NULL == dest->string[i]) - { - return JB_ERR_MEMORY; - } } } @@ -269,10 +193,10 @@ jb_err merge_actions (struct action_spec *dest, if (src->multi_remove_all[i]) { /* Remove everything from dest */ - list_remove_all(dest->multi_remove[i]); + destroy_list(dest->multi_remove[i]); + destroy_list(dest->multi_add[i]); dest->multi_remove_all[i] = 1; - - err = list_duplicate(dest->multi_add[i], src->multi_add[i]); + list_duplicate(dest->multi_add[i], src->multi_add[i]); } else if (dest->multi_remove_all[i]) { @@ -281,23 +205,16 @@ jb_err merge_actions (struct action_spec *dest, * about what we add. */ list_remove_list(dest->multi_add[i], src->multi_remove[i]); - err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]); + list_append_list_unique(dest->multi_add[i], src->multi_add[i]); } else { /* No "remove all"s to worry about. */ list_remove_list(dest->multi_add[i], src->multi_remove[i]); - err = list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]); - if (!err) err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]); - } - - if (err) - { - return err; + list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]); + list_append_list_unique(dest->multi_add[i], src->multi_add[i]); } } - - return JB_ERR_OK; } @@ -307,8 +224,6 @@ jb_err merge_actions (struct action_spec *dest, * * Description : Copy an action_specs. * Similar to "cur_action = new_action". - * Note that dest better not contain valid data - * - it's overwritten, not freed. * * Parameters : * 1 : dest = Destination of copy. @@ -317,13 +232,10 @@ jb_err merge_actions (struct action_spec *dest, * Returns : N/A * *********************************************************************/ -jb_err copy_action (struct action_spec *dest, - const struct action_spec *src) +void copy_action (struct action_spec *dest, + const struct action_spec *src) { int i; - jb_err err = JB_ERR_OK; - - memset(dest, '\0', sizeof(*dest)); dest->mask = src->mask; dest->add = src->add; @@ -331,32 +243,15 @@ jb_err copy_action (struct action_spec *dest, for (i = 0; i < ACTION_STRING_COUNT; i++) { char * str = src->string[i]; - if (str) - { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } - dest->string[i] = str; - } + dest->string[i] = (str ? strdup(str) : NULL); } for (i = 0; i < ACTION_MULTI_COUNT; i++) { dest->multi_remove_all[i] = src->multi_remove_all[i]; - err = list_duplicate(dest->multi_remove[i], src->multi_remove[i]); - if (err) - { - return err; - } - err = list_duplicate(dest->multi_add[i], src->multi_add[i]); - if (err) - { - return err; - } + list_duplicate(dest->multi_remove[i], src->multi_remove[i]); + list_duplicate(dest->multi_add[i], src->multi_add[i]); } - return err; } @@ -364,9 +259,7 @@ jb_err copy_action (struct action_spec *dest, * * Function : free_action * - * Description : Destroy an action_spec. Frees memory used by it, - * except for the memory used by the struct action_spec - * itself. + * Description : Free an action_specs. * * Parameters : * 1 : src = Source to free. @@ -378,11 +271,6 @@ void free_action (struct action_spec *src) { int i; - if (src == NULL) - { - return; - } - for (i = 0; i < ACTION_STRING_COUNT; i++) { freez(src->string[i]); @@ -418,14 +306,14 @@ void free_action (struct action_spec *src) * we found an action. * 2 : name = [out] Start of action name, null * terminated. NULL on EOL - * 3 : value = [out] Start of action value, null + * 3 : value = [out] Start of action value, null * terminated. NULL if none or EOL. * - * Returns : JB_ERR_OK => Ok - * JB_ERR_PARSE => Mismatched {} (line was trashed anyway) + * Returns : 0 => Ok + * nonzero => Mismatched {} (line was trashed anyway) * *********************************************************************/ -jb_err get_action_token(char **line, char **name, char **value) +int get_action_token(char **line, char **name, char **value) { char * str = *line; char ch; @@ -449,19 +337,19 @@ jb_err get_action_token(char **line, char **name, char **value) if (*str == '{') { /* null name, just value is prohibited */ - return JB_ERR_PARSE; + return 1; } *name = str; /* parse option */ - while (((ch = *str) != '\0') && + while (((ch = *str) != '\0') && (ch != ' ') && (ch != '\t') && (ch != '{')) { if (ch == '}') { - /* error, '}' without '{' */ - return JB_ERR_PARSE; + /* error */ + return 1; } str++; } @@ -480,7 +368,7 @@ jb_err get_action_token(char **line, char **name, char **value) /* More to parse next time. */ *line = str + 1; } - return JB_ERR_OK; + return 0; } str++; @@ -491,7 +379,7 @@ jb_err get_action_token(char **line, char **name, char **value) { /* error */ *value = NULL; - return JB_ERR_PARSE; + return 1; } /* got value */ @@ -500,7 +388,7 @@ jb_err get_action_token(char **line, char **name, char **value) chomp(*value); - return JB_ERR_OK; + return 0; } @@ -517,17 +405,15 @@ jb_err get_action_token(char **line, char **name, char **value) * 3 : cur_action = Where to store the action. Caller * allocates memory. * - * Returns : JB_ERR_OK => Ok - * JB_ERR_PARSE => Parse error (line was trashed anyway) - * nonzero => Out of memory (line was trashed anyway) + * Returns : 0 => Ok + * nonzero => Error (line was trashed anyway) * *********************************************************************/ -jb_err get_actions(char *line, - struct action_alias * alias_list, - struct action_spec *cur_action) +static int get_actions(char *line, + struct action_alias * alias_list, + struct action_spec *cur_action) { - jb_err err; - init_action(cur_action); + memset(cur_action, '\0', sizeof(*cur_action)); cur_action->mask = ACTION_MASK_ALL; while (line) @@ -535,16 +421,15 @@ jb_err get_actions(char *line, char * option = NULL; char * value = NULL; - err = get_action_token(&line, &option, &value); - if (err) + if (get_action_token(&line, &option, &value)) { - return err; + return 1; } if (option) { /* handle option in 'option' */ - + /* Check for standard action name */ const struct action_name * action = action_names; @@ -570,15 +455,11 @@ jb_err get_actions(char *line, if ((value == NULL) || (*value == '\0')) { - return JB_ERR_PARSE; + return 1; } /* FIXME: should validate option string here */ freez (cur_action->string[action->index]); cur_action->string[action->index] = strdup(value); - if (NULL == cur_action->string[action->index]) - { - return JB_ERR_MEMORY; - } break; } case AV_REM_STRING: @@ -592,28 +473,24 @@ jb_err get_actions(char *line, { /* append multi string. */ - struct list * remove_p = cur_action->multi_remove[action->index]; - struct list * add_p = cur_action->multi_add[action->index]; + struct list * remove = cur_action->multi_remove[action->index]; + struct list * add = cur_action->multi_add[action->index]; if ((value == NULL) || (*value == '\0')) { - return JB_ERR_PARSE; + return 1; } - list_remove_item(remove_p, value); - err = enlist_unique(add_p, value, 0); - if (err) - { - return err; - } + list_remove_item(remove, value); + enlist_unique(add, value, 0); break; } case AV_REM_MULTI: { /* remove multi string. */ - struct list * remove_p = cur_action->multi_remove[action->index]; - struct list * add_p = cur_action->multi_add[action->index]; + struct list * remove = cur_action->multi_remove[action->index]; + struct list * add = cur_action->multi_add[action->index]; if ( (value == NULL) || (*value == '\0') || ((*value == '*') && (value[1] == '\0')) ) @@ -623,8 +500,8 @@ jb_err get_actions(char *line, * * Remove *ALL*. */ - list_remove_all(remove_p); - list_remove_all(add_p); + destroy_list(remove); + destroy_list(add); cur_action->multi_remove_all[action->index] = 1; } else @@ -634,27 +511,22 @@ jb_err get_actions(char *line, if ( !cur_action->multi_remove_all[action->index] ) { /* there isn't a catch-all in the remove list already */ - err = enlist_unique(remove_p, value, 0); - if (err) - { - return err; - } + enlist_unique(remove, value, 0); } - list_remove_item(add_p, value); + list_remove_item(add, value); } break; } default: /* Shouldn't get here unless there's memory corruption. */ - assert(0); - return JB_ERR_PARSE; + return 1; } } else { /* try user aliases. */ const struct action_alias * alias = alias_list; - + while ( (alias != NULL) && (0 != strcmpic(alias->name, option)) ) { alias = alias->next; @@ -667,51 +539,187 @@ jb_err get_actions(char *line, else { /* Bad action name */ - return JB_ERR_PARSE; + return 1; } } } } - return JB_ERR_OK; + return 0; } /********************************************************************* * - * Function : init_current_action + * Function : actions_to_text * - * Description : Zero out an action. + * Description : Converts a actionsfile entry from numeric form + * ("mask" and "add") to text. * * Parameters : - * 1 : dest = An uninitialized current_action_spec. + * 1 : mask = As from struct url_actions + * 2 : add = As from struct url_actions * - * Returns : N/A + * Returns : A string. Caller must free it. * *********************************************************************/ -void init_current_action (struct current_action_spec *dest) +char * actions_to_text(struct action_spec *action) { - memset(dest, '\0', sizeof(*dest)); + unsigned mask = action->mask; + unsigned add = action->add; + char * result = strdup(""); + struct list * lst; - dest->flags = ACTION_MOST_COMPATIBLE; + /* sanity - prevents "-feature +feature" */ + mask |= add; + + +#define DEFINE_ACTION_BOOL(__name, __bit) \ + if (!(mask & __bit)) \ + { \ + result = strsav(result, " -" __name); \ + } \ + else if (add & __bit) \ + { \ + result = strsav(result, " +" __name); \ + } + +#define DEFINE_ACTION_STRING(__name, __bit, __index) \ + if (!(mask & __bit)) \ + { \ + result = strsav(result, " -" __name); \ + } \ + else if (add & __bit) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, action->string[__index]); \ + result = strsav(result, "}"); \ + } + +#define DEFINE_ACTION_MULTI(__name, __index) \ + if (action->multi_remove_all[__index]) \ + { \ + result = strsav(result, " -" __name "{*}"); \ + } \ + else \ + { \ + lst = action->multi_remove[__index]->next; \ + while (lst) \ + { \ + result = strsav(result, " -" __name "{"); \ + result = strsav(result, lst->str); \ + result = strsav(result, "}"); \ + lst = lst->next; \ + } \ + } \ + lst = action->multi_add[__index]->next; \ + while (lst) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, lst->str); \ + result = strsav(result, "}"); \ + lst = lst->next; \ + } + +#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ + +#include "actionlist.h" + +#undef DEFINE_ACTION_MULTI +#undef DEFINE_ACTION_STRING +#undef DEFINE_ACTION_BOOL +#undef DEFINE_ACTION_ALIAS + + return result; } /********************************************************************* * - * Function : init_action + * Function : current_actions_to_text + * + * Description : Converts a actionsfile entry to text. + * + * Parameters : + * 1 : action = Action + * + * Returns : A string. Caller must free it. + * + *********************************************************************/ +char * current_action_to_text(struct current_action_spec *action) +{ + unsigned flags = action->flags; + char * result = strdup(""); + struct list * lst; + +#define DEFINE_ACTION_BOOL(__name, __bit) \ + if (flags & __bit) \ + { \ + result = strsav(result, " +" __name); \ + } \ + else \ + { \ + result = strsav(result, " -" __name); \ + } + +#define DEFINE_ACTION_STRING(__name, __bit, __index) \ + if (flags & __bit) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, action->string[__index]); \ + result = strsav(result, "}"); \ + } \ + else \ + { \ + result = strsav(result, " -" __name); \ + } + +#define DEFINE_ACTION_MULTI(__name, __index) \ + lst = action->multi[__index]->next; \ + if (lst == NULL) \ + { \ + result = strsav(result, " -" __name); \ + } \ + else \ + { \ + while (lst) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, lst->str); \ + result = strsav(result, "}"); \ + lst = lst->next; \ + } \ + } + +#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ + +#include "actionlist.h" + +#undef DEFINE_ACTION_MULTI +#undef DEFINE_ACTION_STRING +#undef DEFINE_ACTION_BOOL +#undef DEFINE_ACTION_ALIAS + + return result; +} + + +/********************************************************************* + * + * Function : init_current_action * * Description : Zero out an action. * * Parameters : - * 1 : dest = An uninitialized action_spec. + * 1 : dest = An uninitialized current_action_spec. * * Returns : N/A * *********************************************************************/ -void init_action (struct action_spec *dest) +void init_current_action (struct current_action_spec *dest) { memset(dest, '\0', sizeof(*dest)); + dest->flags = ACTION_MOST_COMPATIBLE; } @@ -725,7 +733,7 @@ void init_action (struct action_spec *dest) * is that this one doesn't allocate memory for * strings (so "src" better be in memory for at least * as long as "dest" is, and you'd better free - * "dest" using "free_current_action"). + * "dest" using "current_free_action"). * Also, there is no mask or remove lists in dest. * (If we're applying it to a URL, we don't need them) * @@ -733,15 +741,13 @@ void init_action (struct action_spec *dest) * 1 : dest = Current actions, to modify. * 2 : src = Action to add. * - * Returns 0 : no error - * !=0 : error, probably JB_ERR_MEMORY. + * Returns : N/A * *********************************************************************/ -jb_err merge_current_action (struct current_action_spec *dest, - const struct action_spec *src) +void merge_current_action (struct current_action_spec *dest, + const struct action_spec *src) { int i; - jb_err err = JB_ERR_OK; dest->flags &= src->mask; dest->flags |= src->add; @@ -751,13 +757,8 @@ jb_err merge_current_action (struct current_action_spec *dest, char * str = src->string[i]; if (str) { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } freez(dest->string[i]); - dest->string[i] = str; + dest->string[i] = strdup(str); } } @@ -765,24 +766,16 @@ jb_err merge_current_action (struct current_action_spec *dest, { if (src->multi_remove_all[i]) { - /* Remove everything from dest, then add src->multi_add */ - err = list_duplicate(dest->multi[i], src->multi_add[i]); - if (err) - { - return err; - } + /* Remove everything from dest */ + destroy_list(dest->multi[i]); + list_duplicate(dest->multi[i], src->multi_add[i]); } else { list_remove_list(dest->multi[i], src->multi_remove[i]); - err = list_append_list_unique(dest->multi[i], src->multi_add[i]); - if (err) - { - return err; - } + list_append_list_unique(dest->multi[i], src->multi_add[i]); } } - return err; } @@ -790,8 +783,7 @@ jb_err merge_current_action (struct current_action_spec *dest, * * Function : free_current_action * - * Description : Free memory used by a current_action_spec. - * Does not free the current_action_spec itself. + * Description : Free a current_action_spec. * * Parameters : * 1 : src = Source to free. @@ -817,33 +809,6 @@ void free_current_action (struct current_action_spec *src) } -static struct file_list *current_actions_file = NULL; - - -#ifdef FEATURE_GRACEFUL_TERMINATION -/********************************************************************* - * - * Function : unload_current_actions_file - * - * Description : Unloads current actions file - reset to state at - * beginning of program. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void unload_current_actions_file(void) -{ - if (current_actions_file) - { - current_actions_file->unloader = unload_actions_file; - current_actions_file = NULL; - } -} -#endif /* FEATURE_GRACEFUL_TERMINATION */ - - /********************************************************************* * * Function : unload_actions_file @@ -864,8 +829,7 @@ void unload_actions_file(void *file_data) while (cur != NULL) { next = cur->next; - free_url_spec(cur->url); - free_action(cur->action); + free_url(cur->url); freez(cur); cur = next; } @@ -873,32 +837,6 @@ void unload_actions_file(void *file_data) } -/********************************************************************* - * - * Function : free_alias_list - * - * Description : Free memory used by a list of aliases. - * - * Parameters : - * 1 : alias_list = Linked list to free. - * - * Returns : N/A - * - *********************************************************************/ -void free_alias_list(struct action_alias *alias_list) -{ - while (alias_list != NULL) - { - struct action_alias * next = alias_list->next; - alias_list->next = NULL; - freez(alias_list->name); - free_action(alias_list->action); - free(alias_list); - alias_list = next; - } -} - - /********************************************************************* * * Function : load_actions_file @@ -914,29 +852,22 @@ void free_alias_list(struct action_alias *alias_list) *********************************************************************/ int load_actions_file(struct client_state *csp) { - - /* - * Parser mode. - * Note: Keep these in the order they occur in the file, they are - * sometimes tested with <= - */ -#define MODE_START_OF_FILE 1 -#define MODE_SETTINGS 2 -#define MODE_DESCRIPTION 3 -#define MODE_ALIAS 4 -#define MODE_ACTIONS 5 - - int mode = MODE_START_OF_FILE; + static struct file_list *current_actions_file = NULL; FILE *fp; + struct url_actions *last_perm; struct url_actions *perm; char buf[BUFFER_SIZE]; struct file_list *fs; - struct action_spec * cur_action = NULL; - int cur_action_used = 0; +#define MODE_START_OF_FILE 1 +#define MODE_ACTIONS 2 +#define MODE_ALIAS 3 + int mode = MODE_START_OF_FILE; + struct action_spec cur_action[1]; struct action_alias * alias_list = NULL; - unsigned long linenum = 0; + + memset(cur_action, '\0', sizeof(*cur_action)); if (!check_file_changed(current_actions_file, csp->config->actions_file, &fs)) { @@ -969,7 +900,7 @@ int load_actions_file(struct client_state *csp) return 1; /* never get here */ } - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) + while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) { if (*buf == '{') { @@ -984,9 +915,9 @@ int load_actions_file(struct client_state *csp) { /* too short */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -998,87 +929,25 @@ int load_actions_file(struct client_state *csp) { /* too short */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): {{ }}", - csp->config->actions_file, linenum); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: {{ }}", + csp->config->actions_file); return 1; /* never get here */ } - /* - * An actionsfile can optionally contain the following blocks. - * They *MUST* be in this order, to simplify processing: - * - * {{settings}} - * name=value... - * - * {{description}} - * ...free text, format TBD, but no line may start with a '{'... - * - * {{alias}} - * name=actions... - * - * The actual actions must be *after* these special blocks. - * None of these special blocks may be repeated. - * - */ - if (0 == strcmpic(start, "settings")) - { - /* it's a {{settings}} block */ - if (mode >= MODE_SETTINGS) - { - /* {{settings}} must be first thing in file and must only - * appear once. - */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: {{settings}} must only appear once, and it must be before anything else.", - csp->config->actions_file, linenum); - } - mode = MODE_SETTINGS; - } - else if (0 == strcmpic(start, "description")) - { - /* it's a {{description}} block */ - if (mode >= MODE_DESCRIPTION) - { - /* {{description}} is a singleton and only {{settings}} may proceed it - */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: {{description}} must only appear once, and only a {{settings}} block may be above it.", - csp->config->actions_file, linenum); - } - mode = MODE_DESCRIPTION; - } - else if (0 == strcmpic(start, "alias")) + if (0 == strcmpic(start, "alias")) { /* it's an {{alias}} block */ - if (mode >= MODE_ALIAS) - { - /* {{alias}} must be first thing in file, possibly after - * {{settings}} and {{description}} - * - * {{alias}} must only appear once. - * - * Note that these are new restrictions introduced in - * v2.9.10 in order to make actionsfile editing simpler. - * (Otherwise, reordering actionsfile entries without - * completely rewriting the file becomes non-trivial) - */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: {{alias}} must only appear once, and it must be before all actions.", - csp->config->actions_file, linenum); - } + mode = MODE_ALIAS; } else { /* invalid {{something}} block */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): {{%s}}", - csp->config->actions_file, linenum, start); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: {{%s}}", + csp->config->actions_file, start); return 1; /* never get here */ } } @@ -1093,26 +962,7 @@ int load_actions_file(struct client_state *csp) mode = MODE_ACTIONS; /* free old action */ - if (cur_action) - { - if (!cur_action_used) - { - free_action(cur_action); - free(cur_action); - } - cur_action = NULL; - } - cur_action_used = 0; - cur_action = (struct action_spec *)zalloc(sizeof(*cur_action)); - if (cur_action == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory", - csp->config->actions_file); - return 1; /* never get here */ - } - init_action(cur_action); + free_action(cur_action); /* trim { */ strcpy(actions_buf, buf + 1); @@ -1121,11 +971,11 @@ int load_actions_file(struct client_state *csp) end = actions_buf + strlen(actions_buf) - 1; if (*end != '}') { - /* No closing } */ + /* too short */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } *end = '\0'; @@ -1133,48 +983,42 @@ int load_actions_file(struct client_state *csp) /* trim any whitespace immediately inside {} */ chomp(actions_buf); + if (*actions_buf == '\0') + { + /* too short */ + fclose(fp); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); + return 1; /* never get here */ + } + if (get_actions(actions_buf, alias_list, cur_action)) { /* error */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } } } - else if (mode == MODE_SETTINGS) - { - /* - * Part of the {{settings}} block. - * Ignore for now, but we may want to read & check permissions - * when we go multi-user. - */ - } - else if (mode == MODE_DESCRIPTION) - { - /* - * Part of the {{description}} block. - * Ignore for now. - */ - } else if (mode == MODE_ALIAS) { - /* - * define an alias - */ + /* define an alias */ char actions_buf[BUFFER_SIZE]; struct action_alias * new_alias; + int more = 1; char * start = strchr(buf, '='); char * end = start; if ((start == NULL) || (start == buf)) { - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid alias line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -1207,9 +1051,9 @@ int load_actions_file(struct client_state *csp) } if (*start == '\0') { - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid alias line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -1221,12 +1065,12 @@ int load_actions_file(struct client_state *csp) { /* error */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s = %s", - csp->config->actions_file, linenum, buf, start); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid alias line: %s = %s", + csp->config->actions_file, buf, start); return 1; /* never get here */ } - + /* add to list */ new_alias->next = alias_list; alias_list = new_alias; @@ -1252,9 +1096,9 @@ int load_actions_file(struct client_state *csp) if (create_url_spec(perm->url, buf)) { fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: cannot create URL pattern from: %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': cannot create URL pattern from: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -1266,16 +1110,16 @@ int load_actions_file(struct client_state *csp) { /* oops - please have a {} line as 1st line in file. */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': first needed line (%lu) is invalid: %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': first line is invalid: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } else { /* How did we get here? This is impossible! */ fclose(fp); - log_error(LOG_LEVEL_FATAL, + log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': INTERNAL ERROR - mode = %d", csp->config->actions_file, mode); return 1; /* never get here */ @@ -1283,10 +1127,24 @@ int load_actions_file(struct client_state *csp) } fclose(fp); - + free_action(cur_action); - free_alias_list(alias_list); + while (alias_list != NULL) + { + struct action_alias * next = alias_list->next; + freez((char *)alias_list->name); + free_action(alias_list->action); + free(alias_list); + alias_list = next; + } + +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) + { + fs->proxy_args = strsav(fs->proxy_args, ""); + } +#endif /* ndef SPLIT_PROXY_ARGS */ /* the old one is now obsolete */ if (current_actions_file) @@ -1306,290 +1164,3 @@ int load_actions_file(struct client_state *csp) return(0); } - - -/********************************************************************* - * - * Function : actions_to_text - * - * Description : Converts a actionsfile entry from numeric form - * ("mask" and "add") to text. - * - * Parameters : - * 1 : mask = As from struct url_actions - * 2 : add = As from struct url_actions - * - * Returns : A string. Caller must free it. - * NULL on out-of-memory error. - * - *********************************************************************/ -char * actions_to_text(struct action_spec *action) -{ - unsigned mask = action->mask; - unsigned add = action->add; - char * result = strdup(""); - struct list_entry * lst; - - /* sanity - prevents "-feature +feature" */ - mask |= add; - - -#define DEFINE_ACTION_BOOL(__name, __bit) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, " -" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, " +" __name); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, " -" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, action->string[__index]); \ - string_append(&result, "}"); \ - } - -#define DEFINE_ACTION_MULTI(__name, __index) \ - if (action->multi_remove_all[__index]) \ - { \ - string_append(&result, " -" __name); \ - } \ - else \ - { \ - lst = action->multi_remove[__index]->first; \ - while (lst) \ - { \ - string_append(&result, " -" __name "{"); \ - string_append(&result, lst->str); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } \ - } \ - lst = action->multi_add[__index]->first; \ - while (lst) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, lst->str); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } - -#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ - -#include "actionlist.h" - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS - - return result; -} - - -#ifdef FEATURE_CGI_EDIT_ACTIONS -/********************************************************************* - * - * Function : actions_to_html - * - * Description : Converts a actionsfile entry from numeric form - * ("mask" and "add") to a
-seperated HTML string. - * - * Parameters : - * 1 : mask = As from struct url_actions - * 2 : add = As from struct url_actions - * - * Returns : A string. Caller must free it. - * NULL on out-of-memory error. - * - *********************************************************************/ -char * actions_to_html(struct action_spec *action) -{ - unsigned mask = action->mask; - unsigned add = action->add; - char * result = strdup(""); - char * enc_str; - struct list_entry * lst; - - /* sanity - prevents "-feature +feature" */ - mask |= add; - - -#define DEFINE_ACTION_BOOL(__name, __bit) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, "\n
-" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, "\n
+" __name); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, "\n
-" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, "\n
+" __name "{"); \ - if (NULL == result) \ - { \ - return NULL; \ - } \ - enc_str = html_encode(action->string[__index]);\ - if (NULL == enc_str) \ - { \ - free(result); \ - return NULL; \ - } \ - string_append(&result, enc_str); \ - free(enc_str); \ - string_append(&result, "}"); \ - } - -#define DEFINE_ACTION_MULTI(__name, __index) \ - if (action->multi_remove_all[__index]) \ - { \ - string_append(&result, "\n
-" __name); \ - } \ - else \ - { \ - lst = action->multi_remove[__index]->first; \ - while (lst) \ - { \ - string_append(&result, "\n
-" __name "{");\ - if (NULL == result) \ - { \ - return NULL; \ - } \ - enc_str = html_encode(lst->str); \ - if (NULL == enc_str) \ - { \ - free(result); \ - return NULL; \ - } \ - string_append(&result, enc_str); \ - free(enc_str); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } \ - } \ - lst = action->multi_add[__index]->first; \ - while (lst) \ - { \ - string_append(&result, "\n
+" __name "{"); \ - if (NULL == result) \ - { \ - return NULL; \ - } \ - enc_str = html_encode(lst->str); \ - if (NULL == enc_str) \ - { \ - free(result); \ - return NULL; \ - } \ - string_append(&result, enc_str); \ - free(enc_str); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } - -#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ - -#include "actionlist.h" - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS - - /* trim leading
*/ - if (result && *result) - { - char * s = result; - result = strdup(result + 5); - free(s); - } - - return result; -} -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - - -/********************************************************************* - * - * Function : current_actions_to_text - * - * Description : Converts a actionsfile entry to text. - * - * Parameters : - * 1 : action = Action - * - * Returns : A string. Caller must free it. - * NULL on out-of-memory error. - * - *********************************************************************/ -char * current_action_to_text(struct current_action_spec *action) -{ - unsigned long flags = action->flags; - char * result = strdup(""); - struct list_entry * lst; - -#define DEFINE_ACTION_BOOL(__name, __bit) \ - if (flags & __bit) \ - { \ - string_append(&result, " +" __name); \ - } \ - else \ - { \ - string_append(&result, " -" __name); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (flags & __bit) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, action->string[__index]); \ - string_append(&result, "}"); \ - } \ - else \ - { \ - string_append(&result, " -" __name); \ - } - -#define DEFINE_ACTION_MULTI(__name, __index) \ - lst = action->multi[__index]->first; \ - if (lst == NULL) \ - { \ - string_append(&result, " -" __name); \ - } \ - else \ - { \ - while (lst) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, lst->str); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } \ - } - -#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ - -#include "actionlist.h" - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS - - return result; -} diff --git a/actions.h b/actions.h index 04434e28..d71d8c34 100644 --- a/actions.h +++ b/actions.h @@ -1,6 +1,6 @@ -#ifndef ACTIONS_H_INCLUDED -#define ACTIONS_H_INCLUDED -#define ACTIONS_H_VERSION "$Id: actions.h,v 1.8 2002/03/24 13:25:43 swa Exp $" +#ifndef _ACTIONS_H +#define _ACTIONS_H +#define ACTIONS_H_VERSION "$Id: actions.h,v ??? $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/actions.h,v $ @@ -9,7 +9,7 @@ * Functions declared include: FIXME * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,46 +35,6 @@ * * Revisions : * $Log: actions.h,v $ - * Revision 1.8 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.7 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.6 2001/10/23 21:30:30 jongfoster - * Adding error-checking to selected functions. - * - * Revision 1.5 2001/10/14 21:58:22 jongfoster - * Adding support for the CGI-based editor: - * - Exported get_actions() - * - Added new function free_alias_list() - * - Added support for {{settings}} and {{description}} blocks - * in the actions file. They are currently ignored. - * - Added restriction to only one {{alias}} block which must appear - * first in the file, to simplify the editor's rewriting rules. - * - Note that load_actions_file() is no longer used by the CGI-based - * editor, but some of the other routines in this file are. - * - * Revision 1.4 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.3 2001/09/14 00:17:32 jongfoster - * Tidying up memory allocation. New function init_action(). - * - * Revision 1.2 2001/07/29 19:01:11 jongfoster - * Changed _FILENAME_H to FILENAME_H_INCLUDED. - * Added forward declarations for needed structures. - * - * Revision 1.1 2001/05/31 21:16:46 jongfoster - * Moved functions to process the action list into this new file. - * * *********************************************************************/ @@ -84,51 +44,23 @@ extern "C" { #endif -struct action_spec; -struct current_action_spec; -struct client_state; - - - -/* This structure is used to hold user-defined aliases */ -struct action_alias -{ - const char * name; - struct action_spec action[1]; - struct action_alias * next; -}; - - -extern jb_err get_actions (char *line, - struct action_alias * alias_list, - struct action_spec *cur_action); -extern void free_alias_list(struct action_alias *alias_list); - -extern void init_action(struct action_spec *dest); -extern void free_action(struct action_spec *src); -extern jb_err merge_actions (struct action_spec *dest, - const struct action_spec *src); -extern jb_err copy_action (struct action_spec *dest, +extern void merge_actions (struct action_spec *dest, const struct action_spec *src); +extern void copy_action (struct action_spec *dest, + const struct action_spec *src); +extern void free_action (struct action_spec *src); extern char * actions_to_text (struct action_spec *action); -#ifdef FEATURE_CGI_EDIT_ACTIONS -extern char * actions_to_html (struct action_spec *action); -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ extern void init_current_action (struct current_action_spec *dest); -extern void free_current_action (struct current_action_spec *src); -extern jb_err merge_current_action (struct current_action_spec *dest, +extern void merge_current_action (struct current_action_spec *dest, const struct action_spec *src); +extern void free_current_action (struct current_action_spec *src); extern char * current_action_to_text(struct current_action_spec *action); -extern jb_err get_action_token(char **line, char **name, char **value); +extern int get_action_token(char **line, char **name, char **value); extern void unload_actions_file(void *file_data); extern int load_actions_file(struct client_state *csp); -#ifdef FEATURE_GRACEFUL_TERMINATION -void unload_current_actions_file(void); -#endif - /* Revision control strings from this header and associated .c file */ extern const char actions_rcs[]; @@ -138,7 +70,7 @@ extern const char actions_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef ACTIONS_H_INCLUDED */ +#endif /* ndef _ERRLOG_H */ /* Local Variables: diff --git a/default.action b/actionsfile old mode 100644 new mode 100755 similarity index 76% rename from default.action rename to actionsfile index b2c85ef5..d3e14d4a --- a/default.action +++ b/actionsfile @@ -1,43 +1,10 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/basic.action,v $ -# -# $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $ +############################################################################# +# Sample actions file for the Internet Junkbuster 2.9.x # -# Purpose : Default actions file, see -# http://www.privoxy.org/faq/questions.html#CONFIGFILES +# For information, see http://ijbswa.sourceforge.net/ # -# Copyright : Written by and Copyright -# Privoxy team. http://www.privoxy.org/ +# $Id: actionsfile,v 1.2 2001/06/29 21:45:41 oes Exp $ # -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# We value your feedback. However, to provide you with the best support, -# please note: -# -# * Use the support forum to get help: -# http://sourceforge.net/tracker/?group_id=11118&atid=211118 -# * Submit bugs only thru our bug forum: -# http://sourceforge.net/tracker/?group_id=11118&atid=111118 -# Make sure that the bug has not already been submitted. Please try -# to verify that it is a Junkbuster bug, and not a browser or site -# bug first. If you are using your own custom configuration, please -# try the stock configs to see if the problem is a configuration -# related bug. And if not using the latest development snapshot, -# please try the latest one. Or even better, CVS sources. -# * Submit feature requests only thru our feature request forum: -# http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse -# -# For any other issues, feel free to use the mailing lists: -# http://sourceforge.net/mail/?group_id=11118 -# -# Anyone interested in actively participating in development and related -# discussions can join the appropriate mailing list here: -# http://sourceforge.net/mail/?group_id=11118. Archives are available -# here too. -# ############################################################################# # Syntax ############################################################################# @@ -65,7 +32,7 @@ # is a domain-only pattern and will match any request to www.yahoo.com # # www.example.com/ -# means exactly the same (but is slightly less efficient) +# means exactly the same # # www.example.com/index.html # matches only the document /index.html on www.example.com @@ -125,16 +92,12 @@ # details. # # Please note that matching in the path is CASE INSENSITIVE by default, but -# you can switch to case sensitive by starting the pattern with the "(?-i)" -# switch: +# you can switch to case sensitive at any point in the pattern by using +# the "(?-i)" switch: # # www.example.com/(?-i)PaTtErN.* # will match only documents whose path starts with PaTtErN in exactly this # capitalization. -# -# Partially case-sensetive and partially case-insensitive patterns are -# possible, but the rules about splitting them up are extremely complex -# - see the PCRE documentation for more information. # ############################################################################# # Action Syntax @@ -186,11 +149,6 @@ # most banner animations, but also has the risk of not showing the # entire last frame (if it is only a delta to an earlier frame). # -# +downgrade -# Downgrade HTTP/1.1 client requests to HTTP/1.0 and downgrade the -# responses as well. Use this action for servers that use HTTP/1.1 -# protocol features that Junkbuster currently can't handle yet. -# # +fast-redirects # Many sites, like yahoo.com, don't just link to other sites. # Instead, they will link to some script on their own server, @@ -212,23 +170,9 @@ # request and send a local redirect back to your browser without # contacting the remote site. # -# +filter{name} -# Filter the website through one or more regular expression filters. -# Repeat for multiple filters. -# -# Filters predefined in the supplied re_filterfile include: -# -# html-annoyances: Get rid of particularly annoying HTML abuse -# js-annoyances: Get rid of particularly annoying JavaScript abuse -# no-poups: Kill all popups in JS and HTML -# frameset-borders: Give frames a border -# webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking) -# no-refresh: Automatic refresh sucks on auto-dialup lines -# fun: Text replacements for subversive browsing fun! -# nimda: Remove (virus) Nimda code. -# banners-by-size: Kill banners by size -# crude-parental: Kill all web pages that contain the words "sex" or "warez" -# +# +filter +# Filter the website through the re_filterfile +# FIXME: The syntax should be +filter{filename} # # +hide-forwarded # Block any existing X-Forwarded-for header, and do not add a new one. @@ -267,50 +211,17 @@ # in which case a "blocked" image can be sent rather than a HTML page. # See +image-blocker{} for the control over what is actually sent. # +# +image-blocker{logo} # +image-blocker{blank} -# +image-blocker{pattern} -# +image-blocker{} with being any valid image URL +# +image-blocker{http://i.j.b/send-banner} # Decides what to do with URLs that end up tagged with {+block +image}. -# There are 4 options: -# * "-image-blocker" will send a HTML "blocked" page, usually -# resulting in a "broken image" icon. -# * "+image-blocker{blank}" will send a 1x1 transparent image -# * "+image-blocker{pattern}" will send a 4x4 grey/white pattern -# which is less intrusive than the logo but easier to recognize -# than the transparent one. -# * "+image-blocker{}" will send a HTTP temporary redirect -# to the specified image URL. -# -# -# +limit-connect{portlist} -# The CONNECT methods exists in HTTP to allow access to secure websites -# (https:// URLs) through proxies. It works very simply: The proxy -# connects to the server on the specified port, and then short-circuits -# its connections to the cliant and to the remote proxy. -# This can be a big security hole, since CONNECT-enabled proxies can -# be abused as TCP relays very easily. -# By default, i.e. in the absence of a +limit-connect action, Junkbuster -# will only allow CONNECT requests to port 443, which is the standard port -# for https. -# If you want to allow CONNECT for more ports than that, or want to forbid -# CONNECT altogether, you can specify a comma separated list of ports and port -# ranges (the latter using dashes, with the minimum defaulting to 0 and max to 65K): -# -# +limit-connect{443} # This is the default and need no be specified. -# +limit-connect{80,443} # Ports 80 and 443 are OK. -# +limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to 100, and above 500 are OK. -# -# +no-compression -# Prevent the website from compressing the data. Some websites do -# that, which is a problem for junkbuster, since +filter, +no-popup -# and +gif-deanimate will not work on compressed data. Will slow down -# connections to those websites, though. -# -# +no-cookies-keep -# If the website sets cookies, make sure they are erased when you exit -# and restart your web browser. This makes profiling cookies useless, -# but won't break sites which require cookies so that you can log in -# or for transactions. +# There are 4 options. "-image-blocker" will send a HTML "blocked" page, +# usually resulting in a "broken image" icon. "+image-blocker{logo}" +# will send a "JunkBuster" image. "+image-blocker{blank}" will send +# a 1x1 transparent GIF. And finally, "+image-blocker{http://xyz.com}" +# will send a HTTP temporary redirect to the specified image - this +# has the advantage of the icon being beeing cached by the browser, +# which will speed up the display. # # +no-cookies-read # Prevent the website from reading cookies @@ -364,130 +275,86 @@ # Useful aliases +no-cookies = +no-cookies-set +no-cookies-read -no-cookies = -no-cookies-set -no-cookies-read +fragile = -block -no-cookies -filter -fast-redirects -hide-referer -no-popups +shop = -no-cookies -filter -fast-redirects +imageblock = +block +image -# Fragile sites should have the minimum changes -fragile = -block -deanimate-gifs -fast-redirects -filter -hide-referer -no-cookies -no-popups - -# Shops should be allowed to set persistent cookies -shop = -filter -no-cookies -no-cookies-keep - -# Your favourite blend of filters: -# -myfilters = +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\ - +filter{webbugs} +filter{nimda} +filter{banners-by-size} - +#For people who don't like to type too much: ;-) +c0 = +no-cookies +c1 = -no-cookies +c2 = -no-cookies-set +no-cookies-read +c3 = +no-cookies-set -no-cookies-read #... etc. Customize to your heart's content. ############################################################################# # Defaults ############################################################################# {\ --add-header \ -block \ --deanimate-gifs \ --downgrade \ +fast-redirects \ -myfilters \ -+no-compression \ -+no-cookies-keep \ ++filter \ +hide-forwarded \ +hide-from{block} \ +hide-referer{forge} \ -hide-user-agent \ -image \ -+image-blocker{http://config.privoxy.org/send-banner} \ -+no-cookies-keep \ --no-cookies-read \ --no-cookies-set \ ++image-blocker{http://i.j.b/send-banner} \ ++no-cookies-read \ ++no-cookies-set \ +no-popups \ --vanilla-wafer \ --wafer \ ++vanilla-wafer \ } / # Match all URLs - ############################################################################# # A useful site for testing - shows all headers: # http://privacy.net/analyze/ ############################################################################# -{+add-header{X-Privacy: Yes please} \ +{+add-header{X-Privacy: Yes please} #-add-header{*} \ +add-header{X-User-Tracking: No thanks!} -filter} privacy.net - ############################################################################# -# Test for new GIF deanimation feature. -# Just try http://www.oesterhelt.org/deanimate-demo with and without it. +# Permissions list ############################################################################# -{+deanimate-gifs{last}} -www.oesterhelt.org/deanimate-demo - -############################################################################# # Sites that need cookies -# -# FIXME: Now cookies are allowed by default, do any of these sites -# need persistent cookies? -############################################################################# +{-no-cookies} +.javasoft.com +.sun.com +.yahoo.com +.msdn.microsoft.com -#{-no-cookies} -#.javasoft.com -#.sun.com -#.yahoo.com -#.msdn.microsoft.com -#.sourceforge.net -#.sf.net -#www.nexgo.de -#.myrealbox.com -#mail.uni.de -#e-tools.freenet.de -#office.freenet.de +# Alternative way of saying the same thing +{-no-cookies-set -no-cookies-read} +.sourceforge.net +.sf.net -############################################################################# # These sites are very complex and require # minimal interference. -############################################################################# {fragile} .office.microsoft.com .windowsupdate.microsoft.com -.deutsche-bank-24.de -############################################################################# # Shopping sites - still want to block ads. -############################################################################# {shop} .quietpc.com .worldpay.com # for quietpc.com .jungle.com .scan.co.uk -############################################################################# # These shops require pop-ups -############################################################################# {shop -no-popups} .dabs.com .overclockers.co.uk -############################################################################# -# Sometimes fast-redirects catches things by mistake -############################################################################# {-fast-redirects} www.ukc.ac.uk/cgi-bin/wac\.cgi\? login.yahoo.com -edit.europe.yahoo.com -.google.com -.altavista.com/.*(like|url|link):http -.altavista.com/trans.*urltext=http -.speedfind.de -.nytimes.com -############################################################################# # Please don't re_filter code! -############################################################################# {-filter} -.sourceforge.net - +.cvs.sourceforge.net ############################################################################# # Imagelist: @@ -517,18 +384,13 @@ www.carbuyer.com/cgi-carbuyer/getimage.cgi *.fxweb.com/v2-trackrun\.cgi 195.63.104.61 195.63.104.222 -213.165.64.3[4-9] -213.165.64.4[0-4] +213.165.64.3[89] +213.165.64.4[1-4] 194.221.183.22[1-7] -a196.g.akamai.net/7/196/2670/000[1-3]/images\.gmx\.net/.*images/.*/.*/ -/cgi-bin/ivw/CP/ +a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/ +/cgi-bin/ivw/CP/CGI 151.189.8.213/Adimg 151.189.8.193/Media -.smartclicks.com/.*/smart(img|banner|host|bar|site) -.linkexchange.com/.*/showl(ogo|e) -MoneyBanner.de -pixel.intares.net/cgi-bin/janus -ar.atwola.com # This serves all ads for CNN and AOL ############################################################################# # Blocklist: @@ -544,48 +406,49 @@ ar.atwola.com # This serves all ads for CNN and AOL ###/*.*/(sponsor|banner)s?[0-9]?/ ###/*.*/.*banner([-_]?[a-z0-9]+)?\.(gif|jpg) -/?.*/_?(plain|live)?ads?(-banners)?/ -/?.*/abanners/ -/?.*/ad(sdna_image|gifs?)/ -/?.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe) -/?.*/adbanners/ -/?.*/ad_banner/ -/?.*/adserver -/?.*/adstream\.cgi -/?.*/adv((er)?ts?|ertis(ing|ements?))?/ -/?.*/anzei(gen)?/? -/?.*/ban[-_]cgi/ -/?.*/banner_?ads/ -/?.*/banner_?anzeigen -/?.*/bannerimage/ -/?.*/banners?/ -/?.*/banners?\.cgi/ -/?.*/cgi-bin/centralad/getimage -/?.*/images/addver\.gif -/?.*/images/advert\.gif -/?.*/images/marketing/.*\.(gif|jpe?g) -/?.*/place-ads -/?.*/popupads/ -/?.*/promobar.* -/?.*/publicite/ -/?.*/randomads/.*\.(gif|jpe?g) -/?.*/rekla(ma|me|am)/.*\.(gif|jpe?g) -/?.*/siteads/ -/?.*/sponsor.*\.gif -/?.*/sponsors?[0-9]?/ -/?.*/ucbandeimg/ -/?.*/werb\..* -/?.*/werbebanner/ -/?.*/werbung/.*\.(gif|jpe?g) -/?.*/adv\. # www.telegraaf.nl -/?.*/advert[0-9]+\.jpg -/?.*bann\.gif -/?.*/ads/ +/.*/_?(plain|live)?ads?(-banners)?/ +/.*/abanners/ +/.*/ad(sdna_image|gifs?)/ +/.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe) +/.*/adbanners/ +/.*/adserver +/.*/adstream\.cgi +/.*/adv((er)?ts?|ertis(ing|ements?))?/ +/.*/anzei(gen)?/? +/.*/ban[-_]cgi/ +/.*/banner_?ads/ +/.*/banner_?anzeigen +/.*/bannerimage/ +/.*/banners?/ +/.*/banners?\.cgi/ +/.*/cgi-bin/centralad/getimage +/.*/images/addver\.gif +/.*/images/advert\.gif +/.*/images/marketing/.*\.(gif|jpe?g) +/.*/place-ads +/.*/popupads/ +/.*/promobar.* +/.*/publicite/ +/.*/randomads/.*\.(gif|jpe?g) +/.*/reklama/.*\.(gif|jpe?g) +/.*/reklame/.*\.(gif|jpe?g) +/.*/reklaam/.*\.(gif|jpe?g) +/.*/siteads/ +/.*/sponsor.*\.gif +/.*/sponsors?[0-9]?/ +/.*/ucbandeimg/ +/.*/werb\..* +/.*/werbebanner/ +/.*/werbung/.*\.(gif|jpe?g) +/.*/adv\. # www.telegraaf.nl +/.*/advert[0-9]+\.jpg +/.*bann\.gif /Media/Images/Adds/ /_banner/ /ad_images/ /adgenius/ /adimages/ +/.*/ads/ /viewad/ /adserve/ /adverts/ @@ -624,24 +487,24 @@ ar.atwola.com # This serves all ads for CNN and AOL /worldnet/ad\.cgi /zhp/auktion/img/ /cgi-bin/nph-adclick.exe/ -/?.*/Image/BannerAdvertising/ -/?.*/ad-bin/ -/?.*/adlib/server\.cgi -/?.*/gsa_bs/gsa_bs.cmdl +/.*/Image/BannerAdvertising/ +/.*/ad-bin/ +/.*/adlib/server\.cgi +/.*/gsa_bs/gsa_bs.cmdl /autoads/ /anz/pics/ # for our finnish friends, by Kai Puolamaki -/?.*/mainos/*.*/.*\.gif -/?.*/mainos/*.*/.*\.jpe?g +/.*/mainos/*.*/.*\.gif +/.*/mainos/*.*/.*\.jpe?g # more from a finnish friend Petri Haapio cgi.tietovalta.fi .keltaisetsivut.fi/web/img/\.*gif .haku.net/pics/pana\.*gif .www.fi/guvat/\.*gif -/?.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png)) -/?.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png)) +/.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png)) +/.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png)) # and even more from a finnish friend Hannu Napari 194.251.243.50/cgi-bin/banner @@ -652,21 +515,21 @@ www.iltalehti.fi/ilmkuvat www.mtv3.fi/mainoskuvat # -/?.*/adfinity -/?.*/[?]adserv -/?.*/bizgrphx/ -/?.*/smallad2\.gif -/?.*/ana2ad\.gif -/?.*/adimg/ -/?.*/.*counter\.pl -/?.*/spin_html/ -/?.*/images/topics/topicgimp\.gif +/.*/adfinity +/.*/[?]adserv +/.*/bizgrphx/ +/.*/smallad2\.gif +/.*/ana2ad\.gif +/.*/adimg/ +/.*/.*counter\.pl +/.*/spin_html/ +/.*/images/topics/topicgimp\.gif .discovery.com/.*banner_id -/?.*/.*bannr\.gif +/.*/.*bannr\.gif .cruel.com/images/ .idrink.com/frm_bottom.htm -/?.*/.*pb_ihtml\.gif -/?.*/ph-ad.*\.focalink\.com +/.*/.*pb_ihtml\.gif +/.*/ph-ad.*\.focalink\.com /cgi-bin/adjuggler /we_ba/ # hausfrauenseite.de *bwhahahaaaaa* @@ -699,38 +562,38 @@ www.mtv3.fi/mainoskuvat /.*s_msn\.gif /.*addchannel\.gif /.*adddesktop\.gif -/?.*/ns4\.gif -/?.*/v3sban\.gif -/?.*/?FPCreated\.gif -/?.*/opera35\.gif -/?.*/opera13\.gif -/?.*/opera_b\.gif -/?.*/ie_horiz\.gif -/?.*/ie_logo\.gif +/.*/ns4\.gif +/.*/v3sban\.gif +/.*/?FPCreated\.gif +/.*/opera35\.gif +/.*/opera13\.gif +/.*/opera_b\.gif +/.*/ie_horiz\.gif +/.*/ie_logo\.gif # ... and even more! -/?.*/favicon\.ico +/.*/favicon\.ico # generally useless information and promo stuff (commented out) #/.*/(counter|getpcbutton|BuiltByNOF|netscape|hotmail|vcr(rated)?|rsaci(rated)?|freeloader|cache_now(_anim)?|apache_pb|now_(anim_)?button|ie_?(buttonlogo|static?|.*ani.*)?)\.(gif|jpe?g) -/?.*/images/na/us/brand/ -/?.*/advantage\.(gif|jpg) -/?.*/advanbar\.(gif|jpg) -/?.*/advanbtn\.(gif|jpg) -/?.*/biznetsmall\.(gif|jpg) -/?.*/utopiad\.(gif|jpg) -/?.*/epipo\.(gif|jpg) -/?.*/amazon([a-zA-Z0-9]+)\.(gif|jpg) -/?.*/bnlogo.(gif|jpg) -/?.*/buynow([a-zA-Z0-9]+)\.(gif|jpg) +/.*/images/na/us/brand/ +/.*/advantage\.(gif|jpg) +/.*/advanbar\.(gif|jpg) +/.*/advanbtn\.(gif|jpg) +/.*/biznetsmall\.(gif|jpg) +/.*/utopiad\.(gif|jpg) +/.*/epipo\.(gif|jpg) +/.*/amazon([a-zA-Z0-9]+)\.(gif|jpg) +/.*/bnlogo.(gif|jpg) +/.*/buynow([a-zA-Z0-9]+)\.(gif|jpg) /p/d/publicid # for the dutch folks by a dutch friend gertjan@west.nl -/?.*/Advertenties/ -/?.*/Adverteerders/ +/.*/Advertenties/ +/.*/Adverteerders/ .netdirect.nl/nd_servlet/___ # -------------------------------------------------------------------------- @@ -1039,8 +902,8 @@ www.forbes.com/tool/images/frontend/ www.zserver.com www.spinbox.com .pathfinder.com/shopping/marketplace/images/ -/?.*/adbanner* -/?.*/adgraphic* +/.*/adbanner* +/.*/adgraphic* static.wired.com/images .perso.estat.com/cgi-bin/perso/ #dinoadserver1.roka.net @@ -1086,11 +949,11 @@ home.talkcity.com/homepopup.html.* # Banners from Freeserve #banner.freeservers.com/cgi-bin/fs_adbar # fixed by above regexp # And those nasty va-popups ! -/?.*/?va_banner.html +/.*/?va_banner.html # And an all-around hit against advert*.jpg -/?.*/advert[0-9]+\.jpg +/.*/advert[0-9]+\.jpg # And yet another Internet Explorer gif ... -/?.*/ie_horiz\.gif +/.*/ie_horiz\.gif # Some uninteresting buttons I think... .mircx.com/images/buttons/ services.mircx.com/.*\.gif @@ -1309,10 +1172,6 @@ www.linux-magazin.de/banner # The Register ads - oh, and all images in Register stories (sigh). www.theregister.co.uk/media/ -# Used on http://www.theregister.co.uk/ -# Sample advert URL: -# http://secure.webconnect.net/cgi-bin/webconnecthome.dll?F467 -.webconnect.net # Dilbert: www.dilbert.com/comics/dilbert/images/.*_140x800.*\.gif @@ -1326,11 +1185,11 @@ www.stattrack.com/stats/ #Now they're Yahoo GeoCities, their junk is in a different place. ##geo.yahoo.com/serv ##visit.geocities.com/visit.gif -.yimg.com/?.*/www.geocities.com/js_source +.yimg.com/.*/www.geocities.com/js_source #http://us.toto.geo.yahoo.com/toto?s=76001086 .geo.yahoo.com .visit.geocities.com -.yimg.com/?.*/www.geocities.com/ +.yimg.com/.*/www.geocities.com/ #http://counter16.bravenet.com/counter.php counter*. @@ -1366,7 +1225,7 @@ logout.gmx.net logout.tvspielfilm.de gmx.tvspielfilm.de www.freenet.de/customerindex\.html -/?.*/phpAds +/.*/phpAds .fxweb.com/v2-trackrun\.cgi rtldating.peopleunited.de .advertising.com @@ -1378,13 +1237,12 @@ fourohfour.nbci.com/Members404Error.php3 .adlink.de www.fair-ist-mehr.de/cgi-bin/bt.pl .linkexchange. -/?.*/adpage.asp +/.*/adpage.asp /ADS .net-on.net rstrip.namezero.com 62.26.220.2 .doubleclick.net -.adserver.yahoo.com ############################################################################# {-block} @@ -1392,7 +1250,6 @@ rstrip.namezero.com include.ebay.com cpan.valueclick.com www.userfriendly.org/images/banners/banner_dp_heart\.gif -advogato.org #Why were these in the Waldherr blockfile? #www.hitbox.com @@ -1497,8 +1354,10 @@ www.iez-auktion.de # Jon's addition: MSDN + .msdn.microsoft.com + #js .adbusters.com .freemail*.web.de/online/ordner/anzeigen @@ -1506,8 +1365,10 @@ foggy.sda.t-online.de .us.i1.yimg.com/us.yimg.com/i/pim/ad2.gif www.nexgo.de/.*/bg_banner.jpg -# .*ads. matches prdownloads.sourceforge.net and many other download sites -# The fix is: -.*downloads. +# New GIF deanimation feature. Just try http://www.oesterhelt.org/deanimate-demo +# with and without it. +# +{+deanimate-gifs{last}} +www.oesterhelt.org/deanimate-demo # End of file diff --git a/advanced.action b/advanced.action deleted file mode 100644 index 02855034..00000000 --- a/advanced.action +++ /dev/null @@ -1,90 +0,0 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/advanced.action,v $ -# -# $Id: advanced.action,v 1.3 2002/03/26 22:29:54 swa Exp $ -# -# Purpose : Most agressive actions file, see -# http://www.privoxy.org/faq/questions.html#CONFIGFILES -# -# Copyright : Written by and Copyright -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# We value your feedback. However, to provide you with the best support, -# please note: -# -# * Use the support forum to get help: -# http://sourceforge.net/tracker/?group_id=11118&atid=211118 -# * Submit bugs only thru our bug forum: -# http://sourceforge.net/tracker/?group_id=11118&atid=111118 -# Make sure that the bug has not already been submitted. Please try -# to verify that it is a Junkbuster bug, and not a browser or site -# bug first. If you are using your own custom configuration, please -# try the stock configs to see if the problem is a configuration -# related bug. And if not using the latest development snapshot, -# please try the latest one. Or even better, CVS sources. -# * Submit feature requests only thru our feature request forum: -# http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse -# -# For any other issues, feel free to use the mailing lists: -# http://sourceforge.net/mail/?group_id=11118 -# -# Anyone interested in actively participating in development and related -# discussions can join the appropriate mailing list here: -# http://sourceforge.net/mail/?group_id=11118. Archives are available -# here too. -# -###################################################################### - -###################################################################### -# Aliases -###################################################################### - -###################################################################### -# Defaults -###################################################################### - -###################################################################### -# Specials -###################################################################### - -###################################################################### -# Imagelist: -###################################################################### - -###################################################################### -# Blocklist: -###################################################################### - -###################################################################### -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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. -# -###################################################################### diff --git a/amiga.c b/amiga.c index 493a00eb..789fd085 100644 --- a/amiga.c +++ b/amiga.c @@ -1,4 +1,4 @@ -const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; +const char amiga_rcs[] = "$Id: amiga.c,v 1.1.1.1 2001/05/15 13:58:46 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/amiga.c,v $ @@ -6,7 +6,7 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; * Purpose : Amiga-specific declarations. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General @@ -28,48 +28,6 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; * * Revisions : * $Log: amiga.c,v $ - * Revision 1.8 2002/03/25 19:32:15 joergs - * Name in version string changed from junkbuster to Privoxy. - * - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.5 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.4 2001/10/07 15:35:13 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Revision 1.3 2001/09/12 22:54:51 joergs - * Stacksize of main thread increased. - * - * Revision 1.2 2001/05/23 00:13:58 joergs - * AmigaOS support fixed. - * * Revision 1.1.1.1 2001/05/15 13:58:46 oes * Initial import of version 2.9.3 source tree * @@ -88,8 +46,8 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; const char amiga_h_rcs[] = AMIGA_H_VERSION; -unsigned long __stack = 100*1024; -static char ver[] = "$VER: Privoxy " __AMIGAVERSION__ " (" __AMIGADATE__ ")"; +unsigned long __stack = 20*1024; +static char ver[] = "$VER: junkbuster " __AMIGAVERSION__ " (" __AMIGADATE__ ")"; struct Task *main_task = NULL; int childs = 0; @@ -109,32 +67,29 @@ __saveds ULONG server_thread(void) { SetErrnoPtr(&(UserData.eno),sizeof(int)); local_csp->cfd=ObtainSocket(local_csp->cfd, AF_INET, SOCK_STREAM, 0); - if(JB_INVALID_SOCKET!=local_csp->cfd) + if(-1!=local_csp->cfd) { Signal(main_task,SIGF_SINGLE); serve((struct client_state *) local_csp); } else { - local_csp->flags &= ~CSP_FLAG_ACTIVE; + local_csp->active = 0; Signal(main_task,SIGF_SINGLE); } CloseLibrary(SocketBase); } else { - local_csp->flags &= ~CSP_FLAG_ACTIVE; + local_csp->active = 0; Signal(main_task,SIGF_SINGLE); } childs--; return 0; } -static BPTR olddir; - void amiga_exit(void) { if(SocketBase) { CloseLibrary(SocketBase); } - CurrentDir(olddir); } static struct SignalSemaphore memsem; @@ -162,13 +117,12 @@ void InitAmiga(void) InitSemaphore(&memsem); memsemptr = &memsem; - olddir=CurrentDir(GetProgramDir()); atexit(amiga_exit); } #ifdef __GNUC__ #ifdef libnix -/* multithreadingsafe libnix replacements */ +/* multitaskingsafe libnix replacements */ static void *memPool=NULL; void *malloc (size_t s) @@ -277,7 +231,7 @@ ADD2EXIT(__memCleanUp,-50); #error No libnix and no ixemul!? #endif /* libnix */ #else -#error Only GCC is supported, multithreading safe malloc/free required. +#error Only GCC is supported, multitasking safe malloc/free required. #endif /* __GNUC__ */ #endif /* def AMIGA */ diff --git a/amiga.h b/amiga.h index 580dc32d..53933048 100644 --- a/amiga.h +++ b/amiga.h @@ -1,7 +1,7 @@ #ifdef AMIGA -#ifndef AMIGA_H_INCLUDED -#define AMIGA_H_INCLUDED -#define AMIGA_H_VERSION "$Id: amiga.h,v 1.8 2002/03/24 13:25:43 swa Exp $" +#ifndef _AMIGA_H +#define _AMIGA_H +#define AMIGA_H_VERSION "$Id: amiga.h,v 1.3 2001/05/25 21:53:27 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/amiga.h,v $ @@ -9,7 +9,7 @@ * Purpose : Amiga-specific declarations. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General @@ -31,23 +31,6 @@ * * Revisions : * $Log: amiga.h,v $ - * Revision 1.8 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.7 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.6 2001/10/13 12:46:08 joergs - * Added #undef EINTR to avoid warnings - * - * Revision 1.5 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.4 2001/05/29 20:05:06 joergs - * Fixed exit() macro not exiting if called before InitAmiga() - * (junkbuster --help and --version). - * * Revision 1.3 2001/05/25 21:53:27 jongfoster * Fixing indentation * @@ -70,7 +53,6 @@ #undef __NOLIBBASE__ #define __CONSTLIBBASEDECL__ const -#define DEVICES_TIMER_H #include #include #include @@ -116,8 +98,7 @@ __saveds ULONG server_thread(void); } \ } -#undef EINTR #define EINTR 0 -#endif /* ndef AMIGA_H_INCLUDED */ +#endif /* ndef _AMIGA_H */ #endif /* def AMIGA */ diff --git a/basic.action b/basic.action deleted file mode 100644 index 567f6b93..00000000 --- a/basic.action +++ /dev/null @@ -1,377 +0,0 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/basic.action,v $ -# -# $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $ -# -# Purpose : Very basic actions file, see -# http://www.privoxy.org/faq/questions.html#CONFIGFILES -# -# Copyright : Written by and Copyright -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# We value your feedback. However, to provide you with the best support, -# please note: -# -# * Use the support forum to get help: -# http://sourceforge.net/tracker/?group_id=11118&atid=211118 -# * Submit bugs only thru our bug forum: -# http://sourceforge.net/tracker/?group_id=11118&atid=111118 -# Make sure that the bug has not already been submitted. Please try -# to verify that it is a Junkbuster bug, and not a browser or site -# bug first. If you are using your own custom configuration, please -# try the stock configs to see if the problem is a configuration -# related bug. And if not using the latest development snapshot, -# please try the latest one. Or even better, CVS sources. -# * Submit feature requests only thru our feature request forum: -# http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse -# -# For any other issues, feel free to use the mailing lists: -# http://sourceforge.net/mail/?group_id=11118 -# -# Anyone interested in actively participating in development and related -# discussions can join the appropriate mailing list here: -# http://sourceforge.net/mail/?group_id=11118. Archives are available -# here too. -# -###################################################################### - -###################################################################### -# Aliases -###################################################################### -{{alias}} -+imageblock = +block +image - -###################################################################### -# Defaults -###################################################################### -{\ -+deanimate-gifs{last} \ -+image-blocker{trans} \ -+hide-referer{forge} \ -+no-cookies-keep \ --filter \ -} -/ # Match all URLs - - -###################################################################### -# Specials -###################################################################### -{+image} -############################################################################# -/.*\.gif -/.*\.jpe?g -/.*\.png - -############################################################################# -{+imageblock} -############################################################################# -.ad.doubleclick.net -.adforce.imgis.com -.focalink.com - -###################################################################### -# Blocklist: -###################################################################### -{+block} -############################################################################# - -# generic hosts (probably most effective) -ad*. -.*ads. -banner. - -/.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g)) -/.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/]) -/.*/(ng)?adclient\.cgi -/.*/(plain|live|rotate)[-_.]?ads?/ -/.*/(sponsor)s?[0-9]?/ -/?.*/_?(plain|live)?ads?(-banners)?/ -/?.*/abanners/ -/?.*/ad(sdna_image|gifs?)/ -/?.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe) -/?.*/adbanners/ -/?.*/adserver -/?.*/adstream\.cgi -/?.*/adv((er)?ts?|ertis(ing|ements?))?/ -/?.*/anzei(gen)?/? -/?.*/ban[-_]cgi/ -/?.*/banner_?ads/ -/?.*/banner_?anzeigen -/?.*/bannerimage/ -/?.*/banners?/ -/?.*/banners?\.cgi/ -/?.*/cgi-bin/centralad/getimage -/?.*/images/addver\.gif -/?.*/images/advert\.gif -/?.*/images/marketing/.*\.(gif|jpe?g) -/?.*/place-ads -/?.*/popupads/ -/?.*/promobar.* -/?.*/publicite/ -/?.*/randomads/.*\.(gif|jpe?g) -/?.*/rekla(ma|me|am)/.*\.(gif|jpe?g) -/?.*/siteads/ -/?.*/sponsor.*\.gif -/?.*/sponsors?[0-9]?/ -/?.*/ucbandeimg/ -/?.*/werb\..* -/?.*/werbebanner/ -/?.*/werbung/.*\.(gif|jpe?g) -/?.*/adv\. # www.telegraaf.nl -/?.*/advert[0-9]+\.jpg -/?.*bann\.gif -/?.*/ads/ -/_banner/ -/ad_images/ -/adgenius/ -/adimages/ -/viewad/ -/adserve/ -/adverts/ -/annonser?/ -/bando/ -/bannerad/ -/bannerfarm/ -/bin/getimage.cgi/...\?AD -/bin/nph-oma.count/ct/default.shtml -/bin/nph-oma.count/ix/default.html -/cgi-bin/getimage.cgi/....\?GROUP= -/cgi-bin/nph-load -/cgi-bin/webad.dll/ad -/cwmail/acc\.gif -/cwmail/amzn-bm1\.gif -/db_area/banrgifs/ -/gif/teasere/ -/grafikk/annonse/ -/graphics/defaultAd/ -/grf/annonif -/htmlad/ -/image\.ng/AdType -/image\.ng/transactionID -/images/.*/.*_anim\.gif # alvin brattli -/ip_img/.*\.(gif|jpe?g) -/marketpl*/ -/minibanners/ -/netscapeworld/nw-ad/ -/promotions/houseads/ -/rotads/ -/rotateads/ -/rotations/ -/torget/jobline/.*\.gif -/viewad/ -/werbung/ -/worldnet/ad\.cgi -/zhp/auktion/img/ -/cgi-bin/nph-adclick.exe/ -/?.*/Image/BannerAdvertising/ -/?.*/ad-bin/ -/?.*/adlib/server\.cgi -/?.*/gsa_bs/gsa_bs.cmdl -/autoads/ -/anz/pics/ -# for our finnish friends, by Kai Puolamaki -/?.*/mainos/*.*/.*\.gif -/?.*/mainos/*.*/.*\.jpe?g -# more from a finnish friend Petri Haapio -/?.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png)) -/?.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png)) -# -/?.*/adfinity -/?.*/[?]adserv -/?.*/bizgrphx/ -/?.*/smallad2\.gif -/?.*/ana2ad\.gif -/?.*/adimg/ -/?.*/.*counter\.pl -/?.*/spin_html/ -/?.*/images/topics/topicgimp\.gif -.discovery.com/.*banner_id -/?.*/.*bannr\.gif -.cruel.com/images/ -.idrink.com/frm_bottom.htm -/?.*/.*pb_ihtml\.gif -/?.*/ph-ad.*\.focalink\.com -/cgi-bin/adjuggler - -# ms sucks ! -/.*(ms)?backoff(ice)?.*\.(gif|jpe?g) -/.*(/ie4|/ie3|msie|sqlbans|powrbybo|activex|backoffice|explorer|netnow|getpoint|ntbutton|hmlink).*\.(gif|jpe?g) -/.*activex.*(gif|jpe?g) -/.*explorer?.(gif|jpe?g) -/.*freeie\.(gif|jpe?g) -/.*/ie_?(buttonlogo|static?|anim.*)?\.(gif|jpe?g) -/.*ie_sm\.(gif|jpe?g) -/.*msie(30)?\.(gif|jpe?g) -/.*msnlogo\.(gif|jpe?g) -/.*office97_ad1\.(gif|jpe?g) -/.*pbbobansm\.(gif|jpe?g) -/.*powrbybo\.(gif|jpe?g) -/.*sqlbans\.(gif|jpe?g) -/.*exc_ms\.gif -/.*ie4get_animated\.gif -/.*ie4_animated\.gif -/.*n_iemap\.gif -/.*ieget\.gif -/.*logo_msnhm_* -/.*mcsp2\.gif -/.*msn2\.gif -/.*add_active\.gif -/.*n_msnmap\.gif -/.*Ad00\.gif -/.*s_msn\.gif -/.*addchannel\.gif -/.*adddesktop\.gif -/?.*/ns4\.gif -/?.*/v3sban\.gif -/?.*/?FPCreated\.gif -/?.*/opera35\.gif -/?.*/opera13\.gif -/?.*/opera_b\.gif -/?.*/ie_horiz\.gif -/?.*/ie_logo\.gif -# ... and even more! -/?.*/favicon\.ico - -/?.*/images/na/us/brand/ -/?.*/advantage\.(gif|jpg) -/?.*/advanbar\.(gif|jpg) -/?.*/advanbtn\.(gif|jpg) -/?.*/biznetsmall\.(gif|jpg) -/?.*/utopiad\.(gif|jpg) -/?.*/epipo\.(gif|jpg) -/?.*/amazon([a-zA-Z0-9]+)\.(gif|jpg) -/?.*/bnlogo.(gif|jpg) -/?.*/buynow([a-zA-Z0-9]+)\.(gif|jpg) - -# for the dutch folks by a dutch friend gertjan@west.nl -/?.*/Advertenties/ -/?.*/Adverteerders/ -.netdirect.nl/nd_servlet/___ - -.admaximize.com -.imgis.com - -# wayne@staff.msen.com -a*.*.*.yimg.com/([0-9]*|\/)*us.yimg.com/* - -#################################################### -# Jon's addition: -# -# The Register ads - oh, and all images in Register stories (sigh). -www.theregister.co.uk/media/ - -# Used on http://www.theregister.co.uk/ -# Sample advert URL: -# http://secure.webconnect.net/cgi-bin/webconnecthome.dll?F467 -.webconnect.net - -# Dilbert: -www.dilbert.com/comics/dilbert/images/.*_140x800.*\.gif - -# stattrack.com -# Uses URL: http://www.stattrack.com/cgi-bin/stats/image.cgi -/cgi-bin/stats/ -# And loads JavaScript from http://www.stattrack.com/stats/code -www.stattrack.com/stats/ - -#Now they're Yahoo GeoCities, their junk is in a different place. -##geo.yahoo.com/serv -##visit.geocities.com/visit.gif -.yimg.com/?.*/www.geocities.com/js_source -#http://us.toto.geo.yahoo.com/toto?s=76001086 -.geo.yahoo.com -.visit.geocities.com -.yimg.com/?.*/www.geocities.com/ - -.exitexchange.com - -#SourceForge ads. -sfads.osdn.com - -#This site traps the browser -.webhideout.com - -#privacy.net runs ads -.a.consumer.net - -#Lindsay.Marshall@newcastle.ac.uk suggested these, to kill Opera adverts: -www.qksrv.net -mirror.qkimg.net - -#js -dinoadserver*.roka.net -logout.gmx.net -logout.tvspielfilm.de -gmx.tvspielfilm.de -www.freenet.de/customerindex\.html -/?.*/phpAds -.fxweb.com/v2-trackrun\.cgi -rtldating.peopleunited.de -.advertising.com -www.zdnet.com/fcgi-bin/ -service.bfast.com/bfast/serve -199.172.144.25 -fourohfour.nbci.com/Members404Error.php3 -.adtech.de -.adlink.de -www.fair-ist-mehr.de/cgi-bin/bt.pl -.linkexchange. -/?.*/adpage.asp -/ADS -.net-on.net -rstrip.namezero.com -62.26.220.2 -.doubleclick.net -.adserver.yahoo.com - -############################################################################# -{-block} -############################################################################# -.admin. -.edu -.ac.uk # English Universities too! - Jon -.uni-*.de # What about Germany? --oes -# my banking stuff => no ads. -.comdirekt.de -.comdirect.de -.teledata.de -# Jon's addition: MSDN -.msdn.microsoft.com -# .*ads. matches prdownloads.sourceforge.net and many other download sites -# The fix is: -.*downloads. - -###################################################################### -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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. -# -###################################################################### diff --git a/cgi.c b/cgi.c index a5694414..60806b16 100644 --- a/cgi.c +++ b/cgi.c @@ -1,18 +1,16 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.10 2001/07/13 13:53:13 oes 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: * * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -38,212 +36,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $"; * * Revisions : * $Log: cgi.c,v $ - * Revision 1.56 2002/03/24 17:50:46 jongfoster - * Fixing compile error if actions file editor disabled - * - * Revision 1.55 2002/03/24 16:55:06 oes - * Making GIF checkerboard transparent - * - * Revision 1.54 2002/03/24 16:18:15 jongfoster - * Removing old logo - * - * Revision 1.53 2002/03/24 16:06:00 oes - * Correct transparency for checkerboard PNG. Thanks, Magnus! - * - * Revision 1.52 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.51 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.50 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.49 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.48 2002/03/08 17:47:07 jongfoster - * Adding comments - * - * Revision 1.47 2002/03/08 16:41:33 oes - * Added GIF images again - * - * Revision 1.46 2002/03/07 03:48:38 oes - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - Added a 4x4 pattern PNG which is less intrusive - * than the logo but also clearly marks the deleted banners - * - * Revision 1.45 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.44 2002/03/05 22:43:45 david__schmidt - * - Better error reporting on OS/2 - * - Fix double-slash comment (oops) - * - * Revision 1.43 2002/03/05 21:33:45 david__schmidt - * - Re-enable OS/2 building after new parms were added - * - Fix false out of memory report when resolving CGI templates when no IP - * address is available of failed attempt (a la no such domain) - * - * Revision 1.42 2002/01/21 00:33:20 jongfoster - * Replacing strsav() with the safer string_append() or string_join(). - * Adding map_block_keep() to save a few bytes in the edit-actions-list HTML. - * Adding missing html_encode() to error message generators. - * Adding edit-actions-section-swap and many "shortcuts" to the list of CGIs. - * - * Revision 1.41 2002/01/17 20:56:22 jongfoster - * Replacing hard references to the URL of the config interface - * with #defines from project.h - * - * Revision 1.40 2002/01/09 14:26:46 oes - * Added support for thread-safe gmtime_r call. - * - * Revision 1.39 2001/11/16 00:48:13 jongfoster - * Fixing a compiler warning - * - * Revision 1.38 2001/11/13 00:31:21 jongfoster - * - Adding new CGIs for use by non-JavaScript browsers: - * edit-actions-url-form - * edit-actions-add-url-form - * edit-actions-remove-url-form - * - Fixing make_menu()'s HTML generation - it now quotes the href parameter. - * - Fixing || bug. - * - * Revision 1.37 2001/11/01 14:28:47 david__schmidt - * Show enablement/disablement status in almost all templates. - * There is a little trickiness here: apparent recursive resolution of - * @if-enabled-then@ caused the toggle template to show status out-of-phase with - * the actual enablement status. So a similar construct, - * @if-enabled-display-then@, is used to resolve the status display on non-'toggle' - * templates. - * - * Revision 1.36 2001/10/26 17:33:27 oes - * marginal bugfix - * - * Revision 1.35 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.34 2001/10/18 22:22:09 david__schmidt - * Only show "Local support" on templates conditionally: - * - if either 'admin-address' or 'proxy-info-url' are uncommented in config - * - if not, no Local support section appears - * - * Revision 1.33 2001/10/14 22:28:41 jongfoster - * Fixing stupid typo. - * - * Revision 1.32 2001/10/14 22:20:18 jongfoster - * - Changes to CGI dispatching method to match CGI names exactly, - * rather than doing a prefix match. - * - No longer need to count the length of the CGI handler names by hand. - * - Adding new handler for 404 error when disptching a CGI, if none of - * the handlers match. - * - Adding new handlers for CGI actionsfile editor. - * - * Revision 1.31 2001/10/10 10:56:39 oes - * Failiure to load template now fatal. Before, the user got a hard-to-understand assertion failure from cgi.c - * - * Revision 1.30 2001/10/02 15:30:57 oes - * Introduced show-request cgi - * - * Revision 1.29 2001/09/20 15:47:44 steudten - * - * Fix BUG: Modify int size to size_t size in fill_template() - * - removes big trouble on machines where sizeof(int) != sizeof(size_t). - * - * Revision 1.28 2001/09/19 18:00:37 oes - * - Deletef time() FIXME (Can't fail under Linux either, if - * the argument is guaranteed to be in out address space, - * which it is.) - * - Fixed comments - * - Pointer notation cosmetics - * - Fixed a minor bug in template_fill(): Failiure of - * pcrs_execute() now secure. - * - * Revision 1.27 2001/09/16 17:08:54 jongfoster - * Moving simple CGI functions from cgi.c to new file cgisimple.c - * - * 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. - * - * Revision 1.24 2001/09/16 11:38:01 jongfoster - * Splitting fill_template() into 2 functions: - * template_load() loads the file - * template_fill() performs the PCRS regexps. - * This is because the CGI edit interface has a "table row" - * template which is used many times in the page - this - * change means it's only loaded from disk once. - * - * Revision 1.23 2001/09/16 11:16:05 jongfoster - * Better error handling in dispatch_cgi() and parse_cgi_parameters() - * - * Revision 1.22 2001/09/16 11:00:10 jongfoster - * New function alloc_http_response, for symmetry with free_http_response - * - * Revision 1.21 2001/09/13 23:53:03 jongfoster - * Support for both static and dynamically generated CGI pages. - * Correctly setting Last-Modified: and Expires: HTTP headers. - * - * Revision 1.20 2001/09/13 23:40:36 jongfoster - * (Cosmetic only) Indentation correction - * - * Revision 1.19 2001/09/13 23:31:25 jongfoster - * Moving image data to cgi.c rather than cgi.h. - * - * Revision 1.18 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.17 2001/08/05 15:57:38 oes - * Adapted finish_http_response to new list_to_text - * - * Revision 1.16 2001/08/01 21:33:18 jongfoster - * Changes to fill_template() that reduce memory usage without having - * an impact on performance. I also renamed some variables so as not - * to clash with the C++ keywords "new" and "template". - * - * Revision 1.15 2001/08/01 21:19:22 jongfoster - * Moving file version information to a separate CGI page. - * - * Revision 1.14 2001/08/01 00:19:03 jongfoster - * New function: map_conditional() for an if-then-else syntax. - * Changing to use new version of show_defines() - * - * Revision 1.13 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.12 2001/07/29 18:47:05 jongfoster - * Adding missing #include "loadcfg.h" - * - * Revision 1.11 2001/07/18 17:24:37 oes - * Changed to conform to new pcrs interface - * * Revision 1.10 2001/07/13 13:53:13 oes * Removed all #ifdef PCRS and related code * @@ -332,7 +124,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $"; #include #include #include -#include #ifdef _WIN32 #define snprintf _snprintf @@ -343,196 +134,42 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 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 "cgisimple.h" -#ifdef FEATURE_CGI_EDIT_ACTIONS -#include "cgiedit.h" -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ -#include "loadcfg.h" -/* loadcfg.h is for g_bToggleIJB only */ +#include "showargs.h" const char cgi_h_rcs[] = CGI_H_VERSION; -static const struct cgi_dispatcher cgi_dispatchers[] = { - { "", - cgi_default, - "Privoxy main page" }, -#ifdef FEATURE_GRACEFUL_TERMINATION - { "die", - cgi_die, - "Shut down - Do not deploy this build in a production environment, this is a one click Denial Of Service attack!!!" }, -#endif +const struct cgi_dispatcher cgi_dispatcher[] = { { "show-status", - cgi_show_status, - "Show information about the current configuration" }, - { "show-version", - cgi_show_version, - "Show the source code version numbers" }, - { "show-request", - cgi_show_request, - "Show the client's request headers." }, + 11, cgi_show_status, + "Show information about the version and configuration" }, { "show-url-info", - cgi_show_url_info, + 13, cgi_show_url_info, "Show which actions apply to a URL and why" }, -#ifdef FEATURE_CGI_EDIT_ACTIONS - { "toggle", - cgi_toggle, - "Toggle Privoxy on or off" }, - { "edit-actions", - cgi_edit_actions, - "Edit the actions list" }, - - - { "eaa", /* Shortcut for edit-actions-add-url-form */ - cgi_edit_actions_add_url_form, - NULL }, - { "eau", /* Shortcut for edit-actions-url-form */ - cgi_edit_actions_url_form, - NULL }, - { "ear", /* Shortcut for edit-actions-remove-url-form */ - cgi_edit_actions_remove_url_form, - NULL }, - { "eas", /* Shortcut for edit-actions-for-url */ - cgi_edit_actions_for_url, - NULL }, - { "easa", /* Shortcut for edit-actions-section-add */ - cgi_edit_actions_section_add, - NULL }, - { "easr", /* Shortcut for edit-actions-section-remove */ - cgi_edit_actions_section_remove, - NULL }, - { "eass", /* Shortcut for edit-actions-section-swap */ - cgi_edit_actions_section_swap, - NULL }, - { "edit-actions-for-url", - cgi_edit_actions_for_url, - NULL /* Edit the actions for (a) specified URL(s) */ }, - { "edit-actions-list", - cgi_edit_actions_list, - NULL /* Edit the actions list */ }, - { "edit-actions-submit", - cgi_edit_actions_submit, - NULL /* Change the actions for (a) specified URL(s) */ }, - { "edit-actions-url", - cgi_edit_actions_url, - NULL /* Change a URL pattern in the actionsfile */ }, - { "edit-actions-url-form", - cgi_edit_actions_url_form, - NULL /* Form to change a URL pattern in the actionsfile */ }, - { "edit-actions-add-url", - cgi_edit_actions_add_url, - NULL /* Add a URL pattern to the actionsfile */ }, - { "edit-actions-add-url-form", - cgi_edit_actions_add_url_form, - NULL /* Form to add a URL pattern to the actionsfile */ }, - { "edit-actions-remove-url", - cgi_edit_actions_remove_url, - NULL /* Remove a URL pattern from the actionsfile */ }, - { "edit-actions-remove-url-form", - cgi_edit_actions_remove_url_form, - NULL /* Form to remove a URL pattern from the actionsfile */ }, - { "edit-actions-section-add", - cgi_edit_actions_section_add, - NULL /* Remove a section from the actionsfile */ }, - { "edit-actions-section-remove", - cgi_edit_actions_section_remove, - NULL /* Remove a section from the actionsfile */ }, - { "edit-actions-section-swap", - cgi_edit_actions_section_swap, - NULL /* Swap two sections in the actionsfile */ }, -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - { "robots.txt", - cgi_robots_txt, - NULL /* Sends a robots.txt file to tell robots to go away. */ }, { "send-banner", - cgi_send_banner, - NULL /* Send a built-in image */ }, - { "t", - cgi_transparent_image, - NULL /* Send a transparent image (short name) */ }, - { NULL, /* NULL Indicates end of list and default page */ - cgi_error_404, - NULL /* Unknown CGI page */ } + 11, cgi_send_banner, + "HIDE Send the transparent or \"Junkbuster\" gif" }, + { "", + 0, cgi_default, + "Junkbuster main page" }, + { NULL, 0, NULL, NULL } }; -/* - * Bulit-in images for ad replacement - * - * Hint: You can encode your own images like this: - * cat your-image | perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o", unpack("C", $c)); }' - */ - -#ifdef FEATURE_NO_GIFS - -/* - * Checkerboard pattern, as a PNG. - */ -const char image_pattern_data[] = - "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104" - "\122\000\000\000\004\000\000\000\004\010\002\000\000\000\046" - "\223\011\051\000\000\000\006\142\113\107\104\000\310\000\310" - "\000\310\052\045\225\037\000\000\000\032\111\104\101\124\170" - "\332\143\070\161\342\304\377\377\377\041\044\003\234\165\342" - "\304\011\006\234\062\000\125\200\052\251\125\174\360\223\000" - "\000\000\000\111\105\116\104\256\102\140\202"; - -/* - * 1x1 transparant PNG. - */ -const char image_blank_data[] = - "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104\122" - "\000\000\000\004\000\000\000\004\010\006\000\000\000\251\361\236" - "\176\000\000\000\007\164\111\115\105\007\322\003\013\020\073\070" - "\013\025\036\203\000\000\000\011\160\110\131\163\000\000\013\022" - "\000\000\013\022\001\322\335\176\374\000\000\000\004\147\101\115" - "\101\000\000\261\217\013\374\141\005\000\000\000\033\111\104\101" - "\124\170\332\143\070\161\342\304\207\377\377\377\347\302\150\006" - "\144\016\210\146\040\250\002\000\042\305\065\221\270\027\131\110" - "\000\000\000\000\111\105\116\104\256\102\140\202"; -#else - -/* - * Checkerboard pattern, as a GIF. - */ -const char image_pattern_data[] = - "\107\111\106\070\071\141\004\000\004\000\200\000\000\310\310" - "\310\377\377\377\041\376\016\111\040\167\141\163\040\141\040" - "\142\141\156\156\145\162\000\041\371\004\001\012\000\001\000" - "\054\000\000\000\000\004\000\004\000\000\002\005\104\174\147" - "\270\005\000\073"; - -/* - * 1x1 transparant GIF. - */ -const char image_blank_data[] = - "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000" - "\000!\371\004\001\000\000\000\000,\000\000\000\000\001" - "\000\001\000\000\002\002D\001\000;"; -#endif - -const size_t image_pattern_length = sizeof(image_pattern_data) - 1; -const size_t image_blank_length = sizeof(image_blank_data) - 1; - - -static struct http_response cgi_error_memory_response[1]; - -static struct http_response *dispatch_known_cgi(struct client_state * csp, - const char * path); -static struct map *parse_cgi_parameters(char *argstring); - - /********************************************************************* * * Function : dispatch_cgi * - * Description : Checks if a request URL has either the magical - * hostname CGI_SITE_1_HOST (usully http://i.j.b/) or - * matches CGI_SITE_2_HOST CGI_SITE_2_PATH (usually - * http://ijbswa.sourceforge.net/config). If so, it passes - * the (rest of the) path onto dispatch_known_cgi, which - * calls the relevant CGI handler function. + * Description : Checks if a request URL has either the magical hostname + * i.j.b or matches HOME_PAGE_URL/config/. If so, it parses + * the (rest of the) path as a cgi name plus query string, + * prepares a map that maps CGI parameter names to their values, + * initializes the http_response struct, and calls the + * relevant CGI handler function. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) @@ -542,47 +179,31 @@ static struct map *parse_cgi_parameters(char *argstring); *********************************************************************/ struct http_response *dispatch_cgi(struct client_state *csp) { - const char *host = csp->http->host; - const char *path = csp->http->path; + char *argstring = NULL; + const struct cgi_dispatcher *d; + struct map *param_list; + struct http_response *rsp; /* * Should we intercept ? */ - /* Note: "example.com" and "example.com." are equivalent hostnames. */ - - /* Either the host matches CGI_SITE_1_HOST ..*/ - if ( ( (0 == strcmpic(host, CGI_SITE_1_HOST)) - || (0 == strcmpic(host, CGI_SITE_1_HOST "."))) - && (path[0] == '/') ) + /* Either the host matches CGI_PREFIX_HOST ..*/ + if (0 == strcmpic(csp->http->host, CGI_PREFIX_HOST)) { - /* ..then the path will all be for us. Remove leading '/' */ - path++; + /* ..then the path will all be for us */ + argstring = csp->http->path; } - /* Or it's the host part CGI_SITE_2_HOST, and the path CGI_SITE_2_PATH */ - else if ( ( (0 == strcmpic(host, CGI_SITE_2_HOST )) - || (0 == strcmpic(host, CGI_SITE_2_HOST ".")) ) - && (0 == strncmpic(path, CGI_SITE_2_PATH, strlen(CGI_SITE_2_PATH))) ) + /* Or it's the host part HOME_PAGE_URL, and the path /config ? */ + else if ( (0 == strcmpic(csp->http->host, HOME_PAGE_URL + 7 )) + && (0 == strncmpic(csp->http->path,"/config", 7)) + && ((csp->http->path[7] == '/') || (csp->http->path[7] == '\0'))) { - /* take everything following CGI_SITE_2_PATH */ - path += strlen(CGI_SITE_2_PATH); - if (*path == '/') - { - /* skip the forward slash after CGI_SITE_2_PATH */ - path++; - } - else if (*path != '\0') - { - /* - * wierdness: URL is /configXXX, where XXX is some string - * Do *NOT* intercept. - */ - return NULL; - } + /* then it's everything following "/config" */ + argstring = csp->http->path + 7; } else { - /* Not a CGI */ return NULL; } @@ -590,74 +211,16 @@ struct http_response *dispatch_cgi(struct client_state *csp) * This is a CGI call. */ - return dispatch_known_cgi(csp, path); -} - - -/********************************************************************* - * - * Function : dispatch_known_cgi - * - * Description : Processes a CGI once dispatch_cgi has determined that - * it matches one of the magic prefixes. Parses the path - * as a cgi name plus query string, prepares a map that - * maps CGI parameter names to their values, initializes - * the http_response struct, and calls the relevant CGI - * handler function. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : path = Path of CGI, with the CGI prefix removed. - * Should not have a leading "/". - * - * Returns : http_response, or NULL on handler failure or out of - * memory. - * - *********************************************************************/ -static struct http_response *dispatch_known_cgi(struct client_state * csp, - const char * path) -{ - const struct cgi_dispatcher *d; - struct map *param_list; - struct http_response *rsp; - char *query_args_start; - char *path_copy; - jb_err err; - - if (NULL == (path_copy = strdup(path))) - { - return cgi_error_memory(); - } - - query_args_start = path_copy; - while (*query_args_start && *query_args_start != '?') - { - query_args_start++; - } - if (*query_args_start == '?') - { - *query_args_start++ = '\0'; - } - - if (NULL == (param_list = parse_cgi_parameters(query_args_start))) + /* Get mem for response or fail*/ + if (NULL == ( rsp = zalloc(sizeof(*rsp)))) { - free(path_copy); - return cgi_error_memory(); + return NULL; } - - /* - * At this point: - * path_copy = CGI call name - * param_list = CGI params, as map - */ - - /* Get mem for response or fail*/ - if (NULL == (rsp = alloc_http_response())) + /* Remove leading slash */ + if (*argstring == '/') { - free(path_copy); - free_map(param_list); - return cgi_error_memory(); + argstring++; } log_error(LOG_LEVEL_GPC, "%s%s cgi call", csp->http->hostport, csp->http->path); @@ -665,32 +228,25 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp, csp->ip_addr_str, csp->http->cmd); /* Find and start the right CGI function*/ - d = cgi_dispatchers; - for (;;) + for (d = cgi_dispatcher; d->handler; d++) { - if ((d->name == NULL) || (strcmp(path_copy, d->name) == 0)) + if (strncmp(argstring, d->name, d->name_length) == 0) { - err = (d->handler)(csp, rsp, param_list); - free(path_copy); - free_map(param_list); - if (err == JB_ERR_CGI_PARAMS) - { - err = cgi_error_bad_param(csp, rsp); - } - if (!err) - { - /* It worked */ - return finish_http_response(rsp); - } - else + param_list = parse_cgi_parameters(argstring + d->name_length); + if ((d->handler)(csp, rsp, param_list)) { - /* Error in handler, probably out-of-memory */ - free_http_response(rsp); - return cgi_error_memory(); + freez(rsp); } + + free_map(param_list); + return(finish_http_response(rsp)); } - d++; } + + /* Can't get here, since cgi_default will match all requests */ + freez(rsp); + return(NULL); + } @@ -702,361 +258,513 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp, * pairs and store them in a struct map list. * * Parameters : - * 1 : string = string to be parsed. Will be trashed. + * 1 : string = string to be parsed * - * Returns : pointer to param list, or NULL if out of memory. + * Returns : poniter to param list, or NULL if failiure * *********************************************************************/ -static struct map *parse_cgi_parameters(char *argstring) +struct map *parse_cgi_parameters(char *argstring) { - char *p; + char *tmp, *p; char *vector[BUFFER_SIZE]; int pairs, i; - struct map *cgi_params; + struct map *cgi_params = NULL; - if (NULL == (cgi_params = new_map())) - { - return NULL; - } + if(*argstring == '?') argstring++; + tmp = strdup(argstring); - pairs = ssplit(argstring, "&", vector, SZ(vector), 1, 1); + pairs = ssplit(tmp, "&", vector, SZ(vector), 1, 1); for (i = 0; i < pairs; i++) { if ((NULL != (p = strchr(vector[i], '='))) && (*(p+1) != '\0')) { *p = '\0'; - if (map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0)) - { - free_map(cgi_params); - return NULL; - } + cgi_params = map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0); } } - return cgi_params; + free(tmp); + return(cgi_params); } /********************************************************************* * - * Function : error_response - * - * Description : returns an http_response that explains the reason - * why a request failed. + * 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 : templatename = Which template should be used for the answer - * 3 : sys_err = system error number + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters * - * Returns : A http_response. If we run out of memory, this - * will be cgi_error_memory(). + * Returns : 0 * *********************************************************************/ -struct http_response *error_response(struct client_state *csp, - const char *templatename, - int sys_err) +int cgi_default(struct client_state *csp, struct http_response *rsp, + struct map *parameters) { - jb_err err; - struct http_response *rsp; - struct map * exports = default_exports(csp, NULL); - if (exports == NULL) - { - return cgi_error_memory(); - } - - if (NULL == (rsp = alloc_http_response())) - { - free_map(exports); - return cgi_error_memory(); - } - - err = map(exports, "host", 1, html_encode(csp->http->host), 0); - if (!err) err = map(exports, "hostport", 1, html_encode(csp->http->hostport), 0); - if (!err) err = map(exports, "path", 1, html_encode(csp->http->path), 0); - if (!err) err = map(exports, "error", 1, html_encode_and_free_original(safe_strerror(sys_err)), 0); - if (!err) - { - err = map(exports, "host-ip", 1, html_encode(csp->http->host_ip_addr_str), 0); - if (err) - { - /* Some failures, like "404 no such domain", don't have an IP address. */ - err = map(exports, "host-ip", 1, html_encode(csp->http->host), 0); - } - } + char *p, *tmp = NULL; + struct map *exports = default_exports(csp, ""); - - if (err) + /* If there were other parameters, export a dump as "cgi-parameters" */ + if(parameters) { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); + 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); + exports = map(exports, "cgi-parameters", 1, tmp, 0); + free(p); } - - if (!strcmp(templatename, "no-such-domain")) - { - rsp->status = strdup("404 No such domain"); - if (rsp->status == NULL) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } - } - else if (!strcmp(templatename, "connect-failed")) + else { - rsp->status = strdup("503 Connect failed"); - if (rsp->status == NULL) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } + exports = map(exports, "cgi-parameters", 1, "", 1); } - err = template_fill_for_cgi(csp, templatename, exports, rsp); - if (err) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = fill_template(csp, "default", exports); + free_map(exports); + return(0); - return finish_http_response(rsp); } /********************************************************************* * - * Function : cgi_init_error_messages + * Function : cgi_send_banner * - * Description : Call at the start of the program to initialize - * the error message used by cgi_error_memory(). + * Description : CGI function that returns a banner. * - * Parameters : N/A + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters * - * Returns : N/A + * CGI Parameters : + * type : Selects the type of banner between "trans" and "jb". + * Defaults to "jb" if absent or != "trans". + * + * Returns : 0 * *********************************************************************/ -void cgi_init_error_messages(void) +int cgi_send_banner(struct client_state *csp, struct http_response *rsp, + struct map *parameters) { - memset(cgi_error_memory_response, '\0', sizeof(*cgi_error_memory_response)); - cgi_error_memory_response->head = - "HTTP/1.0 500 Internal Privoxy Error\r\n" - "Content-Type: text/html\r\n" - "\r\n"; - cgi_error_memory_response->body = - "\r\n" - "500 Internal Privoxy Error\r\n" - "\r\n" - "

500 Internal Privoxy Error

\r\n" - "

Privoxy ran out of memory while processing your request.

\r\n" - "

Please contact your proxy administrator, or try again later

\r\n" - "\r\n" - "\r\n"; - - cgi_error_memory_response->head_length = - strlen(cgi_error_memory_response->head); - cgi_error_memory_response->content_length = - strlen(cgi_error_memory_response->body); -} + if(strcmp(lookup(parameters, "type"), "trans")) + { + rsp->body = bindup(JBGIF, sizeof(JBGIF)); + rsp->content_length = sizeof(JBGIF); + } + else + { + rsp->body = bindup(BLANKGIF, sizeof(BLANKGIF)); + rsp->content_length = sizeof(BLANKGIF); + } + enlist(rsp->headers, "Content-Type: image/gif"); -/********************************************************************* - * - * Function : cgi_error_memory - * - * Description : Called if a CGI function runs out of memory. - * Returns a statically-allocated error response. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : template_name = Name of template that could not - * be loaded. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -struct http_response *cgi_error_memory(void) -{ - /* assert that it's been initialized. */ - assert(cgi_error_memory_response->head); + return(0); - return cgi_error_memory_response; } /********************************************************************* * - * Function : cgi_error_no_template + * Function : cgi_show_status * - * Description : Almost-CGI function that is called if a templae - * cannot be loaded. Note this is not a true CGI, - * it takes a template name rather than a map of - * parameters. + * 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 : template_name = Name of template that could not - * be loaded. + * 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 : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : 0 * *********************************************************************/ -jb_err cgi_error_no_template(struct client_state *csp, - struct http_response *rsp, - const char *template_name) +int cgi_show_status(struct client_state *csp, struct http_response *rsp, + struct map *parameters) { - static const char status[] = - "500 Internal Privoxy Error"; - static const char body_prefix[] = - "\r\n" - "500 Internal Privoxy Error\r\n" - "\r\n" - "

500 Internal Privoxy Error

\r\n" - "

Privoxy encountered an error while processing your request:

\r\n" - "

Could not load template file "; - static const char body_suffix[] = - "

\r\n" - "

Please contact your proxy administrator.

\r\n" - "

If you are the proxy administrator, please put the required file " - "in the (confdir)/templates directory. The " - "location of the (confdir) directory " - "is specified in the main Privoxy config " - "file. (It's typically the Privoxy install directory" -#ifndef _WIN32 - ", or /etc/privoxy/" -#endif /* ndef _WIN32 */ - ").

\r\n" - "\r\n" - "\r\n"; - - assert(csp); - assert(rsp); - assert(template_name); - - /* Reset rsp, if needed */ - freez(rsp->status); - freez(rsp->head); - freez(rsp->body); - rsp->content_length = 0; - rsp->head_length = 0; - rsp->is_static = 0; - - rsp->body = malloc(strlen(body_prefix) + strlen(template_name) + strlen(body_suffix) + 1); - if (rsp->body == NULL) + char *s = NULL; + int i; + struct map *exports = default_exports(csp, "show-status"); + +#ifdef SPLIT_PROXY_ARGS + FILE * fp; + char buf[BUFFER_SIZE]; + char * p; + const char * filename = NULL; + char * file_description = NULL; + + + p = lookup(parameters, "file"); + switch (*p) { - return JB_ERR_MEMORY; + 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 TRUST_FILES + case 't': + if (csp->tlist) + { + filename = csp->tlist->filename; + file_description = "Trust List"; + } + break; +#endif /* def TRUST_FILES */ } - strcpy(rsp->body, body_prefix); - strcat(rsp->body, template_name); - strcat(rsp->body, body_suffix); - rsp->status = strdup(status); - if (rsp->body == NULL) + if (NULL != filename) { - return JB_ERR_MEMORY; + exports = map(exports, "file-description", 1, file_description, 1); + exports = map(exports, "filepath", 1, html_encode(filename), 0); + + if ((fp = fopen(filename, "r")) == NULL) + { + exports = 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); + exports = map(exports, "contents", 1, s, 0); + } + rsp->body = fill_template(csp, "show-status-file", exports); + free_map(exports); + return(0); + } - return JB_ERR_OK; -} +#endif /* def SPLIT_PROXY_ARGS */ + exports = map(exports, "redirect-url", 1, REDIRECT_URL, 1); + + s = NULL; + for (i=0; i < Argc; i++) + { + s = strsav(s, Argv[i]); + s = strsav(s, " "); + } + exports = map(exports, "invocation", 1, s, 0); -/********************************************************************* + exports = map(exports, "options", 1, csp->config->proxy_args, 1); + s = show_rcs(); + exports = map(exports, "sourceversions", 1, s, 0); + s = show_defines(); + exports = map(exports, "defines", 1, s, 0); + +#ifdef STATISTICS + exports = add_stats(exports); +#else + exports = map_block_killer(exports, "statistics"); +#endif /* ndef STATISTICS */ + +#ifdef SPLIT_PROXY_ARGS + + exports = map_block_killer(exports, "no-split-args"); + + if (csp->actions_list) + { + exports = map(exports, "actions-filename", 1, csp->actions_list->filename, 1); + } + else + { + exports = map(exports, "actions-filename", 1, "None specified", 1); + } + + if (csp->rlist) + { + exports = map(exports, "re-filter-filename", 1, csp->rlist->filename, 1); + } + else + { + exports = map(exports, "re-filter-filename", 1, "None specified", 1); + } + +#ifdef TRUST_FILES + if (csp->tlist) + { + exports = map(exports, "trust-filename", 1, csp->tlist->filename, 1); + } + else + { + exports = map(exports, "trust-filename", 1, "None specified", 1); + } +#else + exports = map_block_killer(exports, "trust-support"); +#endif /* ndef TRUST_FILES */ + +#else /* ifndef SPLIT_PROXY_ARGS */ + exports = map_block_killer(exports, "split-args"); + + if (csp->clist) + { + map(exports, "clist", 1, csp->clist->proxy_args , 1); + } + + if (csp->rlist) + { + map(exports, "rlist", 1, csp->rlist->proxy_args , 1); + } + +#ifdef TRUST_FILES + if (csp->tlist) + { + map(exports, "tlist", 1, csp->tlist->proxy_args , 1); + } +#endif /* def TRUST_FILES */ + +#endif /* ndef SPLIT_PROXY_ARGS */ + + rsp->body = fill_template(csp, "show-status", exports); + free_map(exports); + return(0); + +} + + + /********************************************************************* * - * Function : cgi_error_bad_param + * 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. * - * Description : CGI function that is called if the parameters - * (query string) for a CGI were wrong. - * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output + * 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 + * 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 : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : 0 * *********************************************************************/ -jb_err cgi_error_bad_param(struct client_state *csp, - struct http_response *rsp) +int cgi_show_url_info(struct client_state *csp, struct http_response *rsp, + struct map *parameters) { - struct map *exports; + struct map *exports = default_exports(csp, "show-url-info"); + char *url_param, *host = NULL; - assert(csp); - assert(rsp); - - if (NULL == (exports = default_exports(csp, NULL))) + if (NULL == (url_param = strdup(lookup(parameters, "url"))) || *url_param == '\0') { - return JB_ERR_MEMORY; + exports = map_block_killer(exports, "url-given"); + exports = 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; + + exports = map(exports, "url", 1, host, 1); + exports = map(exports, "url-html", 1, html_encode(host), 0); + + init_current_action(action); + + s = current_action_to_text(action); + exports = map(exports, "default", 1, s , 0); + + if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL)) + { + exports = map(exports, "matches", 1, "none" , 1); + exports = map(exports, "final", 1, lookup(exports, "default"), 1); + + freez(url_param); + free_current_action(action); + + rsp->body = fill_template(csp, "show-url-info", 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) + { + exports = map(exports, "matches", 1, "none" , 1); + exports = map(exports, "final", 1, lookup(exports, "default"), 1); + + freez(url_param); + freez(path); + free_current_action(action); + + rsp->body = fill_template(csp, "show-url-info", 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) + { + exports = map(exports, "matches", 1, matches , 0); + } + else + { + exports = 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); + exports = map(exports, "final", 1, s, 0); + s = NULL; + + free_current_action(action); + } + + rsp->body = fill_template(csp, "show-url-info", exports); + free_map(exports); + return 0; - return template_fill_for_cgi(csp, "cgi-error-bad-param", exports, rsp); } /********************************************************************* * - * Function : get_http_time + * Function : error_response * - * Description : Get the time in a format suitable for use in a - * HTTP header - e.g.: - * "Sun, 06 Nov 1994 08:49:37 GMT" + * Description : returns an http_response that explains the reason + * why a request failed. * - * Parameters : - * 1 : time_offset = Time returned will be current time - * plus this number of seconds. - * 2 : buf = Destination for result. Must be long enough - * to hold 29 characters plus a trailing zero. + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : template = Which template should be used for the answer + * 3 : errno = system error number * - * Returns : N/A + * Returns : NULL if no memory, else http_response * *********************************************************************/ -void get_http_time(int time_offset, char *buf) +struct http_response *error_response(struct client_state *csp, const char *template, int err) { - static const char day_names[7][4] = - { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - static const char month_names[12][4] = - { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - - struct tm *t; - time_t current_time; - - assert(buf); - - time(¤t_time); /* get current time */ - - current_time += time_offset; + struct http_response *rsp; + struct map *exports = default_exports(csp, NULL); - /* get and save the gmt */ + if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp)))) { -#ifdef HAVE_GMTIME_R - struct tm dummy; - t = gmtime_r(¤t_time, &dummy); -#else - t = gmtime(¤t_time); -#endif - } + return NULL; + } - /* Format: "Sun, 06 Nov 1994 08:49:37 GMT" */ - snprintf(buf, 30, - "%s, %02d %s %4d %02d:%02d:%02d GMT", - day_names[t->tm_wday], - t->tm_mday, - month_names[t->tm_mon], - t->tm_year + 1900, - t->tm_hour, - t->tm_min, - t->tm_sec - ); + exports = map(exports, "host-html", 1, html_encode(csp->http->host), 0); + exports = map(exports, "hostport", 1, csp->http->hostport, 1); + exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0); + exports = map(exports, "path", 1, csp->http->path, 1); + exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0); + exports = map(exports, "error", 1, safe_strerror(err), 0); + exports = map(exports, "host-ip", 1, csp->http->host_ip_addr_str, 1); + rsp->body = fill_template(csp, template, exports); + free_map(exports); + + if (!strcmp(template, "no-such-domain")) + { + rsp->status = strdup("404 No such domain"); + } + else if (!strcmp(template, "connect-failed")) + { + rsp->status = strdup("503 Connect failed"); + } + + return(finish_http_response(rsp)); } @@ -1070,28 +778,18 @@ void get_http_time(int time_offset, char *buf) * Parameters : * 1 : rsp = pointer to http_response to be processed * - * Returns : A http_response, usually the rsp parameter. - * On error, free()s rsp and returns cgi_error_memory() + * Returns : http_response, or NULL on failiure * *********************************************************************/ struct http_response *finish_http_response(struct http_response *rsp) { char buf[BUFFER_SIZE]; - jb_err err; - - /* Special case - do NOT change this statically allocated response, - * which is ready for output anyway. - */ - if (rsp == cgi_error_memory_response) - { - return rsp; - } /* * Fill in the HTTP Status */ sprintf(buf, "HTTP/1.0 %s", rsp->status ? rsp->status : "200 OK"); - err = enlist_first(rsp->headers, buf); + enlist_first(rsp->headers, buf); /* * Set the Content-Length @@ -1100,95 +798,32 @@ struct http_response *finish_http_response(struct http_response *rsp) { rsp->content_length = rsp->body ? strlen(rsp->body) : 0; } - if (!err) - { - sprintf(buf, "Content-Length: %d", rsp->content_length); - err = enlist(rsp->headers, buf); - } + sprintf(buf, "Content-Length: %d", rsp->content_length); + enlist(rsp->headers, buf); /* - * Fill in the default headers: - * - * Content-Type: default to text/html if not already specified. - * Date: set to current date/time. - * Last-Modified: set to date/time the page was last changed. - * Expires: set to date/time page next needs reloading. - * Cache-Control: set to "no-cache" if applicable. - * - * See http://www.w3.org/Protocols/rfc2068/rfc2068 + * Fill in the default headers FIXME: Are these correct? sequence OK? check rfc! */ - if (!err) err = enlist_unique(rsp->headers, "Content-Type: text/html", 13); - - if (rsp->is_static) - { - /* - * Set Expires to about 10 min into the future so it'll get reloaded - * occasionally, e.g. if Privoxy gets upgraded. - */ - - if (!err) - { - get_http_time(0, buf); - err = enlist_unique_header(rsp->headers, "Date", buf); - } - - /* Some date in the past. */ - if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", "Sat, 17 Jun 2000 12:00:00 GMT"); - - if (!err) - { - get_http_time(10 * 60, buf); /* 10 * 60sec = 10 minutes */ - err = enlist_unique_header(rsp->headers, "Expires", buf); - } - } - else - { - /* - * Compliant browsers should not cache this due to the "Cache-Control" - * setting. However, to be certain, we also set both "Last-Modified" - * and "Expires" to the current time. - */ - if (!err) err = enlist_unique_header(rsp->headers, "Cache-Control", "no-cache"); - - get_http_time(0, buf); - if (!err) err = enlist_unique_header(rsp->headers, "Date", buf); - if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", buf); - if (!err) err = enlist_unique_header(rsp->headers, "Expires", buf); - } - + enlist_unique(rsp->headers, "Last-Modified: Thu Jul 31, 1997 07:42:22 pm GMT", 14); + enlist_unique(rsp->headers, "Expires: Thu Jul 31, 1997 07:42:22 pm GMT", 8); + enlist_unique(rsp->headers, "Content-Type: text/html", 13); + enlist(rsp->headers, ""); + /* * Write the head */ - if (err || (NULL == (rsp->head = list_to_text(rsp->headers)))) + if (NULL == (rsp->head = list_to_text(rsp->headers))) { free_http_response(rsp); - return cgi_error_memory(); + return(NULL); } rsp->head_length = strlen(rsp->head); - return rsp; - -} - - -/********************************************************************* - * - * Function : alloc_http_response - * - * Description : Allocates a new http_response structure. - * - * Parameters : N/A - * - * Returns : pointer to a new http_response, or NULL. - * - *********************************************************************/ -struct http_response *alloc_http_response(void) -{ - return (struct http_response *) zalloc(sizeof(struct http_response)); + return(rsp); } - + /********************************************************************* * @@ -1205,16 +840,13 @@ struct http_response *alloc_http_response(void) *********************************************************************/ void free_http_response(struct http_response *rsp) { - /* - * Must special case cgi_error_memory_response, which is never freed. - */ - if (rsp && (rsp != cgi_error_memory_response)) + if(rsp) { freez(rsp->status); freez(rsp->head); freez(rsp->body); destroy_list(rsp->headers); - free(rsp); + freez(rsp); } } @@ -1222,254 +854,99 @@ void free_http_response(struct http_response *rsp) /********************************************************************* * - * Function : template_load + * Function : fill_template * * Description : CGI support function that loads a given HTML - * template from the confdir, ignoring comment - * lines. + * template from the confdir, and fills it in + * by replacing @name@ with value using pcrs, + * for each item in the output map. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : template_ptr = Destination for pointer to loaded - * template text. - * 3 : template = name of the HTML template to be used + * 1 : csp = Current client state (buffers, headers, etc...) + * 3 : template = name of the HTML template to be used + * 2 : exports = map with fill in symbol -> name pairs * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * JB_ERR_FILE if the template file cannot be read + * Returns : char * with filled out form, or NULL if failiure * *********************************************************************/ -jb_err template_load(struct client_state *csp, char ** template_ptr, - const char *templatename) +char *fill_template(struct client_state *csp, const char *template, struct map *exports) { - char *templates_dir_path; - char *full_path; - char *file_buffer; - FILE *fp; + struct map *m; + pcrs_job *job, *joblist = NULL; char buf[BUFFER_SIZE]; + char *new, *old = NULL; + int size; + FILE *fp; - assert(csp); - assert(template_ptr); - assert(templatename); - - *template_ptr = NULL; /* * Open template file or fail */ + snprintf(buf, BUFFER_SIZE, "%s/templates/%s", csp->config->confdir, template); - templates_dir_path = make_path(csp->config->confdir, "templates"); - if (templates_dir_path == NULL) + if(NULL == (fp = fopen(buf, "r"))) { - return JB_ERR_MEMORY; - } - - full_path = make_path(templates_dir_path, templatename); - free(templates_dir_path); - if (full_path == NULL) - { - return JB_ERR_MEMORY; - } - - file_buffer = strdup(""); - if (file_buffer == NULL) - { - free(full_path); - return JB_ERR_MEMORY; - } - - if (NULL == (fp = fopen(full_path, "r"))) - { - log_error(LOG_LEVEL_ERROR, "Cannot open template file %s: %E", full_path); - free(full_path); - free(file_buffer); - return JB_ERR_FILE; + log_error(LOG_LEVEL_ERROR, "error loading template %s: %E", buf); + return NULL; } - free(full_path); + /* - * Read the file, ignoring comments. - * - * FIXME: The comment handling could break with lines >BUFFER_SIZE long. - * This is unlikely in practise. + * Assemble pcrs joblist from exports map */ - while (fgets(buf, BUFFER_SIZE, fp)) + for (m = exports; m; m = m->next) { - /* skip lines starting with '#' */ - if(*buf == '#') + int error; + + /* Enclose name in @@ */ + snprintf(buf, BUFFER_SIZE, "@%s@", m->name); + + /* Make and chain job */ + if ( NULL == (job = (pcrs_compile(buf, m->value, "sigTU", &error))) ) { - continue; + log_error(LOG_LEVEL_ERROR, "Error compiling template fill job %s: %d", m->name, error); } - - if (string_append(&file_buffer, buf)) + else { - fclose(fp); - return JB_ERR_MEMORY; + job->next = joblist; + joblist = job; } } - fclose(fp); - - *template_ptr = file_buffer; - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : template_fill - * - * Description : CGI support function that fills in a pre-loaded - * HTML template by replacing @name@ with value using - * pcrs, for each item in the output map. - * - * Note that a leading '$' charachter in the export map's - * values will be stripped and toggle on backreference - * interpretation. - * - * Parameters : - * 1 : template_ptr = IN: Template to be filled out. - * Will be free()d. - * OUT: Filled out template. - * Caller must free(). - * 2 : exports = map with fill in symbol -> name pairs - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error - * - *********************************************************************/ -jb_err template_fill(char **template_ptr, const struct map *exports) -{ - struct map_entry *m; - pcrs_job *job; - char buf[BUFFER_SIZE]; - char *tmp_out_buffer; - char *file_buffer; - size_t size; - int error; - const char *flags; - - assert(template_ptr); - assert(*template_ptr); - assert(exports); - file_buffer = *template_ptr; - size = strlen(file_buffer) + 1; /* - * Assemble pcrs joblist from exports map + * Read the file, ignoring comments */ - for (m = exports->first; m != NULL; m = m->next) + while (fgets(buf, BUFFER_SIZE, fp)) { - if (*m->name == '$') - { - /* - * First character of name is '$', so remove this flag - * character and allow backreferences ($1 etc) in the - * "replace with" text. - */ - snprintf(buf, BUFFER_SIZE, "%s", m->name + 1); - flags = "sigU"; - } - else - { - /* - * Treat the "replace with" text as a literal string - - * no quoting needed, no backreferences allowed. - * ("Trivial" ['T'] flag). - */ - flags = "sigTU"; - - /* Enclose name in @@ */ - snprintf(buf, BUFFER_SIZE, "@%s@", m->name); - } + /* skip lines starting with '#' */ + if(*buf == '#') continue; + + old = strsav(old, buf); + } + fclose(fp); - log_error(LOG_LEVEL_CGI, "Substituting: s/%s/%s/%s", buf, m->value, flags); + /* + * Execute the jobs + */ + size = strlen(old) + 1; + new = old; - /* Make and run job. */ - job = pcrs_compile(buf, m->value, flags, &error); - if (job == NULL) - { - if (error == PCRS_ERR_NOMEM) - { - free(file_buffer); - *template_ptr = NULL; - return JB_ERR_MEMORY; - } - else - { - log_error(LOG_LEVEL_ERROR, "Error compiling template fill job %s: %d", m->name, error); - /* Hope it wasn't important and silently ignore the invalid job */ - } - } - else - { - pcrs_execute(job, file_buffer, size, &tmp_out_buffer, &size); - free(file_buffer); - pcrs_free_job(job); - if (NULL == tmp_out_buffer) - { - *template_ptr = NULL; - return JB_ERR_MEMORY; - } - file_buffer = tmp_out_buffer; - } + for (job = joblist; NULL != job; job = job->next) + { + pcrs_execute(job, old, size, &new, &size); + if (old != buf) free(old); + old = new; } + /* - * Return + * Free the jobs & return */ - *template_ptr = file_buffer; - return JB_ERR_OK; -} + pcrs_free_joblist(joblist); + return(new); - -/********************************************************************* - * - * Function : template_fill_for_cgi - * - * Description : CGI support function that loads a HTML template - * and fills it in. Handles file-not-found errors - * by sending a HTML error message. For convenience, - * this function also frees the passed "exports" map. - * - * Parameters : - * 1 : csp = Client state - * 2 : templatename = name of the HTML template to be used - * 3 : exports = map with fill in symbol -> name pairs. - * Will be freed by this function. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error - * - *********************************************************************/ -jb_err template_fill_for_cgi(struct client_state *csp, - const char *templatename, - struct map *exports, - struct http_response *rsp) -{ - jb_err err; - - assert(csp); - assert(templatename); - assert(exports); - assert(rsp); - - err = template_load(csp, &rsp->body, templatename); - if (err == JB_ERR_FILE) - { - free_map(exports); - return cgi_error_no_template(csp, rsp, templatename); - } - else if (err) - { - free_map(exports); - return err; /* JB_ERR_MEMORY */ - } - err = template_fill(&rsp->body, exports); - free_map(exports); - return err; } @@ -1483,75 +960,43 @@ jb_err template_fill_for_cgi(struct client_state *csp, * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * 2 : caller = name of CGI who calls us and which should - * be excluded from the generated menu. May be - * NULL. - * Returns : NULL if no memory, else a new map. Caller frees. + * be excluded from the generated menu. + * Returns : NULL if no memory, else map * *********************************************************************/ -struct map *default_exports(const struct client_state *csp, const char *caller) +struct map *default_exports(struct client_state *csp, char *caller) { + struct map *exports = NULL; char buf[20]; - jb_err err; - struct map * exports; - int local_help_exists = 0; - assert(csp); - - exports = new_map(); - if (exports == NULL) - { - return NULL; - } - - err = map(exports, "version", 1, html_encode(VERSION), 0); - if (!err) err = map(exports, "my-ip-address", 1, html_encode(csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown"), 0); - if (!err) err = map(exports, "my-hostname", 1, html_encode(csp->my_hostname ? csp->my_hostname : "unknown"), 0); - if (!err) err = map(exports, "homepage", 1, html_encode(HOME_PAGE_URL), 0); - if (!err) err = map(exports, "default-cgi", 1, html_encode(CGI_PREFIX), 0); - if (!err) err = map(exports, "menu", 1, make_menu(caller), 0); - if (!err) err = map(exports, "code-status", 1, CODE_STATUS, 1); - if (!err) err = map_conditional(exports, "enabled-display", g_bToggleIJB); + exports = map(exports, "version", 1, VERSION, 1); + exports = map(exports, "my-ip-address", 1, csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown", 1); + exports = map(exports, "my-hostname", 1, csp->my_hostname ? csp->my_hostname : "unknown", 1); + exports = map(exports, "admin-address", 1, csp->config->admin_address ? csp->config->admin_address : "fill@me.in.please", 1); + exports = map(exports, "homepage", 1, HOME_PAGE_URL, 1); + exports = map(exports, "default-cgi", 1, HOME_PAGE_URL "/config", 1); + exports = map(exports, "menu", 1, make_menu(caller), 0); + exports = map(exports, "code-status", 1, CODE_STATUS, 1); snprintf(buf, 20, "%d", csp->config->hport); - if (!err) err = map(exports, "my-port", 1, buf, 1); + exports = map(exports, "my-port", 1, buf, 1); if(!strcmp(CODE_STATUS, "stable")) { - if (!err) err = map_block_killer(exports, "unstable"); - } - - if (csp->config->admin_address != NULL) - { - if (!err) err = map(exports, "admin-address", 1, html_encode(csp->config->admin_address), 0); - local_help_exists = 1; - } - else - { - if (!err) err = map_block_killer(exports, "have-adminaddr-info"); + exports = map_block_killer(exports, "unstable"); } - if (csp->config->proxy_info_url != NULL) + if(csp->config->proxy_info_url != NULL) { - if (!err) err = map(exports, "proxy-info-url", 1, html_encode(csp->config->proxy_info_url), 0); - local_help_exists = 1; + exports = map(exports, "proxy-info-url", 1, csp->config->proxy_info_url, 1); } else { - if (!err) err = map_block_killer(exports, "have-proxy-info"); - } + exports = map_block_killer(exports, "have-proxy-info"); + } - if (local_help_exists == 0) - { - if (!err) err = map_block_killer(exports, "have-help-info"); - } + return(exports); - if (err) - { - free_map(exports); - return NULL; - } - - return exports; } @@ -1569,184 +1014,145 @@ struct map *default_exports(const struct client_state *csp, const char *caller) * 1 : exports = map to extend * 2 : name = name of conditional block * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : extended map * *********************************************************************/ -jb_err map_block_killer(struct map *exports, const char *name) +struct map *map_block_killer(struct map *exports, char *name) { char buf[1000]; /* Will do, since the names are hardwired */ - assert(exports); - assert(name); - assert(strlen(name) < 490); - snprintf(buf, 1000, "if-%s-start.*if-%s-end", name, name); - return map(exports, buf, 1, "", 1); + exports = map(exports, buf, 1, "", 1); + + return(exports); + } /********************************************************************* * - * Function : map_block_keep + * Function : make_menu * - * Description : Convenience function. Removes the markers used - * by map-block-killer, to save a few bytes. - * i.e. removes "@if--start@" and "@if--end@" + * Description : Returns an HTML-formatted menu of the available + * unhidden CGIs, excluding the one given in . * - * Parameters : - * 1 : exports = map to extend - * 2 : name = name of conditional block + * Parameters : self = name of CGI to leave out, can be NULL * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : menu string * *********************************************************************/ -jb_err map_block_keep(struct map *exports, const char *name) +char *make_menu(const char *self) { - jb_err err; - char buf[500]; /* Will do, since the names are hardwired */ - - assert(exports); - assert(name); - assert(strlen(name) < 490); + const struct cgi_dispatcher *d; + char buf[BUFFER_SIZE], *tmp = NULL; - snprintf(buf, 500, "if-%s-start", name); - err = map(exports, buf, 1, "", 1); + if (self == NULL) self = "NO-SUCH-CGI!"; - if (err) + /* List available unhidden CGI's and export as "other-cgis" */ + for (d = cgi_dispatcher; d->handler; d++) { - return err; + if (strncmp(d->description, "HIDE", 4) && strcmp(d->name, self)) + { + snprintf(buf, BUFFER_SIZE, "
  • %s
  • \n", + HOME_PAGE_URL, d->name, d->description); + tmp = strsav(tmp, buf); + } } + return(tmp); - snprintf(buf, 500, "if-%s-end", name); - return map(exports, buf, 1, "", 1); } /********************************************************************* * - * Function : map_conditional - * - * Description : Convenience function. - * Adds an "if-then-else" for the conditional HTML-template - * block , i.e. a substitution of the form: - * @if--then@ - * True text - * @else-not-@ - * False text - * @endif-@ + * Function : dump_map * - * The control structure and one of the alternatives - * will be hidden. + * Description : HTML-dump a map for debugging * - * Parameters : - * 1 : exports = map to extend - * 2 : name = name of conditional block - * 3 : choose_first = nonzero for first, zero for second. + * Parameters : + * 1 : map = map to dump * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : string with HTML * *********************************************************************/ -jb_err map_conditional(struct map *exports, const char *name, int choose_first) +char *dump_map(struct map *map) { - char buf[1000]; /* Will do, since the names are hardwired */ - jb_err err; + struct map *p = map; + char *ret = NULL; - assert(exports); - assert(name); - assert(strlen(name) < 480); + ret = strsav(ret, "\n"); - snprintf(buf, 1000, (choose_first - ? "else-not-%s@.*@endif-%s" - : "if-%s-then@.*@else-not-%s"), - name, name); - - err = map(exports, buf, 1, "", 1); - if (err) + while (p) { - return err; + ret = strsav(ret, "\n"); + p = p->next; } - snprintf(buf, 1000, (choose_first ? "if-%s-then" : "endif-%s"), name); - return map(exports, buf, 1, "", 1); + ret = strsav(ret, "
    "); + ret = strsav(ret, p->name); + ret = strsav(ret, ""); + ret = strsav(ret, p->value); + ret = strsav(ret, "
    \n"); + return(ret); + } +#ifdef STATISTICS /********************************************************************* * - * Function : make_menu + * Function : add_stats * - * Description : Returns an HTML-formatted menu of the available - * unhidden CGIs, excluding the one given in . + * Description : Add the blocking statistics to a given map. * - * Parameters : self = name of CGI to leave out, can be NULL + * Parameters : + * 1 : exports = map to write to. * - * Returns : menu string, or NULL on out-of-memory error. + * Returns : pointer to extended map * *********************************************************************/ -char *make_menu(const char *self) +struct map *add_stats(struct map *exports) { - const struct cgi_dispatcher *d; - char *result = strdup(""); + float perc_rej; /* Percentage of http requests rejected */ + char buf[1000]; + int local_urls_read = urls_read; + int local_urls_rejected = urls_rejected; - if (self == NULL) - { - self = "NO-SUCH-CGI!"; - } + /* + * 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 * + */ - /* List available unhidden CGI's and export as "other-cgis" */ - for (d = cgi_dispatchers; d->name; d++) + if (local_urls_read == 0) { - if (d->description && strcmp(d->name, self)) - { - string_append(&result, "
  • name); - string_append(&result, "\">"); - string_append(&result, d->description); - string_append(&result, "
  • \n"); - } + exports = map_block_killer(exports, "have-stats"); } + else + { + exports = map_block_killer(exports, "have-no-stats"); - return result; -} - + perc_rej = (float)local_urls_rejected * 100.0F / + (float)local_urls_read; -/********************************************************************* - * - * Function : dump_map - * - * Description : HTML-dump a map for debugging - * - * Parameters : - * 1 : the_map = map to dump - * - * Returns : string with HTML - * - *********************************************************************/ -char *dump_map(const struct map *the_map) -{ - struct map_entry *cur_entry; - char *ret = strdup(""); + sprintf(buf, "%d", local_urls_read); + exports = map(exports, "requests-received", 1, buf, 1); - string_append(&ret, "\n"); + sprintf(buf, "%d", local_urls_rejected); + exports = map(exports, "requests-blocked", 1, buf, 1); - for (cur_entry = the_map->first; - (cur_entry != NULL) && (ret != NULL); - cur_entry = cur_entry->next) - { - string_append(&ret, "\n"); + sprintf(buf, "%6.2f", perc_rej); + exports = map(exports, "percent-blocked", 1, buf, 1); } - string_append(&ret, "
    "); - string_join (&ret, html_encode(cur_entry->name)); - string_append(&ret, ""); - string_join (&ret, html_encode(cur_entry->value)); - string_append(&ret, "
    \n"); - return ret; -} + return(exports); +} +#endif /* def STATISTICS */ /* Local Variables: diff --git a/cgi.h b/cgi.h index c7391bc6..fb6f5742 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.23 2002/03/24 16:18:15 jongfoster Exp $" +#ifndef _CGI_H +#define _CGI_H +#define CGI_H_VERSION "$Id: cgi.h,v 1.5 2001/06/29 13:22:44 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ @@ -12,7 +12,7 @@ * * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -38,86 +38,6 @@ * * Revisions : * $Log: cgi.h,v $ - * Revision 1.23 2002/03/24 16:18:15 jongfoster - * Removing old logo - * - * Revision 1.22 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.21 2002/03/07 03:48:38 oes - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - Added a 4x4 pattern PNG which is less intrusive - * than the logo but also clearly marks the deleted banners - * - * Revision 1.20 2002/03/04 17:53:22 oes - * Fixed compiled warning - * - * Revision 1.19 2002/01/21 00:33:52 jongfoster - * Adding map_block_keep() to save a few bytes in the edit-actions-list HTML. - * - * Revision 1.18 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.17 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.16 2001/09/16 17:08:54 jongfoster - * Moving simple CGI functions from cgi.c to new file cgisimple.c - * - * 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 - * template_fill() performs the PCRS regexps. - * This is because the CGI edit interface has a "table row" - * template which is used many times in the page - this - * change means it's only loaded from disk once. - * - * Revision 1.13 2001/09/16 11:00:10 jongfoster - * New function alloc_http_response, for symmetry with free_http_response - * - * Revision 1.12 2001/09/13 23:31:25 jongfoster - * Moving image data to cgi.c rather than cgi.h. - * - * Revision 1.11 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.10 2001/08/01 21:19:22 jongfoster - * Moving file version information to a separate CGI page. - * - * Revision 1.9 2001/08/01 00:17:54 jongfoster - * Adding prototype for map_conditional - * - * Revision 1.8 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.7 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.6 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * * Revision 1.5 2001/06/29 13:22:44 oes * - Cleaned up * - Added new functions: default_exports(), make_menu(), @@ -145,59 +65,68 @@ extern "C" { #endif /* - * Main dispatch function + * Dispatch & parameter parsing functions */ 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_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_send_banner(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, - int err); +extern struct http_response *error_response(struct client_state *csp, const char *template, int err); /* * CGI support functions */ -extern struct http_response * alloc_http_response(void); -extern void free_http_response(struct http_response *rsp); - extern struct http_response *finish_http_response(struct http_response *rsp); +extern void free_http_response(struct http_response *rsp); -extern struct map * default_exports(const struct client_state *csp, const char *caller); - -extern jb_err map_block_killer (struct map *exports, const char *name); -extern jb_err map_block_keep (struct map *exports, const char *name); -extern jb_err map_conditional (struct map *exports, const char *name, int choose_first); - -extern jb_err template_load(struct client_state *csp, char ** template_ptr, - const char *templatename); -extern jb_err template_fill(char ** template_ptr, const struct map *exports); -extern jb_err template_fill_for_cgi(struct client_state *csp, - const char *templatename, - struct map *exports, - struct http_response *rsp); +extern struct map *default_exports(struct client_state *csp, char *caller); +extern struct map *map_block_killer(struct map *map, char *name); +extern char *fill_template(struct client_state *csp, const char *template, struct map *exports); -extern void cgi_init_error_messages(void); -extern struct http_response *cgi_error_memory(void); -extern jb_err cgi_error_no_template(struct client_state *csp, - struct http_response *rsp, - const char *template_name); -extern jb_err cgi_error_bad_param(struct client_state *csp, - struct http_response *rsp); /* * Text generators */ -extern void get_http_time(int time_offset, char * buf); extern char *make_menu(const char *self); -extern char *dump_map(const struct map *the_map); +extern char *dump_map(struct map *map); + +#ifdef STATISTICS +extern struct map *add_stats(struct map *exports); +#endif /* def STATISTICS */ + /* - * Ad replacement images. + * Hint: You can encode your own GIFs like that: + * perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o,", unpack("C", $c)); }' */ -extern const char image_pattern_data[]; -extern const size_t image_pattern_length; -extern const char image_blank_data[]; -extern const size_t image_blank_length; + +static const char JBGIF[] = + "GIF89aD\000\013\000\360\000\000\000\000\000\377\377\377!" + "\371\004\001\000\000\001\000,\000\000\000\000D\000\013\000" + "\000\002a\214\217\251\313\355\277\000\200G&K\025\316hC\037" + "\200\234\230Y\2309\235S\230\266\206\372J\253<\3131\253\271" + "\270\215\342\254\013\203\371\202\264\334P\207\332\020o\266" + "N\215I\332=\211\312\3513\266:\026AK)\364\370\365aobr\305" + "\372\003S\275\274k2\354\254z\347?\335\274x\306^9\374\276" + "\037Q\000\000;"; + +static const char BLANKGIF[] = + "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000" + "\000!\371\004\001\000\000\000\000,\000\000\000\000\001" + "\000\001\000\000\002\002D\001\000;"; + /* Revision control strings from this header and associated .c file */ extern const char cgi_rcs[]; @@ -207,7 +136,7 @@ extern const char cgi_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef CGI_H_INCLUDED */ +#endif /* ndef _CGI_H */ /* Local Variables: diff --git a/cgiedit.c b/cgiedit.c deleted file mode 100644 index 51a70f27..00000000 --- a/cgiedit.c +++ /dev/null @@ -1,4522 +0,0 @@ -const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.27 2002/03/26 23:06:04 jongfoster Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/cgiedit.c,v $ - * - * Purpose : CGI-based actionsfile editor. - * - * Functions declared include: cgi_edit_* - * - * NOTE: The CGIs in this file use parameter names - * such as "f" and "s" which are really *BAD* choices. - * However, I'm trying to save bytes in the - * edit-actions-list HTML page - the standard actions - * file generated a 550kbyte page, which is ridiculous. - * - * Stick to the short names in this file for consistency. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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: cgiedit.c,v $ - * Revision 1.27 2002/03/26 23:06:04 jongfoster - * Removing duplicate @ifs on the toggle page - * - * Revision 1.26 2002/03/26 22:59:17 jongfoster - * Fixing /toggle to display status consistently. - * - * Revision 1.25 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.24 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.23 2002/03/24 13:32:41 swa - * name change related issues - * - * Revision 1.22 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.21 2002/03/22 18:02:48 jongfoster - * Fixing remote toggle - * - * Revision 1.20 2002/03/16 20:28:34 oes - * Added descriptions to the filters so users will know what they select in the cgi editor - * - * Revision 1.19 2002/03/16 18:38:14 jongfoster - * Stopping stupid or malicious users from breaking the actions - * file using the web-based editor. - * - * Revision 1.18 2002/03/16 14:57:44 jongfoster - * Full support for enabling/disabling modular filters. - * - * Revision 1.17 2002/03/16 14:26:42 jongfoster - * First version of modular filters support - READ ONLY! - * Fixing a double-free bug in the out-of-memory handling in map_radio(). - * - * Revision 1.16 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.15 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.14 2002/03/05 00:24:51 jongfoster - * Patch to always edit the current actions file. - * - * Revision 1.13 2002/03/04 02:07:59 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.12 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.11 2002/01/23 01:03:31 jongfoster - * Fixing gcc [CygWin] compiler warnings - * - * Revision 1.10 2002/01/23 00:22:59 jongfoster - * Adding new function cgi_edit_actions_section_swap(), to reorder - * the actions file. - * - * Adding get_url_spec_param() to get a validated URL pattern. - * - * Moving edit_read_line() out of this file and into loaders.c. - * - * Adding missing html_encode() to many CGI functions. - * - * Moving the functions that #include actionlist.h to the end of the file, - * because the Visual C++ 97 debugger gets extremely confused if you try - * to debug any code that comes after them in the file. - * - * Major optimizations in cgi_edit_actions_list() to reduce the size of - * the generated HTML (down 40% from 550k to 304k), with major side-effects - * throughout the editor and templates. In particular, the length of the - * URLs throughout the editor has been drastically reduced, by cutting - * paramater names down to 1 character and CGI names down to 3-4 - * characters, by removing all non-essential CGI paramaters even at the - * expense of having to re-read the actions file for the most trivial - * page, and by using relative rather than absolute URLs. This means - * that this (typical example): - * - * - * - * is now this: - * - * - * - * Revision 1.9 2002/01/17 20:56:22 jongfoster - * Replacing hard references to the URL of the config interface - * with #defines from project.h - * - * Revision 1.8 2001/11/30 23:35:51 jongfoster - * Renaming actionsfile to ijb.action - * - * Revision 1.7 2001/11/13 00:28:24 jongfoster - * - Renaming parameters from edit-actions-for-url so that they only - * contain legal JavaScript characters. If we wanted to write - * JavaScript that worked with Netscape 4, this is nessacery. - * (Note that at the moment the JavaScript doesn't actually work - * with Netscape 4, but now this is purely a template issue, not - * one affecting code). - * - Adding new CGIs for use by non-JavaScript browsers: - * edit-actions-url-form - * edit-actions-add-url-form - * edit-actions-remove-url-form - * - Fixing || bug. - * - * Revision 1.6 2001/10/29 03:48:09 david__schmidt - * OS/2 native needed a snprintf() routine. Added one to miscutil, brackedted - * by and __OS2__ ifdef. - * - * Revision 1.5 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.4 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.3 2001/10/14 22:12:49 jongfoster - * New version of CGI-based actionsfile editor. - * Major changes, including: - * - Completely new file parser and file output routines - * - edit-actions CGI renamed edit-actions-for-url - * - All CGIs now need a filename parameter, except for... - * - New CGI edit-actions which doesn't need a filename, - * to allow you to start the editor up. - * - edit-actions-submit now works, and now automatically - * redirects you back to the main edit-actions-list handler. - * - * Revision 1.2 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.1 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. - * - * - **********************************************************************/ - - -#include "config.h" - -/* - * FIXME: Following includes copied from cgi.c - which are actually needed? - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#define snprintf _snprintf -#endif /* def _WIN32 */ - -#include "project.h" -#include "cgi.h" -#include "cgiedit.h" -#include "cgisimple.h" -#include "list.h" -#include "encode.h" -#include "actions.h" -#include "miscutil.h" -#include "errlog.h" -#include "loaders.h" -#include "loadcfg.h" -/* loadcfg.h is for g_bToggleIJB only */ -#include "urlmatch.h" - -const char cgiedit_h_rcs[] = CGIEDIT_H_VERSION; - - -#ifdef FEATURE_CGI_EDIT_ACTIONS - -struct file_line -{ - struct file_line * next; - char * raw; - char * prefix; - char * unprocessed; - int type; - - union - { - struct action_spec action[1]; - - struct - { - char * name; - char * svalue; - int ivalue; - } setting; - - /* Add more data types here... e.g. - - - struct url_spec url[1]; - - struct - { - struct action_spec action[1]; - const char * name; - } alias; - - */ - - } data; -}; - -#define FILE_LINE_UNPROCESSED 1 -#define FILE_LINE_BLANK 2 -#define FILE_LINE_ALIAS_HEADER 3 -#define FILE_LINE_ALIAS_ENTRY 4 -#define FILE_LINE_ACTION 5 -#define FILE_LINE_URL 6 -#define FILE_LINE_SETTINGS_HEADER 7 -#define FILE_LINE_SETTINGS_ENTRY 8 -#define FILE_LINE_DESCRIPTION_HEADER 9 -#define FILE_LINE_DESCRIPTION_ENTRY 10 - - -struct editable_file -{ - struct file_line * lines; - const char * filename; /* Full pathname - e.g. "/etc/privoxy/wibble.action" */ - const char * identifier; /* Filename stub - e.g. "wibble". Use for CGI param. */ - /* Pre-encoded with url_encode() for ease of use. */ - const char * version_str; /* Last modification time, as a string. For CGI param */ - /* Can be used in URL without using url_param(). */ - unsigned version; /* Last modification time - prevents chaos with - * the browser's "back" button. Note that this is a - * time_t cast to an unsigned. When comparing, always - * cast the time_t to an unsigned, and *NOT* vice-versa. - * This may lose the top few bits, but they're not - * significant anyway. - */ - int newline; /* Newline convention - one of the NEWLINE_xxx constants. - * Note that changing this after the file has been - * read in will cause a mess. - */ - struct file_line * parse_error; /* On parse error, this is the offending line. */ - const char * parse_error_text; /* On parse error, this is the problem. - * (Statically allocated) */ -}; - -#define CGI_ACTION_PARAM_LEN_MAX 500 - -/* FIXME: Following non-static functions should be prototyped in .h or made static */ - -/* Functions to read and write arbitrary config files */ -jb_err edit_read_file(struct client_state *csp, - const struct map *parameters, - int require_version, - const char *suffix, - struct editable_file **pfile); -jb_err edit_write_file(struct editable_file * file); -void edit_free_file(struct editable_file * file); - -/* Functions to read and write actions files */ -jb_err edit_parse_actions_file(struct editable_file * file); -jb_err edit_read_actions_file(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters, - int require_version, - struct editable_file **pfile); - -/* Error handlers */ -jb_err cgi_error_modified(struct client_state *csp, - struct http_response *rsp, - const char *filename); -jb_err cgi_error_parse(struct client_state *csp, - struct http_response *rsp, - struct editable_file *file); -jb_err cgi_error_file(struct client_state *csp, - struct http_response *rsp, - const char *filename); -jb_err cgi_error_disabled(struct client_state *csp, - struct http_response *rsp); - -/* Internal arbitrary config file support functions */ -static jb_err edit_read_file_lines(FILE *fp, struct file_line ** pfile, int *newline); -static void edit_free_file_lines(struct file_line * first_line); - -/* Internal actions file support functions */ -static int match_actions_file_header_line(const char * line, const char * name); -static jb_err split_line_on_equals(const char * line, char ** pname, char ** pvalue); - -/* Internal parameter parsing functions */ -static jb_err get_file_name_param(struct client_state *csp, - const struct map *parameters, - const char *param_name, - const char *suffix, - char **pfilename, - const char **pparam); -static jb_err get_number_param(struct client_state *csp, - const struct map *parameters, - char *name, - unsigned *pvalue); -static jb_err get_url_spec_param(struct client_state *csp, - const struct map *parameters, - const char *name, - char **pvalue); -static jb_err get_string_param(const struct map *parameters, - const char *param_name, - const char **pparam); - -/* Internal actionsfile <==> HTML conversion functions */ -static jb_err map_radio(struct map * exports, - const char * optionname, - const char * values, - int value); -static jb_err actions_to_radio(struct map * exports, - const struct action_spec *action); -static jb_err actions_from_radio(const struct map * parameters, - struct action_spec *action); - - -static jb_err map_copy_parameter_html(struct map *out, - const struct map *in, - const char *name); -#if 0 /* unused function */ -static jb_err map_copy_parameter_url(struct map *out, - const struct map *in, - const char *name); -#endif /* unused function */ - -/********************************************************************* - * - * Function : map_copy_parameter_html - * - * Description : Copy a CGI parameter from one map to another, HTML - * encoding it. - * - * Parameters : - * 1 : out = target map - * 2 : in = source map - * 3 : name = name of cgi parameter to copy - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the parameter doesn't exist - * in the source map - * - *********************************************************************/ -static jb_err map_copy_parameter_html(struct map *out, - const struct map *in, - const char *name) -{ - const char * value; - jb_err err; - - assert(out); - assert(in); - assert(name); - - value = lookup(in, name); - err = map(out, name, 1, html_encode(value), 0); - - if (err) - { - /* Out of memory */ - return err; - } - else if (*value == '\0') - { - return JB_ERR_CGI_PARAMS; - } - else - { - return JB_ERR_OK; - } -} - - -#if 0 /* unused function */ -/********************************************************************* - * - * Function : map_copy_parameter_html - * - * Description : Copy a CGI parameter from one map to another, URL - * encoding it. - * - * Parameters : - * 1 : out = target map - * 2 : in = source map - * 3 : name = name of cgi parameter to copy - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the parameter doesn't exist - * in the source map - * - *********************************************************************/ -static jb_err map_copy_parameter_url(struct map *out, - const struct map *in, - const char *name) -{ - const char * value; - jb_err err; - - assert(out); - assert(in); - assert(name); - - value = lookup(in, name); - err = map(out, name, 1, url_encode(value), 0); - - if (err) - { - /* Out of memory */ - return err; - } - else if (*value == '\0') - { - return JB_ERR_CGI_PARAMS; - } - else - { - return JB_ERR_OK; - } -} -#endif /* 0 - unused function */ - -/********************************************************************* - * - * Function : cgi_edit_actions_url_form - * - * Description : CGI function that displays a form for - * edit-actions-url - * - * 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 - * f : (filename) Identifies the file to edit - * v : (version) File's last-modified time - * p : (pattern) Line number of pattern to edit - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_url_form(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map * exports; - unsigned patternid; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number; - jb_err err; - - assert(csp); - assert(rsp); - assert(parameters); - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "p", &patternid); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - cur_line = file->lines; - - for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++) - { - cur_line = cur_line->next; - } - - if ( (cur_line == NULL) - || (line_number != patternid) - || (patternid < 1) - || (cur_line->type != FILE_LINE_URL)) - { - /* Invalid "patternid" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - if (NULL == (exports = default_exports(csp, NULL))) - { - edit_free_file(file); - return JB_ERR_MEMORY; - } - - err = map(exports, "f", 1, file->identifier, 1); - if (!err) err = map(exports, "v", 1, file->version_str, 1); - if (!err) err = map(exports, "p", 1, url_encode(lookup(parameters, "p")), 0); - if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0); - - edit_free_file(file); - - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "edit-actions-url-form", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_add_url_form - * - * Description : CGI function that displays a form for - * edit-actions-url - * - * 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 : - * f : (filename) Identifies the file to edit - * v : (version) File's last-modified time - * s : (section) Line number of section to edit - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_add_url_form(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map *exports; - jb_err err; - - assert(csp); - assert(rsp); - assert(parameters); - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - if (NULL == (exports = default_exports(csp, NULL))) - { - return JB_ERR_MEMORY; - } - - err = map_copy_parameter_html(exports, parameters, "f"); - if (!err) err = map_copy_parameter_html(exports, parameters, "v"); - if (!err) err = map_copy_parameter_html(exports, parameters, "s"); - - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "edit-actions-add-url-form", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_remove_url_form - * - * Description : CGI function that displays a form for - * edit-actions-url - * - * 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 : - * f : (filename) Identifies the file to edit - * v : (version) File's last-modified time - * p : (pattern) Line number of pattern to edit - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_remove_url_form(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map * exports; - unsigned patternid; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number; - jb_err err; - - assert(csp); - assert(rsp); - assert(parameters); - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "p", &patternid); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - cur_line = file->lines; - - for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++) - { - cur_line = cur_line->next; - } - - if ( (cur_line == NULL) - || (line_number != patternid) - || (patternid < 1) - || (cur_line->type != FILE_LINE_URL)) - { - /* Invalid "patternid" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - if (NULL == (exports = default_exports(csp, NULL))) - { - edit_free_file(file); - return JB_ERR_MEMORY; - } - - err = map(exports, "f", 1, file->identifier, 1); - if (!err) err = map(exports, "v", 1, file->version_str, 1); - if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0); - if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0); - - edit_free_file(file); - - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "edit-actions-remove-url-form", exports, rsp); -} - - -/********************************************************************* - * - * Function : edit_write_file - * - * Description : Write a complete file to disk. - * - * Parameters : - * 1 : filename = File to write to. - * 2 : file = Data structure to write. - * - * Returns : JB_ERR_OK on success - * JB_ERR_FILE on error writing to file. - * JB_ERR_MEMORY on out of memory - * - *********************************************************************/ -jb_err edit_write_file(struct editable_file * file) -{ - FILE * fp; - struct file_line * cur_line; - struct stat statbuf[1]; - char version_buf[22]; /* 22 = ceil(log10(2^64)) + 2 = max number of - digits in time_t, assuming this is a 64-bit - machine, plus null terminator, plus one - for paranoia */ - - assert(file); - assert(file->filename); - -#if defined(AMIGA) || defined(__OS2__) - if (NULL == (fp = fopen(file->filename, "w"))) -#else - if (NULL == (fp = fopen(file->filename, "wt"))) -#endif /* def AMIGA */ - { - return JB_ERR_FILE; - } - - cur_line = file->lines; - while (cur_line != NULL) - { - if (cur_line->raw) - { - if (fputs(cur_line->raw, fp) < 0) - { - fclose(fp); - return JB_ERR_FILE; - } - } - else - { - if (cur_line->prefix) - { - if (fputs(cur_line->prefix, fp) < 0) - { - fclose(fp); - return JB_ERR_FILE; - } - } - if (cur_line->unprocessed) - { - /* This should be a single line - sanity check. */ - assert(NULL == strchr(cur_line->unprocessed, '\r')); - assert(NULL == strchr(cur_line->unprocessed, '\n')); - - if (NULL != strchr(cur_line->unprocessed, '#')) - { - /* Must quote '#' characters */ - int numhash = 0; - int len; - char * src; - char * dest; - char * str; - - /* Count number of # characters, so we know length of output string */ - src = cur_line->unprocessed; - while (NULL != (src = strchr(src, '#'))) - { - numhash++; - src++; - } - assert(numhash > 0); - - /* Allocate new memory for string */ - len = strlen(cur_line->unprocessed); - if (NULL == (str = malloc((size_t) len + 1 + numhash))) - { - /* Uh oh, just trashed file! */ - fclose(fp); - return JB_ERR_MEMORY; - } - - /* Loop through string from end */ - src = cur_line->unprocessed + len; - dest = str + len + numhash; - for ( ; len >= 0; len--) - { - if ((*dest-- = *src--) == '#') - { - *dest-- = '\\'; - numhash--; - assert(numhash >= 0); - } - } - assert(numhash == 0); - assert(src + 1 == cur_line->unprocessed); - assert(dest + 1 == str); - - if (fputs(str, fp) < 0) - { - free(str); - fclose(fp); - return JB_ERR_FILE; - } - - free(str); - } - else - { - /* Can write without quoting '#' characters. */ - if (fputs(cur_line->unprocessed, fp) < 0) - { - fclose(fp); - return JB_ERR_FILE; - } - } - if (fputs(NEWLINE(file->newline), fp) < 0) - { - fclose(fp); - return JB_ERR_FILE; - } - } - else - { - /* FIXME: Write data from file->data->whatever */ - assert(0); - } - } - cur_line = cur_line->next; - } - - fclose(fp); - - - /* Update the version stamp in the file structure, since we just - * wrote to the file & changed it's date. - */ - if (stat(file->filename, statbuf) < 0) - { - /* Error, probably file not found. */ - return JB_ERR_FILE; - } - file->version = (unsigned)statbuf->st_mtime; - - /* Correct file->version_str */ - freez(file->version_str); - snprintf(version_buf, 22, "%u", file->version); - version_buf[21] = '\0'; - file->version_str = strdup(version_buf); - if (version_buf == NULL) - { - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : edit_free_file - * - * Description : Free a complete file in memory. - * - * Parameters : - * 1 : file = Data structure to free. - * - * Returns : N/A - * - *********************************************************************/ -void edit_free_file(struct editable_file * file) -{ - if (!file) - { - /* Silently ignore NULL pointer */ - return; - } - - edit_free_file_lines(file->lines); - freez(file->filename); - freez(file->identifier); - freez(file->version_str); - file->version = 0; - file->parse_error_text = NULL; /* Statically allocated */ - file->parse_error = NULL; - - free(file); -} - - -/********************************************************************* - * - * Function : edit_free_file - * - * Description : Free an entire linked list of file lines. - * - * Parameters : - * 1 : first_line = Data structure to free. - * - * Returns : N/A - * - *********************************************************************/ -static void edit_free_file_lines(struct file_line * first_line) -{ - struct file_line * next_line; - - while (first_line != NULL) - { - next_line = first_line->next; - first_line->next = NULL; - freez(first_line->raw); - freez(first_line->prefix); - freez(first_line->unprocessed); - switch(first_line->type) - { - case 0: /* special case if memory zeroed */ - case FILE_LINE_UNPROCESSED: - case FILE_LINE_BLANK: - case FILE_LINE_ALIAS_HEADER: - case FILE_LINE_SETTINGS_HEADER: - case FILE_LINE_DESCRIPTION_HEADER: - case FILE_LINE_DESCRIPTION_ENTRY: - case FILE_LINE_ALIAS_ENTRY: - case FILE_LINE_URL: - /* No data is stored for these */ - break; - - case FILE_LINE_ACTION: - free_action(first_line->data.action); - break; - - case FILE_LINE_SETTINGS_ENTRY: - freez(first_line->data.setting.name); - freez(first_line->data.setting.svalue); - break; - default: - /* Should never happen */ - assert(0); - break; - } - first_line->type = 0; /* paranoia */ - free(first_line); - first_line = next_line; - } -} - - -/********************************************************************* - * - * Function : match_actions_file_header_line - * - * Description : Match an actions file {{header}} line - * - * Parameters : - * 1 : line = String from file - * 2 : name = Header to match against - * - * Returns : 0 iff they match. - * - *********************************************************************/ -static int match_actions_file_header_line(const char * line, const char * name) -{ - size_t len; - - assert(line); - assert(name); - - /* Look for "{{" */ - if ((line[0] != '{') || (line[1] != '{')) - { - return 1; - } - line += 2; - - /* Look for optional whitespace */ - while ( (*line == ' ') || (*line == '\t') ) - { - line++; - } - - /* Look for the specified name (case-insensitive) */ - len = strlen(name); - if (0 != strncmpic(line, name, len)) - { - return 1; - } - line += len; - - /* Look for optional whitespace */ - while ( (*line == ' ') || (*line == '\t') ) - { - line++; - } - - /* Look for "}}" and end of string*/ - if ((line[0] != '}') || (line[1] != '}') || (line[2] != '\0')) - { - return 1; - } - - /* It matched!! */ - return 0; -} - - -/********************************************************************* - * - * Function : match_actions_file_header_line - * - * Description : Match an actions file {{header}} line - * - * Parameters : - * 1 : line = String from file. Must not start with - * whitespace (else infinite loop!) - * 2 : name = Destination for name - * 2 : name = Destination for value - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_PARSE if there's no "=" sign, or if there's - * nothing before the "=" sign (but empty - * values *after* the "=" sign are legal). - * - *********************************************************************/ -static jb_err split_line_on_equals(const char * line, char ** pname, char ** pvalue) -{ - const char * name_end; - const char * value_start; - size_t name_len; - - assert(line); - assert(pname); - assert(pvalue); - assert(*line != ' '); - assert(*line != '\t'); - - *pname = NULL; - *pvalue = NULL; - - value_start = strchr(line, '='); - if ((value_start == NULL) || (value_start == line)) - { - return JB_ERR_PARSE; - } - - name_end = value_start - 1; - - /* Eat any whitespace before the '=' */ - while ((*name_end == ' ') || (*name_end == '\t')) - { - /* - * we already know we must have at least 1 non-ws char - * at start of buf - no need to check - */ - name_end--; - } - - name_len = name_end - line + 1; /* Length excluding \0 */ - if (NULL == (*pname = (char *) malloc(name_len + 1))) - { - return JB_ERR_MEMORY; - } - strncpy(*pname, line, name_len); - (*pname)[name_len] = '\0'; - - /* Eat any the whitespace after the '=' */ - value_start++; - while ((*value_start == ' ') || (*value_start == '\t')) - { - value_start++; - } - - if (NULL == (*pvalue = strdup(value_start))) - { - free(*pname); - *pname = NULL; - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : edit_parse_actions_file - * - * Description : Parse an actions file in memory. - * - * Passed linked list must have the "data" member - * zeroed, and must contain valid "next" and - * "unprocessed" fields. The "raw" and "prefix" - * fields are ignored, and "type" is just overwritten. - * - * Note that on error the file may have been - * partially parsed. - * - * Parameters : - * 1 : file = Actions file to be parsed in-place. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_PARSE on error - * - *********************************************************************/ -jb_err edit_parse_actions_file(struct editable_file * file) -{ - struct file_line * cur_line; - size_t len; - const char * text; /* Text from a line */ - char * name; /* For lines of the form name=value */ - char * value; /* For lines of the form name=value */ - struct action_alias * alias_list = NULL; - jb_err err = JB_ERR_OK; - - /* alias_list contains the aliases defined in this file. - * It might be better to use the "file_line.data" fields - * in the relavent places instead. - */ - - cur_line = file->lines; - - /* A note about blank line support: Blank lines should only - * ever occur as the last line in the file. This function - * is more forgiving than that - FILE_LINE_BLANK can occur - * anywhere. - */ - - /* Skip leading blanks. Should only happen if file is - * empty (which is valid, but pointless). - */ - while ( (cur_line != NULL) - && (cur_line->unprocessed[0] == '\0') ) - { - /* Blank line */ - cur_line->type = FILE_LINE_BLANK; - cur_line = cur_line->next; - } - - if ( (cur_line != NULL) - && (cur_line->unprocessed[0] != '{') ) - { - /* File doesn't start with a header */ - file->parse_error = cur_line; - file->parse_error_text = "First (non-comment) line of the file must contain a header."; - return JB_ERR_PARSE; - } - - if ( (cur_line != NULL) && (0 == - match_actions_file_header_line(cur_line->unprocessed, "settings") ) ) - { - cur_line->type = FILE_LINE_SETTINGS_HEADER; - - cur_line = cur_line->next; - while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{')) - { - if (cur_line->unprocessed[0]) - { - cur_line->type = FILE_LINE_SETTINGS_ENTRY; - - err = split_line_on_equals(cur_line->unprocessed, - &cur_line->data.setting.name, - &cur_line->data.setting.svalue); - if (err == JB_ERR_MEMORY) - { - return err; - } - else if (err != JB_ERR_OK) - { - /* Line does not contain a name=value pair */ - file->parse_error = cur_line; - file->parse_error_text = "Expected a name=value pair on this {{description}} line, but couldn't find one."; - return JB_ERR_PARSE; - } - } - else - { - cur_line->type = FILE_LINE_BLANK; - } - cur_line = cur_line->next; - } - } - - if ( (cur_line != NULL) && (0 == - match_actions_file_header_line(cur_line->unprocessed, "description") ) ) - { - cur_line->type = FILE_LINE_DESCRIPTION_HEADER; - - cur_line = cur_line->next; - while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{')) - { - if (cur_line->unprocessed[0]) - { - cur_line->type = FILE_LINE_DESCRIPTION_ENTRY; - } - else - { - cur_line->type = FILE_LINE_BLANK; - } - cur_line = cur_line->next; - } - } - - if ( (cur_line != NULL) && (0 == - match_actions_file_header_line(cur_line->unprocessed, "alias") ) ) - { - cur_line->type = FILE_LINE_ALIAS_HEADER; - - cur_line = cur_line->next; - while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{')) - { - if (cur_line->unprocessed[0]) - { - /* define an alias */ - struct action_alias * new_alias; - - cur_line->type = FILE_LINE_ALIAS_ENTRY; - - err = split_line_on_equals(cur_line->unprocessed, &name, &value); - if (err == JB_ERR_MEMORY) - { - return err; - } - else if (err != JB_ERR_OK) - { - /* Line does not contain a name=value pair */ - file->parse_error = cur_line; - file->parse_error_text = "Expected a name=value pair on this {{alias}} line, but couldn't find one."; - return JB_ERR_PARSE; - } - - if ((new_alias = zalloc(sizeof(*new_alias))) == NULL) - { - /* Out of memory */ - free(name); - free(value); - free_alias_list(alias_list); - return JB_ERR_MEMORY; - } - - err = get_actions(value, alias_list, new_alias->action); - if (err) - { - /* Invalid action or out of memory */ - free(name); - free(value); - free(new_alias); - free_alias_list(alias_list); - if (err == JB_ERR_MEMORY) - { - return err; - } - else - { - /* Line does not contain a name=value pair */ - file->parse_error = cur_line; - file->parse_error_text = "This alias does not specify a valid set of actions."; - return JB_ERR_PARSE; - } - } - - free(value); - - new_alias->name = name; - - /* add to list */ - new_alias->next = alias_list; - alias_list = new_alias; - } - else - { - cur_line->type = FILE_LINE_BLANK; - } - cur_line = cur_line->next; - } - } - - /* Header done, process the main part of the file */ - while (cur_line != NULL) - { - /* At this point, (cur_line->unprocessed[0] == '{') */ - assert(cur_line->unprocessed[0] == '{'); - text = cur_line->unprocessed + 1; - len = strlen(text) - 1; - if (text[len] != '}') - { - /* No closing } on header */ - free_alias_list(alias_list); - file->parse_error = cur_line; - file->parse_error_text = "Headers starting with '{' must have a " - "closing bracket ('}'). Headers starting with two brackets ('{{') " - "must close with two brackets ('}}')."; - return JB_ERR_PARSE; - } - - if (text[0] == '{') - { - /* An invalid {{ header. */ - free_alias_list(alias_list); - file->parse_error = cur_line; - file->parse_error_text = "Unknown or unexpected two-bracket header. " - "Please remember that the system (two-bracket) headers must " - "appear in the order {{settings}}, {{description}}, {{alias}}, " - "and must appear before any actions (one-bracket) headers. " - "Also note that system headers may not be repeated."; - return JB_ERR_PARSE; - } - - while ( (*text == ' ') || (*text == '\t') ) - { - text++; - len--; - } - while ( (len > 0) - && ( (text[len - 1] == ' ') - || (text[len - 1] == '\t') ) ) - { - len--; - } - - cur_line->type = FILE_LINE_ACTION; - - /* Remove {} and make copy */ - if (NULL == (value = (char *) malloc(len + 1))) - { - /* Out of memory */ - free_alias_list(alias_list); - return JB_ERR_MEMORY; - } - strncpy(value, text, len); - value[len] = '\0'; - - /* Get actions */ - err = get_actions(value, alias_list, cur_line->data.action); - if (err) - { - /* Invalid action or out of memory */ - free(value); - free_alias_list(alias_list); - if (err == JB_ERR_MEMORY) - { - return err; - } - else - { - /* Line does not contain a name=value pair */ - file->parse_error = cur_line; - file->parse_error_text = "This header does not specify a valid set of actions."; - return JB_ERR_PARSE; - } - } - - /* Done with string - it was clobbered anyway */ - free(value); - - /* Process next line */ - cur_line = cur_line->next; - - /* Loop processing URL patterns */ - while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{')) - { - if (cur_line->unprocessed[0]) - { - /* Could parse URL here, but this isn't currently needed */ - - cur_line->type = FILE_LINE_URL; - } - else - { - cur_line->type = FILE_LINE_BLANK; - } - cur_line = cur_line->next; - } - } /* End main while(cur_line != NULL) loop */ - - free_alias_list(alias_list); - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : edit_read_file_lines - * - * Description : Read all the lines of a file into memory. - * Handles whitespace, comments and line continuation. - * - * Parameters : - * 1 : fp = File to read from. On return, this will be - * at EOF but it will not have been closed. - * 2 : pfile = Destination for a linked list of file_lines. - * Will be set to NULL on error. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * - *********************************************************************/ -jb_err edit_read_file_lines(FILE *fp, struct file_line ** pfile, int *newline) -{ - struct file_line * first_line; /* Keep for return value or to free */ - struct file_line * cur_line; /* Current line */ - struct file_line * prev_line; /* Entry with prev_line->next = cur_line */ - jb_err rval; - - assert(fp); - assert(pfile); - - *pfile = NULL; - - cur_line = first_line = zalloc(sizeof(struct file_line)); - if (cur_line == NULL) - { - return JB_ERR_MEMORY; - } - - cur_line->type = FILE_LINE_UNPROCESSED; - - rval = edit_read_line(fp, &cur_line->raw, &cur_line->prefix, &cur_line->unprocessed, newline, NULL); - if (rval) - { - /* Out of memory or empty file. */ - /* Note that empty file is not an error we propogate up */ - free(cur_line); - return ((rval == JB_ERR_FILE) ? JB_ERR_OK : rval); - } - - do - { - prev_line = cur_line; - cur_line = prev_line->next = zalloc(sizeof(struct file_line)); - if (cur_line == NULL) - { - /* Out of memory */ - edit_free_file_lines(first_line); - return JB_ERR_MEMORY; - } - - cur_line->type = FILE_LINE_UNPROCESSED; - - rval = edit_read_line(fp, &cur_line->raw, &cur_line->prefix, &cur_line->unprocessed, newline, NULL); - if ((rval != JB_ERR_OK) && (rval != JB_ERR_FILE)) - { - /* Out of memory */ - edit_free_file_lines(first_line); - return JB_ERR_MEMORY; - } - - } - while (rval != JB_ERR_FILE); - - /* EOF */ - - /* We allocated one too many - free it */ - prev_line->next = NULL; - free(cur_line); - - *pfile = first_line; - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : edit_read_file - * - * Description : Read a complete file into memory. - * Handles CGI parameter parsing. If requested, also - * checks the file's modification timestamp. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : parameters = map of cgi parameters. - * 3 : require_version = true to check "ver" parameter. - * 4 : suffix = File extension, e.g. ".action". - * 5 : pfile = Destination for the file. Will be set - * to NULL on error. - * - * CGI Parameters : - * filename : The name of the file to read, without the - * path or ".action" extension. - * ver : (Only if require_version is nonzero) - * Timestamp of the actions file. If wrong, this - * function fails with JB_ERR_MODIFIED. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if "filename" was not specified - * or is not valid. - * JB_ERR_FILE if the file cannot be opened or - * contains no data - * JB_ERR_MODIFIED if version checking was requested and - * failed - the file was modified outside - * of this CGI editor instance. - * - *********************************************************************/ -jb_err edit_read_file(struct client_state *csp, - const struct map *parameters, - int require_version, - const char *suffix, - struct editable_file **pfile) -{ - struct file_line * lines; - FILE * fp; - jb_err err; - char * filename; - const char * identifier; - struct editable_file * file; - unsigned version = 0; - struct stat statbuf[1]; - char version_buf[22]; - int newline = NEWLINE_UNKNOWN; - - assert(csp); - assert(parameters); - assert(pfile); - - *pfile = NULL; - - err = get_file_name_param(csp, parameters, "f", suffix, - &filename, &identifier); - if (err) - { - return err; - } - - if (stat(filename, statbuf) < 0) - { - /* Error, probably file not found. */ - free(filename); - return JB_ERR_FILE; - } - version = (unsigned) statbuf->st_mtime; - - if (require_version) - { - unsigned specified_version; - err = get_number_param(csp, parameters, "v", &specified_version); - if (err) - { - free(filename); - return err; - } - - if (version != specified_version) - { - return JB_ERR_MODIFIED; - } - } - -#if defined(AMIGA) || defined(__OS2__) - if (NULL == (fp = fopen(filename,"r"))) -#else - if (NULL == (fp = fopen(filename,"rt"))) -#endif /* def AMIGA */ - { - free(filename); - return JB_ERR_FILE; - } - - err = edit_read_file_lines(fp, &lines, &newline); - - fclose(fp); - - if (err) - { - free(filename); - return err; - } - - file = (struct editable_file *) zalloc(sizeof(*file)); - if (err) - { - free(filename); - edit_free_file_lines(lines); - return err; - } - - file->lines = lines; - file->newline = newline; - file->filename = filename; - file->version = version; - file->identifier = url_encode(identifier); - - if (file->identifier == NULL) - { - edit_free_file(file); - return JB_ERR_MEMORY; - } - - /* Correct file->version_str */ - freez(file->version_str); - snprintf(version_buf, 22, "%u", file->version); - version_buf[21] = '\0'; - file->version_str = strdup(version_buf); - if (version_buf == NULL) - { - edit_free_file(file); - return JB_ERR_MEMORY; - } - - *pfile = file; - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : edit_read_actions_file - * - * Description : Read a complete actions file into memory. - * Handles CGI parameter parsing. If requested, also - * checks the file's modification timestamp. - * - * If this function detects an error in the categories - * JB_ERR_FILE, JB_ERR_MODIFIED, or JB_ERR_PARSE, - * then it handles it by filling in the specified - * response structure and returning JB_ERR_FILE. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = HTTP response. Only filled in on error. - * 2 : parameters = map of cgi parameters. - * 3 : require_version = true to check "ver" parameter. - * 4 : pfile = Destination for the file. Will be set - * to NULL on error. - * - * CGI Parameters : - * filename : The name of the actions file to read, without the - * path or ".action" extension. - * ver : (Only if require_version is nonzero) - * Timestamp of the actions file. If wrong, this - * function fails with JB_ERR_MODIFIED. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if "filename" was not specified - * or is not valid. - * JB_ERR_FILE if the file does not contain valid data, - * or if file cannot be opened or - * contains no data, or if version - * checking was requested and failed. - * - *********************************************************************/ -jb_err edit_read_actions_file(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters, - int require_version, - struct editable_file **pfile) -{ - jb_err err; - struct editable_file *file; - - assert(csp); - assert(parameters); - assert(pfile); - - *pfile = NULL; - - err = edit_read_file(csp, parameters, require_version, ".action", &file); - if (err) - { - /* Try to handle if possible */ - if (err == JB_ERR_FILE) - { - err = cgi_error_file(csp, rsp, lookup(parameters, "f")); - } - else if (err == JB_ERR_MODIFIED) - { - err = cgi_error_modified(csp, rsp, lookup(parameters, "f")); - } - if (err == JB_ERR_OK) - { - /* - * Signal to higher-level CGI code that there was a problem but we - * handled it, they should just return JB_ERR_OK. - */ - err = JB_ERR_FILE; - } - return err; - } - - err = edit_parse_actions_file(file); - if (err) - { - if (err == JB_ERR_PARSE) - { - err = cgi_error_parse(csp, rsp, file); - if (err == JB_ERR_OK) - { - /* - * Signal to higher-level CGI code that there was a problem but we - * handled it, they should just return JB_ERR_OK. - */ - err = JB_ERR_FILE; - } - } - edit_free_file(file); - return err; - } - - *pfile = file; - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : get_file_name_param - * - * Description : Get the name of the file to edit from the parameters - * passed to a CGI function. This function handles - * security checks such as blocking urls containing - * "/" or ".", prepending the config file directory, - * and adding the specified suffix. - * - * (This is an essential security check, otherwise - * users may be able to pass "../../../etc/passwd" - * and overwrite the password file [linux], "prn:" - * and print random data [Windows], etc...) - * - * This function only allows filenames contining the - * characters '-', '_', 'A'-'Z', 'a'-'z', and '0'-'9'. - * That's probably too restrictive but at least it's - * secure. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : parameters = map of cgi parameters - * 3 : param_name = The name of the parameter to read - * 4 : suffix = File extension, e.g. ".actions" - * 5 : pfilename = destination for full filename. Caller - * free()s. Set to NULL on error. - * 6 : pparam = destination for partial filename, - * suitable for use in another URL. Allocated as part - * of the map "parameters", so don't free it. - * Set to NULL if not specified. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if "filename" was not specified - * or is not valid. - * - *********************************************************************/ -static jb_err get_file_name_param(struct client_state *csp, - const struct map *parameters, - const char *param_name, - const char *suffix, - char **pfilename, - const char **pparam) -{ - const char *param; - const char *s; -#if 0 /* Patch to make 3.0.0 work properly. */ - char *name; -#endif /* 0 - Patch to make 3.0.0 work properly. */ - char *fullpath; - char ch; - int len; - - assert(csp); - assert(parameters); - assert(suffix); - assert(pfilename); - assert(pparam); - - *pfilename = NULL; - *pparam = NULL; - - param = lookup(parameters, param_name); - if (!*param) - { - return JB_ERR_CGI_PARAMS; - } - - *pparam = param; - - len = strlen(param); - if (len >= FILENAME_MAX) - { - /* Too long. */ - return JB_ERR_CGI_PARAMS; - } - - /* Check every character to see if it's legal */ - s = param; - while ((ch = *s++) != '\0') - { - if ( ((ch < 'A') || (ch > 'Z')) - && ((ch < 'a') || (ch > 'z')) - && ((ch < '0') || (ch > '9')) - && (ch != '-') - && (ch != '_') ) - { - /* Probable hack attempt. */ - return JB_ERR_CGI_PARAMS; - } - } - - /* - * FIXME Following is a hack to make 3.0.0 work properly. - * Change "#if 0" --> "#if 1" below when we have modular action - * files. - * -- Jon - */ -#if 0 /* Patch to make 3.0.0 work properly. */ - /* Append extension */ - name = malloc(len + strlen(suffix) + 1); - if (name == NULL) - { - return JB_ERR_MEMORY; - } - strcpy(name, param); - strcpy(name + len, suffix); - - /* Prepend path */ - fullpath = make_path(csp->config->confdir, name); - free(name); -#else /* 1 - Patch to make 3.0.0 work properly. */ - if ((csp->actions_list == NULL) - || (csp->actions_list->filename == NULL)) - { - return JB_ERR_CGI_PARAMS; - } - - fullpath = ( (csp->actions_list && csp->actions_list->filename) - ? strdup(csp->actions_list->filename) : NULL); -#endif /* 1 - Patch to make 3.0.0 work properly. */ - if (fullpath == NULL) - { - return JB_ERR_MEMORY; - } - - /* Success */ - *pfilename = fullpath; - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : get_char_param - * - * Description : Get a single-character parameter passed to a CGI - * function. - * - * Parameters : - * 1 : parameters = map of cgi parameters - * 2 : param_name = The name of the parameter to read - * - * Returns : Uppercase character on success, '\0' on error. - * - *********************************************************************/ -static char get_char_param(const struct map *parameters, - const char *param_name) -{ - char ch; - - assert(parameters); - assert(param_name); - - ch = *(lookup(parameters, param_name)); - if ((ch >= 'a') && (ch <= 'z')) - { - ch = ch - 'a' + 'A'; - } - - return ch; -} - - -/********************************************************************* - * - * Function : get_string_param - * - * Description : Get a string paramater, to be used as an - * ACTION_STRING or ACTION_MULTI paramater. - * Validates the input to prevent stupid/malicious - * users from corrupting their action file. - * - * Parameters : - * 1 : parameters = map of cgi parameters - * 2 : param_name = The name of the parameter to read - * 3 : pparam = destination for paramater. Allocated as - * part of the map "parameters", so don't free it. - * Set to NULL if not specified. - * - * Returns : JB_ERR_OK on success, or if the paramater - * was not specified. - * JB_ERR_MEMORY on out-of-memory. - * JB_ERR_CGI_PARAMS if the paramater is not valid. - * - *********************************************************************/ -static jb_err get_string_param(const struct map *parameters, - const char *param_name, - const char **pparam) -{ - const char *param; - const char *s; - char ch; - - assert(parameters); - assert(param_name); - assert(pparam); - - *pparam = NULL; - - param = lookup(parameters, param_name); - if (!*param) - { - return JB_ERR_OK; - } - - if (strlen(param) >= CGI_ACTION_PARAM_LEN_MAX) - { - /* - * Too long. - * - * Note that the length limit is arbitrary, it just seems - * sensible to limit it to *something*. There's no - * technical reason for any limit at all. - */ - return JB_ERR_CGI_PARAMS; - } - - /* Check every character to see if it's legal */ - s = param; - while ((ch = *s++) != '\0') - { - if ( ((unsigned char)ch < (unsigned char)' ') - || (ch == '}') ) - { - /* Probable hack attempt, or user accidentally used '}'. */ - return JB_ERR_CGI_PARAMS; - } - } - - /* Success */ - *pparam = param; - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : get_number_param - * - * Description : Get a non-negative integer from the parameters - * passed to a CGI function. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : parameters = map of cgi parameters - * 3 : name = Name of CGI parameter to read - * 4 : pvalue = destination for value. - * Set to -1 on error. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the parameter was not specified - * or is not valid. - * - *********************************************************************/ -static jb_err get_number_param(struct client_state *csp, - const struct map *parameters, - char *name, - unsigned *pvalue) -{ - const char *param; - char ch; - unsigned value; - - assert(csp); - assert(parameters); - assert(name); - assert(pvalue); - - *pvalue = 0; - - param = lookup(parameters, name); - if (!*param) - { - return JB_ERR_CGI_PARAMS; - } - - /* We don't use atoi because I want to check this carefully... */ - - value = 0; - while ((ch = *param++) != '\0') - { - if ((ch < '0') || (ch > '9')) - { - return JB_ERR_CGI_PARAMS; - } - - ch -= '0'; - - /* Note: - * - * defines UINT_MAX - * - * (UINT_MAX - ch) / 10 is the largest number that - * can be safely multiplied by 10 then have ch added. - */ - if (value > ((UINT_MAX - (unsigned)ch) / 10U)) - { - return JB_ERR_CGI_PARAMS; - } - - value = value * 10 + ch; - } - - /* Success */ - *pvalue = value; - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : get_url_spec_param - * - * Description : Get a URL pattern from the parameters - * passed to a CGI function. Removes leading/trailing - * spaces and validates it. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : parameters = map of cgi parameters - * 3 : name = Name of CGI parameter to read - * 4 : pvalue = destination for value. Will be malloc()'d. - * Set to NULL on error. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the parameter was not specified - * or is not valid. - * - *********************************************************************/ -static jb_err get_url_spec_param(struct client_state *csp, - const struct map *parameters, - const char *name, - char **pvalue) -{ - const char *orig_param; - char *param; - char *s; - struct url_spec compiled[1]; - jb_err err; - - assert(csp); - assert(parameters); - assert(name); - assert(pvalue); - - *pvalue = NULL; - - orig_param = lookup(parameters, name); - if (!*orig_param) - { - return JB_ERR_CGI_PARAMS; - } - - /* Copy and trim whitespace */ - param = strdup(orig_param); - if (param == NULL) - { - return JB_ERR_MEMORY; - } - chomp(param); - - /* Must be non-empty, and can't allow 1st character to be '{' */ - if (param[0] == '\0' || param[0] == '{') - { - free(param); - return JB_ERR_CGI_PARAMS; - } - - /* Check for embedded newlines */ - for (s = param; *s != '\0'; s++) - { - if ((*s == '\r') || (*s == '\n')) - { - free(param); - return JB_ERR_CGI_PARAMS; - } - } - - /* Check that regex is valid */ - s = strdup(param); - if (s == NULL) - { - free(param); - return JB_ERR_MEMORY; - } - err = create_url_spec(compiled, s); - free(s); - if (err) - { - free(param); - return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS; - } - free_url_spec(compiled); - - if (param[strlen(param) - 1] == '\\') - { - /* - * Must protect trailing '\\' from becoming line continuation character. - * Two methods: 1) If it's a domain only, add a trailing '/'. - * 2) For path, add the do-nothing PCRE expression (?:) to the end - */ - if (strchr(param, '/') == NULL) - { - err = string_append(¶m, "/"); - } - else - { - err = string_append(¶m, "(?:)"); - } - if (err) - { - return err; - } - - /* Check that the modified regex is valid */ - s = strdup(param); - if (s == NULL) - { - free(param); - return JB_ERR_MEMORY; - } - err = create_url_spec(compiled, s); - free(s); - if (err) - { - free(param); - return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS; - } - free_url_spec(compiled); - } - - *pvalue = param; - return JB_ERR_OK; -} - -/********************************************************************* - * - * Function : map_radio - * - * Description : Map a set of radio button values. E.g. if you have - * 3 radio buttons, declare them as: - * Nimda!%g - - -################################################################################# -# -# banners-by-size: Kill banners by size -# -################################################################################# -# -# Standard banner sizes taken from http://www.iab.net/iab_banner_standards/bannersizes.html -# -# Note: Use http://config.privoxy.org/send-banner?type=trans for a transparent 1x1 image -# Use http://config.privoxy.org/send-banner?type=pattern for a grey/white pattern image -# Use http://config.privoxy.org/send-banner?type=auto to auto-select. -# -################################################################################# -FILTER: banners-by-size Kill banners by size - -s|]*?(width=['"]?468\D)[^>]*(height=['"]?60[^>]*?)>||sig -s|]*?(width=['"]?234\D)[^>]*(height=['"]?60[^>]*?)>||sig -s|]*?(width=['"]?88\D)[^>]*(height=['"]?31[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?90[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?600[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?60[^>]*?)>||sig -s|]*?(width=['"]?160\D)[^>]*(height=['"]?600[^>]*?)>||sig -s|]*?(width=['"]?125\D)[^>]*(height=['"]?125[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?240[^>]*?)>||sig -s|]*?(width=['"]?180\D)[^>]*(height=['"]?150[^>]*?)>||sig -s|]*?(width=['"]?300\D)[^>]*(height=['"]?250[^>]*?)>||sig -s|]*?(width=['"]?250\D)[^>]*(height=['"]?250[^>]*?)>||sig -s|]*?(width=['"]?240\D)[^>]*(height=['"]?400[^>]*?)>||sig -s|]*?(width=['"]?336\D)[^>]*(height=['"]?280[^>]*?)>||sig - -# One more. (Where is 200x50 from?) -# -s|]*?(width=['"]?200\D)[^>]*(height=['"]?50[^>]*?)>||sig - - -################################################################################# -# -# crude-parental: Crude parental filtering? (Use along with a suitable blocklist). -# Shows how to deny access to whole page based on a keyword. -# -################################################################################# -# -# (Note: Middlesex, Sussex and Essex are counties in the UK, not rude words) -# (Note #2: Is 'sex' a rude word?!) -# -################################################################################# -FILTER: crude-parental Crude parental filtering (demo only) - -s%^.*(?Blocked

    Blocked due to possible adult content. Please see this site.

    %is -s+^.*warez.*$+No Warez

    You're not searching for illegal stuff, are you?

    +is - -############################################################################## -# -# Revisions : -# $Log: default.filter,v $ -# Revision 1.4 2002/03/26 22:29:54 swa -# we have a new homepage! -# -# Revision 1.3 2002/03/24 16:08:03 jongfoster -# Fixing banners-by-size for new config URLs -# -# Revision 1.2 2002/03/24 13:02:18 swa -# name change related issues. -# -# Revision 1.1 2002/03/24 11:37:39 jongfoster -# Name change -# -# Revision 1.24 2002/03/16 20:39:54 oes -# - Added descriptions to the filters so users will know what they select in the cgi editor -# - Added content-cookies filter -# - Bugfixed many jobs (Thanks to Al for some hints) -# -# Revision 1.22 2002/03/12 13:42:50 oes -# Fixing & Optimizing REs -# -# Revision 1.21 2002/03/12 11:59:20 oes -# Beefed up Buzzword Bingo -# -# Revision 1.20 2002/03/12 01:42:50 oes -# Introduced modular filters -# -# Revision 1.19 2002/03/10 19:49:24 oes -# Added expression to kill referer tracking in JavaScripts -# -# Revision 1.18 2002/03/08 17:14:12 oes -# PNG -> image in comments -# -# Revision 1.17 2002/03/07 03:50:54 oes -# Adapted comments to new built-in images -# -# Revision 1.16 2002/02/21 00:12:19 jongfoster -# Modifying the banner regexps to use long URLS and to autodetect -# whether to show a logo or a transparent GIF, based on actionsfile -# setting. -# -# Revision 1.15 2001/12/28 23:54:20 steudten -# Fix for feature Req #495374: http-equiv problem -# -# Revision 1.14 2001/12/09 18:55:11 david__schmidt -# Updated CODE_STATUS to beta, commented out microsuck line in re_filterfile -# for 2.9.10 beta -# -# Revision 1.13 2001/10/13 13:11:20 joergs -# Fixed WebBug filter. -# -# Revision 1.12 2001/10/07 15:46:42 oes -# Followed Guy's proposal to change the document.cookie job -# -# Revision 1.11 2001/09/21 12:34:00 joergs -# Added filter to replace "Nimda" code by a warning. -# -# Revision 1.10 2001/07/20 11:04:26 oes -# Added Rodneys javascript cookie filter -# -# Revision 1.9 2001/07/13 14:03:48 oes -# Elimiated yet another bug in the banner-by-size jobs. Shame on me! -# -# Revision 1.8 2001/06/29 13:34:00 oes -# - Added explanation for U and T options -# - Added hint on image replacement by CGI call -# - Fixed bug in banner-by-size jobs -# -# Revision 1.7 2001/06/19 14:21:56 oes -# Fixed microsuck line -# -# Revision 1.6 2001/06/09 14:01:57 swa -# header. cosmetics. default: no messing ala microsuck. -# -# -# diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100644 index 769562fa..00000000 --- a/doc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -man -text diff --git a/doc/STANDARDS.txt b/doc/STANDARDS.txt new file mode 100644 index 00000000..c30f8dbc --- /dev/null +++ b/doc/STANDARDS.txt @@ -0,0 +1,1119 @@ +@ Introduction + + +This set of standards is designed to make our lives easier. It is +developed with the simple goal of helping us keep the "new and +improved Junkbusters" consistent and reliable. Thus making +maintenance easier and increasing chances of success of the +project. + +And that of course comes back to us as individuals. If we can +increase our development and product efficiencies then we can +solve more of the request for changes/improvements and in general +feel good about ourselves. ;-> + + +@ Using Comments + + +@@ Comment, Comment, Comment + +@@@ Explanation: + +Comment as much as possible without commenting the obvious. For +example do not comment "aVariable is equal to bVariable". Instead +explain why aVariable should be equal to the bVariable. Just +because a person can read code does not mean they will understand +why or what is being done. A reader may spend a lot more time +figuring out what is going on when a simple comment or explanation +would have prevented the extra research. Please help your brother +IJB'ers out! + +The comments will also help justify the intent of the code. If the +comment describes something different than what the code is doing +then maybe a programming error is occurring. + +@@@ Example: + +/* if page size greater than 1k ... */ +if ( PageLength() > 1024 ) +{ + ... "block" the page up ... +} + +/* if page size is small, send it in blocks */ +if ( PageLength() > 1024 ) +{ + ... "block" the page up ... +} + +This demonstrates 2 cases of "what not to do". The first is a +"syntax comment". The second is a comment that does not fit what +is actually being done. + + +@@ Use blocks for comments + +@@@ Explanation: + +Comments can help or they can clutter. They help when they are +differentiated from the code they describe. One line comments do +not offer effective separation between the comment and the code. +Block identifiers do, by surrounding the code with a clear, +definable pattern. + +@@@ Example: + +/********************************************************************* + * This will stand out clearly in your code! + *********************************************************************/ +if ( thisVariable == thatVariable ) +{ + DoSomethingVeryImportant(); +} + + +/* unfortunately, this may not */ +if ( thisVariable == thatVariable ) +{ + DoSomethingVeryImportant(); +} + + +if ( thisVariable == thatVariable ) /* this may not either */ +{ + DoSomethingVeryImportant(); +} + +@@@ Exception: + +If you are trying to add a small logic comment and do not wish to +"disrubt" the flow of the code, feel free to use a 1 line comment +which is NOT on the same line as the code. + + +@@ Keep Comments on their own line + +@@@ Explanation: + +It goes back to the question of readability. If the comment is on +the same line as the code it will be harder to read than the +comment that is on its own line. + +There are three exceptions to this rule, which should be violated +freely and often: during the definition of variables, at the end +of closing braces, when used to comment parameters. + +@@@ Example: + +/********************************************************************* + * This will stand out clearly in your code, + * But the second example won't. + *********************************************************************/ +if ( thisVariable == thatVariable ) +{ + DoSomethingVeryImportant(); +} + +if ( thisVariable == thatVariable ) /*can you see me?*/ +{ + DoSomethingVeryImportant(); /*not easily*/ +} + + +/********************************************************************* + * But, the encouraged exceptions: + *********************************************************************/ +int urls_read = 0; /* # of urls read + rejected */ +int urls_rejected = 0; /* # of urls rejected */ + +if ( 1 == X ) +{ + DoSomethingVeryImportant(); +} + + +short DoSomethingVeryImportant( + short firstParam, /* represents something */ + short nextParam /* represents something else */ ) +{ + ...code here... + +} /* -END- DoSomethingVeryImportant */ + + +@@ Comment each logical step + +@@@ Explanation: + +Logical steps should be commented to help others follow the +intent of the written code and comments will make the code more +readable. + +If you have 25 lines of code without a comment, you should +probably go back into it to see where you forgot to put one. + +Most "for", "while", "do", etc... loops _probably_ need a +comment. After all, these are usually major logic containers. + + +@@ Comment All Functions Thoroughly + +@@@ Explanation: + +A reader of the code should be able to look at the comments just +prior to the beginning of a function and discern the reason for +its existence and the consequences of using it. The reader +should not have to read through the code to determine if a given +function is safe for a desired use. The proper information +thoroughly presented at the introduction of a function not only +saves time for subsequent maintenance or debugging, it more +importantly aids in code reuse by allowing a user to determine +the safety and applicability of any function for the problem at +hand. As a result of such benefits, all functions should contain +the information presented in the addendum section of this +document. + + +@@ Comment at the end of braces if the content is more than one screen length + +@@@ Explanation: + +Each closing brace should be followed on the same line by a +comment that describes the origination of the brace if the +original brace is off of the screen, or otherwise far away from +the closing brace. This will simplify the debugging, maintenance, +and readability of the code. + +As a suggestion , use the following flags to make the comment and +its brace more readable: + +use following a closing brace: + } /* -END- if() or while () or etc... */ + +@@@ Example: + +if ( 1 == X ) +{ + DoSomethingVeryImportant(); + ...some long list of commands... +} /* -END- if x is 1 */ + +or: + +if ( 1 == X ) +{ + DoSomethingVeryImportant(); + ...some long list of commands... +} /* -END- if ( 1 == X ) */ + + +@ Naming Conventions + + +@@ Variable Names + +@@@ Explanation: + +Seperate words via an underscore ('_'). + +@@@ Example: + +int ms_iis5_hack = 0; + +@@@ Instead of: + +int msiis5hack = 0; +int msIis5Hack = 0; + + +@@ Function Names + +@@@ Explanation: + +Seperate words via an underscore ('_'). + +@@@ Example: + +int load_aclfile( struct client_state *csp ) + +@@@ Instead of: + +int loadaclfile( struct client_state *csp ) +int loadAclFile( struct client_state *csp ) + + +@@ Header file prototypes + +@@@ Explanation: + +Use a descriptive parameter name in the function prototype in +header files. Use the same parameter name in the header file +that you use in the c file. + +@@@ Example: + +(.h) extern int load_aclfile( struct client_state *csp ); +(.c) int load_aclfile( struct client_state *csp ) + +@@@ Instead of: +(.h) extern int load_aclfile( struct client_state * ); or +(.h) extern int load_aclfile(); +(.c) int load_aclfile( struct client_state *csp ) + + +18. Ennumerations, and #defines + +@@@ Explanation: + +Use all capital letters, with underscores between words. + +@@@ Example: + +(enumeration) : enum Boolean { FALSE, TRUE }; +(#define) : #define DEFAULT_SIZE 100; + +@@@ Note: We should have a standard naming scheme for Symbols that +toggle a feature in the precompiler, and the constants used by that +feature. I'd propose that the toggles should be just one word, with +a common prefix, and that any depandant constants should be +prefixed by that word. + +The prefix could be WITH_, HAVE_, ENABLE_, FEATURE_ etc. + +@@@ Status: I see some this in the code currently! Anybody "figured" +out a standard way to do this? + +@@@ Example: + +#define ENABLE_FORCE 1 + +#ifdef ENABLE_FORCE +#define FORCE_PREFIX blah +#endif /* def ENABLE_FORCE */ + + +@@ Constants + +@@@ Explanation: + +Spell common words out entirely (do not remove vowels). + +Use only widely-known domain acronyms and abbreviations. Capitalize +all letters of an acronym. + +Use underscore (_) to separate adjacent acronyms and +abbreviations. Never terminate a name with an underscore. + +@@@ Example: + +#define USE_IMAGE_LIST 1 + +@@@ Instead of: + +#define USE_IMG_LST 1 or +#define _USE_IMAGE_LIST 1 or +#define USE_IMAGE_LIST_ 1 or +#define use_image_list 1 or +#define UseImageList 1 + + +@ Using Space + + +@@ Put braces on a line by themselves. + +@@@ Explanation: + +The brace needs to be on a line all by itself, not at the end of +the statement. Curly braces should line up with the construct +that they're associated with. This practice makes it easier to +identify the opening and closing braces for a block. + +@@@ Example: + +if ( this == that ) +{ + ... +} + +@@@ Instead of: + +if ( this == that ) { + ... +} + +or + +if ( this == that ) { ... } + +@@@ Note: In the special case that the if-statement is inside a loop, +and it is trivial, i.e. it tests for a condidtion that is obvious +from the purpose of the block, one-liners as above may optically +preserve the loop structure and make it easier to read. + +@@@ Status: developer-discrection. + +@@@ Example exception: + +while ( more lines are read ) +{ + /* Please document what is/is not a comment line here */ + if ( it's a comment ) continue; + + do_something( line ); +} + + +@@ ALL control statements should have a block + +@@@ Explanation: + +Using braces to make a block will make your code more readable +and less prone to error. All control statements should have a +block defined. + +@@@ Example: + +if ( this == that ) +{ + DoSomething(); + DoSomethingElse(); +} + +@@@ Instead of: + +if ( this == that ) + DoSomething(); + DoSomethingElse(); + +or + +if ( this == that ) DoSomething(); + +@@@ Note: The first example in "Instead of" will execute in a manner +other than that which the developer desired (per indentation). Using +code braces would have prevented this "feature". The "explanation" +and "exception" from the point above also applies. + + +@@ Do not belabor/blow-up boolean expressions + +@@@ Example: + +structure->flag = ( condition ); + +@@@ Instead of: + +if ( condition ) +{ + structure->flag = 1; +} +else +{ + structure->flag = 0; +} + +@@@ Note: The former is readable and consice. The later is wordy and +inefficient. Please assume that any developer new to the project has +at least a "good" knowledge of C/C++. (Hope I do not offend by that +last comment ... 8-) + + +@@ Use white space freely because it is free + +@@@ Explanation: + +Make it readable. The notable exception to using white space +freely is listed in the next guideline. + +@@@ Example: + +int firstValue = 0; +int someValue = 0; +int anotherValue = 0; +int thisVariable = 0; + +if ( thisVariable == thatVariable ) + +firstValue = oldValue + ( ( someValue - anotherValue ) - whatever ) + + +@@ Don't use white space around structure operators + +@@@ Explanation: + +- structure pointer operator ( "->" ) +- member operator ( "." ) +- functions and parentheses + +It is a general coding practice to put pointers, references, and +function parentheses next to names. With spaces, the connection +between the object and variable/function name is not as clear. + +@@@ Example: + +aStruct->aMember; +aStruct.aMember; +FunctionName(); + +@@@ Instead of: +aStruct -> aMember; +aStruct . aMember; +FunctionName (); + + +@@ Make the last brace of a function stand out + +@@@ Example: + +int function1( ... ) +{ + ...code... + return( retCode ); + +} /* -END- function1 */ + + +int function2( ... ) +{ +} /* -END- function2 */ + + +@@@ Instead of: + +int function1( ... ) +{ + ...code... + return( retCode ); +} +int function2( ... ) +{ +} + +@@@ Note: Use 1 blank line before the closing brace and 2 lines +afterwards. This makes the end of function standout to the most +casual viewer. Although function comments help seperate functions, +this is still a good coding practice. In fact, I follow these rules +when using blocks in "for", "while", "do" loops, and long if {} +statements too. After all whitespace is free! + +@@@ Status: developer-discrection on the number of blank lines. +Enforced is the end of function comments. + + +@@ Use 3 character indentions + +@@@ Explanation: + +If some use 8 character TABs and some use 3 character TABs, the code +can look *very* ragged. So use 3 character indentions only. If you +like to use TABs, pass your code through a filter such as "expand -t3" +before checking in your code. + +@@@ Example: + +static const char * const url_code_map[256] = +{ + NULL, ... +}; + + +int function1( ... ) +{ + if ( 1 ) + { + return( ALWAYS_TRUE ); + } + else + { + return( HOW_DID_YOU_GET_HERE ); + } + + return( NEVER_GETS_HERE ); + +} + + +@ Initializing + + +@@ Initialize all variables + +@@@ Explanation: + +Do not assume that the variables declared will not be used until +after they have been assigned a value somewhere else in the +code. Remove the chance of accidentally using an unassigned +variable. + +@@@ Example: + +short anShort = 0; +float aFloat = 0; +struct *ptr = NULL; + +@@@ Note: It is much easier to debug a SIGSEGV if the message says +you are trying to access memory address 00000000 and not +129FA012; or arrayPtr[20] causes a SIGSEV vs. arrayPtr[0]. + +@@@ Status: developer-discrection if and only if the variable is +assigned a value "shortly after" declaration. + + +@ Functions + + +@@ Name functions that return a boolean as a question. + +@@@ Explanation: + +Value should be phrased as a question that would logically be +answered as a true or false statement + +@@@ Example: + +ShouldWeBlockThis(); +ContainsAnImage(); +IsWebPageBlank(); + + +@@ Always specify a return type for a function. + +@@@ Explanation: + +The default return for a function is an int. To avoid ambiguity, +create a return for a function when the return has a purpose, and +create a void return type if the function does not need to return +anything. + + +@@ Minimize function calls when iterating by using variables + +@@@ Explanation: + +It is easy to write the following code, and a clear argument can +be made that the code is easy to understand: + +@@@ Example: + +for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ ) +{ + .... +} + +@@@ Note: Unfortunately, this makes a function call for each and every +iteration. This increases the overhead in the program, because the +compiler has to look up the function each time, call it, and return a +value. Depending on what occurs in the blockListLength() call, it +might even be creating and destroying structures with each iteration, +even though in each case it is comparing "cnt" to the same value, over +and over. Remember too - even a call to blockListLength() is a +function call, with the same overhead. + +Instead of using a function call during the iterations, assign +the value to a variable, and evaluate using the variable. + +@@@ Example: + +size_t len = blockListLength(); + +for ( size_t cnt = 0; cnt < len; cnt ++ ) +{ + .... +} + +@@@ Exceptions: if the value of blockListLength() *may* change or could +*potentially* change, then you must code the function call in the +for/while loop. + + +@@ Pass and Return by Const Reference + +@@@ Explanation: + +This allows a developer to define a const pointer and call your +function. If your function does not have the const keyword, we +may not be able to use your function. Consider strcmp, if it +were defined as: + extern int strcmp( char *s1, char *s2 ); + +I could then not use it to compare argv's in main: + int main( int argc, const char *argv[] ) + { + strcmp( argv[0], "junkbusters" ); + } + +Both these pointers are *const*! If the c runtime library maintainers +do it, we should too. + + +@@ Pass and Return by Value + +@@@ Explanation: + +Most structures cannot fit onto a normal stack entry (i.e. they +are not 4 bytes or less). Aka, a function declaration like: + int load_aclfile( struct client_state csp ) + +would not work. So, to be consistent, we should declare all +prototypes with "pass by value": + int load_aclfile( struct client_state *csp ) + + +@@ Use #include and #include "fileName" for locals + +@@@ Explanation: + +Your include statements should contain the file name without a +path. The path should be listed in the Makefile, using -I as +processor directive to search the indicated paths. An exception +to this would be for some proprietary software that utilizes a +partial path to distinguish their header files from system or +other header files. + +@@@ Example: + +#include /* This is not a local include */ +#include "config.h" /* This IS a local include */ + +@@@ Exception: + +/* This is not a local include, but requires a path element. */ +#include + +@@@ Note: Please! do not add "-I." to the Makefile without a _very_ +good reason. This duplicates the #include "file.h" behaviour. + + +@@ Provide multiple inclusion protection + +@@@ Explanation: + +Prevents compiler and linker errors resulting from redefinition of +items. + +Wrap each header file with the following syntax to prevent multiple +inclusions of the file. Of course, replace FILENAME_UPPERCASE with +your file name, with "." Changed to "_", and make it uppercase. + +@@@ Example: + +#ifndef _PROJECT_H +#define _PROJECT_H + ... +#endif /* ndef _PROJECT_H */ + + +@@ Where Possible, Use Forward Struct Declaration Instead of Includes + +@@@ Explanation: + +Useful in headers that include pointers to other struct's. +Modifications to excess header files may cause needless compiles. + +@@@ Example: + +/********************************************************************* + * We're avoiding an include statement here! + *********************************************************************/ +struct file_list; +extern file_list *xyz; + +@@@ Note: If you declare "file_list xyz;" (without the pointer), then +including the proper header file is necessary. If you only want to +prototype a pointer, however, the header file is unneccessary. + +@@@ Status: Use with discrection. + + +@ General Coding Practices + + +@@ Provide a default case for all switch statements + +@@@ Explanation: + +What you think is guaranteed is never really guaranteed. The value +that you don't think you need to check is the one that someday will be +passed. So, to protect yourself from the unknown, always have a +default step in a switch statement. + +@@@ Example: + +switch( hash_string( cmd ) ) +{ + case hash_actions_file : + ... code ... + break; + + case hash_confdir : + ... code ... + break; + + default : + log_error( ... ); + ... anomly code goes here ... + continue; / break; / exit( 1 ); / etc ... + +} /* end switch( hash_string( cmd ) ) */ + +@@@ Note: If you already have a default condition, you are obviously +exempt from this point. Of note, most of the WIN32 code calls +`DefWindowProc' after the switch statement. This API call +*should* be included in a default statement. + +@@@ Another Note: This is not so much a readability issue as a robust +programming issue. The "anomly code goes here" may be no more than a +print to the STDERR stream (as in load_config). Or it may really be +an ABEND condition. + +@@@ Status: Programmer discretion is advised. + + +@@ Try to avoid falling through cases in a switch statement. + +@@@ Explanation: + +In general, you will want to have a 'break' statement within each +'case' of a switch statement. This allows for the code to be more +readable and understandable, and furthermore can prevent unwanted +surprises if someone else later gets creative and moves the code +around. + +The language allows you to plan the fall through from one case +statement to another simply by omitting the break statement within the +case statement. This feature does have benefits, but should only be +used in rare cases. In general, use a break statement for each case +statement. + +If you choose to allow fall through, you should comment both the fact +of the fall through and reason why you felt it was necessary. + + +@@ Use 'long' or 'short' Instead of 'int' + +@@@ Explanation: + +On 32-bit platforms, int usually has the range of long. On 16-bit +platforms, int has the range of short. + +@@@ Status: open-to-debate. In the case of most FSF projects +(including X/GNU-Emacs), there are typedefs to int4, int8, int16, (or +equivalence ... I forget the exact typedefs now). Should we add these +to IJB now that we have a "configure" script? + + +@@ Declare each variable and struct on its own line. + +@@@ Explanation: + +It can be tempting to declare a series of variables all on one line. +Don't. + +@@@ Example: + +long a = 0; +long b = 0; +long c = 0; + +@@@ Instead of: + +long a, b, c; + +@@@ Explanation: +- there is more room for comments on the individual variables +- easier to add new variables without messing up the original ones +- when searching on a variable to find its type, there is less + clutter to "visually" eliminate + +@@@ Exceptions: when you want to declare a bunch of loop variables or +other trivial variables; feel free to declare them on 1 line. You +should, although, provide a good comment on their functions. + +@@@ Status: developer-discrection. + + +@@ Use malloc/zalloc sparingly + +@@@ Explanation: + +Create a local stuct (on the stack) if the variable will live +and die within the context of one function call. + +Only "malloc" a struct (on the heap) if the variable's life will +extend beyond the context of one function call. + +@@@ Example: + +If a function creates a struct and stores a pointer to it in a +list, then it should definately be allocated via `malloc'. + + +@@ The Programmer Who Uses 'malloc' is Responsible for Ensuring 'free' + +@@@ Explanation: + +If you have to "malloc" an instance, you are responsible for insuring +that the instance is `free'd, even if the deallocation event falls +within some other programmer's code. You are also responsible for +ensuring that deletion is timely (i.e. not too soon, not too late). +This is known as "low-coupling" and is a "good thing (tm)". You may +need to offer a free/unload/destuctor type function to accomodate +this. + +@@@ Example: + +int load_re_filterfile( struct client_state *csp ) { ... } +static void unload_re_filterfile( void *f ) { ... } + +@@@ Exceptions: + +The developer cannot be expected to provide `free'ing functions for +C run-time library functions ... such as `strdup'. + +@@@ Status: developer-discrection. The "main" use of this standard is +for allocating and freeing data structures (complex or nested). + + +@@ Add loaders to the `file_list' structure and in order + +@@@ Explanation: + +I have ordered all of the "blocker" file code to be in alpha +order. It is easier to add/read new blockers when you expect a +certain order. + +@@@ Note: It may appear that the alpha order is broken in places by +POPUP tests coming before PCRS tests. But since POPUPs can also +be referred to as KILLPOPUPs, it is clear that it should come +first. + + +@@ "Uncertain" new code and/or changes to exitinst code, use FIXME + +@@@ Explanation: + +If you have enough confidence in new code or confidence in your +changes, but are not *quite* sure of the reprocussions, add this: + +/* FIXME: this code has a logic error on platform XYZ, + * attempthing to fix + */ +#ifdef PLATFORM + ...changed code here... +#endif + +or: + +/* FIXME: I think the original author really meant this... */ + ...changed code here... + +or: + +/* FIXME: new code that *may* break something else... */ + ...new code here... + +@@@ Note: If you make it clear that this may or may not be a "good +thing (tm)", it will be easier to identify and include in the project +(or conversly exclude from the project). + + +@ Addendum: Template for files and function comment blocks: + + +@@@ Example for file comments: + +const char FILENAME_rcs[] = "$Id: STANDARDS.txt,v 1.3 2001/07/02 01:50:04 iwanttokeepanon Exp $"; +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/doc/STANDARDS.txt,v $ + * + * Purpose : (Fill me in with a good description!) + * + * 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: STANDARDS.txt,v $ + * Revision 1.3 2001/07/02 01:50:04 iwanttokeepanon + * A modified STANDARDS.txt file. I removed my XEmacs test lines (commited in v1.2) + * and made the file Outline-mode compatible. I used "@" for my header lines instead + * of "*" (which interfered in some C comments). I also removed the formfeed character + * from the `outline-regexp' variable because it interfered with the "H" file header and + * the "C" file header comments. + * + * All of the "stardards points/issues" are still available for discussion, cussing, + * and/or flaming . + * + * Revision 1.2 2001/06/28 04:02:42 iwanttokeepanon + * Testing XEmacs and VC/CVS modes. Will this work? We shall see... + * + * Revision 1.1 2001/06/28 03:01:32 iwanttokeepanon + * A suggested standard for IJB. Outline-mode formatting and spell checking to follow. Developer comments encouraged and requested. + * + * + *********************************************************************/ + + +#include "config.h" + + ...necessary include files for us to do our work... + +const char FILENAME_h_rcs[] = FILENAME_H_VERSION; + + +@@@ Note: This declares the rcs variables that should be added to the +"show-proxy-args" page. If this is a brand new creation by you, you +are free to change the "Copyright" section to represent the rights you +wish to maintain. + +@@@ Note: The formfeed character that is present right after the +comment flower box is handy for (X|GNU)Emacs users to skip the verbige +and get to the heart of the code (via `forward-page' and +`backward-page'). Please include it if you can. + +@@@ Example for file header comments: + +#ifndef _FILENAME_H +#define _FILENAME_H +#define FILENAME_H_VERSION "$Id: STANDARDS.txt,v 1.3 2001/07/02 01:50:04 iwanttokeepanon Exp $" +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/doc/STANDARDS.txt,v $ + * + * Purpose : (Fill me in with a good description!) + * + * 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: STANDARDS.txt,v $ + * Revision 1.3 2001/07/02 01:50:04 iwanttokeepanon + * A modified STANDARDS.txt file. I removed my XEmacs test lines (commited in v1.2) + * and made the file Outline-mode compatible. I used "@" for my header lines instead + * of "*" (which interfered in some C comments). I also removed the formfeed character + * from the `outline-regexp' variable because it interfered with the "H" file header and + * the "C" file header comments. + * + * All of the "stardards points/issues" are still available for discussion, cussing, + * and/or flaming . + * + * Revision 1.2 2001/06/28 04:02:42 iwanttokeepanon + * Testing XEmacs and VC/CVS modes. Will this work? We shall see... + * + * Revision 1.1 2001/06/28 03:01:32 iwanttokeepanon + * A suggested standard for IJB. Outline-mode formatting and spell checking to follow. Developer comments encouraged and requested. + * + * + *********************************************************************/ + + +#include "project.h" + +#ifdef __cplusplus +extern "C" { +#endif + + ... function headers here ... + + +/* Revision control strings from this header and associated .c file */ +extern const char FILENAME_rcs[]; +extern const char FILENAME_h_rcs[]; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ndef _FILENAME_H */ + +/* + Local Variables: + tab-width: 3 + end: +*/ + + +@@@ Example for function comments: + +/********************************************************************* + * + * Function : FUNCTION_NAME + * + * Description : (Fill me in with a good description!) + * + * Parameters : + * 1 : param1 = pointer to an important thing + * 2 : x = pointer to something else + * + * Returns : 0 => Ok, everything else is an error. + * + *********************************************************************/ +int FUNCTION_NAME( void *param1, const char *x ) +{ + ... + return( 0 ); + +} + + +@@@ Note: If we all follow this practice, we should be able to parse +our code to create a "self-documenting" web page. + + +@ Local variables for this standards file + + + +Local variables: +mode: outline +mode: auto-fill +outline-regexp: "[@]+" +tab-width: 3 +End: diff --git a/doc/USER_DOC_IS_WIDELY_OBSOLETED b/doc/USER_DOC_IS_WIDELY_OBSOLETED new file mode 100644 index 00000000..e69de29b diff --git a/doc/changes.txt b/doc/changes.txt new file mode 100644 index 00000000..6aa14820 --- /dev/null +++ b/doc/changes.txt @@ -0,0 +1,991 @@ +This file contains details of the changes made to JunkBuster, in +chronological order. Scroll down to the bottom for the newest +additions! + + +***************************************************************************** +* Copied from old README * +***************************************************************************** + +README for the Internet Junkbuster Proxy (TM) Copyright 1997-8 Junkbusters Corp. + + Id: README,v 1.1 2001/04/16 21:10:38 rodney Exp + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +The version of the code with this makefile is Version 2.0.2. +No CHANGES file is included here; for a history of previous versions see + http://www.junkbusters.com/ht/en/ijbdist.html#previous +This version tightens security over 2.0.1; some multi-user sites will need +to change the listen-address in the configuration file (see previous URL). + +For installation on Windows see http://www.junkbusters.com/ht/en/ijbwin.html +An executable is provided so you don't need nmake or a C compiler. + +For UNIX and other systems see the FAQ. If you just want to test it with its +defaults of simply stopping cookies and private info, all you need to do now +on most Unix systems is type make, run junkbuster & and configure your browser. + +This directory should contain the following files. The .html files are also +in http://www.junkbusters.com/ht/en/ and http://internet.junkbuster.com +You are welcome to publish copies of the .html files on your local web server, +according to the GNU General Public License. + +gpl.html GNU General Public Licence +junkbstr.exe Executable (binary) for Windows 95/NT +Makefile A very bland Makefile; Most versions of Unix except HP & Suns + compile without change. Windows requires the changes indicated. +ijbman.html Manual for the Internet Junkbuster, HTML format +junkbuster.1 Manual for the Internet Junkbuster, man macro format: + man ./junkbuster.1 # or nroff -man junkbuster.1 | more +ijbfaq.html FAQ: Frequently Asked Questions on the Internet Junkbuster + Includes installation instructions +junkbstr.ini Sample configuration file with almost all options commented out +sblock.ini Sample blockfile (which doesn't really block much, see FAQ) +scookie.ini Sample cookiefile (permits little; you decide who to trust) +saclfile.ini Sample access control file (block access to everyone) +sforward.ini Sample forwardfile (does no fowarding, no gateways, so SOCKS) +strust.ini Sample trustfile (has no trusted sites and blocks nothing) +conn.c, bind.c, encode.c, loaders.c, parsers.c, ssplit.c Various utilities +socks4.c Code for SOCKS4 and SOCKS4A gateways +jcc.c The main program +jcc.h #included declarations etc +gnu_regex.c, gnu_regex.h: Regular expression code from the FSF, not us. +win32.c A few lines of code specific to the Windows version (95 & NT) +acl.c Access controls (new in version 2.0) - doesn't replace firewalls +filters.c Strings for the presentation of messages to user + +If you find that the Internet Junkbuster improves the quality of your life +online, we hope you'll visit http://www.junkbusters.com to see how our free +services can help you bust other kinds of junk out of your life: +junk mail, spam, telemarketing, and invasions of your private data. +And please tell your friends about this free product, and help them set it up. + +If your company finds this software useful in protecting its confidential +information and making its people happier and more productive, please consider +purchasing one of our our commercial support packages: + http://www.junkbusters.com/ht/en/ijbfaq.html#commercial + +We don't advertise, so please tell others in your community about us. + +Junkbusters Corp. http://www.junkbusters.com + + +***************************************************************************** +* Copied from old README.too * +***************************************************************************** + +Id: README.TOO,v 1.1 2001/04/16 21:10:38 rodney Exp + +This is the README.TOO file for Stefan's version of the Internet +Junkbuster (from http://www.waldherr.org/junkbuster/). + + + +Installation: +------------- +Install the RPM with the usual command `rpm -Uvh foobar.rpm'. Since we +run the Junkbuster as user `nobody', cd to a directory where `nobody' +has read access (in particular NOT /root) and issue (as root) + + /etc/rc.d/init.d/junkbuster start + +This will be done automagically for you any time you boot your machine. + + + +Configuration: +-------------- +To let Junkbuster take `care' of the ads, you have to setup your +browser to use the Junkbuster. + + Short instructions for the advanced user: + + Configure Netscape to use 127.0.0.1 on port 8000 as + a proxy server. + + Detailed instructions for the beginner: + + Remove Internet Explorer and install Netscape. No `real' + user would ever use MSIE. Though the Junkbuster works + with IE as well. Read + http://www.junkbusters.com/ht/en/ijbfaq.html#browser + +Check to see if the Junkbuster works correctly by surfing to + + http://127.0.0.1/show-proxy-args + +or any other place and add the text `/show-proxy-args' to the URL. +Ok? Then enjoy your ad-free surfing. + + + +Mailinglists: +------------- +In case you are interested in the Junkbuster, there are two +mailinglists (junkbuster-users and junkbuster-announce). Instructions +on how to subscribe and unsubscribe are at + + http://www.waldherr.org/junkbuster/ + +Bugs: +----- +Please fill out + + http://sourceforge.net/bugs/?func=addbug&group_id=11118 + +Patches: +-------- +Please fill out + + http://sourceforge.net/patch/?func=addpatch&group_id=11118 + +Need Help? +---------- +Please fill out + + http://sourceforge.net/support/?func=addsupport&group_id=11118 + + +Comments: +--------- +I would greatly appreciate feedback for this program. Send comments to +Stefan Waldherr (in either German or English). I +prefer plain text. If you happen to see an ad which got thru the filter +PLEASE use the `contribute' form at http://www.waldherr.org/junkbuster/. + +Have fun, +Stefan. + + +***************************************************************************** +* Copied from old README.win * +***************************************************************************** + +$Id: README.WIN,v 1.1 2001/04/16 21:10:38 rodney Exp $ + +This is the README.WIN file for the Windows version of the Internet +Junkbuster (from http://www.waldherr.org/junkbuster/). + +Installation: +------------- +Congrats, since you are reading this file, you have already unzipped +the archive correctly. + +Start the Junkbuster with `junkbstr' (i.e., click on the icon in the +ijb subdirectory). If you want to start Junkbuster automatically, +make a link to the program in the `Autostart' folder. + + + +Configuration: +-------------- +To let Junkbuster take `care' of the ads, you have to setup your +browser to use the Junkbuster. + + Short instructions for the advanced user: + + Configure Netscape to use 127.0.0.1 on port 8000 as + a proxy server. + + Detailed instructions for the beginner: + + Remove Internet Explorer and install Netscape. No `real' + user would ever use MSIE. Though the Junkbuster works + with IE as well. Read + http://www.junkbusters.com/ht/en/ijbfaq.html#browser + +Check to see if the Junkbuster works correctly by surfing to + + http://127.0.0.1/show-proxy-args + +or any other place and add the text `/show-proxy-args' to the URL. +Ok? Then enjoy your ad-free surfing. + + + +Mailinglists: +------------- +In case you are interested in the Junkbuster, there are two +mailinglists (junkbuster-users and junkbuster-announce). Instructions +on how to subscribe and unsubscribe are at + + http://www.waldherr.org/junkbuster/ + +Bugs: +----- +Please fill out + + http://sourceforge.net/bugs/?func=addbug&group_id=11118 + +Patches: +-------- +Please fill out + + http://sourceforge.net/patch/?func=addpatch&group_id=11118 + +Need Help? +---------- +Please fill out + + http://sourceforge.net/support/?func=addsupport&group_id=11118 + +Comments: +--------- +I would greatly appreciate feedback for this program. Send comments to +Stefan Waldherr (in either German or English). I +prefer plain text. If you happen to see an ad which got thru the filter +PLEASE use the `contribute' form at http://www.waldherr.org/junkbuster/. + +Have fun, +Stefan. + + +***************************************************************************** +* Copied from old README.re_filter * +***************************************************************************** + +DISCLAIMER: + This is pre-alpha code. Using it in any other way + than just reading it is a high risk activity and + the author disclaims all liability for any damage. + + See the GNU General Public License at + http://www.gnu.org/copyleft/gpl.html for details. + + +Dear alpha-Tester, + +Thank you for trying out the experimental re_filter feature of +Junkbuster. As this is still a very early pre-release version, +and I'm neither much of an autoconf or make wizard, building +the patched junkbuster involves some manual work, that is +described below. Please also see the Request for Thoughts section, +as the whole point of this pre-release ist to collect ideas for +improvement and bug reports. + + +INSTALLATION: + + - Get and install pcre from + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ + Version 3.1 or any later one will do. I recommend 3.4. + It *should* install on Win32 as well, but I haven't tried + that. Don't forget to run ldconfig afterwards. + + - Now you have two options: + + A) Install pcrs as a shared library: + pcrs.c and pcrs.h are included in the (patched) ijb subdirectory. + 1.) patch Makefile < Makefile.re_shared.diff + 2.) gcc -Wall -fPIC -c pcrs.c + 3.) gcc -shared -Wl,-soname,libpcrs.so.1 -o libpcrs.so.1.0.1 pcrs.o -lc -lpcre + If this worked OK, + 4.) copy libpcrs.so.1.0.1 to /usr/local/lib + 5.) ln -s /usr/local/lib/libpcrs.1.0.1 /usr/local/lib/libpcrs.so + 6.) ldconfig (Or whatever the equivalent on your platform might be) + 7.) cp pcrs.h /usr/local/include + + OR + + B) Incorporate pcrs into the junkbuster (much easier): + Smile and relax. You're done. + + - Edit the provided re_filterfile to suit your needs and place it + with the rest of junkbusters configfiles. + + - Now junkbuster should build with a simple 'make'. + Note: Setting debug = REF in jcc.c will enable debugging + for the re_filter. + + - Include a line "re_filterfile " in your junkbuster + config file, pointing at the re_filterfile + + - (Optional:) Include a line "re_filter_all" in the config + file. This will set the Policy to filter content from all sites. + Default is to filter only from sites that you wouldn't send a + cookie either. + + - Fire up junkbuster. + +HOW IT WORKS: + + Nah, not tonight anymore ;-) + +REQUEST FOR THOUGHTS: + + - The main decision is whether to filter on-the-fly or to buffer + up the whole document and then run the filter on it. I've built + both versions and currently prefer buffering. + + The advantage of on-the-fly-filtering is obviously that the + document begins to display before it's fully loaded. The big + disadvantage is that with arbitraty content altering in place, + you don't know the size that the document will have after + altering when the Content-Length Header is to be sent. Only + option is to chew it altogether. + + Apart from preserving the ability to generate a valid Content-Length + header (which the patch currently does not yet do), buffering up + the document has some advantages from the filtering point of view: + + - Reliability. Patterns in the document cannot be ripped apart + and are reliably found. (If you look at the document fragment-wise + while it's being transmitted, you miss any pattern that spans + a fragment border) This is especially bad for patterns that do + serious HTML reformatting, as fragments are typically in the order + of 1500 bytes each. + + - Flexibility: The re_filter gives you the choice whether you want + to replace only the pattern's first occurance or replace it globally. + This becomes meningless with fragments. (Solution possible, though.) + + As the filter only processes objects of MIME type text/*, which are typically + rather small compared to binary multimedia (sic) type data, I don't think + that the disadvantage of delayed display of the first bytes is really grave. + + What do you think? + + - Is the choice between a radical (filter all) and semi-smart (filter only when + also crunching cookies) flexible enough? Should I really introduce yet another + configfile for specifying the domains to filter content from? Would anyone use + that? + + - Should I use pcre as a shared library and work out a nice installation + automagic, or should the relevant functions be incorporated in re_filter.c? + + - Even if yes, do we really want an extension that relies on an external library + like pcre? + + - Any bugs, stupid parts in the code ? + + - Cool suggestions for the re_filterfile? (PLEASE!) + + - Should character set translation along the lines of Perl's 'tr' operator + be included? + + - Is the whole feature just pathetic? + +FEEDBACK: + + A whole lot of work has gone into this feature (the pcrs code was also + just written for this) and I'd really like to know if and how you like + it. Since I'm more of a perl than C programmer (and after doing so much + string manipulation in C I'm once again glad abaout that!), I'm sure there + is much to improve. Please send any suggestions/observations/hellos to + oes@paradis.rhein.de. I would also be very glad about any assistance for + a autoconf/make procedure for prcs. + +Well, have fun! +--Andreas + + +***************************************************************************** +* Copied from old README.cygwin * +***************************************************************************** + +Id: README.cygwin,v 1.2 2001/04/29 23:16:29 rodney Exp + + +What I did: I saw too many "personalities" in IJB; so I +ran the code through a couple of regexp's and then let XEmacs +reformat the whole shebang! The results is a uniform +looking code base; aka. as if 1 person created the whole +project. + +Why I did it: (1) it is easier to maintain (2) easier for +a new person to make changes/additions (3) it *looks* more +professional (4) IMHO, it is easier to read (this is very +much a personal preference). + +What I propose: A IJB standards list be included in the +distro and all source/patch checkins be checked for +compliance. We don't need to be an arse on this point, but +submitters should make a valiant attempt to support the +standards. + +Note: do not even try to diff my code with another code +base, you will be overwhelmed. After all, the regexps did a +good bit of changing and XEmacs reformatter did a great deal +more. + +One more note: these changes include conditional compilation for +un?x (namely Linux), cygwin (un?x like compile for WIN32), and +mingw32 (WIN32 like compilation w/o VC++). Right now, all seems +fully functional except cygwin. The cygwin compile will work, +but includes code to make it single threaded. I need to debug +the fork issues, but that will have to come later. + + +Specific changes to expect: + + +1: I've majorly reworked the Makefiles. The existing Makefile was +too *spaghetti* for me! For one, I eliminated the "-I." from the +include path (ugly). Use #include "" for local directory files +and #include <> for path found files (that's basic even to c). + + +2: In accordance with #1, I changed #include "windows.h" to +#include and #include to #include +"gnu_regex.h". + + +3: As part of my standards suggestions (to come later in this +file), I added a standard comment block to every function. There +were too many functions with *no* comment and about 20 different +styles to those that did. This is an example of the block I used: +/********************************************************************* + * + * Function : block_acl + * + * Description : Block this request? + * Decide yes or no based on ACL file. + * + * Parameters : + * 1 : src = Address the browser/user agent is requesting. + * 2 : dst = The proxy or gateway address this is going to. + * 3 : csp = Current client state (buffers, headers, etc...) + * + * Returns : 0 = FALSE (don't block) and 1 = TRUE (do block) + * + *********************************************************************/ + + +4: Some files prototyped like this: + void + func(param1) + int param1; + { + } +and other like this: + void func(int param1) + { + } +I made all look like the second. + + +5: Made: + if( to be if ( + while( to be while ( + switch( to be switch ( + etc ... +The former looks too much like a function call. + + +6: Put braces on their own line and aligned under the +reserved word: + if () { + } else { + } +to be: + if () + { + } + else + { + } +The same for while, do, etc... + + +7: Casted malloc in several places, e.g.: + p = malloc(n); +to be: + p = (char *)malloc(n); +This eliminates compiler warnings. + + +8: Applied the Perl regexp patch and made it fully conditionally +compiled (-DPCRS=TRUE). + + +9: It *appears* that if MINGW32 sees a "main" function, it will +try to link it and start with main (ala console mode). Since I +need MINGW32 to find WinMain instead, I conditionally changed +"main" to "_main" (for MINGW32 only!). + + +10: Changed popup.c to be killpopup.c. This was necessary to +clean up the Makefile. Since there was an ini type file called +"popup" and "popup.c", make got confused on target names. No +other ini file has a .c file with the same name, so I hope this +isn't a big deal. Plus, it fits its config variable +(kill_all_popups) much better. + + +11: Added: + /* + Local Variables: + tab-width: 3 + end: + */ +to all .c and .h files. I use 3 character tabs and this will make +the files display correctly in Emacs editors. This is just my +default setting. Perhaps I will filter all files via "expand +-t3", so not to pi$$ everyone off. Vi is capable of using 3 +character tabs, as I am sure VC++ would be. + + +12: Several places included regexp code with out "#ifdef REGEX" +which broke the ability to compile w/o regexp's. I fixed the code +and can compile w/o regexp (which I don't normally do, but now I +*can*). + + +13: In WinMain, changed: + pszLastTok = strchr(pszLastTok, ' '); +to be: + pszLastTok = strchr(pszLastTok+1, ' '); +The former causes an infinite loop with 2 or more parameters. + + +14: Added my own strdup for Cygwin, see jcc.c for why. + + +15: Added defines in the Makefile and this to jcc.h: + #define VERSION VERSION_MAJOR "." VERSION_MINOR "." VERSION_POINT +This makes "update the numbers also in jcc.h manually" unnecessary +(see your Makefile for this quote). + + +16: Split the "inifiles" target in Makefile into separate targets, +this way each file can be regenerated individually according to +the same implicit rule. + + +17: With the Makefile restructure, I can only provide for +Cygwin/gcc. Hopefully this is a bit cleaner and others can add +their compilers w/o re-spaghetting the file. I have provided +several makefiles as examples only, I do not intend for the +project to start maintaining multiple Makefiles. Perhaps some of +the platform specific Makefile code could be split out into +separate files and we could use the "include" directive to read in +the correct one. + +Better than this, let's get a configure.in guru on the project and +dynamically create the Makefiles! + + +18: In an effort to get this to market (you knew this was coming +eh?), I am going to put the standards suggestions in another file +and ship this one as is. But then, you can probably guess most of +the standards by the changes you see. + + +19: Added a really quick and dirty "install" target to the +Makefile. This needs to be cleaned up and proper directories put +in for each platform. + + +-- release 1 (obsoleted) -- + + +20: Incorporated the TOGGLE and webDAV support patches into my +Cygwin patch. I added conditional compilation to both features. +I changed "extern BOOL g_bToggleIJB;" to be of type "int". This +makes jcc.h independent of "windows.h". The inclusion of such +should not (and is not) necessary for compilation on all +platforms. Besides, BOOL is really only a char or an int anyway! + + +21: Added a new ini! I modified the usual un?x type config file +to M$ type ini file for a Perl regexp compile. This was necessary +to call EditFile on the Perl regexp config file. The new ini +filename is "sregexp.ini" (naturally). I then added menu items to +edit the popup.ini and sregexp.ini files. + + +22: I made "dot h" files for all the "dot c" files. I used this +command to do the *dirty* work: + grep -e "^[A-z]" *.c | sed -e "/=/d" -e "/^[^(]*$/d" \ + -e "/^extern/d" -e "/^static/d" -e "/;$/d" + +And I made each "dot h" file be immune to multiple inclusion via +conditional compilation. Ie. the "jcc.h" file will only include +itself if _JCC_H is undefined. + +After this was done, I compiled the project source by source and +let the compiler tell me what each file was dependent on. Once I +got all the objects to compile, I included the new dependencies in +the Makefiles. + +BTW, I intend to get the Makefile to be generated by a configure +script. Whether this is a GNU "configure.in" type file or a shell +script, I do not know. All I do know is that this is a must for a +"Go/No go" type decision. We cannot proceed with the philosophy +"leave it up to the user to get it to work". + + +23: I broke out the code to load the config file from main. I put +this code into a function called load_config. I made this routine +be called from a signal "HUP". This means we can restart +junkbusters from the command line or from the daemon script via +"restart" without actually killing it and restarting it. This is +common behavior to un?x daemons (see inetd for example). I fixed +the junkbusters.init script to take advantage of this. I intend +to make a M$ menu complement to this as soon as I can. + + +24: BTW, if you have not already noticed by my postings and/or +code, I have added patches and made them all conditionally +compiled. Ie. #ifdef TOGGLE, #ifdef WEBDAV, #ifdef PCRS, etc... +I think that all extensions to IJB should be submitted in this +way. Not only can you compile IJB to be as "tight" as you want, +it also gives the user a "smorgasbord" of options to +choose from. This is quite common in the free software world (you +need look no farther than emacs to see this) and provides maximum +flexibility. + + +25: As promised, I obsoleted the "ijbw32.ini" file. I was a bit +confused by the "close-behaviour=1" entry. It seems to me that it +duplicated the "close-button-minimizes=1" entry. And (by looking +at the code) it was unused. Anyway, I eliminated the "ijbw32.ini" +file and assimilated the settings into the config file. Bye Bye +"ijbw32.ini", hello "config" (aka. don't unnecessarily duplicate +files and/or data types). + + +26: Eliminated re_filter.c. This only defined +(un)load_re_filterfile and re_process_buffer. I moved +(un)load_re_filterfile to loaders.c and re_process_buffer to +filters.c. I also modified the Makefiles to reflect this. In the +doing, I modified the loader and unloader to use the "files" +variable and moved joblist to "re_filterfile_spec" struct. I +added "plist" to the client_state so that all Perl regexp code +could find the latest parsing of the re_filterfile ini. + +This is in keeping with the IJB data structures philosophies. + + +27: Eliminated acl.c. This (as pcre) only defined +(un)load_aclfile and block_acl. I moved (un)load_aclfile to +loaders.c and block_acl to filters.c. I also modified the +Makefiles to reflect this. + + +28: Since I created "dot h" files for all the "dot c" files, I +eliminated all the "extern ...variable;" and all the "extern +...function;" statements that I could find in the "dot c" files. +Instead, I included the proper "dot h" files to do this for us. + + +29: Corrected the "install" Makefile target for un?x. I will do +the same for WIN32 targets. + + +30: Note on the "TOGGLE" patch: since I made IJB fully restartable +via a NOHUP signal; I thought the TOGGLE patch should apply to +both un?x and WIN32. Thus, I eliminated the WIN32 dependencies in +that patch and added "toggle" to the config file. Now everything +works fine for either platform. Still to come is a restart menu +command in WIN32 (See: note 23). + + +31: Just a possible programmer note, we REALLY need a generic +linked list module. Since text lists, client states, filter +files, etc... implement list creation and destruction over and +over; I suggest a generic list that can handle *any* type of list +(ala template classes in C++). If this module included an +iterator (of sorts), we could eliminate the myriad of "for ( top=x; +NULL != x->next; x=x->next )" type statements that are all over +IJB. + +After all, this was taught in the basic "Intro to Data Types" +class (for all you CS majors). + + +32: Renamed all of the .INI files to be .TXT files. I did this +because the .INI files were NOT *really* ini files; which +potentially be confusing. I used the .TXT extension to make sure +that EditFile still worked. + + +33: Removed the "initialed comments", such as "/* swa */". This +leads to less readable code (because it becomes fragmented) and +retains the "multiple personality" syndrome. Comments such as +this can always be figured out from the versioning system. Also, +these comments really should be pooled in one place : the README +files. + + +34: Perhaps we should break with the current versioning tactic of +a "tail version" and start fresh. Perhaps a new major version +release is in order? Version = 3.0.0? + + +35: Added a "Accept-Encoding: gzip" cruncher. If a stream is +compressed via gzip (Netscape specific I think), then it cannot +be modified with Perl regexps. So I added this as an option in +the Makefiles. + + +36: As promised in one of my postings, I have make a +configure-esk script to generate the Makefiles. I would still +like to have a full blown configure.in compatible system, but this +will do in the meantime. Note: this configure script covers +linux, cygwin, and mingw32. At this point I do not have VC++ to +test any of my changes. But the configure script should be +flexible enough to handle this platform. + + +-- + +Please give any feedback to the ijb egroups and, if you feel you +need quicker contact, CC me at IwantToKeepAnon@yahoo.com + +Let me say once more, this has a *lot* of changes and may (aka +WILL) break a lot of existing patches. But I hope the "idea" will +catch on. Perhaps this could be made the baseline code base and +other patches added and standardized later. + +***************************************************************************** +* Date: 7 May 2001 * +* Version: ?? * +* Description: Changes for MS Visual C++ * +* Author: Jon Foster * +***************************************************************************** +(Based on Stromlund's version 0.20) + +I have made several changes to make this compile under VC++ 97, and add new +features. + +Code changes: + +1) If you disable IJB (using the TOGGLE patch) it now turns PCRS off. +2) "Missing function prototype" warnings have been corrected by adding + appropriate #include statements +3) The _DIST_URL define removed and hardcoded. There are hardcoded URLs all + over the place that need fixing - one more doesn't matter. We do really + need to come up with a long-term solution though. (Suggestion: Host a + redirector on the SourceForge web space. e.g + "http://ijbswa.sourceforge.net/redirect.php?ver=2.0.2-10&target=faq", + "http://ijbswa.sourceforge.net/redirect.php?ver=2.0.2-10&target=download", + etc. This allows us to move the pages around easily, and the SourceForge + space can be maintained by anyone who's interested, it's not tied to a + particular individual. This is similar to the approach taken by + Microsoft and Netscape in their browsers.) +4) New file ijbconfig.h is #included everywhere. This provides me with a + place to define VERSION, PCRS, etc. You can still define VERSION_xxx + on the command line, but the other defines are in the header file. + There were just too many #defines - so many that the VC++ 97 IDE + broke when I tried to define them on the command line. We probably + should fix the configure script so that it modifies this file. +5) Deleted empty file afxres.h - we needed to use the VC++ system header + file of that name. However, it's easier to just delete it and put + the relevent #defines in w32res.h. +6) New #define: NO_PROGRAM_NAME_DISPLAY uses "IJB" as the program name in + the log file instead of "H:\Documents and Settings\Administrator\My + Documents\Prog\VC\ijb2\Release\junkbuter.exe" or similar. The reason + for this should be obvious! +7) New #define: STATISTICS enables the statistics feature +8) Statistics is thread-safe, I think. However, loading up the + statistics page now counts as a blocked request. +9) New, shorter message if a setting in the config file is recognised + but unsupported by the current build. It doesn't have "WARNING:" in + front of it either. We may want to actually take this message out + and have it just silently ignore these entries. +10) New feature: #define SPLIT_PROXY_ARGS and the show-proxy-settings + page will split each file out to a seperate page. This is + because the files are quite big, and having to do 1 extra click to + get to them is no problem. This #define also disables the + suppress_blocklists feature (because I believe the original intent + of suppress_blocklists was similar?). It also saves memory by + reading the config files to generate the HTML on the fly, rather + than storing prepared HTML constantly in memory. +11) Marked global constants with "const" attribute. This has a + knock-on effect on pointers in function prototypes, so these have + also been marked const where needed. +12) Rewrote encode.c to have tables pre-initialized, so it can be + marked constant. Also split into 3 distinct functions so that + the tables (which are realy an implementation detail) are not + visible outside that file. +13) Changes to how files are reloaded when you reload the config + file. Previous method didn't free memory (or if you uncommented + the free() calls, it was not thread-safe.) It is now handled + automatically - files are reloaded whenever the filename to + read changes, or the file's timestamp changes. The code in + loaders.c which handles this test has been moved to a single + utility function. +14) killpopup changes: + * Only compiled if you #define KILLPOPUPS + * Call to filter_popups() moved from read_socket() to chat(). + * Writing 1 past end of buffer bug fixed. + * It was scanning the whole buffer even if only partially filled. + * Moved load/unload to loaders.c and changed file handling to + follow standard. +15) Auto-detect whether we want an image or HTML implemented for + Microsoft IE. :-) + There doesn't seem to be a way to tell with the latest build + of Mozilla. :-( +16) Image file code conditionally compiled. +17) Provided option (SPLIT_PROXY_ARGS) to split the show-proxy-args + page into a main page, and then a page for each config file. + This option will also save memory by loading the files when + required for display, rather than saving them in memory when + they are initially loaded. +18) Force page loading ("noijb.") patch applied. #define FORCE_LOAD + + +Packaging changes: + +1) PCRE 3.4 (less it's test and demo programs) is now included in the + pcre directory. It will be statically linked with Junkbuster. (On + win32, DLLs cause a lot of hassle - with a library this small it isn't + worth it. I don't know if it would be better to dynamically link under + UNIX?) +2) junkbustr.dsp and junkbustr.dsw VC++97 project and workspace files are + included. +3) win32build/junkbustr.exe Win32 binary is included. It should not require + any DLLs. It was compiled with all features supported. +4) All README.xyz files put together in this file. +5) Unused files (acl.c, pthread.c, ...) deleted. +6) My block & cookie files used (based on the Waldherr ones). + +Known bug: The Adobe Acrobat 4 plug-in fails when I try to view PDF files in +MSIE. Workaround: disable "web browser integration" in the Adobe Acrobat +settings. + +***************************************************************************** +* Date: 14 May 2001 (early morning) * +* Version: Reported as 2.9.0 * +* Description: Various updates * +* Author: Jon Foster * +***************************************************************************** + +1) Now use PCRE, not GNU REGEX. I have not yet had chance to check the + syntax of the block/image/cookie file to ensure that they match what + is expected - however they seem to work. +2) Replaced "configure" script with one generated by "autoconf". Also + use a header "config.h" (was ijbconfig.h in my previous release) for + the #defines. "config.h" is now generated with "autoheader" from + "acconfig.h" and "configure.in". (Note that to install you do not + need autoconf or autoheader - just run "./configure".) + To see command-line options, run "./configure --help". + This is my first ever autoconf script, so it has some rough edges + (how PCRE is handled is the roughest). +3) Error logging code replaced with new module errlog.c, based on the + one from JunkBusterMT (but with the threading code removed). +4) Most of Rodney's 0.21 and 0.21A patches applied. (Marked *). I did not + apply all of these, since I had already independently done conditional + popup file, conditional image file, and integration of popup code. +5*) ACL, Jar and trust files conditionally compiled. +6*) New source file headers. +7*) Various cosmetic changes. (But I have not consistently ordered the + config files - I think that's worthwhile, but it's 1am and I want to + get this released!) +8*) RCS tags on .h files. +9) RCS tags are const char[] rather than const char *. (Saves 4 bytes + per tag ;-) +10) VC++ project files renamed to vc_junkbuster.*. +11) show-proxy-args now shows status of all conditionals, not just REGEX +12) Various functions moved around. Most notably all the system-specific + sockets code which was spread between jcc.c, bind.c, and connect.c, + has been moved to "jbsockets.c". The non-system-specific code from + connect.c and socks4.c has been movet to "gateway.c". Also, the + config file loader and the global variables it writes to have been + moved to "loadcfg.c". (Maybe this should go into loaders.c?) + And candidate for the "worst filename ever" award is "miscutil.c", + which contains, well, miscellaneous utility functions like zalloc. + (Suggestions for a better name for this file are welcome!) +13) Loaders now use a common function to read a line and skip comments, + and this function also stores the proxy_args. +14) Added ./junkbuster --help (Not for Win32 GUI) +15) Added ./junkbuster --version (Not for Win32 GUI) +16) Win32 resources are now all marked as "U.S. English", rather than + being a mix of "U.S. English", "U.K. English" and "Irish English". +17) Version number changes to 2.9.0 + +Known bugs: +- See (1) above about blockfiles. +- Sending SIGHUP (under Red Hat Linux 7.1) causes a crash. v0.21A hangs + after a SIGHUP. This needs investigating, but pthreads support will + almost certainly help here, so it may not be worth investigating + immediately. +- Compiling with shared system pcre and pcreposix libraries is supported + via a switch to configure, but completely untested. + +Please note that there are now 2^14 == 16384 combinations of conditional +defines, and 4 major compilers (VC, Linux, mingw32, cygwin) for a total +of 65536 different builds. We cannot possibly test all of them! My +standard build is "everything on", and I've tested that on each compiler, +along with a few variants. You may uncover new bugs (probably compiler +errors) if you use an exotic combination of switches. + +***************************************************************************** +* Date: 14 May 2001 * +* Version: 2.9.1 * +* Description: Various updates * +* Author: Andreas S. Oesterhelt * +***************************************************************************** +(From his e-mail:) + + - in parsers.c, fixed two #ifdef FORCE to #ifdef FORCE_LOAD + (BTW: I think FORCE is precise enough, since loading remote + data is the whole purpose of a proxy..) + - Set the FORCE_PREFIX (back) to 'IJB-FORCE-LOAD-'. While 'noijb.' + is more elegant and looks like a hostname in the URL, it doesn't + make clear to the inexperienced user that the proxy is bypassed. It + also has a higher name collision risk. + - Filled in the function header templates for my functions in + parsers.c (again). They obviously got lost in our current + patch war ;-) + - Cut the credit for the §-referrer-option from the config file, + that Stefan had placed there. + - Improved the re_filterfile + +***************************************************************************** +* Date: 14 May 2001 * +* Version: 2.9.2 * +* Description: FORCE patch (again!) * +* Author: Andreas S. Oesterhelt * +***************************************************************************** +(These notes written by Jon) + +- Andreas applied the latest version of the FORCE patch. + +***************************************************************************** +* Date: 14 May 2001 (late afternoon) * +* Version: 2.9.3 * +* Description: Various updates * +* Author: Jon Foster * +***************************************************************************** + +1) Incorporated updates from current CVS tree, including: + - Amiga support (completely untested by me - I don't have an Amiga) + - "tinygif 3" support (redirects blocked images to a specified URL, so + the browser doesn't have to load and cache many copies of the same + image). + - one case where there were both local and global "referrer" variables + (yuck!) clarified by renaming the local one to "refer". + - Fixed some places where close() was used instead of close_socket(). + Thanks to Jörg Strohmayer (joergs at users.sourceforge.net) for these. +2) Temporary hack to get FORCE_LOAD to work with IE. I just lowercased the + FORCE_LOAD_PREFIX. Needs fixing properly. +3) Most URLs hardcoded into JunkBuster were changed to go through a script + e.g. http://ijbswa.sourceforge.net/redirect.php?v=2.9.3&to=faq + The only other URLs left are the GNU GPL: + http://www.fsf.org/copyleft/gpl.html + and the home page: + http://ijbswa.sourceforge.net/ + ... and various URLs which will be intercepted by JunkBuster anyway. + TODO: Still need to do something with the URLs in JunkBuster Corp's + copyright/trademark notice on the bottom of the show-proxy-args page. +4) PCRE or GNU Regex is now a #define option. + +***************************************************************************** +* End of file * +***************************************************************************** + diff --git a/doc/obsolete/fb.gif b/doc/fb.gif similarity index 100% rename from doc/obsolete/fb.gif rename to doc/fb.gif diff --git a/doc/gpl.html b/doc/gpl.html index 7c252b5b..c980e61f 100644 --- a/doc/gpl.html +++ b/doc/gpl.html @@ -1,5 +1,5 @@ - - -
    - - Privoxy Developer Manual - - $Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $ - - - - - By: Privoxy Developers - - - - - - - The developer manual gives the users information on how to help the developer - team. It provides guidance on coding, testing, documentation and other - issues. - - - - Privoxy is a web proxy with advanced filtering - capabilities for protecting privacy, filtering web page content, managing - cookies, controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very - flexible configuration and can be customized to suit individual needs and - tastes. Privoxy has application for both - stand-alone systems and multi-user networks. - - - - Privoxy is based on the code of the - Internet Junkbuster. - Junkbuster was originally written by JunkBusters - Corporation, and was released as free open-source software under the GNU GPL. - Stefan Waldherr made many improvements, and started the SourceForge project - to continue development. Other developers have since joined Stefan. - - - - You can find the latest version of the user manual at http://www.privoxy.org/developer-manual/. - Please see the Contact section in the user-manual if you want to contact the - developers. - - - - - - - - - - - Introduction - To be filled. - - - - - Quickstart to Privoxy Development - -You'll need an account on Sourceforge to support our development. Mail you ID -to the list and wait until a project manager has added you. - -For the time beeing (read, this section is under construction), please note the -following guidelines for changing stuff in the code. If it is - - - A bugfix / clean-up / cosmetic thing: shoot - - - A new feature that can be turned off: shoot - - - A clear improvement w/o side effects on other parts of the code: shoot - - - A matter of taste: ask the list - - - A major redesign of some part of the code: ask the list - - - - - - - Documentation Guidelines - - All docs are in SGML format and located in the doc/source directory. - - - How do you update the webserver (i.e. the pages on sourceforge)? - - - Run make dok (which uses the documents in doc/source to update all - text files in doc/text and to update -all web documents in doc/webserver. - - - Run make webserver which copies all files from -doc/webserver to the sourceforge webserver -via scp. - - - - - - - - - - Coding Guidelines - - Introduction - - This set of standards is designed to make our lives easier. It is - developed with the simple goal of helping us keep the "new and improved - Privoxy" consistent and reliable. Thus making - maintenance easier and increasing chances of success of the - project. - - And that of course comes back to us as individuals. If we can - increase our development and product efficiencies then we can solve more - of the request for changes/improvements and in general feel good about - ourselves. ;-> - - - - Using Comments - - - Comment, Comment, Comment - - Explanation: - - Comment as much as possible without commenting the obvious. - For example do not comment "aVariable is equal to bVariable". - Instead explain why aVariable should be equal to the bVariable. - Just because a person can read code does not mean they will - understand why or what is being done. A reader may spend a lot - more time figuring out what is going on when a simple comment - or explanation would have prevented the extra research. Please - help your brother IJB'ers out! - - The comments will also help justify the intent of the code. - If the comment describes something different than what the code - is doing then maybe a programming error is occurring. - - Example: - -/* if page size greater than 1k ... */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -/* if page size is small, send it in blocks */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -This demonstrates 2 cases of "what not to do". The first is a -"syntax comment". The second is a comment that does not fit what -is actually being done. - - - - - - Use blocks for comments - - Explanation: - - Comments can help or they can clutter. They help when they - are differentiated from the code they describe. One line - comments do not offer effective separation between the comment - and the code. Block identifiers do, by surrounding the code - with a clear, definable pattern. - - Example: - -/********************************************************************* - * This will stand out clearly in your code! - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -/* unfortunately, this may not */ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -if ( thisVariable == thatVariable ) /* this may not either */ -{ - DoSomethingVeryImportant(); -} - - Exception: - - If you are trying to add a small logic comment and do not - wish to "disrubt" the flow of the code, feel free to use a 1 - line comment which is NOT on the same line as the code. - - - - - - Keep Comments on their own line - - Explanation: - - It goes back to the question of readability. If the comment - is on the same line as the code it will be harder to read than - the comment that is on its own line. - - There are three exceptions to this rule, which should be - violated freely and often: during the definition of variables, - at the end of closing braces, when used to comment - parameters. - - Example: - -/********************************************************************* - * This will stand out clearly in your code, - * But the second example won't. - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - -if ( thisVariable == thatVariable ) /*can you see me?*/ -{ - DoSomethingVeryImportant(); /*not easily*/ -} - - -/********************************************************************* - * But, the encouraged exceptions: - *********************************************************************/ -int urls_read = 0; /* # of urls read + rejected */ -int urls_rejected = 0; /* # of urls rejected */ - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); -} - - -short DoSomethingVeryImportant( - short firstparam, /* represents something */ - short nextparam /* represents something else */ ) -{ - ...code here... - -} /* -END- DoSomethingVeryImportant */ - - - - - Comment each logical step - - Explanation: - - Logical steps should be commented to help others follow the - intent of the written code and comments will make the code more - readable. - - If you have 25 lines of code without a comment, you should - probably go back into it to see where you forgot to put - one. - - Most "for", "while", "do", etc... loops _probably_ need a - comment. After all, these are usually major logic - containers. - - - - - - Comment All Functions Thoroughly - - Explanation: - - A reader of the code should be able to look at the comments - just prior to the beginning of a function and discern the - reason for its existence and the consequences of using it. The - reader should not have to read through the code to determine if - a given function is safe for a desired use. The proper - information thoroughly presented at the introduction of a - function not only saves time for subsequent maintenance or - debugging, it more importantly aids in code reuse by allowing a - user to determine the safety and applicability of any function - for the problem at hand. As a result of such benefits, all - functions should contain the information presented in the - addendum section of this document. - - - - - - Comment at the end of braces if the - content is more than one screen length - - Explanation: - - Each closing brace should be followed on the same line by a - comment that describes the origination of the brace if the - original brace is off of the screen, or otherwise far away from - the closing brace. This will simplify the debugging, - maintenance, and readability of the code. - - As a suggestion , use the following flags to make the - comment and its brace more readable: - - use following a closing brace: } /* -END- if() or while () - or etc... */ - - Example: - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if x is 1 */ - -or: - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if ( 1 == X ) */ - - - - - - Naming Conventions - - - - Variable Names - - Explanation: - - Use all lowercase, and seperate words via an underscore - ('_'). Do not start an identifier with an underscore. (ANSI C - reserves these for use by the compiler and system headers.) Do - not use identifiers which are reserved in ANSI C++. (E.g. - template, class, true, false, ...). This is in case we ever - decide to port Privoxy to C++. - - Example: - -int ms_iis5_hack = 0; - - Instead of: - - - -int msiis5hack = 0; int msIis5Hack = 0; - - - - - - - - Function Names - - Explanation: - - Use all lowercase, and seperate words via an underscore - ('_'). Do not start an identifier with an underscore. (ANSI C - reserves these for use by the compiler and system headers.) Do - not use identifiers which are reserved in ANSI C++. (E.g. - template, class, true, false, ...). This is in case we ever - decide to port Privoxy to C++. - - Example: - -int load_some_file( struct client_state *csp ) - - Instead of: - - - -int loadsomefile( struct client_state *csp ) -int loadSomeFile( struct client_state *csp ) - - - - - - - - Header file prototypes - - Explanation: - - Use a descriptive parameter name in the function prototype - in header files. Use the same parameter name in the header file - that you use in the c file. - - Example: - -(.h) extern int load_aclfile( struct client_state *csp ); -(.c) int load_aclfile( struct client_state *csp ) - - Instead of: - -(.h) extern int load_aclfile( struct client_state * ); or -(.h) extern int load_aclfile(); -(.c) int load_aclfile( struct client_state *csp ) - - - - - - - - Enumerations, and #defines - - Explanation: - - Use all capital letters, with underscores between words. Do - not start an identifier with an underscore. (ANSI C reserves - these for use by the compiler and system headers.) - - Example: - -(enumeration) : enum Boolean { FALSE, TRUE }; -(#define) : #define DEFAULT_SIZE 100; - - Note: We have a standard naming scheme for #defines - that toggle a feature in the preprocessor: FEATURE_>, where - > is a short (preferably 1 or 2 word) description. - - Example: - -#define FEATURE_FORCE 1 - -#ifdef FEATURE_FORCE -#define FORCE_PREFIX blah -#endif /* def FEATURE_FORCE */ - - - - - Constants - - Explanation: - - Spell common words out entirely (do not remove vowels). - - Use only widely-known domain acronyms and abbreviations. - Capitalize all letters of an acronym. - - Use underscore (_) to separate adjacent acronyms and - abbreviations. Never terminate a name with an underscore. - - Example: - -#define USE_IMAGE_LIST 1 - - Instead of: - - - -#define USE_IMG_LST 1 or -#define _USE_IMAGE_LIST 1 or -#define USE_IMAGE_LIST_ 1 or -#define use_image_list 1 or -#define UseImageList 1 - - - - - - - - - - Using Space - - - - Put braces on a line by themselves. - - Explanation: - - The brace needs to be on a line all by itself, not at the - end of the statement. Curly braces should line up with the - construct that they're associated with. This practice makes it - easier to identify the opening and closing braces for a - block. - - Example: - -if ( this == that ) -{ - ... -} - - Instead of: - - if ( this == that ) { ... } - - or - - if ( this == that ) { ... } - - Note: In the special case that the if-statement is - inside a loop, and it is trivial, i.e. it tests for a - condidtion that is obvious from the purpose of the block, - one-liners as above may optically preserve the loop structure - and make it easier to read. - - Status: developer-discrection. - - Example exception: - -while ( more lines are read ) -{ - /* Please document what is/is not a comment line here */ - if ( it's a comment ) continue; - - do_something( line ); -} - - - - - ALL control statements should have a - block - - Explanation: - - Using braces to make a block will make your code more - readable and less prone to error. All control statements should - have a block defined. - - Example: - -if ( this == that ) -{ - DoSomething(); - DoSomethingElse(); -} - - Instead of: - - if ( this == that ) DoSomething(); DoSomethingElse(); - - or - - if ( this == that ) DoSomething(); - - Note: The first example in "Instead of" will execute - in a manner other than that which the developer desired (per - indentation). Using code braces would have prevented this - "feature". The "explanation" and "exception" from the point - above also applies. - - - - - - Do not belabor/blow-up boolean - expressions - - Example: - -structure->flag = ( condition ); - - Instead of: - - if ( condition ) { structure->flag = 1; } else { - structure->flag = 0; } - - Note: The former is readable and consice. The later - is wordy and inefficient. Please assume that any developer new - to the project has at least a "good" knowledge of C/C++. (Hope - I do not offend by that last comment ... 8-) - - - - - - Use white space freely because it is - free - - Explanation: - - Make it readable. The notable exception to using white space - freely is listed in the next guideline. - - Example: - -int firstValue = 0; -int someValue = 0; -int anotherValue = 0; -int thisVariable = 0; - -if ( thisVariable == thatVariable ) - -firstValue = oldValue + ( ( someValue - anotherValue ) - whatever ) - - - - - Don't use white space around structure - operators - - Explanation: - - - structure pointer operator ( "->" ) - member operator ( - "." ) - functions and parentheses - - It is a general coding practice to put pointers, references, - and function parentheses next to names. With spaces, the - connection between the object and variable/function name is not - as clear. - - Example: - -aStruct->aMember; -aStruct.aMember; -FunctionName(); - - Instead of: aStruct -> aMember; aStruct . aMember; - FunctionName (); - - - - - - Make the last brace of a function stand - out - - Example: - -int function1( ... ) -{ - ...code... - return( retCode ); - -} /* -END- function1 */ - - -int function2( ... ) -{ -} /* -END- function2 */ - - - Instead of: - - int function1( ... ) { ...code... return( retCode ); } int - function2( ... ) { } - - Note: Use 1 blank line before the closing brace and 2 - lines afterwards. This makes the end of function standout to - the most casual viewer. Although function comments help - seperate functions, this is still a good coding practice. In - fact, I follow these rules when using blocks in "for", "while", - "do" loops, and long if {} statements too. After all whitespace - is free! - - Status: developer-discrection on the number of blank - lines. Enforced is the end of function comments. - - - - - - Use 3 character indentions - - Explanation: - - If some use 8 character TABs and some use 3 character TABs, - the code can look *very* ragged. So use 3 character indentions - only. If you like to use TABs, pass your code through a filter - such as "expand -t3" before checking in your code. - - Example: - -static const char * const url_code_map[256] = -{ - NULL, ... -}; - - -int function1( ... ) -{ - if ( 1 ) - { - return( ALWAYS_TRUE ); - } - else - { - return( HOW_DID_YOU_GET_HERE ); - } - - return( NEVER_GETS_HERE ); - -} - - - - - - - Initializing - - - - Initialize all variables - - Explanation: - - Do not assume that the variables declared will not be used - until after they have been assigned a value somewhere else in - the code. Remove the chance of accidentally using an unassigned - variable. - - Example: - -short anShort = 0; -float aFloat = 0; -struct *ptr = NULL; - - Note: It is much easier to debug a SIGSEGV if the - message says you are trying to access memory address 00000000 - and not 129FA012; or arrayPtr[20] causes a SIGSEV vs. - arrayPtr[0]. - - Status: developer-discrection if and only if the - variable is assigned a value "shortly after" declaration. - - - - - - Functions - - - - Name functions that return a boolean as a - question. - - Explanation: - - Value should be phrased as a question that would logically - be answered as a true or false statement - - Example: - -ShouldWeBlockThis(); -ContainsAnImage(); -IsWebPageBlank(); - - - - - Always specify a return type for a - function. - - Explanation: - - The default return for a function is an int. To avoid - ambiguity, create a return for a function when the return has a - purpose, and create a void return type if the function does not - need to return anything. - - - - - - Minimize function calls when iterating by - using variables - - Explanation: - - It is easy to write the following code, and a clear argument - can be made that the code is easy to understand: - - Example: - -for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ ) -{ - .... -} - - Note: Unfortunately, this makes a function call for - each and every iteration. This increases the overhead in the - program, because the compiler has to look up the function each - time, call it, and return a value. Depending on what occurs in - the blockListLength() call, it might even be creating and - destroying structures with each iteration, even though in each - case it is comparing "cnt" to the same value, over and over. - Remember too - even a call to blockListLength() is a function - call, with the same overhead. - - Instead of using a function call during the iterations, - assign the value to a variable, and evaluate using the - variable. - - Example: - -size_t len = blockListLength(); - -for ( size_t cnt = 0; cnt < len; cnt ++ ) -{ - .... -} - - Exceptions: if the value of blockListLength() *may* - change or could *potentially* change, then you must code the - function call in the for/while loop. - - - - - - Pass and Return by Const Reference - - Explanation: - - This allows a developer to define a const pointer and call - your function. If your function does not have the const - keyword, we may not be able to use your function. Consider - strcmp, if it were defined as: extern int strcmp( char *s1, - char *s2 ); - - I could then not use it to compare argv's in main: int main( - int argc, const char *argv[] ) { strcmp( argv[0], "privoxy" - ); } - - Both these pointers are *const*! If the c runtime library - maintainers do it, we should too. - - - - - - Pass and Return by Value - - Explanation: - - Most structures cannot fit onto a normal stack entry (i.e. - they are not 4 bytes or less). Aka, a function declaration - like: int load_aclfile( struct client_state csp ) - - would not work. So, to be consistent, we should declare all - prototypes with "pass by value": int load_aclfile( struct - client_state *csp ) - - - - - - Names of include files - - Explanation: - - Your include statements should contain the file name without - a path. The path should be listed in the Makefile, using -I as - processor directive to search the indicated paths. An exception - to this would be for some proprietary software that utilizes a - partial path to distinguish their header files from system or - other header files. - - Example: - -#include <iostream.h> /* This is not a local include */ -#include "config.h" /* This IS a local include */ - - - Exception: - - - -/* This is not a local include, but requires a path element. */ -#include <sys/fileName.h> - - - - Note: Please! do not add "-I." to the Makefile - without a _very_ good reason. This duplicates the #include - "file.h" behaviour. - - - - - - Provide multiple inclusion - protection - - Explanation: - - Prevents compiler and linker errors resulting from - redefinition of items. - - Wrap each header file with the following syntax to prevent - multiple inclusions of the file. Of course, replace PROJECT_H - with your file name, with "." Changed to "_", and make it - uppercase. - - Example: - -#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED - ... -#endif /* ndef PROJECT_H_INCLUDED */ - - - - - Use `extern "C"` when appropriate - - Explanation: - - If our headers are included from C++, they must declare our - functions as `extern "C"`. This has no cost in C, but increases - the potential re-usability of our code. - - Example: - -#ifdef __cplusplus -extern "C" -{ -#endif /* def __cplusplus */ - -... function definitions here ... - -#ifdef __cplusplus -} -#endif /* def __cplusplus */ - - - - - Where Possible, Use Forward Struct - Declaration Instead of Includes - - Explanation: - - Useful in headers that include pointers to other struct's. - Modifications to excess header files may cause needless - compiles. - - Example: - -/********************************************************************* - * We're avoiding an include statement here! - *********************************************************************/ -struct file_list; -extern file_list *xyz; - - Note: If you declare "file_list xyz;" (without the - pointer), then including the proper header file is necessary. - If you only want to prototype a pointer, however, the header - file is unneccessary. - - Status: Use with discrection. - - - - - - General Coding Practices - - - - Turn on warnings - - Explanation - - Compiler warnings are meant to help you find bugs. You - should turn on as many as possible. With GCC, the switch is - "-Wall". Try and fix as many warnings as possible. - - - - - - Provide a default case for all switch - statements - - Explanation: - - What you think is guaranteed is never really guaranteed. The - value that you don't think you need to check is the one that - someday will be passed. So, to protect yourself from the - unknown, always have a default step in a switch statement. - - Example: - -switch( hash_string( cmd ) ) -{ - case hash_actions_file : - ... code ... - break; - - case hash_confdir : - ... code ... - break; - - default : - log_error( ... ); - ... anomly code goes here ... - continue; / break; / exit( 1 ); / etc ... - -} /* end switch( hash_string( cmd ) ) */ - - Note: If you already have a default condition, you - are obviously exempt from this point. Of note, most of the - WIN32 code calls `DefWindowProc' after the switch statement. - This API call *should* be included in a default statement. - - Another Note: This is not so much a readability issue - as a robust programming issue. The "anomly code goes here" may - be no more than a print to the STDERR stream (as in - load_config). Or it may really be an ABEND condition. - - Status: Programmer discretion is advised. - - - - - - Try to avoid falling through cases in a - switch statement. - - Explanation: - - In general, you will want to have a 'break' statement within - each 'case' of a switch statement. This allows for the code to - be more readable and understandable, and furthermore can - prevent unwanted surprises if someone else later gets creative - and moves the code around. - - The language allows you to plan the fall through from one - case statement to another simply by omitting the break - statement within the case statement. This feature does have - benefits, but should only be used in rare cases. In general, - use a break statement for each case statement. - - If you choose to allow fall through, you should comment both - the fact of the fall through and reason why you felt it was - necessary. - - - - - - Use 'long' or 'short' Instead of - 'int' - - Explanation: - - On 32-bit platforms, int usually has the range of long. On - 16-bit platforms, int has the range of short. - - Status: open-to-debate. In the case of most FSF - projects (including X/GNU-Emacs), there are typedefs to int4, - int8, int16, (or equivalence ... I forget the exact typedefs - now). Should we add these to IJB now that we have a "configure" - script? - - - - - - Don't mix size_t and other types - - Explanation: - - The type of size_t varies across platforms. Do not make - assumptions about whether it is signed or unsigned, or about - how long it is. Do not compare a size_t against another - variable of a different type (or even against a constant) - without casting one of the values. Try to avoid using size_t if - you can. - - - - - - Declare each variable and struct on its - own line. - - Explanation: - - It can be tempting to declare a series of variables all on - one line. Don't. - - Example: - -long a = 0; -long b = 0; -long c = 0; - - Instead of: - - long a, b, c; - - Explanation: - there is more room for comments on the - individual variables - easier to add new variables without - messing up the original ones - when searching on a variable to - find its type, there is less clutter to "visually" - eliminate - - Exceptions: when you want to declare a bunch of loop - variables or other trivial variables; feel free to declare them - on 1 line. You should, although, provide a good comment on - their functions. - - Status: developer-discrection. - - - - - - Use malloc/zalloc sparingly - - Explanation: - - Create a local stuct (on the stack) if the variable will - live and die within the context of one function call. - - Only "malloc" a struct (on the heap) if the variable's life - will extend beyond the context of one function call. - - Example: - -If a function creates a struct and stores a pointer to it in a -list, then it should definately be allocated via `malloc'. - - - - - The Programmer Who Uses 'malloc' is - Responsible for Ensuring 'free' - - Explanation: - - If you have to "malloc" an instance, you are responsible for - insuring that the instance is `free'd, even if the deallocation - event falls within some other programmer's code. You are also - responsible for ensuring that deletion is timely (i.e. not too - soon, not too late). This is known as "low-coupling" and is a - "good thing (tm)". You may need to offer a - free/unload/destuctor type function to accomodate this. - - Example: - -int load_re_filterfile( struct client_state *csp ) { ... } -static void unload_re_filterfile( void *f ) { ... } - - Exceptions: - - The developer cannot be expected to provide `free'ing - functions for C run-time library functions ... such as - `strdup'. - - Status: developer-discrection. The "main" use of this - standard is for allocating and freeing data structures (complex - or nested). - - - - - - Add loaders to the `file_list' structure - and in order - - Explanation: - - I have ordered all of the "blocker" file code to be in alpha - order. It is easier to add/read new blockers when you expect a - certain order. - - Note: It may appear that the alpha order is broken in - places by POPUP tests coming before PCRS tests. But since - POPUPs can also be referred to as KILLPOPUPs, it is clear that - it should come first. - - - - - - "Uncertain" new code and/or changes to - exitinst code, use FIXME - - Explanation: - - If you have enough confidence in new code or confidence in - your changes, but are not *quite* sure of the reprocussions, - add this: - - /* FIXME: this code has a logic error on platform XYZ, * - attempthing to fix */ #ifdef PLATFORM ...changed code here... - #endif - - or: - - /* FIXME: I think the original author really meant this... - */ ...changed code here... - - or: - - /* FIXME: new code that *may* break something else... */ - ...new code here... - - Note: If you make it clear that this may or may not - be a "good thing (tm)", it will be easier to identify and - include in the project (or conversly exclude from the - project). - - - - - - - Addendum: Template for files and function - comment blocks: - - Example for file comments: - -const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $"; -/********************************************************************* - * - * File : $Source$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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$ - * - *********************************************************************/ - - -#include "config.h" - - ...necessary include files for us to do our work... - -const char FILENAME_h_rcs[] = FILENAME_H_VERSION; - - - Note: This declares the rcs variables that should be - added to the "show-proxy-args" page. If this is a brand new - creation by you, you are free to change the "Copyright" section - to represent the rights you wish to maintain. - - Note: The formfeed character that is present right - after the comment flower box is handy for (X|GNU)Emacs users to - skip the verbige and get to the heart of the code (via - `forward-page' and `backward-page'). Please include it if you - can. - - Example for file header comments: - -#ifndef _FILENAME_H -#define _FILENAME_H -#define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $" -/********************************************************************* - * - * File : $Source$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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$ - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - - ... function headers here ... - - -/* Revision control strings from this header and associated .c file */ -extern const char FILENAME_rcs[]; -extern const char FILENAME_h_rcs[]; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef _FILENAME_H */ - -/* - Local Variables: - tab-width: 3 - end: -*/ - - - Example for function comments: - -/********************************************************************* - * - * Function : FUNCTION_NAME - * - * Description : (Fill me in with a good description!) - * - * parameters : - * 1 : param1 = pointer to an important thing - * 2 : x = pointer to something else - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int FUNCTION_NAME( void *param1, const char *x ) -{ - ... - return( 0 ); - -} - - - Note: If we all follow this practice, we should be - able to parse our code to create a "self-documenting" web - page. - - - - - - - Version Control Guidelines - To be filled. note on cvs comments. don't comment what you did, comment -why you did it. - - - - - Testing Guidelines - To be filled. - - - - Testplan for releases - -Explain release numbers. major, minor. developer releases. etc. - - - -Remove any existing rpm with rpm -e - - -Remove any file that was left over. This includes (but is not limited to) - - /var/log/privoxy - /etc/privoxy - /usr/sbin/privoxy - /etc/init.d/privoxy - /usr/doc/privoxy* - - - -Install the rpm. Any error messages? - - start,stop,status Privoxy with the specific script - (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does - autostart work? - Start browsing. Does Privoxy work? Logfile written? - Remove the rpm. Any error messages? All files removed? - - - - - - Test reports - -Please submit test reports only with the test form -at sourceforge. Three simple steps: - - - Select category: the distribution you test on. - Select group: the version of Privoxy that we are about to release. - Fill the Summary and Detailed Description with something - intelligent (keep it short and precise). - - - Do not mail to the mailinglist (we cannot keep track on issues there). - - - - - - - Contact the developers - Please see the user manual for information on how to contact the developers. - - - - - Copyright and History - Please see the user manual for information on Copyright and History. - - - - - See also - Please see the user manual for information on references. - - - - - -
    diff --git a/doc/source/faq.sgml b/doc/source/faq.sgml deleted file mode 100644 index bbbf493e..00000000 --- a/doc/source/faq.sgml +++ /dev/null @@ -1,1431 +0,0 @@ - - - -
    - -Privoxy Frequently Asked Questions - -$Id: faq.sgml,v 1.31 2002/03/26 22:29:55 swa Exp $ - - - - - By: Privoxy Developers - - - - - - - This FAQ gives users and developers alike answers to frequently asked - questions about Privoxy. - - - Privoxy is a web proxy with advanced filtering - capabilities for protecting privacy, filtering web page content, managing - cookies, controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very - flexible configuration and can be customized to suit individual needs and - tastes. Privoxy has application for both - stand-alone systems and multi-user networks. - - - Privoxy is based on the code of the - Internet Junkbuster. - Junkbuster was originally written by JunkBusters - Corporation, and was released as free open-source software under the GNU GPL. - Stefan Waldherr made many improvements, and started the SourceForge project - to continue development. - - - - -You can find the latest version of the document at http://www.privoxy.org/faq/. -Please see the Contact section in the -user-manual if you want to contact the developers. - - - - - - - - - - - - - - -Frequently Asked Questions - - - -General Information - -What is this new version of <application>Privoxy</application>? - - The original Internet Junkbuster (tm) is a - copyrighted product of Junkbusters - Corporation. Development of this effort stopped some time ago as of - version 2.0.2. Stefan Waldherr started the ijbswa project on Sourceforge to rekindle - development. Other developers subsequently joined with Stefan, and have - since added many new features, refinements and enhancements. - - - The new Privoxy started with the same - Junkbuster code base, but has changed - significantly at this point. - - - - - - -Why <quote>Privoxy</quote>? Why a name change at all? - - Privoxy is for Privacy Enhancing Proxy. - There are possible legal complications from the continued use of the - Junkbuster name, which is a trademark of - Junkbusters Corporation. - (There are no objections from Junkbusters Corporation to the - Privoxy project itself though, and they - in fact still share our ideals and goals.) - - - - The developers also believed that there so many changes from the original - code, that it was time to make a clean break from the past and make - a name in their own right, especially now with the pending release of - version 3.0. - - - - - -How does it differ from the old <application>Junkbuster?</application> - - All the old features remain. The new Privoxy - still blocks ads and banners, still manages cookies, and still helps protect - your privacy. But, these are all enhanced, and many new features have been - added, all in the same vein. - - - The configuration has changed significantly as well. This is something that - users will notice right off the bat. The blocklist file does - not exist any more. This is replaced by actions files, such - as default.actions. This is where most of the per site - configuration is now. - - - - -What are some of the new features? - - - - - - - Integrated browser based configuration and control utility (http://p.p). Browser-based tracing of rule - and filter effects. - - - - - - Blocking of annoying pop-up browser windows. - - - - - - HTTP/1.1 compliant (most, but not all 1.1 features are supported). - - - - - - Support for Perl Compatible Regular Expressions in the configuration files, and - generally a more sophisticated and flexible configuration syntax over - previous versions. - - - - - - GIF de-animation. - - - - - - Web page content filtering (removes banners based on size, - invisible web-bugs, JavaScript, pop-ups, status bar abuse, - etc.) - - - - - - Bypass many click-tracking scripts (avoids script redirection). - - - - - - - Multi-threaded (POSIX and native threads). - - - - - - Auto-detection and re-reading of config file changes. - - - - - - User-customizable HTML templates (e.g. 404 error page). - - - - - - Improved cookie management features (e.g. session based cookies). - - - - - - Builds from source on most UNIX-like systems. Packages available for: Linux - (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac OSX, OS/2, HP-UX 11 and AmigaOS. - - - - - - - In addition, the configuration is much more powerful and versatile over-all. - - - - - - - - -What is a <quote>proxy</quote>? How does -<application>Privoxy</application> work? - - When you connect to a web site with Privoxy, - you are really connecting to your locally running version of - Privoxy. Privoxy - intercepts your requests for the web page, and relays that to the - real web site. The web site sends the HTTP data stream - back to Privoxy, where - Privoxy can work its magic before it - relays this data back to your web browser. - - - - Since Privoxy sits between you and the - WWW, it is in a position to intercept and completely manage all web traffic and - HTTP content before it gets to your browser. - Privoxy uses various programming methods to do - this, all of which is under your control via the various configuration - files and options. - - - - There are many kinds of proxies. Privoxy best - fits the filtering proxy category. - - - - -My browser does the same things as -<application>Privoxy</application>. Why should I use -<application>Privoxy</application> at all? - - Modern browsers do indeed have some of the same - functionality as Privoxy. Maybe this is - adequate for you. But Privoxy is much more - versatile and powerful, and can do a number of things that browsers just can't. - - - In addition, a proxy is good choice if you use multiple browsers, or - have a LAN with multiple computers. This way all the configuration - is in one place, and you don't have to maintain a similar configuration - for possibly many browsers. - - - - - - -Is there is a license or fee? What about a -warranty? Registration? - - Privoxy is licensed under the - GNU General Public License (GPL). It is free to use, copy, - modify or distribute as you wish under the terms of this license. - See http://www.gnu.org/copyleft/gpl.html - for specifics. - - - There is no warranty of any kind, expressed, implied or otherwise. That is - something that would cost real money ;-) There is no registration either. - Privoxy really is free - in every respect! - - - - -I would like to help you, what do I do? - -Money Money Money - - We, of course, welcome donations and use the money for domain registering, - regular world-wide get-togethers (hahaha). Anyway, we'll soon describe the - process how to donate money to the team. - - - -You want to work with us? - - Well, helping the team is always a good idea. We welcome new developers, - RPM gurus or documentation makers. Simply get an account on sourceforge.net - and mail your id to the developer mailing list. Then read the - section Quickstart in the developers manual. - - -Once we have added you to the team, you'll have write access to the CVS -repository, and together we'll find a suitable task for you. - - - - - - - - - - -Installation - - -Which browsers are supported by <application>Privoxy</application>? - - Any browser that can be configured to use a proxy, which - is probably almost all browsers. Direct browser support is not necessary - since Privoxy runs as a separate application and - just exchanges standard HTML data with your browser. - - - - -Which operating systems are supported? - - Right now Win32, Mac OSX, OS/2, AmigaOS, Linux, and many - flavors of Unix. - - - - Source code is available, so porting to other operating systems, - is always a possibility. - - - - -Can I install - <application>Privoxy</application> over <application>Junkbuster</application>? - - We recommend you uninstall Junkbuster - first to minimize conflicts and confusion. You may want to - save your old configuration files for future reference. The configuration - is substantially changed. - - - See the user-manual for - platform specific installation instructions. [FIXME: This is meant for after - the name change for 3.0!] - - - - - -I just installed <application>Privoxy</application>. Is there anything -special I have to do now? - - - All browsers must be told to use Privoxy - as a proxy by specifying the correct proxy address and port number - in the appropriate configuration area for the browser. See below. - - - - - - -What is the proxy address of <application>Privoxy</application>? - - If you set up the Privoxy to run on - the computer you browse from (rather than your ISP's server or some - networked computer on a LAN), the proxy will be on localhost - (which is the special name used by every computer on the Internet to refer - to itself) and the port will be 8118 (unless you have Privoxy to run on a different port with the - listen-address config option). - - - When configuring your browser's proxy settings you typically enter - the word localhost in the boxes next to HTTP - and Secure (HTTPS) and then the number 8118 - for port. This tells your browser to send all web - requests to Privoxy instead of directly to the - Internet. - - - Privoxy can also be used to proxy for - a Local Area Network. In this case, your would enter either the IP - address of the LAN host where Privoxy - is running, or the equivalent hostname. Port assignment would be - same as above. - - - Privoxy does not currently handle - protocols such as FTP, SMTP, IM, IRC, ICQ, or other Internet - protocols. - - - - -I just installed <application>Privoxy</application>, and nothing is happening. -All the ads are there. What's wrong? - - - Did you configure your browser to use Privoxy - as a proxy? It does not sound like it. See above. You might also try flushing - the browser's caches to force a full re-reading of pages. You can verify - that Privoxy is running, and your browser - is correctly configured by entering the special URL: - http://p.p/. This should give you - a banner that says This is Privoxy and - access to Privoxy's internal configuration. - If you see this, then you are good to go. If not, the browser or - Privoxy are not set up correctly. - - - - - - - - - - -Configuration - -Can I use my old config files? - - There are major changes to Junkbuster - configuration from version 2.0.x to 2.9.x and later. The older files will - not work at all. If this is the case, you will need to re-enter your old - data into the new configuration structure. This is probably also a good - recommendation even if upgrading from 2.9.x to 3.x since there were - many minor changes along the way. - - - - -What is an <quote>actions</quote> file? - - - actions files are where various actions that - Privoxy might take, are configured. - Typically, you would define a set of default actions that apply - to all URLs, then add exceptions to these defaults. - - - - Actions can be defined on a per site basis, or for groups of sites. Actions - can also be grouped together and then applied to one or more sites. There - are many possible actions that might apply to any given site. As an example, - if we are blocking cookies as one of our default - actions, but need to accept cookies from a given - site, we would define this in our actions file. - - - - - Privoxy comes with several default - actions files, with varying degrees - of filtering and blocking, as starting points for your own - configuration (see below). - - - - - -The <quote>actions</quote>concept confuses me. Please list -some of these <quote>actions</quote>. - - These are all explained in the - user-manual. - Please refer to that. - - - - - -How are actions files configured? What is the easiest -way to do this? - - - The easiest way to do this, is to access Privoxy - with your web browser at http://p.p/, - and then select - "Edit the actions list" - from the selection list. You can also do this by editing the appropriate - file with a text editor. - - - - Please see the - user-manual for a - detailed explanation of these and other configuration files, and their - various options and syntax. - - - - - - - What are the differences between -intermediate.action, basic.action, etc.? - -Configuring Privoxy is not easy. To help you get -started, we provide you with three different default configurations. The -following table shows you, which features are enabled in each configuration. - - -Default Configurations - - - - - - - - - Feature - default.action - basic.action - intermediate.action - advanced.action - - - - - - - - - - - - - - - - - ad-filtering - ? - x - x - x - - - - blank image - ? - x - x - x - - - - de-animate GIFs - ? - x - x - x - - - - referer forging - ? - x - x - x - - - - jon's +no-cookies-keep (i.e. session cookies only) - ? - x - x - x - - - - no-popup windows - ? - - x - x - - - - fast redirects - ? - - x - x - - - - hide-referrer - ? - - x - x - - - - hide-useragent - ? - - x - x - - - - content-modification - ? - - - x - - - - feature-x - ? - - - - - - - feature-y - ? - - - - - - - feature-z - ? - - - - - - - -
    -
    -
    - - Why can I change the configuration with a -browser? Does that not raise security issues? - -What I don't understand, is how I can browser edit the config file as a -regular user, while the whole /etc/privoxy hierarchy belongs to the user -"privoxy", with only 644 perms. - - -When you use the browser-based editor, Privoxy -itself is writing to the config files. Because -Privoxy is running as the user "privoxy", it can -update the config files. - - -If you don't like this, setting "enable-edit-actions 0" in the config file -will disable the browser-based editor. If you're that paranoid, you should -also consider setting "enable-remote-toggle 0" to prevent browser-based -enabling/disabling of Privoxy. - - -Note that normally only local users can connect to Privoxy, so this is not -(normally) a security problem. - - - - - -What is a <quote>default.filter</quote>? - - The default.filter file is used to filter any - web page content. By filtering we mean it can modify, remove, - or change anything on the page, including HTML tags, and - JavaScript. Regular expressions are used to accomplish this, and operate - on a line by line basis. This is potentially a very powerful feature, but - requires some expertise. - - - - If you are familiar with regular expressions, and HTML, you can look at - the provided default.filter with a text editor and see - some of things it can be used for. - - - - Presently, there is no GUI editor option for this part of the configuration, - but you can disable/enable various sections of the included default - file with the Actions List Editor from your browser. - - - - - -How can I set up <application>Privoxy</application> to act as a proxy for my - LAN? - - By default, Privoxy only responds to requests - from localhost. To have it act as a server for a network, this needs to be - changed in the main config file where the Privoxy - configuration is located. In that file is a listen-address - option. It may be commented out with a # symbol. Make sure - it is uncommented, and assign it the address of the LAN gateway interface, - and port number to use: - - - - - listen-address 192.168.1.1:8118 - - - - - Save the file, and restart Privoxy. Configure - all browsers on the network then to use this address and port number. - - - - - - -Instead of ads, now I get a checkerboard pattern. I don't want to see anything. - - This is a configuration option for images that - Privoxy is stopping. You have the choice a checkerboard - pattern, a transparent 1x1 GIF image (aka blank), or a custom - URL or your choice. - - - - If you want to see nothing, then change the +image-blocker - action to +image-blocker{blank}. This can be done from the - Edit Actions List selection at http://p.p/. Or by hand editing the appropriate - actions file. This will only effect what is defined as images - though. - - - - - - - -Why would anybody want to see a checkerboard pattern? - - This can be helpful for troubleshooting problems. It might also be good - for anyone new to Privoxy so that they can - see if their favorite pages are displaying correctly, and - Privoxy is not inadvertently removing something - important. - - - - - -I see large red banners on some pages that say -<quote>Blocked</quote>. How do I get rid of this? - - These are URLs that match something in one of - Privoxy's block actions (+block). It is meant - to be a warning so that you know something has been blocked and an easy way - for you to see why. These are handled differently than what has been defined - as images (e.g. ad banners). If you want them to be treated - as if they were images, so that they can be made invisible, then move the - offending URL from the +block section to the - +imageblock section of your actions file. Alternately, you - could modify the block HTML template that - is used by Privoxy to display this, and make it - something more to your liking. - - - - - -How can I make <application>Privoxy</application> work with other -proxies like <application>Squid</application>? - - This can be done. See the user manual, - which describes how to do this. - - - - - -
    - - - -Miscellaneous - - -How much does <application>Privoxy</application> slow my browsing down? This -has to add extra time to browsing. - - It should not slow you down any in real terms, and may actually help - speed things up since ads, banners and other junk are not being displayed. - The actual processing time required by Privoxy - itself for each page, is relatively small in the overall scheme of things, - and happens very quickly. This is typically more than offset by time saved - not downloading and rendering ad images. - - - - Filtering via the filterfile - mechanism may cause a perceived slowdown, since the entire page is buffered - before displaying. See below. - - - - - - -I noticed considerable -delays in page requests compared to the old Junkbuster. What's wrong? - -Using the default filtering configuration, I noticed considerable delays in -page requests compared to the old Junkbuster. Loading pages with large contents -seemed to take forever, then suddenly delivering all the content at once. - - -The whole content must be loaded in order to filter, and nothing is is -sent to the browser during this time. The loading time does not really -change in real numbers, but the feeling is different, because most -browsers are able to start rendering incomplete content, giving the -user a feeling of "it works". - - -To modify the content of a page (i.e. make frames resizeable again, etc.) and -not just replace ads, Privoxy needs to download the -entire page first, do its content magic and then send the page to the browser. - - - - -What is the "http://p.p/"? - -Since Privoxy sits between your web browser and the Internet, it can be -programmed to handle certain pages specially. - - - -With recent versions of Privoxy (version 2.9.x), you can get some -information about Privoxy and change some settings by going to -http://p.p/ or, equivalently, http://www.privoxy.org/config/ -(Note that p.p is far easier to type but may not work in some -configurations). - - - -These pages are *not* forwarded to a server on the Internet - instead they are -handled by a special web server which is built in to Privoxy. - - - -If you are not running Privoxy, then http://p.p/ will fail, and -http://www.privoxy.org/config/ will return a web page telling you -you're not running Privoxy. - - - -If you have version 2.0.2, then the equivalent is -http://example.com/show-proxy-args (but you get far less information, and you -should really consider upgrading to 2.9.x). - - - - - -Do you still maintain the blocklists? - - No. The format of the blocklists has changed significantly in the versions - 2.9.x. Once we have released the new version, there will again be - blocklists that you can update automatically. - - - -How can I submit new ads? - - As of now, please discontinue to submit new ad blocking infos. Once we - have released the new version, there will again be a form on the website, - which you can use to contribute new ads. - - - -How can I hide my IP address? - - You cannot hide your IP address with Privoxy or any other software, since -the server needs to know your IP address to send the answer to you. - - -Fortunately there are many publicly usable anonymous proxies out there, which -solve the problem by providing a further level of indirection between you and -the web server, shared by many people and thus letting your requests "drown" -in white noise of unrelated requests as far as user tracking is concerned. - - -Most of them will, however, log your IP address and make it available to the -authorities in case you abuse that anonymity for criminal purposes. In fact -you can't even rule out that some of them only exist to *collect* information -on (those suspicious) people with a more than average preference for privacy. - - -You can find a list of anonymous public proxies at multiproxy.org and many -more through Google. - - - - - - - - - - - - -Can <application>Privoxy</application> guarantee I am anonymous? - - No. Your chances of remaining anonymous are greatly improved, but unless you - are an expert on Internet security it would be safest to assume that - everything you do on the Web can be traced back to you. - - - Privoxy can remove various information about you, - and allows you more freedom to decide which sites - you can trust. But it's still possible that web sites can find out who you - are. Here's one way this can happen. - - - A few browsers disclose the user's email address in certain situations, such - as when transferring a file by FTP. Privoxy - does not filter FTP. If you need this feature, or are concerned about the - mail handler of your browser disclosing your email address, you might - consider products such as NSClean. - - - Browsers available only as binaries could use non-standard headers to give - out any information they can have access to: see the manufacturer's license - agreement. It's impossible to anticipate and prevent every breach of privacy - that might occur. The professionally paranoid prefer browsers available as - source code, because anticipating their behavior is easier. Trust the source, - Luke! - - - - - -Might some things break because header information is -being altered? - - - Definitely. More and more sites use HTTP header content to decide what to - display and how to display it. There is many ways that this can be handled, - so having hard and fast rules, is tricky. - - - - USER AGENT in particular is often used in this way to identify - the browser, and adjust content accordingly. Changing this now is not - recommended, since so many sites do look for this. You may get undesirable - results by changing this. - - - - For instance, different browsers use different encodings of Russian and Czech - characters, certain web servers convert pages on-the-fly according to the - User Agent header. Giving a User Agent with the wrong - operating system or browser manufacturer causes some sites in these languages - to be garbled; Surfers to Eastern European sites should change it to - something closer. And then some page access counters work by looking at the - REFERER header; they may fail or break if unavailable. The - weather maps of Intellicast have been blocked by their server when no - REFERER or cookie is provided, is another example. There are - many, many other ways things can go wrong when trying to fool a web server. - - - - If you have problems with a site, you will have to adjust your configuration - accordingly. Cookies are probably the most likely adjustment that may - be required, but by no means the only one. - - - - - - - -Can <application>Privoxy</application> act as a <quote>caching</quote> proxy to -speed up web browsing? - - No, it does not have this ability at all. You want something like - Squid for this. And, yes, - before you ask, Privoxy can co-exist - with other kinds of proxies like Squid. - - - - -What about as a firewall? Can <application>Privoxy</application> protect me? - - Not in the way you mean, or in the way a true firewall can, or a proxy that - has this specific capability. Privoxy can help - protect your privacy, but not really protect you from intrusion attempts. - - - - - - - - - This is not a font problem. The logo is an image that is created by - Privoxy on the fly. So as to not waste - memory, the image is rather small. The blockiness comes when the - image is scaled to fill a largish area. There is not much to be done - about this, other than to use one of the other - imageblock directives: pattern, - blank, or a URL of your choosing. - - -Given the above problem, we have decided to remove the logo option entirely -[as of v2.9.13]. - - - - - -I have large empty spaces now where ads used to be. -Why does <application>Privoxy</application> leave these large gaps? - - It would be easy enough to just eliminate this space altogether, rather than - fill it with blank space. But, this would create problems with many pages - that use the overall size of the ad to help organize the page layout and - position the various components of the page where they were intended to be. - It is best left this way. - - - - - -How can <application>Privoxy</application> filter Secure (HTTPS) URLs? - - This is a limitation since HTTPS transactions are encrypted SSL sessions - between your browser and the secure site, and are meant to be reliably - secure and private. This means that all cookies and HTTP - header information are also encrypted from the time they leave your browser, - to the site, and vice versa. Privoxy does not - try to unencrypt this information, so it just passes through as is. - Privoxy can still catch images and ads that - are embedded in the SSL stream though. - - - - - - -<application>Privoxy</application> runs as a <quote>server</quote>. How -secure is it? Do I need to take any special precautions? - - There are no known exploits that might effect - Privoxy. On Unix-like systems, - Privoxy can run as a non-privileged - user, which is how we recommend it be run. Also, by default - Privoxy only listens to requests - from localhost. It is not itself directly exposed to the - Internet in this configuration. If you want to have - Privoxy serve as a LAN proxy, this will have to - be opened up to allow for LAN requests. In this case, we'd recommend - you specify only the LAN gateway address, e.g. 192.168.1.1 in the main - Privoxy config file. All LAN hosts can then use - this as their proxy address in the browser proxy configuration. In this way, - Privoxy will not listen on any external ports. - Of course, a firewall is always good too. Better safe than sorry. - - - - - -How can I temporarily disable <application>Privoxy</application>? - - The easiest way is to access Privoxy with your - browser by using the special URL: http://p.p/ - and select "Toggle Privoxy on or off" from that page. - - - - - - - - - - -Troubleshooting - - -I just upgraded and am getting <quote>connection refused</quote> -with every web page? - - Either Privoxy is not running, or your - browser is configured for a different port than what - Privoxy is using. - - - - The old Privoxy (and also - Junkbuster) used port 8000 by - default. This has been changed to port 8118 now, due to a conflict - with NAS (Network Audio Service), which uses port 8000. If you haven't, - you need to change your browser to the new port number, or alternately - change Privoxy's listen-address - setting in the config file used to start - Privoxy. - - - - - -I just added a new rule, but the steenkin ad is -still getting through. How? - - If the ad had been displayed before you added its URL, it will probably be - held in the browser's cache for some time, so it will be displayed without - the need for any request to the server, and Privoxy - will not be in the picture. The best thing to do is try flushing the browser's - caches. And then try again. - - - - If this doesn't help, you probably have an error in the rule you - applied. Try pasting the full URL of the offending ad into http://www.privoxy.org/config/show-url-info - and see if any actions match your new rule. - - - - - -One of my favorite sites does not work with <application>Privoxy</application>. -What can I do? - - - First verify that it is indeed a Privoxy problem, - by disabling Privoxy filtering and blocking. - Go to http://p.p/ and click on - Toggle Privoxy On or Off, then disable it. Now try that - page again. - - - - If still a problem, go to Show which actions apply to a URL and - why from http://p.p/ and paste - the full URL of the page in question into the prompt. See which actions are - being applied to the URL. Now, armed with this information, go to Edit - the actions list. Here you should see various sections that have - various Privoxy features disabled for specific - sites. Disabled actions will have a - (minus - sign) in front of them. Add your problem page URL to one of these sections - that looks like it is disabling the feature that is causing the - problem. Re-try the page. There might be some trial and error involved. This - is discussed in a little more detail in the user-manual - appendix. - - - - - Alternately, if you are comfortable with a text editor, you can accomplish - the same thing by editing the appropriate actions file. - - - - - -What time is it? - - Time for you to go! - - - - - -
    - - - - - - - - -Copyright and History -Please see the user manual for information on Copyright and History. - - - - -See also -Please see the user manual for information on references. - - - - - - -
    diff --git a/doc/source/ldp.dsl b/doc/source/ldp.dsl deleted file mode 100644 index e4352a5a..00000000 --- a/doc/source/ldp.dsl +++ /dev/null @@ -1,172 +0,0 @@ - - - -]]> - - -]]> -]> - - - - - - - - -;; ============================== -;; customize the print stylesheet -;; ============================== - - - - - - - - - - -;; this is necessary because right now jadetex does not understand -;; symbolic entities, whereas things work well with numeric entities. -(declare-characteristic preserve-sdata? - "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" - #f) - -;; put the legal notice in a separate file -(define %generate-legalnotice-link% - #t) - -;; use graphics in admonitions, and have their path be "stylesheet-images" -;; NO: they do not yet look very good -(define %admon-graphics-path% - "./stylesheet-images/") - -(define %admon-graphics% - #f) - -(define %funcsynopsis-decoration% - ;; make funcsynopsis look pretty - #t) - -(define %html-ext% - ".html") - -(define %generate-article-toc% - ;; Should a Table of Contents be produced for Articles? - ;; If true, a Table of Contents will be generated for each 'Article'. - #t) - -(define %root-filename% - ;; The filename of the root HTML document (e.g, "index"). - "index") - -(define %generate-part-toc% - #t) - -(define %shade-verbatim% - #t) - -(define %use-id-as-filename% - ;; Use ID attributes as name for component HTML files? - #t) - -(define %graphic-default-extension% - "gif") - -(define %section-autolabel% - ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.) - #t) - -;; HB changed TOC depth to 3 levels. -(define (toc-depth nd) - 3) - -;; HB added 03/20/02, see dbparam.dsl ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(define %body-attr% - ;; REFENTRY body-attr - ;; PURP What attributes should be hung off of BODY? - ;; DESC - ;; A list of the the BODY attributes that should be generated. - ;; The format is a list of lists, each interior list contains the - ;; name and value of a BODY attribute. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - (list - (list "BGCOLOR" "#EEEEEE") - (list "TEXT" "#000000") - (list "LINK" "#0000FF") - (list "VLINK" "#840084") - (list "ALINK" "#0000FF"))) - -(define %stylesheet% - ;; REFENTRY stylesheet - ;; PURP Name of the stylesheet to use - ;; DESC - ;; The name of the stylesheet to place in the HTML LINK TAG, or '#f' to - ;; suppress the stylesheet LINK. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - "../p_doc.css") - -(define %stylesheet-type% - ;; REFENTRY stylesheet-type - ;; PURP The type of the stylesheet to use - ;; DESC - ;; The type of the stylesheet to place in the HTML LINK TAG. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - "text/css") - -(define %css-liststyle-alist% - ;; REFENTRY css-liststyle-alist - ;; PURP Map DocBook OVERRIDE and MARK attributes to CSS - ;; DESC - ;; If '%css-decoration%' is turned on then the list-style-type property of - ;; list items will be set to reflect the list item style selected in the - ;; DocBook instance. This associative list maps the style type names used - ;; in your instance to the appropriate CSS names. If no mapping exists, - ;; the name from the instance will be used. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - '(("bullet" "disc") - ("box" "square"))) - -(define %css-decoration% - ;; REFENTRY css-decoration - ;; PURP Enable CSS decoration of elements - ;; DESC - ;; If '%css-decoration%' is turned on then HTML elements produced by the - ;; stylesheet may be decorated with STYLE attributes. For example, the - ;; LI tags produced for list items may include a fragment of CSS in the - ;; STYLE attribute which sets the CSS property "list-style-type". - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - #t) - - - - - - - - diff --git a/doc/source/user-manual.sgml b/doc/source/user-manual.sgml deleted file mode 100644 index 1e9723e1..00000000 --- a/doc/source/user-manual.sgml +++ /dev/null @@ -1,4197 +0,0 @@ - - - - - -
    - -Privoxy User Manual - -$Id: user-manual.sgml,v 1.59 2002/03/27 00:54:33 hal9 Exp $ - - - - - By: Privoxy Developers - - - - - - - The user manual gives users information on how to install, configure and use - Privoxy. Privoxy is a - web proxy with advanced filtering capabilities for protecting privacy, - filtering web page content, managing cookies, controlling access, and - removing ads, banners, pop-ups and other obnoxious Internet - Junk. Privoxy has a very flexible configuration - and can be customized to suit individual needs and - tastes. Privoxy has application for both - stand-alone systems and multi-user networks. - - -You can find the latest version of the user manual at http://www.privoxy.org/user-manual/. - - - - - - - - - - - - -Introduction - - Privoxy is a web proxy with advanced filtering - capabilities for protecting privacy, filtering web page content, managing - cookies, controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very - flexible configuration and can be customized to suit individual needs and - tastes. Privoxy has application for both - stand-alone systems and multi-user networks. - - - - Privoxy is based on the code of the - Internet Junkbuster. - Junkbuster was originally written by JunkBusters - Corporation, and was released as free open-source software under the GNU GPL. - Stefan Waldherr made many improvements, and started the SourceForge project - to continue development. - - - - Privoxy continues the - Junkbuster tradition, but adds many - refinements and enhancements. - - - - This documentation is included with the current BETA version of - Privoxy and is mostly complete at this - point. The most up to date reference for the time being is still the comments - in the source files and in the individual configuration files. Development - of version 3.0 is currently nearing completion, and includes many significant - changes and enhancements over earlier versions. The target release date for - stable v3.0 is soon ;-) - - - - Since this is a BETA version, not all new features are well tested. This - documentation may be slightly out of sync as a result (especially with - CVS sources). And there may be bugs, though hopefully - not many! - - - - - -New Features - - In addition to Internet Junkbuster's traditional - feature of ad and banner blocking and cookie management, - Privoxy provides new features, some of them - currently under development: - - - - - - - - - Integrated browser based configuration and control utility (http://p.p). Browser-based tracing of rule - and filter effects. - - - - - - Blocking of annoying pop-up browser windows. - - - - - - HTTP/1.1 compliant (most, but not all 1.1 features are supported). - - - - - - Support for Perl Compatible Regular Expressions in the configuration files, and - generally a more sophisticated and flexible configuration syntax over - previous versions. - - - - - - GIF de-animation. - - - - - - Web page content filtering (removes banners based on size, - invisible web-bugs, JavaScript, pop-ups, status bar abuse, - etc.) - - - - - - Bypass many click-tracking scripts (avoids script redirection). - - - - - - - Multi-threaded (POSIX and native threads). - - - - - - Auto-detection and re-reading of config file changes. - - - - - - User-customizable HTML templates (e.g. 404 error page). - - - - - - Improved cookie management features (e.g. session based cookies). - - - - - - Builds from source on most UNIX-like systems. Packages available for: Linux - (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac OSX, OS/2, HP-UX 11 and AmigaOS. - - - - - - - In addition, the configuration is much more powerful and versatile over-all. - - - - - - - - - - - - - - -Installation - - Privoxy is available as raw source code, or - pre-compiled binaries. See the Privoxy Home Page - for binaries and current release info. Privoxy - is also available via CVS. - This is the recommended approach at this time. But please be aware that CVS - is constantly changing, and it may break in mysterious ways. - - - -Source - - For gzipped tar archives, unpack the source: - - - - - tar xzvf privoxy-2.9.13-beta-src* [.tgz or .tar.gz] - cd privoxy-2.9.13-beta - - - - - For retrieving the current CVS sources, you'll need the CVS - package installed first. To download CVS source: - - - - - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co current - cd current - - - - - This will create a directory named current/, which will - contain the source tree. - - - - Then, in either case, to build from tarball/CVS source: - - - - - ./configure (--help to see options) - make (the make from gnu, gmake for *BSD) - su - make -n install (to see where all the files will go) - make install (to really install) - - - - - For Redhat and SuSE Linux RPM packages, see below. - - - - - - -Red Hat - - To build Redhat RPM packages, install source as above. Then: - - - - - autoheader - autoconf - ./configure - make redhat-dist - - - - - This will create both binary and src RPMs in the usual places. Example: - - - -    /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - -    /usr/src/redhat/SRPMS/privoxy-2.9.11-1.src.rpm - - - - To install, of course: - - - - - rpm -Uvv /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - - - - This will place the Privoxy configuration - files in /etc/privoxy/, and log files in - /var/log/privoxy/. - - - - - -SuSE - - To build SuSE RPM packages, install source as above. Then: - - - - - autoheader - autoconf - ./configure - make suse-dist - - - - - This will create both binary and src RPMs in the usual places. Example: - - - -    /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - -    /usr/src/packages/SRPMS/privoxy-2.9.11-1.src.rpm - - - - To install, of course: - - - - - rpm -Uvv /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - - - - This will place the Privoxy configuration - files in /etc/privoxy/, and log files in - /var/log/privoxy/. - - - - - - -OS/2 - - - - - Privoxy is packaged in a WarpIN self- - installing archive. The self-installing program will be named depending - on the release version, something like: - ijbos2_setup_1.2.3.exe. In order to install it, simply - run this executable or double-click on its icon and follow the WarpIN - installation panels. A shadow of the Privoxy - executable will be placed in your startup folder so it will start - automatically whenever OS/2 starts. - - - - The directory you choose to install Privoxy - into will contain all of the configuration files. - - - - If you would like to build binary images on OS/2 yourself, you will need - a few Unix-like tools: autoconf, autoheader and sh. These tools will be - used to create the required config.h file, which is not part of the - source distribution because it differs based on platform. You will also - need a compiler. - The distribution has been created using IBM VisualAge compilers, but you - can use any compiler you like. GCC/EMX has the disadvantage of needing - to be single-threaded due to a limitation of EMX's implementation of the - select() socket call. - - - - In addition to needing the source code distribution as outlined earlier, - you will want to extract the os2seutp directory from CVS: - - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co os2setup - - This will create a directory named os2setup/, which will contain the - Makefile.vac makefile and os2build.cmd - which is used to completely create the binary distribution. The sequence - of events for building the executable for yourself goes something like this: - - cd current - autoheader - autoconf - sh configure - cd ..\os2setup - nmake -f Makefile.vac - - You will see this sequence laid out in os2build.cmd. - - - - - - -Windows -Click-click. (I need help on this. Not a clue here. Also for -configuration section below. HB.) - - - - -Other - - Some quick notes on other Operating Systems. - - - - For FreeBSD (and other *BSDs?), the build will require gmake - instead of the included make. gmake is - available from http://www.gnu.org. - The rest should be the same as above for Linux/Unix. - - - - - - - - - - -<application>Privoxy</application> Configuration - - All Privoxy configuration is kept - in text files. These files can be edited with a text editor. - Many important aspects of Privoxy can - also be controlled easily with a web browser. - - - - - - - -Controlling <application>Privoxy</application> with Your Web Browser - - Privoxy can be reached by the special - URL http://p.p/ (or alternately - http://www.privoxy.org/config/), - which is an internal page. You will see the following section: - - - - - - -Please choose from the following options: - - * Show information about the current configuration - * Show the source code version numbers - * Show the client's request headers. - * Show which actions apply to a URL and why - * Toggle Privoxy on or off - * Edit the actions list - - - - - - This should be self-explanatory. Note the last item is an editor for the - actions list, which is where much of the ad, banner, cookie, - and URL blocking magic is configured as well as other advanced features of - Privoxy. This is an easy way to adjust various - aspects of Privoxy configuration. The actions - file, and other configuration files, are explained in detail below. - Privoxy will automatically detect any changes - to these files. - - - - Toggle Privoxy On or Off is handy for sites that might - have problems with your current actions and filters, or just to test if - a site misbehaves, whether it is Privoxy - causing the problem or not. Privoxy continues - to run as a proxy in this case, but all filtering is disabled. - - - - - - - - - - - - - -Configuration Files Overview - - For Unix, *BSD and Linux, all configuration files are located in - /etc/privoxy/ by default. For MS Windows, OS/2, and - AmigaOS these are all in the same directory as the - Privoxy executable. The name and number of - configuration files has changed from previous versions, and is subject to - change as development progresses. - - - - The installed defaults provide a reasonable starting point, though possibly - aggressive by some standards. For the time being, there are only three - default configuration files (this will change in time): - - - - - - - - The main configuration file is named config - on Linux, Unix, BSD, OS/2, and AmigaOS and config.txt - on Windows. - - - - - - The default.action file is used to define various - actions relating to images, banners, pop-ups, access - restrictions, banners and cookies. There is a CGI based editor for this - file that can be accessed via http://p.p. (Other actions - files are included as well with differing levels of filtering - and blocking, e.g. ijb-basic.action.) - - - - - - The default.filter file can be used to re-write the raw - page content, including viewable text as well as embedded HTML and JavaScript, - and whatever else lurks on any given web page. - - - - - - - - default.action and default.filter - can use Perl style regular expressions for maximum flexibility. All files use - the # character to denote a comment. Such - lines are not processed by Privoxy. After - making any changes, there is no need to restart - Privoxy in order for the changes to take - effect. Privoxy should detect such changes - automatically. - - - - While under development, the configuration content is subject to change. - The below documentation may not be accurate by the time you read this. - Also, what constitutes a default setting, may change, so - please check all your configuration files on important issues. - - - - - - - -The Main Configuration File - - Again, the main configuration file is named config on - Linux/Unix/BSD and OS/2, and config.txt on Windows. - Configuration lines consist of an initial keyword followed by a list of - values, all separated by whitespace (any number of spaces or tabs). For - example: - - - - - - - blockfile blocklist.ini - - - - - - - Indicates that the blockfile is named blocklist.ini. (A - default installation does not use this.) - - - - A # indicates a comment. Any part of a - line following a # is ignored, except if - the # is preceded by a - \. - - - - Thus, by placing a # at the start of an - existing configuration line, you can make it a comment and it will be treated - as if it weren't there. This is called commenting out an - option and can be useful to turn off features: If you comment out the - logfile line, Privoxy will not - log to a file at all. Watch for the default: section in each - explanation to see what happens if the option is left unset (or commented - out). - - - - Long lines can be continued on the next line by using a - \ as the very last character. - - - - There are various aspects of Privoxy behavior - that can be tuned. - - - - - - -Defining Other Configuration Files - - - Privoxy can use a number of other files to tell it - what ads to block, what cookies to accept, etc. This section of the - configuration file tells Privoxy where to find - all those other files. - - - - On Windows and AmigaOS, - Privoxy looks for these files in the same - directory as the executable. On Unix and OS/2, - Privoxy looks for these files in the current - working directory. In either case, an absolute path name can be used to - avoid problems. - - - - When development goes modular and multi-user, the blocker, filter, and - per-user config will be stored in subdirectories of confdir. - For now, only confdir/templates is used for storing HTML - templates for CGI results. - - - - The location of the configuration files: - - - - - - - confdir /etc/privoxy # No trailing /, please. - - - - - - - The directory where all logging (i.e. logfile and - jarfile) takes place. No trailing - /, please: - - - - - - - logdir /var/log/privoxy - - - - - - - Note that all file specifications below are relative to - the above two directories! - - - - The default.action file contains patterns to specify the - actions to apply to requests for each site. Default: Cookies to and from all - destinations are kept only during the current browser session (i.e. they are - not saved to disk). Pop-ups are disabled for all sites. All sites are - filtered through selected sections of default.filter. No sites - are blocked. Privoxy displays a checkboard type - pattern for filtered ads and other images. The syntax of this file is - explained in detail below. Other - actions files are included, and you are free to use any of - them. They have varying degrees of aggressiveness. - - - - - - - actionsfile default.action - - - - - - - The default.filter file contains content modification rules - that use regular expressions. These rules permit powerful - changes on the content of Web pages, e.g., you could disable your favorite - JavaScript annoyances, re-write the actual displayed text, or just have some - fun replacing Microsoft with MicroSuck wherever - it appears on a Web page. Default: whatever the developers are playing with - :-/ - - - - Filtering requires buffering the page content, which may appear to slow down - page rendering since nothing is displayed until all content has passed - the filters. (It does not really take longer, but seems that way since - the page is not incrementally displayed.) This effect will be more noticeable - on slower connections. - - - - - - - - filterfile default.filter - - - - - - - The logfile is where all logging and error messages are written. The logfile - can be useful for tracking down a problem with - Privoxy (e.g., it's not blocking an ad you - think it should block) but in most cases you probably will never look at it. - - - - Your logfile will grow indefinitely, and you will probably want to - periodically remove it. On Unix systems, you can do this with a cron job - (see man cron). For Redhat, a logrotate - script has been included. - - - - On SuSE Linux systems, you can place a line like /var/log/privoxy.* - +1024k 644 nobody.nogroup in /etc/logfiles, with - the effect that cron.daily will automatically archive, gzip, and empty the - log, when it exceeds 1M size. - - - - Default: Log to the a file named logfile. - Comment out to disable logging. - - - - - - - logfile logfile - - - - - - - The jarfile defines where - Privoxy stores the cookies it intercepts. Note - that if you use a jarfile, it may grow quite large. Default: - Don't store intercepted cookies. - - - - - - - #jarfile jarfile - - - - - - - If you specify a trustfile, - Privoxy will only allow access to sites that - are named in the trustfile. You can also mark sites as trusted referrers, - with the effect that access to untrusted sites will be granted, if a link - from a trusted referrer was used. The link target will then be added to the - trustfile. This is a very restrictive feature that typical - users most probably want to leave disabled. Default: Disabled, don't use the - trust mechanism. - - - - - - - #trustfile trust - - - - - - - If you use the trust mechanism, it is a good idea to write up some on-line - documentation about your blocking policy and to specify the URL(s) here. They - will appear on the page that your users receive when they try to access - untrusted content. Use multiple times for multiple URLs. Default: Don't - display links on the untrusted info page. - - - - - - - trust-info-url http://www.your-site.com/why_we_block.html - trust-info-url http://www.your-site.com/what_we_allow.html - - - - - - - - - - - - - - -Other Configuration Options - - - This part of the configuration file contains options that control how - Privoxy operates. - - - - Admin-address should be set to the email address of the proxy - administrator. It is used in many of the proxy-generated pages. Default: - fill@me.in.please. - - - - - - - #admin-address fill@me.in.please - - - - - - - Proxy-info-url can be set to a URL that contains more info - about this Privoxy installation, it's - configuration and policies. It is used in many of the proxy-generated pages - and its use is highly recommended in multi-user installations, since your - users will want to know why certain content is blocked or modified. Default: - Don't show a link to on-line documentation. - - - - - - - proxy-info-url http://www.your-site.com/proxy.html - - - - - - - Listen-address specifies the address and port where - Privoxy will listen for connections from your - Web browser. The default is to listen on the localhost port 8118, and - this is suitable for most users. (In your web browser, under proxy - configuration, list the proxy server as localhost and the - port as 8118). - - - - If you already have another service running on port 8118, or if you want to - serve requests from other machines (e.g. on your local network) as well, you - will need to override the default. The syntax is - listen-address [<ip-address>]:<port>. If you leave - out the IP address, Privoxy will bind to all - interfaces (addresses) on your machine and may become reachable from the - Internet. In that case, consider using access control lists (acl's) (see - aclfile above), or a firewall. - - - - For example, suppose you are running Privoxy on - a machine which has the address 192.168.0.1 on your local private network - (192.168.0.0) and has another outside connection with a different address. - You want it to serve requests from inside only: - - - - - - - listen-address 192.168.0.1:8118 - - - - - - - If you want it to listen on all addresses (including the outside - connection): - - - - - - - listen-address :8118 - - - - - - - If you do this, consider using ACLs (see aclfile above). Note: - you will need to point your browser(s) to the address and port that you have - configured here. Default: localhost:8118 (127.0.0.1:8118). - - - - The debug option sets the level of debugging information to log in the - logfile (and to the console in the Windows version). A debug level of 1 is - informative because it will show you each request as it happens. Higher - levels of debug are probably only of interest to developers. - - - - - - - debug 1 # GPC = show each GET/POST/CONNECT request - debug 2 # CONN = show each connection status - debug 4 # IO = show I/O status - debug 8 # HDR = show header parsing - debug 16 # LOG = log all data into the logfile - debug 32 # FRC = debug force feature - debug 64 # REF = debug regular expression filter - debug 128 # = debug fast redirects - debug 256 # = debug GIF de-animation - debug 512 # CLF = Common Log Format - debug 1024 # = debug kill pop-ups - debug 4096 # INFO = Startup banner and warnings. - debug 8192 # ERROR = Non-fatal errors - - - - - - - It is highly recommended that you enable ERROR - reporting (debug 8192), at least until v3.0 is released. - - - - The reporting of FATAL errors (i.e. ones which crash - Privoxy) is always on and cannot be disabled. - - - - If you want to use CLF (Common Log Format), you should set debug - 512 ONLY, do not enable anything else. - - - - Multiple debug directives, are OK - they're logical-OR'd - together. - - - - - - - debug 15 # same as setting the first 4 listed above - - - - - - - Default: - - - - - - - debug 1 # URLs - debug 4096 # Info - debug 8192 # Errors - *we highly recommended enabling this* - - - - - - - Privoxy normally uses - multi-threading, a software technique that permits it to - handle many different requests simultaneously. In some cases you may wish to - disable this -- particularly if you're trying to debug a problem. The - single-threaded option forces - Privoxy to handle requests sequentially. - Default: Multi-threaded mode. - - - - - - - #single-threaded - - - - - - - toggle allows you to temporarily disable all - Privoxy's filtering. Just set toggle - 0. - - - - The Windows version of Privoxy puts an icon in - the system tray, which also allows you to change this option. If you - right-click on that icon (or select the Options menu), one - choice is Enable. Clicking on enable toggles - Privoxy on and off. This is useful if you want - to temporarily disable Privoxy, e.g., to access - a site that requires cookies which you would otherwise have blocked. This can also - be toggled via a web browser at the Privoxy - internal address of http://p.p on - any platform. - - - - toggle 1 means Privoxy runs - normally, toggle 0 means that - Privoxy becomes a non-anonymizing non-blocking - proxy. Default: 1 (on). - - - - - - - toggle 1 - - - - - - - For content filtering, i.e. the +filter and - +deanimate-gif actions, it is necessary that - Privoxy buffers the entire document body. - This can be potentially dangerous, since a server could just keep sending - data indefinitely and wait for your RAM to exhaust. With nasty consequences. - - - - The buffer-limit option lets you set the maximum - size in Kbytes that each buffer may use. When the documents buffer exceeds - this size, it is flushed to the client unfiltered and no further attempt to - filter the rest of it is made. Remember that there may multiple threads - running, which might require increasing the buffer-limit - Kbytes each, unless you have enabled - single-threaded above. - - - - - - - buffer-limit 4069 - - - - - - - To enable the web-based default.action file editor set - enable-edit-actions to 1, or 0 to disable. Note - that you must have compiled Privoxy with - support for this feature, otherwise this option has no effect. This - internal page can be reached at http://p.p. - - - - Security note: If this is enabled, anyone who can use the proxy - can edit the actions file, and their changes will affect all users. - For shared proxies, you probably want to disable this. Default: enabled. - - - - - - - enable-edit-actions 1 - - - - - - - Allow Privoxy to be toggled on and off - remotely, using your web browser. Set enable-remote-toggleto - 1 to enable, and 0 to disable. Note that you must have compiled - Privoxy with support for this feature, - otherwise this option has no effect. - - - - Security note: If this is enabled, anyone who can use the proxy can toggle - it on or off (see http://p.p), and - their changes will affect all users. For shared proxies, you probably want to - disable this. Default: enabled. - - - - - - - enable-remote-toggle 1 - - - - - - - - - - - - - -Access Control List (ACL) - - Access controls are included at the request of some ISPs and systems - administrators, and are not usually needed by individual users. Please note - the warnings in the FAQ that this proxy is not intended to be a substitute - for a firewall or to encourage anyone to defer addressing basic security - weaknesses. - - - - If no access settings are specified, the proxy talks to anyone that - connects. If any access settings file are specified, then the proxy - talks only to IP addresses permitted somewhere in this file and not - denied later in this file. - - - - Summary -- if using an ACL: - - - - - Client must have permission to receive service. - - - - - LAST match in ACL wins. - - - - - Default behavior is to deny service. - - - - - The syntax for an entry in the Access Control List is: - - - - - - - ACTION SRC_ADDR[/SRC_MASKLEN] [ DST_ADDR[/DST_MASKLEN] ] - - - - - - - Where the individual fields are: - - - - - - - ACTION = permit-access or deny-access - - SRC_ADDR = client hostname or dotted IP address - SRC_MASKLEN = number of bits in the subnet mask for the source - - DST_ADDR = server or forwarder hostname or dotted IP address - DST_MASKLEN = number of bits in the subnet mask for the target - - - - - - - - The field separator (FS) is whitespace (space or tab). - - - - IMPORTANT NOTE: If Privoxy is using a - forwarder (see below) or a gateway for a particular destination URL, the - DST_ADDR that is examined is the address of the forwarder - or the gateway and NOT the address of the ultimate - target. This is necessary because it may be impossible for the local - Privoxy to determine the address of the - ultimate target (that's often what gateways are used for). - - - - Here are a few examples to show how the ACL features work: - - - - localhost is OK -- no DST_ADDR implies that - ALL destination addresses are OK: - - - - - - - permit-access localhost - - - - - - - A silly example to illustrate permitting any host on the class-C subnet with - Privoxy to go anywhere: - - - - - - - permit-access www.privoxy.com/24 - - - - - - - Except deny one particular IP address from using it at all: - - - - - - - deny-access ident.privoxy.com - - - - - - - You can also specify an explicit network address and subnet mask. - Explicit addresses do not have to be resolved to be used. - - - - - - - permit-access 207.153.200.0/24 - - - - - - - A subnet mask of 0 matches anything, so the next line permits everyone. - - - - - - - permit-access 0.0.0.0/0 - - - - - - - Note, you cannot say: - - - - - - - permit-access .org - - - - - - - to allow all *.org domains. Every IP address listed must resolve fully. - - - - An ISP may want to provide a Privoxy that is - accessible by the world and yet restrict use of some of their - private content to hosts on its internal network (i.e. its own subscribers). - Say, for instance the ISP owns the Class-B IP address block 123.124.0.0 (a 16 - bit netmask). This is how they could do it: - - - - - - - permit-access 0.0.0.0/0 0.0.0.0/0 # other clients can go anywhere - # with the following exceptions: - - deny-access 0.0.0.0/0 123.124.0.0/16 # block all external requests for - # sites on the ISP's network - - permit 0.0.0.0/0 www.my_isp.com # except for the ISP's main - # web site - - permit 123.124.0.0/16 0.0.0.0/0 # the ISP's clients can go - # anywhere - - - - - - - Note that if some hostnames are listed with multiple IP addresses, - the primary value returned by DNS (via gethostbyname()) is used. Default: - Anyone can access the proxy. - - - - - - - - - - -Forwarding - - - This feature allows chaining of HTTP requests via multiple proxies. - It can be used to better protect privacy and confidentiality when - accessing specific domains by routing requests to those domains - to a special purpose filtering proxy such as lpwa.com. Or to use - a caching proxy to speed up browsing. - - - - It can also be used in an environment with multiple networks to route - requests via multiple gateways allowing transparent access to multiple - networks without having to modify browser configurations. - - - - Also specified here are SOCKS proxies. Privoxy - SOCKS 4 and SOCKS 4A. The difference is that SOCKS 4A will resolve the target - hostname using DNS on the SOCKS server, not our local DNS client. - - - - The syntax of each line is: - - - - - - - forward target_domain[:port] http_proxy_host[:port] - forward-socks4 target_domain[:port] socks_proxy_host[:port] http_proxy_host[:port] - forward-socks4a target_domain[:port] socks_proxy_host[:port] http_proxy_host[:port] - - - - - - - If http_proxy_host is ., then requests are not forwarded to a - HTTP proxy but are made directly to the web servers. - - - - Lines are checked in sequence, and the last match wins. - - - - There is an implicit line equivalent to the following, which specifies that - anything not finding a match on the list is to go out without forwarding - or gateway protocol, like so: - - - - - - - forward .* . # implicit - - - - - - - In the following common configuration, everything goes to Lucent's LPWA, - except SSL on port 443 (which it doesn't handle): - - - - - - - forward .* lpwa.com:8000 - forward :443 . - - - - - - - - Some users have reported difficulties related to LPWA's use of - . as the last element of the domain, and have said that this - can be fixed with this: - - - - - - - forward lpwa. lpwa.com:8000 - - - - - - - (NOTE: the syntax for specifying target_domain has changed since the - previous paragraph was written -- it will not work now. More information - is welcome.) - - - - In this fictitious example, everything goes via an ISP's caching proxy, - except requests to that ISP: - - - - - - - forward .* caching.myisp.net:8000 - forward myisp.net . - - - - - - - For the @home network, we're told the forwarding configuration is this: - - - - - - - - forward .* proxy:8080 - - - - - - - Also, we're told they insist on getting cookies and JavaScript, so you should - allow cookies from home.com. We consider JavaScript a potential security risk. - Java need not be enabled. - - - - In this example direct connections are made to all internal - domains, but everything else goes through Lucent's LPWA by way of the - company's SOCKS gateway to the Internet. - - - - - - - forward-socks4 .* lpwa.com:8000 firewall.my_company.com:1080 - forward my_company.com . - - - - - - - This is how you could set up a site that always uses SOCKS but no forwarders: - - - - - - - forward-socks4a .* . firewall.my_company.com:1080 - - - - - - - An advanced example for network administrators: - - - - If you have links to multiple ISPs that provide various special content to - their subscribers, you can configure forwarding to pass requests to the - specific host that's connected to that ISP so that everybody can see all - of the content on all of the ISPs. - - - - This is a bit tricky, but here's an example: - - - - - host-a has a PPP connection to isp-a.com. And host-b has a PPP connection to - isp-b.com. host-a can run a Privoxy proxy with - forwarding like this: - - - - - - - forward .* . - forward isp-b.com host-b:8118 - - - - - - - host-b can run a Privoxy proxy with forwarding - like this: - - - - - - - forward .* . - forward isp-a.com host-a:8118 - - - - - - - Now, anyone on the Internet (including users on host-a - and host-b) can set their browser's proxy to either - host-a or host-b and be able to browse the content on isp-a or isp-b. - - - - Here's another practical example, for University of Kent at - Canterbury students with a network connection in their room, who - need to use the University's Squid web cache. - - - - - - - forward *. ssbcache.ukc.ac.uk:3128 # Use the proxy, except for: - forward .ukc.ac.uk . # Anything on the same domain as us - forward * . # Host with no domain specified - forward 129.12.*.* . # A dotted IP on our /16 network. - forward 127.*.*.* . # Loopback address - forward localhost.localdomain . # Loopback address - forward www.ukc.mirror.ac.uk . # Specific host - - - - - - - If you intend to chain Privoxy and - squid locally, then chain as - browser -> squid -> privoxy is the recommended way. - - - - Your squid configuration could then look like this: - - - - - - - # Define Privoxy as parent cache - - cache_peer 127.0.0.1 parent 8118 0 no-query - - # Define ACL for protocol FTP - acl FTP proto FTP - - # Do not forward ACL FTP to privoxy - always_direct allow FTP - - # Do not forward ACL CONNECT (https) to privoxy - always_direct allow CONNECT - - # Forward the rest to privoxy - never_direct allow all - - - - - - - - - - - - - -Windows GUI Options - - - Privoxy has a number of options specific to the - Windows GUI interface: - - - - If activity-animation is set to 1, the - Privoxy icon will animate when - Privoxy is active. To turn off, set to 0. - - - - - - - activity-animation 1 - - - - - - - If log-messages is set to 1, - Privoxy will log messages to the console - window: - - - - - - - log-messages 1 - - - - - - - If log-buffer-size is set to 1, the size of the log buffer, - i.e. the amount of memory used for the log messages displayed in the - console window, will be limited to log-max-lines (see below). - - - - Warning: Setting this to 0 will result in the buffer to grow infinitely and - eat up all your memory! - - - - - - - log-buffer-size 1 - - - - - - - log-max-lines is the maximum number of lines held - in the log buffer. See above. - - - - - - - log-max-lines 200 - - - - - - - If log-highlight-messages is set to 1, - Privoxy will highlight portions of the log - messages with a bold-faced font: - - - - - - - log-highlight-messages 1 - - - - - - - The font used in the console window: - - - - - - - log-font-name Comic Sans MS - - - - - - - Font size used in the console window: - - - - - - - log-font-size 8 - - - - - - - show-on-task-bar controls whether or not - Privoxy will appear as a button on the Task bar - when minimized: - - - - - - - show-on-task-bar 0 - - - - - - - If close-button-minimizes is set to 1, the Windows close - button will minimize Privoxy instead of closing - the program (close with the exit option on the File menu). - - - - - - - close-button-minimizes 1 - - - - - - - The hide-console option is specific to the MS-Win console - version of Privoxy. If this option is used, - Privoxy will disconnect from and hide the - command console. - - - - - - - #hide-console - - - - - - - - - - - - - -The Actions File - - - The default.action file (formerly - actionsfile or ijb.action) is used to define what actions - Privoxy takes, and thus determines how images, - cookies and various other aspects of HTTP content and transactions are - handled. Images can be anything you want, including ads, banners, or just - some obnoxious URL that you would rather not see. Cookies can be accepted - or rejected, or accepted only during the current browser session (i.e. - not written to disk). Changes to default.action should - be immediately visible to Privoxy without - the need to restart. - - - - The easiest way to edit actions file is with a browser by - loading http://p.p/, and then select - Edit Actions List. A text editor can also be used. - - - - To determine which actions apply to a request, the URL of the request is - compared to all patterns in this file. Every time it matches, the list of - applicable actions for the URL is incrementally updated. You can trace - this process by visiting http://p.p/show-url-info. - - - - - There are four types of lines in this file: comments (begin with a - # character), actions, aliases and patterns, all of which are - explained below, as well as the configuration file syntax that - Privoxy understands. - - - - - - -URL Domain and Path Syntax - - Generally, a pattern has the form <domain>/<path>, where both the - <domain> and <path> part are optional. If you only specify a - domain part, the / can be left out: - - - - www.example.com - is a domain only pattern and will match any request to - www.example.com. - - - - www.example.com/ - means exactly the same. - - - - www.example.com/index.html - matches only the single - document /index.html on www.example.com. - - - - /index.html - matches the document /index.html, regardless of - the domain. - - - - index.html - matches nothing, since it would be - interpreted as a domain name and there is no top-level domain called - .html. - - - - The matching of the domain part offers some flexible options: if the - domain starts or ends with a dot, it becomes unanchored at that end. - For example: - - - - .example.com - matches any domain that ENDS in - .example.com. - - - - www. - matches any domain that STARTS with - www. - - - - Additionally, there are wild-cards that you can use in the domain names - themselves. They work pretty similar to shell wild-cards: * - stands for zero or more arbitrary characters, ? stands for - any single character. And you can define character classes in square - brackets and they can be freely mixed: - - - - ad*.example.com - matches adserver.example.com, - ads.example.com, etc but not sfads.example.com. - - - - *ad*.example.com - matches all of the above, and then some. - - - - .?pix.com - matches www.ipix.com, - pictures.epix.com, a.b.c.d.e.upix.com, etc. - - - - www[1-9a-ez].example.com - matches www1.example.com, - www4.example.com, wwwd.example.com, - wwwz.example.com, etc., but not - wwww.example.com. - - - - If Privoxy was compiled with - pcre support (default), Perl compatible regular expressions - can be used. See the pcre/docs/ directory or man - perlre (also available on http://www.perldoc.com/perl5.6/pod/perlre.html) - for details. A brief discussion of regular expressions is in the - Appendix. For instance: - - - - /.*/advert[0-9]+\.jpe?g - would match a URL from any - domain, with any path that includes advert followed - immediately by one or more digits, then a . and ending in - either jpeg or jpg. So we match - example.com/ads/advert2.jpg, and - www.example.com/ads/banners/advert39.jpeg, but not - www.example.com/ads/banners/advert39.gif (no gifs in the - example pattern). - - - - Please note that matching in the path is case - INSENSITIVE by default, but you can switch to case - sensitive at any point in the pattern by using the - (?-i) switch: - - - - www.example.com/(?-i)PaTtErN.* - will match only - documents whose path starts with PaTtErN in - exactly this capitalization. - - - - - - - - - - - -Actions - - Actions are enabled if preceded with a +, and disabled if - preceded with a -. Actions are invoked by enclosing the - action name in curly braces (e.g. {+some_action}), followed by a list of - URLs to which the action applies. There are three classes of actions: - - - - - - - - Boolean (e.g. +/-block): - - - - - - {+name} # enable this action - {-name} # disable this action - - - - - - - - - - parameterized (e.g. +/-hide-user-agent): - - - - - - {+name{param}} # enable action and set parameter to param - {-name} # disable action - - - - - - - - - Multi-value (e.g. {+/-add-header{Name: value}}, {+/-wafer{name=value}}): - - - - - - {+name{param}} # enable action and add parameter param - {-name{param}} # remove the parameter param - {-name} # disable this action totally - - - - - - - - - - - If nothing is specified in this file, no actions are taken. - So in this case Privoxy would just be a - normal, non-blocking, non-anonymizing proxy. You must specifically - enable the privacy and blocking features you need (although the - provided default default.action file will - give a good starting point). - - - - Later defined actions always over-ride earlier ones. For multi-valued - actions, the actions are applied in the order they are specified. - - - - The list of valid Privoxy actions are: - - - - - - - - Add the specified HTTP header, which is not checked for validity. - You may specify this many times to specify many different headers: - - - - - - +add-header{Name: value} - - - - - - - - - - Block this URL totally. In a default installation, a blocked - URL will result in bright red banner that says BLOCKED, - with a reason why it is being blocked. - - - - - - +block - - - - - - - - - - De-animate all animated GIF images, i.e. reduce them to their last frame. - This will also shrink the images considerably (in bytes, not pixels!). If - the option first is given, the first frame of the animation - is used as the replacement. If last is given, the last frame - of the animation is used instead, which probably makes more sense for most - banner animations, but also has the risk of not showing the entire last - frame (if it is only a delta to an earlier frame). - - - - - - +deanimate-gifs{last} - +deanimate-gifs{first} - - - - - - - - - +downgrade will downgrade HTTP/1.1 client requests to - HTTP/1.0 and downgrade the responses as well. Use this action for servers - that use HTTP/1.1 protocol features that - Privoxy doesn't handle well yet. HTTP/1.1 - is only partially implemented. Default is not to downgrade requests. - - - - - - +downgrade - - - - - - - - - Many sites, like yahoo.com, don't just link to other sites. Instead, they - will link to some script on their own server, giving the destination as a - parameter, which will then redirect you to the final target. URLs resulting - from this scheme typically look like: - http://some.place/some_script?http://some.where-else. - - - Sometimes, there are even multiple consecutive redirects encoded in the - URL. These redirections via scripts make your web browsing more traceable, - since the server from which you follow such a link can see where you go to. - Apart from that, valuable bandwidth and time is wasted, while your browser - ask the server for one redirect after the other. Plus, it feeds the - advertisers. - - - The +fast-redirects option enables interception of these - requests by Privoxy, who will cut off all but - the last valid URL in the request and send a local redirect back to your - browser without contacting the remote site. - - - - - - +fast-redirects - - - - - - - - - Apply the filters in the section_header - section of the default.filter file to the site(s). - default.filter sections are grouped according to like - functionality. - - - - - - - +filter{section_header} - - - - - - - Filter sections that are pre-defined in the supplied - default.filter include: - - -
    - - - html-annoyances: Get rid of particularly annoying HTML abuse. - - - - - js-annoyances: Get rid of particularly annoying JavaScript abuse - - - - - no-poups: Kill all popups in JS and HTML - - - - - frameset-borders: Give frames a border - - - - - webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking) - - - - - no-refresh: Automatic refresh sucks on auto-dialup lines - - - - - fun: Text replacements for subversive browsing fun! - - - - - nimda: Remove (virus) Nimda code. - - - - - banners-by-size: Kill banners by size - - - - - crude-parental: Kill all web pages that contain the words "sex" or "warez" - - -
    - -
    - - - - Block any existing X-Forwarded-for header, and do not add a new one: - - - - - - +hide-forwarded - - - - - - - - - If the browser sends a From: header containing your e-mail - address, this either completely removes the header (block), or - changes it to the specified e-mail address. - - - - - - +hide-from{block} - +hide-from{spam@sittingduck.xqq} - - - - - - - - - Don't send the Referer: (sic) header to the web site. You - can block it, forge a URL to the same server as the request (which is - preferred because some sites will not send images otherwise) or set it to a - constant string of your choice. - - - - - - +hide-referer{block} - +hide-referer{forge} - +hide-referer{http://nowhere.com} - - - - - - - - - Alternative spelling of +hide-referer. It has the same - parameters, and can be freely mixed with, +hide-referer. - (referrer is the correct English spelling, however the HTTP - specification has a bug - it requires it to be spelled referer.) - - - - - - +hide-referrer{...} - - - - - - - - - Change the User-Agent: header so web servers can't tell your - browser type. Warning! This breaks many web sites. Specify the - user-agent value you want. Example, pretend to be using Netscape on - Linux: - - - - - - +hide-user-agent{Mozilla (X11; I; Linux 2.0.32 i586)} - - - - - - - - - - Treat this URL as an image. This only matters if it's also +blocked, - in which case a blocked image can be sent rather than a HTML page. - See +image-blocker{} below for the control over what is actually sent. - If you want invisible ads, they should be defined as - images and blocked. And also, - image-blocker should be set to blank. - - - - - - +image - - - - - - - - Decides what to do with URLs that end up tagged with {+block - +image}, e.g an advertizement. There are five options. - -image-blocker will send a HTML blocked page, - usually resulting in a broken image icon. - - - -+image-blocker{blank} will send a 1x1 transparent GIF -image. And finally, +image-blocker{http://xyz.com} will send a -HTTP temporary redirect to the specified image. This has the advantage of the -icon being being cached by the browser, which will speed up the display. -+image-blocker{pattern} will send a checkboard type pattern - - - - - - - - - - +image-blocker{blank} - +image-blocker{pattern} - +image-blocker{http://p.p/send-banner} - - - - - - - - - By default (i.e. in the absence of a +limit-connect - action), Privoxy will only allow CONNECT - requests to port 443, which is the standard port for https as a - precaution. - - - - The CONNECT methods exists in HTTP to allow access to secure websites - (https:// URLs) through proxies. It works very simply: the proxy - connects to the server on the specified port, and then short-circuits - its connections to the client and to the remote proxy. - This can be a big security hole, since CONNECT-enabled proxies can - be abused as TCP relays very easily. - - - - If you want to allow CONNECT for more ports than this, or want to forbid - CONNECT altogether, you can specify a comma separated list of ports and - port ranges (the latter using dashes, with the minimum defaulting to 0 and - max to 65K): - - - - - - - +limit-connect{443} # This is the default and need no be specified. - +limit-connect{80,443} # Ports 80 and 443 are OK. - +limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to 100 - #and above 500 are OK. - - - - - - - - - - +no-compression prevents the website from compressing the - data. Some websites do this, which can be a problem for - Privoxy, since +filter, - +no-popup and +gif-deanimate will not work on - compressed data. This will slow down connections to those websites, - though. Default is nocompression is turned on. - - - - - - - +nocompression - - - - - - - - - If the website sets cookies, no-cookies-keep will make sure - they are erased when you exit and restart your web browser. This makes - profiling cookies useless, but won't break sites which require cookies so - that you can log in for transactions. Default: on. - - - - - - +no-cookies-keep - - - - - - - - - Prevent the website from reading cookies: - - - - - - +no-cookies-read - - - - - - - - - Prevent the website from setting cookies: - - - - - - +no-cookies-set - - - - - - - - - Filter the website through a built-in filter to disable those obnoxious - JavaScript pop-up windows via window.open(), etc. The two alternative - spellings are equivalent. - - - - - - +no-popup - +no-popups - - - - - - - - - This action only applies if you are using a jarfile - for saving cookies. It sends a cookie to every site stating that you do not - accept any copyright on cookies sent to you, and asking them not to track - you. Of course, this is a (relatively) unique header they could use to - track you. - - - - - - +vanilla-wafer - - - - - - - - - This allows you to add an arbitrary cookie. It can be specified multiple - times in order to add as many cookies as you like. - - - - - - +wafer{name=value} - - - - - - -
    -
    - - - The meaning of any of the above is reversed by preceding the action with a - -, in place of the +. - - - - Some examples: - - - - Turn off cookies by default, then allow a few through for specified sites: - - - - - - - # Turn off all persistent cookies - { +no-cookies-read } - { +no-cookies-set } - # Allow cookies for this browser session ONLY - { +no-cookies-keep } - - # Exceptions to the above, sites that benefit from persistent cookies - { -no-cookies-read } - { -no-cookies-set } - { -no-cookies-keep } - .javasoft.com - .sun.com - .yahoo.com - .msdn.microsoft.com - .redhat.com - - # Alternative way of saying the same thing - {-no-cookies-set -no-cookies-read -no-cookies-keep} - .sourceforge.net - .sf.net - - - - - - - Now turn off fast redirects, and then we allow two exceptions: - - - - - - - # Turn them off! - {+fast-redirects} - - # Reverse it for these two sites, which don't work right without it. - {-fast-redirects} - www.ukc.ac.uk/cgi-bin/wac\.cgi\? - login.yahoo.com - - - - - - - Turn on page filtering according to rules in the defined sections - of refilterfile, and make one exception for - sourceforge: - - - - - - - # Run everything through the filter file, using only the - # specified sections: - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\ - +filter{webbugs} +filter{nimda} +filter{banners-by-size} - - # Then disable filtering of code from sourceforge! - {-filter} - .cvs.sourceforge.net - - - - - - - Now some URLs that we want blocked, ie we won't see them. - Many of these use regular expressions that will expand to match multiple - URLs: - - - - - - - # Blocklist: - {+block} - /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g)) - /.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/]) - /.*/(ng)?adclient\.cgi - /.*/(plain|live|rotate)[-_.]?ads?/ - /.*/(sponsor)s?[0-9]?/ - /.*/_?(plain|live)?ads?(-banners)?/ - /.*/abanners/ - /.*/ad(sdna_image|gifs?)/ - /.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe) - /.*/adbanners/ - /.*/adserver - /.*/adstream\.cgi - /.*/adv((er)?ts?|ertis(ing|ements?))?/ - /.*/banner_?ads/ - /.*/banners?/ - /.*/banners?\.cgi/ - /.*/cgi-bin/centralad/getimage - /.*/images/addver\.gif - /.*/images/marketing/.*\.(gif|jpe?g) - /.*/popupads/ - /.*/siteads/ - /.*/sponsor.*\.gif - /.*/sponsors?[0-9]?/ - /.*/advert[0-9]+\.jpg - /Media/Images/Adds/ - /ad_images/ - /adimages/ - /.*/ads/ - /bannerfarm/ - /grafikk/annonse/ - /graphics/defaultAd/ - /image\.ng/AdType - /image\.ng/transactionID - /images/.*/.*_anim\.gif # alvin brattli - /ip_img/.*\.(gif|jpe?g) - /rotateads/ - /rotations/ - /worldnet/ad\.cgi - /cgi-bin/nph-adclick.exe/ - /.*/Image/BannerAdvertising/ - /.*/ad-bin/ - /.*/adlib/server\.cgi - /autoads/ - - - - - - - Note that many of these actions have the potential to cause a page to - misbehave, possibly even not to display at all. There are many ways - a site designer may choose to design his site, and what HTTP header - content he may depend on. There is no way to have hard and fast rules - for all sites. See the Appendix - for a brief example on troubleshooting actions. - - - -
    - - - - - - -Aliases - - Custom actions, known to Privoxy - as aliases, can be defined by combining other actions. - These can in turn be invoked just like the built-in actions. - Currently, an alias can contain any character except space, tab, =, - { or }. But please use only a- - z, 0-9, +, and - -. Alias names are not case sensitive, and - must be defined before anything else in the - default.actionfile ! And there can only be one set of - aliases defined. - - - - Now let's define a few aliases: - - - - - - - # Useful customer aliases we can use later. These must come first! - {{alias}} - +no-cookies = +no-cookies-set +no-cookies-read - -no-cookies = -no-cookies-set -no-cookies-read - fragile = -block -no-cookies -filter -fast-redirects -hide-referer -no-popups - shop = -no-cookies -filter -fast-redirects - +imageblock = +block +image - - #For people who don't like to type too much: ;-) - c0 = +no-cookies - c1 = -no-cookies - c2 = -no-cookies-set +no-cookies-read - c3 = +no-cookies-set -no-cookies-read - #... etc. Customize to your heart's content. - - - - - - - Some examples using our shop and fragile - aliases from above: - - - - - - - # These sites are very complex and require - # minimal interference. - {fragile} - .office.microsoft.com - .windowsupdate.microsoft.com - .nytimes.com - - # Shopping sites - still want to block ads. - {shop} - .quietpc.com - .worldpay.com # for quietpc.com - .jungle.com - .scan.co.uk - - # These shops require pop-ups - {shop -no-popups} - .dabs.com - .overclockers.co.uk - - - - - - -
    - - - - - - -The Filter File - - Any web page can be dynamically modified with the filter file. This - modification can be removal, or re-writing, of any web page content, - including tags and non-visible content. The default filter file is - default.filter, located in the config directory. - - - - The included example file is divided into sections. Each section begins - with the FILTER keyword, followed by the identifier - for that section, e.g. FILTER: webbugs. Each section performs - a similar type of filtering, such as html-annoyances. - - - - - This file uses regular expressions to alter or remove any string in the - target page. The expressions can only operate on one line at a time. Some - examples from the included default default.filter: - - - - Stop web pages from displaying annoying messages in the status bar by - deleting such references: - - - - - - - FILTER: html-annoyances - - # New browser windows should be resizeable and have a location and status - # bar. Make it so. - # - s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig - s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig - s/scrolling="?(no|0|Auto)"?/scrolling=1/ig - s/menubar="?(no|0)"?/menubar=1/ig - - # The <BLINK> tag was a crime! - # - s*<blink>|</blink>**ig - - # Is this evil? - # - #s/framespacing="?(no|0)"?//ig - #s/margin(height|width)=[0-9]*//gi - - - - - - - Just for kicks, replace any occurrence of Microsoft with - MicroSuck, and have a little fun with topical buzzwords: - - - - - - - FILTER: fun - - s/microsoft(?!.com)/MicroSuck/ig - - # Buzzword Bingo: - # - s/industry-leading|cutting-edge|award-winning/<font color=red><b>BINGO!</b></font>/ig - - - - - - - Kill those pesky little web-bugs: - - - - - - - # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking) - FILTER: webbugs - - s/<img\s+[^>]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\s*['"]?1(\D[^>]*?)?>/<!-- Squished WebBug -->/sig - - - - - - - - - - - - - - -Templates - - When Privoxy displays one of its internal - pages, such as a 404 Not Found error page, it uses the appropriate template. - On Linux, BSD, and Unix, these are located in - /etc/privoxy/templates by default. These may be - customized, if desired. - - - - -
    - - - - - - -Quickstart to Using <application>Privoxy</application> - - Install package, then run and enjoy! Privoxy - is typically started by specifying the main configuration file to be - used on the command line. Example Unix startup command: - - - - - - # /usr/sbin/privoxy /etc/privoxy/config - - - - - - An init script is provided for SuSE and Redhat. - - - -For for SuSE: /etc/rc.d/privoxy start - - - -For RedHat: /etc/rc.d/init.d/privoxy start - - - - - If no configuration file is specified on the command line, - Privoxy will look for a file named - config in the current directory. Except on Win32 where - it will try config.txt. If no file is specified on the - command line and no default configuration file can be found, - Privoxy will fail to start. - - - - Be sure your browser is set to use the proxy which is by default at - localhost, port 8118. With Netscape (and - Mozilla), this can be set under Edit - -> Preferences -> Advanced -> Proxies -> HTTP Proxy. - For Internet Explorer: Tools > - Internet Properties -> Connections -> LAN Setting. Then, - check Use Proxy and fill in the appropriate info (Address: - localhost, Port: 8118). Include if HTTPS proxy support too. - - - - The included default configuration files should give a reasonable starting - point, though may be somewhat aggressive in blocking junk. You will probably - want to keep an eye out for sites that require persistent cookies, and add these to - default.action as needed. By default, most of these will - be accepted only during the current browser session, until you add them to - the configuration. If you want the browser to handle this instead, you will - need to edit default.action and disable this feature. If you - use more than one browser, it would make more sense to let - Privoxy handle this. In which case, the - browser(s) should be set to accept all cookies. - - - - If a particular site shows problems loading properly, try adding it - to the {fragile} section of - default.action. This will turn off most actions for - this site. - - - - Privoxy is HTTP/1.1 compliant, but not all 1.1 - features are as yet implemented. If browsers that support HTTP/1.1 (like - Mozilla or recent versions of I.E.) experience - problems, you might try to force HTTP/1.0 compatibility. For Mozilla, look - under Edit -> Preferences -> Debug -> Networking. - Or set the +downgrade config option in - default.action. - - - - After running Privoxy for a while, you can - start to fine tune the configuration to suit your personal, or site, - preferences and requirements. There are many, many aspects that can - be customized. Actions (as specified in default.action) - can be adjusted by pointing your browser to - http://p.p/, - and then follow the link to edit the actions list. - (This is an internal page and does not require Internet access.) - - - - In fact, various aspects of Privoxy - configuration can be viewed from this page, including - current configuration parameters, source code version numbers, - the browser's request headers, and actions that apply - to a given URL. In addition to the default.action file - editor mentioned above, Privoxy can also - be turned on and off from this page. - - - - If you encounter problems, please verify it is a - Privoxy bug, by disabling - Privoxy, and then trying the same page. - Also, try another browser if possible to eliminate browser or site - problems. Before reporting it as a bug, see if there is not a configuration - option that is enabled that is causing the page not to load. You can - then add an exception for that page or site. If a bug, please report it to - the developers (see below). - - - - - - - -Command Line Options - - Privoxy may be invoked with the following - command-line options: - - - - - - - - --version - - - Print version info and exit, Unix only. - - - - - --help - - - Print a short usage info and exit, Unix only. - - - - - --no-daemon - - - Don't become a daemon, i.e. don't fork and become process group - leader, don't detach from controlling tty. Unix only. - - - - - --pidfile FILE - - - - On startup, write the process ID to FILE. Delete the - FILE on exit. Failiure to create or delete the - FILE is non-fatal. If no FILE - option is given, no PID file will be used. Unix only. - - - - - --user USER[.GROUP] - - - - After (optionally) writing the PID file, assume the user ID of - USER, and if included the GID of GROUP. Exit if the - privileges are not sufficient to do so. Unix only. - - - - - configfile - - - If no configfile is included on the command line, - Privoxy will look for a file named - config in the current directory (except on Win32 - where it will look for config.txt instead). Specify - full path to avoid confusion. - - - - - - - - - - - - - - - - -Contacting the Developers, Bug Reporting and Feature -Requests - -We value your feedback. However, to provide you with the best support, -please note: - - - - Use the Sourceforge support forum to get - help. - - Submit bugs only thru our Sourceforge bug - forum. -Make sure that the bug has not already been submitted. Please try to -verify that it is a Privoxy bug, and not -a browser or site bug first. If you are using your own custom configuration, -please try the stock configs to see if the problem is a configuration -related bug. And if not using the latest development snapshot, please -try the latest one. Or even better, CVS sources. - - - - Submit feature requests only thru our Sourceforge feature request forum. - - - - - - - -For any other issues, feel free to use the mailing lists. - - - - Anyone interested in actively participating in development and related - discussions can join the appropriate mailing list - here. - Archives are available here too. - - - - - - -Copyright and History - - -License - - Privoxy 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, which is available from the Free Software Foundation, - Inc, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - - - - - - - - - -History - - Privoxy is derived from - the Internet Junkbuster, with many - improvments and enhancements over the original. - - - - Junkbuster was originally written by Anonymous - Coders and Junkbuster's - Corporation, and was released as free open-source software under the - GNU GPL. Stefan - Waldherr made many improvements, and started the SourceForge project - Privoxy to rekindle development. There are now several active - developers contributing. The last stable release of - Junkbuster was v2.0.2, which has now - grown whiskers ;-). - - - - - - - -See also - - - - -   http://sourceforge.net/projects/ijbswa - - - - -   http://www.privoxy.org/ - - - - -   http://p.p/ - - - - -   http://www.junkbusters.com/ht/en/cookies.html - - - - -   http://www.waldherr.org/junkbuster/ - - - - -   http://privacy.net/analyze/ - - - - -  http://www.squid-cache.org/ - - - - - - - - - -Appendix - - - - -Regular Expressions - - Privoxy can use regular expressions - in various config files. Assuming support for pcre (Perl - Compatible Regular Expressions) is compiled in, which is the default. Such - configuration directives do not require regular expressions, but they can be - used to increase flexibility by matching a pattern with wild-cards against - URLs. - - - - If you are reading this, you probably don't understand what regular - expressions are, or what they can do. So this will be a very brief - introduction only. A full explanation would require a book ;-) - - - - Regular expressions is a way of matching one character - expression against another to see if it matches or not. One of the - expressions is a literal string of readable characters - (letter, numbers, etc), and the other is a complex string of literal - characters combined with wild-cards, and other special characters, called - meta-characters. The meta-characters have special meanings and - are used to build the complex pattern to be matched against. Perl Compatible - Regular Expressions is an enhanced form of the regular expression language - with backward compatibility. - - - - To make a simple analogy, we do something similar when we use wild-card - characters when listing files with the dir command in DOS. - *.* matches all filenames. The special - character here is the asterisk which matches any and all characters. We can be - more specific and use ? to match just individual - characters. So dir file?.text would match - file1.txt, file2.txt, etc. We are pattern - matching, using a similar technique to regular expressions! - - - - Regular expressions do essentially the same thing, but are much, much more - powerful. There are many more special characters and ways of - building complex patterns however. Let's look at a few of the common ones, - and then some examples: - - - - - . - Matches any single character, e.g. a, - A, 4, :, or @. - - - - - - ? - The preceding character or expression is matched ZERO or ONE - times. Either/or. - - - - - - + - The preceding character or expression is matched ONE or MORE - times. - - - - - - * - The preceding character or expression is matched ZERO or MORE - times. - - - - - - \ - The escape character denotes that - the following character should be taken literally. This is used where one of the - special characters (e.g. .) needs to be taken literally and - not as a special meta-character. - - - - - - [] - Characters enclosed in brackets will be matched if - any of the enclosed characters are encountered. - - - - - - () - parentheses are used to group a sub-expression, - or multiple sub-expressions. - - - - - - | - The bar character works like an - or conditional statement. A match is successful if the - sub-expression on either side of | matches. - - - - - - s/string1/string2/g - This is used to rewrite strings of text. - string1 is replaced by string2 in this - example. - - - - - These are just some of the ones you are likely to use when matching URLs with - Privoxy, and is a long way from a definitive - list. This is enough to get us started with a few simple examples which may - be more illuminating: - - - - /.*/banners/.* - A simple example - that uses the common combination of . and * to - denote any character, zero or more times. In other words, any string at all. - So we start with a literal forward slash, then our regular expression pattern - (.*) another literal forward slash, the string - banners, another forward slash, and lastly another - .*. We are building - a directory path here. This will match any file with the path that has a - directory named banners in it. The .* matches - any characters, and this could conceivably be more forward slashes, so it - might expand into a much longer looking path. For example, this could match: - /eye/hate/spammers/banners/annoy_me_please.gif, or just - /banners/annoying.html, or almost an infinite number of other - possible combinations, just so it has banners in the path - somewhere. - - - - A now something a little more complex: - - - - /.*/adv((er)?ts?|ertis(ing|ements?))?/ - - We have several literal forward slashes again (/), so we are - building another expression that is a file path statement. We have another - .*, so we are matching against any conceivable sub-path, just so - it matches our expression. The only true literal that must - match our pattern is adv, together with - the forward slashes. What comes after the adv string is the - interesting part. - - - - Remember the ? means the preceding expression (either a - literal character or anything grouped with (...) in this case) - can exist or not, since this means either zero or one match. So - ((er)?ts?|ertis(ing|ements?)) is optional, as are the - individual sub-expressions: (er), - (ing|ements?), and the s. The | - means or. We have two of those. For instance, - (ing|ements?), can expand to match either ing - OR ements?. What is being done here, is an - attempt at matching as many variations of advertisement, and - similar, as possible. So this would expand to match just adv, - or advert, or adverts, or - advertising, or advertisement, or - advertisements. You get the idea. But it would not match - advertizements (with a z). We could fix that by - changing our regular expression to: - /.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/, which would then match - either spelling. - - - - /.*/advert[0-9]+\.(gif|jpe?g) - Again - another path statement with forward slashes. Anything in the square brackets - [] can be matched. This is using 0-9 as a - shorthand expression to mean any digit one through nine. It is the same as - saying 0123456789. So any digit matches. The + - means one or more of the preceding expression must be included. The preceding - expression here is what is in the square brackets -- in this case, any digit - one through nine. Then, at the end, we have a grouping: (gif|jpe?g). - This includes a |, so this needs to match the expression on - either side of that bar character also. A simple gif on one side, and the other - side will in turn match either jpeg or jpg, - since the ? means the letter e is optional and - can be matched once or not at all. So we are building an expression here to - match image GIF or JPEG type image file. It must include the literal - string advert, then one or more digits, and a . - (which is now a literal, and not a special character, since it is escaped - with \), and lastly either gif, or - jpeg, or jpg. Some possible matches would - include: //advert1.jpg, - /nasty/ads/advert1234.gif, - /banners/from/hell/advert99.jpg. It would not match - advert1.gif (no leading slash), or - /adverts232.jpg (the expression does not include an - s), or /advert1.jsp (jsp is not - in the expression anywhere). - - - - s/microsoft(?!.com)/MicroSuck/i - This is - a substitution. MicroSuck will replace any occurrence of - microsoft. The i at the end of the expression - means ignore case. The (?!.com) means - the match should fail if microsoft is followed by - .com. In other words, this acts like a NOT - modifier. In case this is a hyperlink, we don't want to break it ;-). - - - - We are barely scratching the surface of regular expressions here so that you - can understand the default Privoxy - configuration files, and maybe use this knowledge to customize your own - installation. There is much, much more that can be done with regular - expressions. Now that you know enough to get started, you can learn more on - your own :/ - - - - More reading on Perl Compatible Regular expressions: - http://www.perldoc.com/perl5.6/pod/perlre.html - - - - - - - - - -<application>Privoxy</application>'s Internal Pages - - - Since Privoxy proxies each requested - web page, it is easy for Privoxy to - trap certain URLs. In this way, we can talk directly to - Privoxy, and see how it is - configured, see how our rules are being applied, change these - rules and other configuration options, and even turn - Privoxy's filtering off, all with - a web browser. - - - - - The URLs listed below are the special ones that allow direct access - to Privoxy. Of course, - Privoxy must be running to access these. If - not, you will get a friendly error message. Internet access is not - necessary either. - - - - - - - - Privoxy main page: - -
    - - http://www.privoxy.org/config/ - -
    - - Alternately, this may be reached at http://p.p/, but this - variation may not work as reliably as the above in some configurations. - -
    - - - - Show information about the current configuration: - -
    - - http://www.privoxy.org/config/show-status - -
    -
    - - - - Show the source code version numbers: - -
    - - http://www.privoxy.org/config/show-version - -
    -
    - - - - Show the client's request headers: - -
    - - http://www.privoxy.org/config/show-request - -
    -
    - - - - Show which actions apply to a URL and why: - -
    - - http://www.privoxy.org/config/show-url-info - -
    -
    - - - - Toggle Privoxy on or off: - -
    - - http://www.privoxy.org/config/toggle - -
    - - Short cuts. Turn off, then on: - -
    - - http://www.privoxy.org/config/toggle?set=disable - -
    -
    - - http://www.privoxy.org/config/toggle?set=enable - -
    -
    - - - - Edit the actions list file: - -
    - - http://www.privoxy.org/config/edit-actions - -
    -
    - -
    -
    - - - These may be bookmarked for quick reference. - - - -
    - - - - -Anatomy of an Action - - - The way Privoxy applies actions - to any given URL can be complex, and not always so easy to understand what - is happening. And sometimes we need to be able to see - just what Privoxy is doing. Especially, - if something Privoxy is doing is causing - us a problem inadvertantly. It can be a little daunting to look at - the actions files themselves, since they tend to be filled with - regular expressions whose consequences are not always - so obvious. Privoxy provides the - http://www.privoxy.org/config/show-url-info - page that can show us very specifically how actions - are being applied to any given URL. This is a big help for troubleshooting. - - - - First, enter one URL (or partial URL) at the prompt, and then - Privoxy will tell us - how the current configuration will handle it. This will not - help with filtering effects from the default.filter file! It - also will not tell you about any other URLs that may be embedded within the - URL you are testing. For instance, images such as ads are expressed as URLs - within the raw page source of HTML pages. So you will only get info for the - actual URL that is pasted into the prompt area -- not any sub-URLs. If you - want to know about embedded URLs like ads, you will have to dig those out of - the HTML source. Use your browser's View Page Source option - for this. - - - - Let's look at an example, google.com, - one section at a time: - - - - - System default actions: - - { -add-header -block -deanimate-gifs -downgrade -fast-redirects -filter - -hide-forwarded -hide-from -hide-referer -hide-user-agent -image - -image-blocker -limit-connect -no-compression -no-cookies-keep - -no-cookies-read -no-cookies-set -no-popups -vanilla-wafer -wafer } - - - - - - This is the top section, and only tells us of the compiled in defaults. This - is basically what Privoxy would do if there - were not any actions defined, i.e. it does nothing. Every action - is disabled. This is not particularly informative for our purposes here. OK, - next section: - - - - - - Matches for http://google.com: - - { -add-header -block +deanimate-gifs -downgrade +fast-redirects - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} - +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} - +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} - -hide-user-agent -image +image-blocker{blank} +no-compression - +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups - -vanilla-wafer -wafer } - / - - { -no-cookies-keep -no-cookies-read -no-cookies-set } - .google.com - - { -fast-redirects } - .google.com - - - - - - This is much more informative, and tells us how we have defined our - actions, and which ones match for our example, - google.com. The first grouping shows our default - settings, which would apply to all URLs. If you look at your actions - file, this would be the section just below the aliases section - near the top. This applies to all URLs as signified by the single forward - slash -- /. - - - - - These are the default actions we have enabled. But we can define additional - actions that would be exceptions to these general rules, and then list - specific URLs that these exceptions would apply to. Last match wins. - Just below this then are two explict matches for .google.com. - The first is negating our various cookie blocking actions (i.e. we will allow - cookies here). The second is allowing fast-redirects. Note - that there is a leading dot here -- .google.com. This will - match any hosts and sub-domains, in the google.com domain also, such as - www.google.com. So, apparently, we have these actions defined - somewhere in the lower part of our actions file, and - google.com is referenced in these sections. - - - - - And now we pull it altogether in the bottom section and summarize how - Privoxy is appying all its actions - to google.com: - - - - - - - Final results: - - -add-header -block -deanimate-gifs -downgrade -fast-redirects - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} - +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} - +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} - -hide-user-agent -image +image-blocker{blank} -limit-connect +no-compression - -no-cookies-keep -no-cookies-read -no-cookies-set +no-popups -vanilla-wafer - -wafer - - - - - - Now another example, ad.doubleclick.net: - - - - - - { +block +image } - .ad.doubleclick.net - - { +block +image } - ad*. - - { +block +image } - .doubleclick.net - - - - - - We'll just show the interesting part here, the explicit matches. It is - matched three different times. Each as an +block +image, - which is the expanded form of one of our aliases that had been defined as: - +imageblock. (Aliases are defined in the - first section of the actions file and typically used to combine more - than one action.) - - - - Any one of these would have done the trick and blocked this as an unwanted - image. This is unnecessarily redundant since the last case effectively - would also cover the first. No point in taking chances with these guys - though ;-) Note that if you want an ad or obnoxious - URL to be invisible, it should be defined as ad.doubleclick.net - is done here -- as both a +block and an - +image. The custom alias +imageblock does this - for us. - - - - One last example. Let's try http://www.rhapsodyk.net/adsl/HOWTO/. - This one is giving us problems. We are getting a blank page. Hmmm... - - - - - - Matches for http://www.rhapsodyk.net/adsl/HOWTO/: - - { -add-header -block +deanimate-gifs -downgrade +fast-redirects - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} - +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} - +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} - -hide-user-agent -image +image-blocker{blank} +no-compression - +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups - -vanilla-wafer -wafer } - / - - { +block +image } - /ads - - - - - - Ooops, the /adsl/ is matching /ads! But - we did not want this at all! Now we see why we get the blank page. We could - now add a new action below this that explictly does not - block (-block) pages with adsl. There are various ways to - handle such exceptions. Example: - - - - - - { -block } - /adsl - - - - - - Now the page displays ;-) - - - - - But now what about a situation where we get no explicit matches like - we did with: - - - - - - - { -block } - /adsl - - - - - - That actually was very telling and pointed us quickly to where the problem - was. If you don't get this kind of match, then it means one of the default - rules in the first section is causing the problem. This would require some - guesswork, and maybe a little trial and error to isolate the offending rule. - One likely cause would be one of the {+filter} actions. Try - adding the URL for the site to one of aliases that turn off +filter: - - - - - - {shop} - .quietpc.com - .worldpay.com # for quietpc.com - .jungle.com - .scan.co.uk - .forbes.com - - - - - - {shop} is an alias that expands to - { -filter -no-cookies -no-cookies-keep }. Or you could do - your own exception to negate filtering: - - - - - - - {-filter} - .forbes.com - - - - - - -
    - - - -
    diff --git a/doc/text/developer-manual.txt b/doc/text/developer-manual.txt deleted file mode 100644 index e0a86856..00000000 --- a/doc/text/developer-manual.txt +++ /dev/null @@ -1,1315 +0,0 @@ - -Privoxy Developer Manual - - By: Privoxy Developers - - $Id: developer-manual.sgml,v 1.13 2002/03/27 01:16:41 hal9 Exp $ - - The developer manual gives the users information on how to help the - developer team. It provides guidance on coding, testing, documentation - and other issues. - - Privoxy is a web proxy with advanced filtering capabilities for - protecting privacy, filtering web page content, managing cookies, - controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very flexible configuration and - can be customized to suit individual needs and tastes. Privoxy has - application for both stand-alone systems and multi-user networks. - - Privoxy is based on the code of the Internet Junkbuster. Junkbuster - was originally written by JunkBusters Corporation, and was released as - free open-source software under the GNU GPL. Stefan Waldherr made many - improvements, and started the SourceForge project to continue - development. Other developers have since joined Stefan. - - You can find the latest version of the user manual at - [1]http://www.privoxy.org/developer-manual/. Please see the Contact - section in the user-manual if you want to contact the developers. - _________________________________________________________________ - - Table of Contents - 1. [2]Introduction - 2. [3]Quickstart to Privoxy Development - 3. [4]Documentation Guidelines - 4. [5]Coding Guidelines - - 4.1. [6]Introduction - 4.2. [7]Using Comments - - 4.2.1. [8]Comment, Comment, Comment - 4.2.2. [9]Use blocks for comments - 4.2.3. [10]Keep Comments on their own line - 4.2.4. [11]Comment each logical step - 4.2.5. [12]Comment All Functions Thoroughly - 4.2.6. [13]Comment at the end of braces if the content is - more than one screen length - - 4.3. [14]Naming Conventions - - 4.3.1. [15]Variable Names - 4.3.2. [16]Function Names - 4.3.3. [17]Header file prototypes - 4.3.4. [18]Enumerations, and #defines - 4.3.5. [19]Constants - - 4.4. [20]Using Space - - 4.4.1. [21]Put braces on a line by themselves. - 4.4.2. [22]ALL control statements should have a block - 4.4.3. [23]Do not belabor/blow-up boolean expressions - 4.4.4. [24]Use white space freely because it is free - 4.4.5. [25]Don't use white space around structure operators - 4.4.6. [26]Make the last brace of a function stand out - 4.4.7. [27]Use 3 character indentions - - 4.5. [28]Initializing - - 4.5.1. [29]Initialize all variables - - 4.6. [30]Functions - - 4.6.1. [31]Name functions that return a boolean as a - question. - - 4.6.2. [32]Always specify a return type for a function. - 4.6.3. [33]Minimize function calls when iterating by using - variables - - 4.6.4. [34]Pass and Return by Const Reference - 4.6.5. [35]Pass and Return by Value - 4.6.6. [36]Names of include files - 4.6.7. [37]Provide multiple inclusion protection - 4.6.8. [38]Use `extern "C"` when appropriate - 4.6.9. [39]Where Possible, Use Forward Struct Declaration - Instead of Includes - - 4.7. [40]General Coding Practices - - 4.7.1. [41]Turn on warnings - 4.7.2. [42]Provide a default case for all switch statements - 4.7.3. [43]Try to avoid falling through cases in a switch - statement. - - 4.7.4. [44]Use 'long' or 'short' Instead of 'int' - 4.7.5. [45]Don't mix size_t and other types - 4.7.6. [46]Declare each variable and struct on its own - line. - - 4.7.7. [47]Use malloc/zalloc sparingly - 4.7.8. [48]The Programmer Who Uses 'malloc' is Responsible - for Ensuring 'free' - - 4.7.9. [49]Add loaders to the `file_list' structure and in - order - - 4.7.10. [50]"Uncertain" new code and/or changes to exitinst - code, use FIXME - - 4.8. [51]Addendum: Template for files and function comment - blocks: - - 5. [52]Version Control Guidelines - 6. [53]Testing Guidelines - - 6.1. [54]Testplan for releases - 6.2. [55]Test reports - - 7. [56]Contact the developers - 8. [57]Copyright and History - 9. [58]See also - -1. Introduction - - To be filled. - _________________________________________________________________ - -2. Quickstart to Privoxy Development - - You'll need an account on Sourceforge to support our development. Mail - you ID to the list and wait until a project manager has added you. For - the time beeing (read, this section is under construction), please - note the following guidelines for changing stuff in the code. If it is - - 1. A bugfix / clean-up / cosmetic thing: shoot - 2. A new feature that can be turned off: shoot - 3. A clear improvement w/o side effects on other parts of the code: - shoot - 4. A matter of taste: ask the list - 5. A major redesign of some part of the code: ask the list - _________________________________________________________________ - -3. Documentation Guidelines - - All docs are in SGML format and located in the doc/source directory. - - How do you update the webserver (i.e. the pages on sourceforge)? - - 1. Run make dok (which uses the documents in doc/source to update all - text files in doc/text and to update all web documents in - doc/webserver. - 2. Run make webserver which copies all files from doc/webserver to - the sourceforge webserver via scp. - _________________________________________________________________ - -4. Coding Guidelines - -4.1. Introduction - - This set of standards is designed to make our lives easier. It is - developed with the simple goal of helping us keep the "new and - improved Privoxy" consistent and reliable. Thus making maintenance - easier and increasing chances of success of the project. - - And that of course comes back to us as individuals. If we can increase - our development and product efficiencies then we can solve more of the - request for changes/improvements and in general feel good about - ourselves. ;-> - _________________________________________________________________ - -4.2. Using Comments - -4.2.1. Comment, Comment, Comment - - Explanation: - - Comment as much as possible without commenting the obvious. For - example do not comment "aVariable is equal to bVariable". Instead - explain why aVariable should be equal to the bVariable. Just because a - person can read code does not mean they will understand why or what is - being done. A reader may spend a lot more time figuring out what is - going on when a simple comment or explanation would have prevented the - extra research. Please help your brother IJB'ers out! - - The comments will also help justify the intent of the code. If the - comment describes something different than what the code is doing then - maybe a programming error is occurring. - - Example: -/* if page size greater than 1k ... */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -/* if page size is small, send it in blocks */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -This demonstrates 2 cases of "what not to do". The first is a -"syntax comment". The second is a comment that does not fit what -is actually being done. - _________________________________________________________________ - -4.2.2. Use blocks for comments - - Explanation: - - Comments can help or they can clutter. They help when they are - differentiated from the code they describe. One line comments do not - offer effective separation between the comment and the code. Block - identifiers do, by surrounding the code with a clear, definable - pattern. - - Example: -/********************************************************************* - * This will stand out clearly in your code! - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -/* unfortunately, this may not */ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -if ( thisVariable == thatVariable ) /* this may not either */ -{ - DoSomethingVeryImportant(); -} - - Exception: - - If you are trying to add a small logic comment and do not wish to - "disrubt" the flow of the code, feel free to use a 1 line comment - which is NOT on the same line as the code. - _________________________________________________________________ - -4.2.3. Keep Comments on their own line - - Explanation: - - It goes back to the question of readability. If the comment is on the - same line as the code it will be harder to read than the comment that - is on its own line. - - There are three exceptions to this rule, which should be violated - freely and often: during the definition of variables, at the end of - closing braces, when used to comment parameters. - - Example: -/********************************************************************* - * This will stand out clearly in your code, - * But the second example won't. - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - -if ( thisVariable == thatVariable ) /*can you see me?*/ -{ - DoSomethingVeryImportant(); /*not easily*/ -} - - -/********************************************************************* - * But, the encouraged exceptions: - *********************************************************************/ -int urls_read = 0; /* # of urls read + rejected */ -int urls_rejected = 0; /* # of urls rejected */ - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); -} - - -short DoSomethingVeryImportant( - short firstparam, /* represents something */ - short nextparam /* represents something else */ ) -{ - ...code here... - -} /* -END- DoSomethingVeryImportant */ - _________________________________________________________________ - -4.2.4. Comment each logical step - - Explanation: - - Logical steps should be commented to help others follow the intent of - the written code and comments will make the code more readable. - - If you have 25 lines of code without a comment, you should probably go - back into it to see where you forgot to put one. - - Most "for", "while", "do", etc... loops _probably_ need a comment. - After all, these are usually major logic containers. - _________________________________________________________________ - -4.2.5. Comment All Functions Thoroughly - - Explanation: - - A reader of the code should be able to look at the comments just prior - to the beginning of a function and discern the reason for its - existence and the consequences of using it. The reader should not have - to read through the code to determine if a given function is safe for - a desired use. The proper information thoroughly presented at the - introduction of a function not only saves time for subsequent - maintenance or debugging, it more importantly aids in code reuse by - allowing a user to determine the safety and applicability of any - function for the problem at hand. As a result of such benefits, all - functions should contain the information presented in the addendum - section of this document. - _________________________________________________________________ - -4.2.6. Comment at the end of braces if the content is more than one screen -length - - Explanation: - - Each closing brace should be followed on the same line by a comment - that describes the origination of the brace if the original brace is - off of the screen, or otherwise far away from the closing brace. This - will simplify the debugging, maintenance, and readability of the code. - - As a suggestion , use the following flags to make the comment and its - brace more readable: - - use following a closing brace: } /* -END- if() or while () or etc... - */ - - Example: -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if x is 1 */ - -or: - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if ( 1 == X ) */ - _________________________________________________________________ - -4.3. Naming Conventions - -4.3.1. Variable Names - - Explanation: - - Use all lowercase, and seperate words via an underscore ('_'). Do not - start an identifier with an underscore. (ANSI C reserves these for use - by the compiler and system headers.) Do not use identifiers which are - reserved in ANSI C++. (E.g. template, class, true, false, ...). This - is in case we ever decide to port Privoxy to C++. - - Example: -int ms_iis5_hack = 0; - - Instead of: - -int msiis5hack = 0; int msIis5Hack = 0; - _________________________________________________________________ - -4.3.2. Function Names - - Explanation: - - Use all lowercase, and seperate words via an underscore ('_'). Do not - start an identifier with an underscore. (ANSI C reserves these for use - by the compiler and system headers.) Do not use identifiers which are - reserved in ANSI C++. (E.g. template, class, true, false, ...). This - is in case we ever decide to port Privoxy to C++. - - Example: -int load_some_file( struct client_state *csp ) - - Instead of: - -int loadsomefile( struct client_state *csp ) -int loadSomeFile( struct client_state *csp ) - _________________________________________________________________ - -4.3.3. Header file prototypes - - Explanation: - - Use a descriptive parameter name in the function prototype in header - files. Use the same parameter name in the header file that you use in - the c file. - - Example: -(.h) extern int load_aclfile( struct client_state *csp ); -(.c) int load_aclfile( struct client_state *csp ) - - Instead of: -(.h) extern int load_aclfile( struct client_state * ); or -(.h) extern int load_aclfile(); -(.c) int load_aclfile( struct client_state *csp ) - _________________________________________________________________ - -4.3.4. Enumerations, and #defines - - Explanation: - - Use all capital letters, with underscores between words. Do not start - an identifier with an underscore. (ANSI C reserves these for use by - the compiler and system headers.) - - Example: -(enumeration) : enum Boolean { FALSE, TRUE }; -(#define) : #define DEFAULT_SIZE 100; - - Note: We have a standard naming scheme for #defines that toggle a - feature in the preprocessor: FEATURE_>, where > is a short (preferably - 1 or 2 word) description. - - Example: -#define FEATURE_FORCE 1 - -#ifdef FEATURE_FORCE -#define FORCE_PREFIX blah -#endif /* def FEATURE_FORCE */ - _________________________________________________________________ - -4.3.5. Constants - - Explanation: - - Spell common words out entirely (do not remove vowels). - - Use only widely-known domain acronyms and abbreviations. Capitalize - all letters of an acronym. - - Use underscore (_) to separate adjacent acronyms and abbreviations. - Never terminate a name with an underscore. - - Example: -#define USE_IMAGE_LIST 1 - - Instead of: - -#define USE_IMG_LST 1 or -#define _USE_IMAGE_LIST 1 or -#define USE_IMAGE_LIST_ 1 or -#define use_image_list 1 or -#define UseImageList 1 - _________________________________________________________________ - -4.4. Using Space - -4.4.1. Put braces on a line by themselves. - - Explanation: - - The brace needs to be on a line all by itself, not at the end of the - statement. Curly braces should line up with the construct that they're - associated with. This practice makes it easier to identify the opening - and closing braces for a block. - - Example: -if ( this == that ) -{ - ... -} - - Instead of: - - if ( this == that ) { ... } - - or - - if ( this == that ) { ... } - - Note: In the special case that the if-statement is inside a loop, and - it is trivial, i.e. it tests for a condidtion that is obvious from the - purpose of the block, one-liners as above may optically preserve the - loop structure and make it easier to read. - - Status: developer-discrection. - - Example exception: -while ( more lines are read ) -{ - /* Please document what is/is not a comment line here */ - if ( it's a comment ) continue; - - do_something( line ); -} - _________________________________________________________________ - -4.4.2. ALL control statements should have a block - - Explanation: - - Using braces to make a block will make your code more readable and - less prone to error. All control statements should have a block - defined. - - Example: -if ( this == that ) -{ - DoSomething(); - DoSomethingElse(); -} - - Instead of: - - if ( this == that ) DoSomething(); DoSomethingElse(); - - or - - if ( this == that ) DoSomething(); - - Note: The first example in "Instead of" will execute in a manner other - than that which the developer desired (per indentation). Using code - braces would have prevented this "feature". The "explanation" and - "exception" from the point above also applies. - _________________________________________________________________ - -4.4.3. Do not belabor/blow-up boolean expressions - - Example: -structure->flag = ( condition ); - - Instead of: - - if ( condition ) { structure->flag = 1; } else { structure->flag = 0; - } - - Note: The former is readable and consice. The later is wordy and - inefficient. Please assume that any developer new to the project has - at least a "good" knowledge of C/C++. (Hope I do not offend by that - last comment ... 8-) - _________________________________________________________________ - -4.4.4. Use white space freely because it is free - - Explanation: - - Make it readable. The notable exception to using white space freely is - listed in the next guideline. - - Example: -int firstValue = 0; -int someValue = 0; -int anotherValue = 0; -int thisVariable = 0; - -if ( thisVariable == thatVariable ) - -firstValue = oldValue + ( ( someValue - anotherValue ) - whatever ) - _________________________________________________________________ - -4.4.5. Don't use white space around structure operators - - Explanation: - - - structure pointer operator ( "->" ) - member operator ( "." ) - - functions and parentheses - - It is a general coding practice to put pointers, references, and - function parentheses next to names. With spaces, the connection - between the object and variable/function name is not as clear. - - Example: -aStruct->aMember; -aStruct.aMember; -FunctionName(); - - Instead of: aStruct -> aMember; aStruct . aMember; FunctionName (); - _________________________________________________________________ - -4.4.6. Make the last brace of a function stand out - - Example: -int function1( ... ) -{ - ...code... - return( retCode ); - -} /* -END- function1 */ - - -int function2( ... ) -{ -} /* -END- function2 */ - - Instead of: - - int function1( ... ) { ...code... return( retCode ); } int function2( - ... ) { } - - Note: Use 1 blank line before the closing brace and 2 lines - afterwards. This makes the end of function standout to the most casual - viewer. Although function comments help seperate functions, this is - still a good coding practice. In fact, I follow these rules when using - blocks in "for", "while", "do" loops, and long if {} statements too. - After all whitespace is free! - - Status: developer-discrection on the number of blank lines. Enforced - is the end of function comments. - _________________________________________________________________ - -4.4.7. Use 3 character indentions - - Explanation: - - If some use 8 character TABs and some use 3 character TABs, the code - can look *very* ragged. So use 3 character indentions only. If you - like to use TABs, pass your code through a filter such as "expand -t3" - before checking in your code. - - Example: -static const char * const url_code_map[256] = -{ - NULL, ... -}; - - -int function1( ... ) -{ - if ( 1 ) - { - return( ALWAYS_TRUE ); - } - else - { - return( HOW_DID_YOU_GET_HERE ); - } - - return( NEVER_GETS_HERE ); - -} - _________________________________________________________________ - -4.5. Initializing - -4.5.1. Initialize all variables - - Explanation: - - Do not assume that the variables declared will not be used until after - they have been assigned a value somewhere else in the code. Remove the - chance of accidentally using an unassigned variable. - - Example: -short anShort = 0; -float aFloat = 0; -struct *ptr = NULL; - - Note: It is much easier to debug a SIGSEGV if the message says you are - trying to access memory address 00000000 and not 129FA012; or - arrayPtr[20] causes a SIGSEV vs. arrayPtr[0]. - - Status: developer-discrection if and only if the variable is assigned - a value "shortly after" declaration. - _________________________________________________________________ - -4.6. Functions - -4.6.1. Name functions that return a boolean as a question. - - Explanation: - - Value should be phrased as a question that would logically be answered - as a true or false statement - - Example: -ShouldWeBlockThis(); -ContainsAnImage(); -IsWebPageBlank(); - _________________________________________________________________ - -4.6.2. Always specify a return type for a function. - - Explanation: - - The default return for a function is an int. To avoid ambiguity, - create a return for a function when the return has a purpose, and - create a void return type if the function does not need to return - anything. - _________________________________________________________________ - -4.6.3. Minimize function calls when iterating by using variables - - Explanation: - - It is easy to write the following code, and a clear argument can be - made that the code is easy to understand: - - Example: -for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ ) -{ - .... -} - - Note: Unfortunately, this makes a function call for each and every - iteration. This increases the overhead in the program, because the - compiler has to look up the function each time, call it, and return a - value. Depending on what occurs in the blockListLength() call, it - might even be creating and destroying structures with each iteration, - even though in each case it is comparing "cnt" to the same value, over - and over. Remember too - even a call to blockListLength() is a - function call, with the same overhead. - - Instead of using a function call during the iterations, assign the - value to a variable, and evaluate using the variable. - - Example: -size_t len = blockListLength(); - -for ( size_t cnt = 0; cnt < len; cnt ++ ) -{ - .... -} - - Exceptions: if the value of blockListLength() *may* change or could - *potentially* change, then you must code the function call in the - for/while loop. - _________________________________________________________________ - -4.6.4. Pass and Return by Const Reference - - Explanation: - - This allows a developer to define a const pointer and call your - function. If your function does not have the const keyword, we may not - be able to use your function. Consider strcmp, if it were defined as: - extern int strcmp( char *s1, char *s2 ); - - I could then not use it to compare argv's in main: int main( int argc, - const char *argv[] ) { strcmp( argv[0], "privoxy" ); } - - Both these pointers are *const*! If the c runtime library maintainers - do it, we should too. - _________________________________________________________________ - -4.6.5. Pass and Return by Value - - Explanation: - - Most structures cannot fit onto a normal stack entry (i.e. they are - not 4 bytes or less). Aka, a function declaration like: int - load_aclfile( struct client_state csp ) - - would not work. So, to be consistent, we should declare all prototypes - with "pass by value": int load_aclfile( struct client_state *csp ) - _________________________________________________________________ - -4.6.6. Names of include files - - Explanation: - - Your include statements should contain the file name without a path. - The path should be listed in the Makefile, using -I as processor - directive to search the indicated paths. An exception to this would be - for some proprietary software that utilizes a partial path to - distinguish their header files from system or other header files. - - Example: -#include /* This is not a local include */ -#include "config.h" /* This IS a local include */ - - Exception: - -/* This is not a local include, but requires a path element. */ -#include - - Note: Please! do not add "-I." to the Makefile without a _very_ good - reason. This duplicates the #include "file.h" behaviour. - _________________________________________________________________ - -4.6.7. Provide multiple inclusion protection - - Explanation: - - Prevents compiler and linker errors resulting from redefinition of - items. - - Wrap each header file with the following syntax to prevent multiple - inclusions of the file. Of course, replace PROJECT_H with your file - name, with "." Changed to "_", and make it uppercase. - - Example: -#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED - ... -#endif /* ndef PROJECT_H_INCLUDED */ - _________________________________________________________________ - -4.6.8. Use `extern "C"` when appropriate - - Explanation: - - If our headers are included from C++, they must declare our functions - as `extern "C"`. This has no cost in C, but increases the potential - re-usability of our code. - - Example: -#ifdef __cplusplus -extern "C" -{ -#endif /* def __cplusplus */ - -... function definitions here ... - -#ifdef __cplusplus -} -#endif /* def __cplusplus */ - _________________________________________________________________ - -4.6.9. Where Possible, Use Forward Struct Declaration Instead of Includes - - Explanation: - - Useful in headers that include pointers to other struct's. - Modifications to excess header files may cause needless compiles. - - Example: -/********************************************************************* - * We're avoiding an include statement here! - *********************************************************************/ -struct file_list; -extern file_list *xyz; - - Note: If you declare "file_list xyz;" (without the pointer), then - including the proper header file is necessary. If you only want to - prototype a pointer, however, the header file is unneccessary. - - Status: Use with discrection. - _________________________________________________________________ - -4.7. General Coding Practices - -4.7.1. Turn on warnings - - Explanation - - Compiler warnings are meant to help you find bugs. You should turn on - as many as possible. With GCC, the switch is "-Wall". Try and fix as - many warnings as possible. - _________________________________________________________________ - -4.7.2. Provide a default case for all switch statements - - Explanation: - - What you think is guaranteed is never really guaranteed. The value - that you don't think you need to check is the one that someday will be - passed. So, to protect yourself from the unknown, always have a - default step in a switch statement. - - Example: -switch( hash_string( cmd ) ) -{ - case hash_actions_file : - ... code ... - break; - - case hash_confdir : - ... code ... - break; - - default : - log_error( ... ); - ... anomly code goes here ... - continue; / break; / exit( 1 ); / etc ... - -} /* end switch( hash_string( cmd ) ) */ - - Note: If you already have a default condition, you are obviously - exempt from this point. Of note, most of the WIN32 code calls - `DefWindowProc' after the switch statement. This API call *should* be - included in a default statement. - - Another Note: This is not so much a readability issue as a robust - programming issue. The "anomly code goes here" may be no more than a - print to the STDERR stream (as in load_config). Or it may really be an - ABEND condition. - - Status: Programmer discretion is advised. - _________________________________________________________________ - -4.7.3. Try to avoid falling through cases in a switch statement. - - Explanation: - - In general, you will want to have a 'break' statement within each - 'case' of a switch statement. This allows for the code to be more - readable and understandable, and furthermore can prevent unwanted - surprises if someone else later gets creative and moves the code - around. - - The language allows you to plan the fall through from one case - statement to another simply by omitting the break statement within the - case statement. This feature does have benefits, but should only be - used in rare cases. In general, use a break statement for each case - statement. - - If you choose to allow fall through, you should comment both the fact - of the fall through and reason why you felt it was necessary. - _________________________________________________________________ - -4.7.4. Use 'long' or 'short' Instead of 'int' - - Explanation: - - On 32-bit platforms, int usually has the range of long. On 16-bit - platforms, int has the range of short. - - Status: open-to-debate. In the case of most FSF projects (including - X/GNU-Emacs), there are typedefs to int4, int8, int16, (or equivalence - ... I forget the exact typedefs now). Should we add these to IJB now - that we have a "configure" script? - _________________________________________________________________ - -4.7.5. Don't mix size_t and other types - - Explanation: - - The type of size_t varies across platforms. Do not make assumptions - about whether it is signed or unsigned, or about how long it is. Do - not compare a size_t against another variable of a different type (or - even against a constant) without casting one of the values. Try to - avoid using size_t if you can. - _________________________________________________________________ - -4.7.6. Declare each variable and struct on its own line. - - Explanation: - - It can be tempting to declare a series of variables all on one line. - Don't. - - Example: -long a = 0; -long b = 0; -long c = 0; - - Instead of: - - long a, b, c; - - Explanation: - there is more room for comments on the individual - variables - easier to add new variables without messing up the - original ones - when searching on a variable to find its type, there - is less clutter to "visually" eliminate - - Exceptions: when you want to declare a bunch of loop variables or - other trivial variables; feel free to declare them on 1 line. You - should, although, provide a good comment on their functions. - - Status: developer-discrection. - _________________________________________________________________ - -4.7.7. Use malloc/zalloc sparingly - - Explanation: - - Create a local stuct (on the stack) if the variable will live and die - within the context of one function call. - - Only "malloc" a struct (on the heap) if the variable's life will - extend beyond the context of one function call. - - Example: -If a function creates a struct and stores a pointer to it in a -list, then it should definately be allocated via `malloc'. - _________________________________________________________________ - -4.7.8. The Programmer Who Uses 'malloc' is Responsible for Ensuring 'free' - - Explanation: - - If you have to "malloc" an instance, you are responsible for insuring - that the instance is `free'd, even if the deallocation event falls - within some other programmer's code. You are also responsible for - ensuring that deletion is timely (i.e. not too soon, not too late). - This is known as "low-coupling" and is a "good thing (tm)". You may - need to offer a free/unload/destuctor type function to accomodate - this. - - Example: -int load_re_filterfile( struct client_state *csp ) { ... } -static void unload_re_filterfile( void *f ) { ... } - - Exceptions: - - The developer cannot be expected to provide `free'ing functions for C - run-time library functions ... such as `strdup'. - - Status: developer-discrection. The "main" use of this standard is for - allocating and freeing data structures (complex or nested). - _________________________________________________________________ - -4.7.9. Add loaders to the `file_list' structure and in order - - Explanation: - - I have ordered all of the "blocker" file code to be in alpha order. It - is easier to add/read new blockers when you expect a certain order. - - Note: It may appear that the alpha order is broken in places by POPUP - tests coming before PCRS tests. But since POPUPs can also be referred - to as KILLPOPUPs, it is clear that it should come first. - _________________________________________________________________ - -4.7.10. "Uncertain" new code and/or changes to exitinst code, use FIXME - - Explanation: - - If you have enough confidence in new code or confidence in your - changes, but are not *quite* sure of the reprocussions, add this: - - /* FIXME: this code has a logic error on platform XYZ, * attempthing - to fix */ #ifdef PLATFORM ...changed code here... #endif - - or: - - /* FIXME: I think the original author really meant this... */ - ...changed code here... - - or: - - /* FIXME: new code that *may* break something else... */ ...new code - here... - - Note: If you make it clear that this may or may not be a "good thing - (tm)", it will be easier to identify and include in the project (or - conversly exclude from the project). - _________________________________________________________________ - -4.8. Addendum: Template for files and function comment blocks: - - Example for file comments: -const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16 -:41 hal9 Exp $"; -/********************************************************************* - * - * File : $Source$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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$ - * - *********************************************************************/ - - -#include "config.h" - - ...necessary include files for us to do our work... - -const char FILENAME_h_rcs[] = FILENAME_H_VERSION; - - Note: This declares the rcs variables that should be added to the - "show-proxy-args" page. If this is a brand new creation by you, you - are free to change the "Copyright" section to represent the rights you - wish to maintain. - - Note: The formfeed character that is present right after the comment - flower box is handy for (X|GNU)Emacs users to skip the verbige and get - to the heart of the code (via `forward-page' and `backward-page'). - Please include it if you can. - - Example for file header comments: -#ifndef _FILENAME_H -#define _FILENAME_H -#define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16: -41 hal9 Exp $" -/********************************************************************* - * - * File : $Source$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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$ - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - - ... function headers here ... - - -/* Revision control strings from this header and associated .c file */ -extern const char FILENAME_rcs[]; -extern const char FILENAME_h_rcs[]; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef _FILENAME_H */ - -/* - Local Variables: - tab-width: 3 - end: -*/ - - Example for function comments: -/********************************************************************* - * - * Function : FUNCTION_NAME - * - * Description : (Fill me in with a good description!) - * - * parameters : - * 1 : param1 = pointer to an important thing - * 2 : x = pointer to something else - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int FUNCTION_NAME( void *param1, const char *x ) -{ - ... - return( 0 ); - -} - - Note: If we all follow this practice, we should be able to parse our - code to create a "self-documenting" web page. - _________________________________________________________________ - -5. Version Control Guidelines - - To be filled. note on cvs comments. don't comment what you did, - comment why you did it. - _________________________________________________________________ - -6. Testing Guidelines - - To be filled. - _________________________________________________________________ - -6.1. Testplan for releases - - Explain release numbers. major, minor. developer releases. etc. - - 1. Remove any existing rpm with rpm -e - 2. Remove any file that was left over. This includes (but is not - limited to) - + /var/log/privoxy - + /etc/privoxy - + /usr/sbin/privoxy - + /etc/init.d/privoxy - + /usr/doc/privoxy* - 3. Install the rpm. Any error messages? - 4. start,stop,status Privoxy with the specific script (e.g. - /etc/rc.d/init/privoxy stop). Reboot your machine. Does autostart - work? - 5. Start browsing. Does Privoxy work? Logfile written? - 6. Remove the rpm. Any error messages? All files removed? - _________________________________________________________________ - -6.2. Test reports - - Please submit test reports only with the [59]test form at sourceforge. - Three simple steps: - - * Select category: the distribution you test on. - * Select group: the version of Privoxy that we are about to release. - * Fill the Summary and Detailed Description with something - intelligent (keep it short and precise). - - Do not mail to the mailinglist (we cannot keep track on issues there). - _________________________________________________________________ - -7. Contact the developers - - Please see the user manual for information on how to contact the - developers. - _________________________________________________________________ - -8. Copyright and History - - Please see the user manual for information on Copyright and History. - _________________________________________________________________ - -9. See also - - Please see the user manual for information on references. - -References - - 1. http://www.privoxy.org/developer-manual/ - 2. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INTRODUCTION - 3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUICKSTART - 4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DOCUMENTATION - 5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CODING - 6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S1 - 7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S2 - 8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S3 - 9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S4 - 10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S5 - 11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S6 - 12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S7 - 13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S8 - 14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S9 - 15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S10 - 16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S11 - 17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S12 - 18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S13 - 19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S14 - 20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S15 - 21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S16 - 22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S17 - 23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S18 - 24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S19 - 25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S20 - 26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S21 - 27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S22 - 28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S23 - 29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S24 - 30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S25 - 31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S26 - 32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S27 - 33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S28 - 34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S29 - 35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S30 - 36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S31 - 37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S32 - 38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S33 - 39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S34 - 40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S35 - 41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S36 - 42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S37 - 43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S38 - 44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S39 - 45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S40 - 46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S41 - 47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S42 - 48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S43 - 49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S44 - 50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S45 - 51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S46 - 52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CVS - 53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING - 54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-PLAN - 55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-REPORT - 56. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONTACT - 57. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT - 58. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO - 59. http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005 diff --git a/doc/text/faq.txt b/doc/text/faq.txt deleted file mode 100644 index 2e9bfbb9..00000000 --- a/doc/text/faq.txt +++ /dev/null @@ -1,881 +0,0 @@ - -Privoxy Frequently Asked Questions - - By: Privoxy Developers - - $Id: faq.sgml,v 1.32 2002/03/27 00:57:03 hal9 Exp $ - - This FAQ gives users and developers alike answers to frequently asked - questions about Privoxy. - - Privoxy is a web proxy with advanced filtering capabilities for - protecting privacy, filtering web page content, managing cookies, - controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very flexible configuration and - can be customized to suit individual needs and tastes. Privoxy has - application for both stand-alone systems and multi-user networks. - - Privoxy is based on the code of the Internet Junkbuster. Junkbuster - was originally written by JunkBusters Corporation, and was released as - free open-source software under the GNU GPL. Stefan Waldherr made many - improvements, and started the SourceForge project to continue - development. - - You can find the latest version of the document at - [1]http://www.privoxy.org/faq/. Please see the Contact section in the - [2]user-manual if you want to contact the developers. - _________________________________________________________________ - - Table of Contents - 1. [3]Frequently Asked Questions - - 1.1. [4]General Information - - 1.1.1. [5]What is this new version of Privoxy? - 1.1.2. [6]Why "Privoxy"? Why a name change at all? - 1.1.3. [7]How does it differ from the old Junkbuster? - 1.1.4. [8]What are some of the new features? - 1.1.5. [9]What is a "proxy"? How does Privoxy work? - 1.1.6. [10]My browser does the same things as Privoxy. Why - should I use Privoxy at all? - - 1.1.7. [11]Is there is a license or fee? What about a - warranty? Registration? - - 1.1.8. [12]I would like to help you, what do I do? - - 1.2. [13]Installation - - 1.2.1. [14]Which browsers are supported by Privoxy? - 1.2.2. [15]Which operating systems are supported? - 1.2.3. [16]Can I install Privoxy over Junkbuster? - 1.2.4. [17]I just installed Privoxy. Is there anything - special I have to do now? - - 1.2.5. [18]What is the proxy address of Privoxy? - 1.2.6. [19]I just installed Privoxy, and nothing is - happening. All the ads are there. What's wrong? - - 1.3. [20]Configuration - - 1.3.1. [21]Can I use my old config files? - 1.3.2. [22]What is an "actions" file? - 1.3.3. [23]The "actions"concept confuses me. Please list - some of these "actions". - - 1.3.4. [24]How are actions files configured? What is the - easiest way to do this? - - 1.3.5. [25]What are the differences between - intermediate.action, basic.action, etc.? - - 1.3.6. [26]Why can I change the configuration with a - browser? Does that not raise security issues? - - 1.3.7. [27]What is a "default.filter"? - 1.3.8. [28]How can I set up Privoxy to act as a proxy for - my LAN? - - 1.3.9. [29]Instead of ads, now I get a checkerboard - pattern. I don't want to see anything. - - 1.3.10. [30]Why would anybody want to see a checkerboard - pattern? - - 1.3.11. [31]I see large red banners on some pages that say - "Blocked". How do I get rid of this? - - 1.3.12. [32]How can I make Privoxy work with other proxies - like Squid? - - 1.4. [33]Miscellaneous - - 1.4.1. [34]How much does Privoxy slow my browsing down? - This has to add extra time to browsing. - - 1.4.2. [35]I noticed considerable delays in page requests - compared to the old Junkbuster. What's wrong? - - 1.4.3. [36]What is the "http://p.p/"? - 1.4.4. [37]Do you still maintain the blocklists? - 1.4.5. [38]How can I submit new ads? - 1.4.6. [39]How can I hide my IP address? - 1.4.7. [40]Can Privoxy guarantee I am anonymous? - 1.4.8. [41]Might some things break because header - information is being altered? - - 1.4.9. [42]Can Privoxy act as a "caching" proxy to speed up - web browsing? - - 1.4.10. [43]What about as a firewall? Can Privoxy protect - me? - - 1.4.11. [44]The Privoxy logo that replaces ads is very - blocky and ugly looking. Can't a better font be - used? - - 1.4.12. [45]I have large empty spaces now where ads used to - be. Why does Privoxy leave these large gaps? - - 1.4.13. [46]How can Privoxy filter Secure (HTTPS) URLs? - 1.4.14. [47]Privoxy runs as a "server". How secure is it? - Do I need to take any special precautions? - - 1.4.15. [48]How can I temporarily disable Privoxy? - - 1.5. [49]Troubleshooting - - 1.5.1. [50]I just upgraded and am getting "connection - refused" with every web page? - - 1.5.2. [51]I just added a new rule, but the steenkin ad is - still getting through. How? - - 1.5.3. [52]One of my favorite sites does not work with - Privoxy. What can I do? - - 1.5.4. [53]What time is it? - - 2. [54]Copyright and History - 3. [55]See also - -1. Frequently Asked Questions - -1.1. General Information - -1.1.1. What is this new version of Privoxy? - - The original Internet Junkbuster (tm) is a copyrighted product of - [56]Junkbusters Corporation. Development of this effort stopped some - time ago as of version 2.0.2. Stefan Waldherr started the ijbswa - project on [57]Sourceforge to rekindle development. Other developers - subsequently joined with Stefan, and have since added many new - features, refinements and enhancements. - - The new Privoxy started with the same Junkbuster code base, but has - changed significantly at this point. - _________________________________________________________________ - -1.1.2. Why "Privoxy"? Why a name change at all? - - Privoxy is for "Privacy Enhancing Proxy". There are possible legal - complications from the continued use of the Junkbuster name, which is - a trademark of [58]Junkbusters Corporation. (There are no objections - from Junkbusters Corporation to the Privoxy project itself though, and - they in fact still share our ideals and goals.) - - The developers also believed that there so many changes from the - original code, that it was time to make a clean break from the past - and make a name in their own right, especially now with the pending - release of version 3.0. - _________________________________________________________________ - -1.1.3. How does it differ from the old Junkbuster? - - All the old features remain. The new Privoxy still blocks ads and - banners, still manages cookies, and still helps protect your privacy. - But, these are all enhanced, and many new features have been added, - all in the same vein. - - The configuration has changed significantly as well. This is something - that users will notice right off the bat. The "blocklist" file does - not exist any more. This is replaced by "actions" files, such as - default.actions. This is where most of the per site configuration is - now. - _________________________________________________________________ - -1.1.4. What are some of the new features? - - * Integrated browser based configuration and control utility - ([59]http://p.p). Browser-based tracing of rule and filter - effects. - * Blocking of annoying pop-up browser windows. - * HTTP/1.1 compliant (most, but not all 1.1 features are supported). - * Support for Perl Compatible Regular Expressions in the - configuration files, and generally a more sophisticated and - flexible configuration syntax over previous versions. - * GIF de-animation. - * Web page content filtering (removes banners based on size, - invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.) - * Bypass many click-tracking scripts (avoids script redirection). - * Multi-threaded (POSIX and native threads). - * Auto-detection and re-reading of config file changes. - * User-customizable HTML templates (e.g. 404 error page). - * Improved cookie management features (e.g. session based cookies). - * Builds from source on most UNIX-like systems. Packages available - for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac - OSX, OS/2, HP-UX 11 and AmigaOS. - * In addition, the configuration is much more powerful and versatile - over-all. - _________________________________________________________________ - -1.1.5. What is a "proxy"? How does Privoxy work? - - When you connect to a web site with Privoxy, you are really connecting - to your locally running version of Privoxy. Privoxy intercepts your - requests for the web page, and relays that to the "real" web site. The - web site sends the HTTP data stream back to Privoxy, where Privoxy can - work its magic before it relays this data back to your web browser. - - Since Privoxy sits between you and the WWW, it is in a position to - intercept and completely manage all web traffic and HTTP content - before it gets to your browser. Privoxy uses various programming - methods to do this, all of which is under your control via the various - configuration files and options. - - There are many kinds of proxies. Privoxy best fits the "filtering - proxy" category. - _________________________________________________________________ - -1.1.6. My browser does the same things as Privoxy. Why should I use Privoxy -at all? - - Modern browsers do indeed have some of the same functionality as - Privoxy. Maybe this is adequate for you. But Privoxy is much more - versatile and powerful, and can do a number of things that browsers - just can't. - - In addition, a proxy is good choice if you use multiple browsers, or - have a LAN with multiple computers. This way all the configuration is - in one place, and you don't have to maintain a similar configuration - for possibly many browsers. - _________________________________________________________________ - -1.1.7. Is there is a license or fee? What about a warranty? Registration? - - Privoxy is licensed under the GNU General Public License (GPL). It is - free to use, copy, modify or distribute as you wish under the terms of - this license. See [60]http://www.gnu.org/copyleft/gpl.html for - specifics. - - There is no warranty of any kind, expressed, implied or otherwise. - That is something that would cost real money ;-) There is no - registration either. Privoxy really is free in every respect! - _________________________________________________________________ - -1.1.8. I would like to help you, what do I do? - -1.1.8.1. Money Money Money - - We, of course, welcome donations and use the money for domain - registering, regular world-wide get-togethers (hahaha). Anyway, we'll - soon describe the process how to donate money to the team. - _________________________________________________________________ - -1.1.8.2. You want to work with us? - - Well, helping the team is always a good idea. We welcome new - developers, RPM gurus or documentation makers. Simply get an account - on sourceforge.net and mail your id to the developer mailing list. - Then read the section Quickstart in the developers manual. - - Once we have added you to the team, you'll have write access to the - CVS repository, and together we'll find a suitable task for you. - _________________________________________________________________ - -1.2. Installation - -1.2.1. Which browsers are supported by Privoxy? - - Any browser that can be configured to use a "proxy", which is probably - almost all browsers. Direct browser support is not necessary since - Privoxy runs as a separate application and just exchanges standard - HTML data with your browser. - _________________________________________________________________ - -1.2.2. Which operating systems are supported? - - Right now Win32, Mac OSX, OS/2, AmigaOS, Linux, and many flavors of - Unix. - - Source code is available, so porting to other operating systems, is - always a possibility. - _________________________________________________________________ - -1.2.3. Can I install Privoxy over Junkbuster? - - We recommend you uninstall Junkbuster first to minimize conflicts and - confusion. You may want to save your old configuration files for - future reference. The configuration is substantially changed. - - See the [61]user-manual for platform specific installation - instructions. [FIXME: This is meant for after the name change for - 3.0!] - _________________________________________________________________ - -1.2.4. I just installed Privoxy. Is there anything special I have to do now? - - All browsers must be told to use Privoxy as a proxy by specifying the - correct proxy address and port number in the appropriate configuration - area for the browser. See below. - _________________________________________________________________ - -1.2.5. What is the proxy address of Privoxy? - - If you set up the Privoxy to run on the computer you browse from - (rather than your ISP's server or some networked computer on a LAN), - the proxy will be on "localhost" (which is the special name used by - every computer on the Internet to refer to itself) and the port will - be 8118 (unless you have Privoxy to run on a different port with the - listen-address config option). - - When configuring your browser's proxy settings you typically enter the - word "localhost" in the boxes next to "HTTP" and "Secure" (HTTPS) and - then the number "8118" for "port". This tells your browser to send all - web requests to Privoxy instead of directly to the Internet. - - Privoxy can also be used to proxy for a Local Area Network. In this - case, your would enter either the IP address of the LAN host where - Privoxy is running, or the equivalent hostname. Port assignment would - be same as above. - - Privoxy does not currently handle protocols such as FTP, SMTP, IM, - IRC, ICQ, or other Internet protocols. - _________________________________________________________________ - -1.2.6. I just installed Privoxy, and nothing is happening. All the ads are -there. What's wrong? - - Did you configure your browser to use Privoxy as a proxy? It does not - sound like it. See above. You might also try flushing the browser's - caches to force a full re-reading of pages. You can verify that - Privoxy is running, and your browser is correctly configured by - entering the special URL: [62]http://p.p/. This should give you a - banner that says "This is Privoxy" and access to Privoxy's internal - configuration. If you see this, then you are good to go. If not, the - browser or Privoxy are not set up correctly. - _________________________________________________________________ - -1.3. Configuration - -1.3.1. Can I use my old config files? - - There are major changes to Junkbuster configuration from version 2.0.x - to 2.9.x and later. The older files will not work at all. If this is - the case, you will need to re-enter your old data into the new - configuration structure. This is probably also a good recommendation - even if upgrading from 2.9.x to 3.x since there were many minor - changes along the way. - _________________________________________________________________ - -1.3.2. What is an "actions" file? - - "actions" files are where various actions that Privoxy might take, are - configured. Typically, you would define a set of default actions that - apply to all URLs, then add exceptions to these defaults. - - Actions can be defined on a per site basis, or for groups of sites. - Actions can also be grouped together and then applied to one or more - sites. There are many possible actions that might apply to any given - site. As an example, if we are blocking cookies as one of our default - actions, but need to accept cookies from a given site, we would define - this in our "actions" file. - - Privoxy comes with several default actions files, with varying degrees - of filtering and blocking, as starting points for your own - configuration (see below). - _________________________________________________________________ - -1.3.3. The "actions"concept confuses me. Please list some of these -"actions". - - These are all explained in the [63]user-manual. Please refer to that. - _________________________________________________________________ - -1.3.4. How are actions files configured? What is the easiest way to do this? - - The easiest way to do this, is to access Privoxy with your web browser - at [64]http://p.p/, and then select "[65]Edit the actions list" from - the selection list. You can also do this by editing the appropriate - file with a text editor. - - Please see the [66]user-manual for a detailed explanation of these and - other configuration files, and their various options and syntax. - _________________________________________________________________ - -1.3.5. What are the differences between intermediate.action, basic.action, -etc.? - - Configuring Privoxy is not easy. To help you get started, we provide - you with three different default configurations. The following table - shows you, which features are enabled in each configuration. - - Table 1. Default Configurations - Feature default.action basic.action intermediate.action - advanced.action - ad-filtering ? x x x - blank image ? x x x - de-animate GIFs ? x x x - referer forging ? x x x - jon's +no-cookies-keep (i.e. session cookies only) ? x x x - no-popup windows ? x x - fast redirects ? x x - hide-referrer ? x x - hide-useragent ? x x - content-modification ? x - feature-x ? - feature-y ? - feature-z ? - _________________________________________________________________ - -1.3.6. Why can I change the configuration with a browser? Does that not -raise security issues? - - What I don't understand, is how I can browser edit the config file as - a regular user, while the whole /etc/privoxy hierarchy belongs to the - user "privoxy", with only 644 perms. - - When you use the browser-based editor, Privoxy itself is writing to - the config files. Because Privoxy is running as the user "privoxy", it - can update the config files. - - If you don't like this, setting "enable-edit-actions 0" in the config - file will disable the browser-based editor. If you're that paranoid, - you should also consider setting "enable-remote-toggle 0" to prevent - browser-based enabling/disabling of Privoxy. - - Note that normally only local users can connect to Privoxy, so this is - not (normally) a security problem. - _________________________________________________________________ - -1.3.7. What is a "default.filter"? - - The "default.filter" file is used to "filter" any web page content. By - "filtering" we mean it can modify, remove, or change anything on the - page, including HTML tags, and JavaScript. Regular expressions are - used to accomplish this, and operate on a line by line basis. This is - potentially a very powerful feature, but requires some expertise. - - If you are familiar with regular expressions, and HTML, you can look - at the provided default.filter with a text editor and see some of - things it can be used for. - - Presently, there is no GUI editor option for this part of the - configuration, but you can disable/enable various sections of the - included default file with the "Actions List Editor" from your - browser. - _________________________________________________________________ - -1.3.8. How can I set up Privoxy to act as a proxy for my LAN? - - By default, Privoxy only responds to requests from localhost. To have - it act as a server for a network, this needs to be changed in the main - config file where the Privoxy configuration is located. In that file - is a "listen-address" option. It may be commented out with a "#" - symbol. Make sure it is uncommented, and assign it the address of the - LAN gateway interface, and port number to use: - - listen-address 192.168.1.1:8118 - - Save the file, and restart Privoxy. Configure all browsers on the - network then to use this address and port number. - _________________________________________________________________ - -1.3.9. Instead of ads, now I get a checkerboard pattern. I don't want to see -anything. - - This is a configuration option for images that Privoxy is stopping. - You have the choice a checkerboard pattern, a transparent 1x1 GIF - image (aka "blank"), or a custom URL or your choice. - - If you want to see nothing, then change the "+image-blocker" action to - "+image-blocker{blank}". This can be done from the "Edit Actions List" - selection at [67]http://p.p/. Or by hand editing the appropriate - actions file. This will only effect what is defined as "images" - though. - _________________________________________________________________ - -1.3.10. Why would anybody want to see a checkerboard pattern? - - This can be helpful for troubleshooting problems. It might also be - good for anyone new to Privoxy so that they can see if their favorite - pages are displaying correctly, and Privoxy is not inadvertently - removing something important. - _________________________________________________________________ - -1.3.11. I see large red banners on some pages that say "Blocked". How do I -get rid of this? - - These are URLs that match something in one of Privoxy's block actions - (+block). It is meant to be a warning so that you know something has - been blocked and an easy way for you to see why. These are handled - differently than what has been defined as "images" (e.g. ad banners). - If you want them to be treated as if they were images, so that they - can be made invisible, then move the offending URL from the "+block" - section to the "+imageblock" section of your actions file. - Alternately, you could modify the "block" HTML template that is used - by Privoxy to display this, and make it something more to your liking. - _________________________________________________________________ - -1.3.12. How can I make Privoxy work with other proxies like Squid? - - This can be done. See the [68]user manual, which describes how to do - this. - _________________________________________________________________ - -1.4. Miscellaneous - -1.4.1. How much does Privoxy slow my browsing down? This has to add extra -time to browsing. - - It should not slow you down any in real terms, and may actually help - speed things up since ads, banners and other junk are not being - displayed. The actual processing time required by Privoxy itself for - each page, is relatively small in the overall scheme of things, and - happens very quickly. This is typically more than offset by time saved - not downloading and rendering ad images. - - "Filtering" via the filterfile mechanism may cause a perceived - slowdown, since the entire page is buffered before displaying. See - below. - _________________________________________________________________ - -1.4.2. I noticed considerable delays in page requests compared to the old -Junkbuster. What's wrong? - - Using the default filtering configuration, I noticed considerable - delays in page requests compared to the old Junkbuster. Loading pages - with large contents seemed to take forever, then suddenly delivering - all the content at once. - - The whole content must be loaded in order to filter, and nothing is is - sent to the browser during this time. The loading time does not really - change in real numbers, but the feeling is different, because most - browsers are able to start rendering incomplete content, giving the - user a feeling of "it works". - - To modify the content of a page (i.e. make frames resizeable again, - etc.) and not just replace ads, Privoxy needs to download the entire - page first, do its content magic and then send the page to the - browser. - _________________________________________________________________ - -1.4.3. What is the "http://p.p/"? - - Since Privoxy sits between your web browser and the Internet, it can - be programmed to handle certain pages specially. - - With recent versions of Privoxy (version 2.9.x), you can get some - information about Privoxy and change some settings by going to - http://p.p/ or, equivalently, http://www.privoxy.org/config/ (Note - that p.p is far easier to type but may not work in some - configurations). - - These pages are *not* forwarded to a server on the Internet - instead - they are handled by a special web server which is built in to Privoxy. - - If you are not running Privoxy, then http://p.p/ will fail, and - http://www.privoxy.org/config/ will return a web page telling you - you're not running Privoxy. - - If you have version 2.0.2, then the equivalent is - http://example.com/show-proxy-args (but you get far less information, - and you should really consider upgrading to 2.9.x). - _________________________________________________________________ - -1.4.4. Do you still maintain the blocklists? - - No. The format of the blocklists has changed significantly in the - versions 2.9.x. Once we have released the new version, there will - again be blocklists that you can update automatically. - _________________________________________________________________ - -1.4.5. How can I submit new ads? - - As of now, please discontinue to submit new ad blocking infos. Once we - have released the new version, there will again be a form on the - website, which you can use to contribute new ads. - _________________________________________________________________ - -1.4.6. How can I hide my IP address? - - You cannot hide your IP address with Privoxy or any other software, - since the server needs to know your IP address to send the answer to - you. - - Fortunately there are many publicly usable anonymous proxies out - there, which solve the problem by providing a further level of - indirection between you and the web server, shared by many people and - thus letting your requests "drown" in white noise of unrelated - requests as far as user tracking is concerned. - - Most of them will, however, log your IP address and make it available - to the authorities in case you abuse that anonymity for criminal - purposes. In fact you can't even rule out that some of them only exist - to *collect* information on (those suspicious) people with a more than - average preference for privacy. - - You can find a list of anonymous public proxies at [69]multiproxy.org - and many more through Google. - _________________________________________________________________ - -1.4.7. Can Privoxy guarantee I am anonymous? - - No. Your chances of remaining anonymous are greatly improved, but - unless you are an expert on Internet security it would be safest to - assume that everything you do on the Web can be traced back to you. - - Privoxy can remove various information about you, and allows you more - freedom to decide which sites you can trust. But it's still possible - that web sites can find out who you are. Here's one way this can - happen. - - A few browsers disclose the user's email address in certain - situations, such as when transferring a file by FTP. Privoxy does not - filter FTP. If you need this feature, or are concerned about the mail - handler of your browser disclosing your email address, you might - consider products such as NSClean. - - Browsers available only as binaries could use non-standard headers to - give out any information they can have access to: see the - manufacturer's license agreement. It's impossible to anticipate and - prevent every breach of privacy that might occur. The professionally - paranoid prefer browsers available as source code, because - anticipating their behavior is easier. Trust the source, Luke! - _________________________________________________________________ - -1.4.8. Might some things break because header information is being altered? - - Definitely. More and more sites use HTTP header content to decide what - to display and how to display it. There is many ways that this can be - handled, so having hard and fast rules, is tricky. - - "USER AGENT" in particular is often used in this way to identify the - browser, and adjust content accordingly. Changing this now is not - recommended, since so many sites do look for this. You may get - undesirable results by changing this. - - For instance, different browsers use different encodings of Russian - and Czech characters, certain web servers convert pages on-the-fly - according to the User Agent header. Giving a "User Agent" with the - wrong operating system or browser manufacturer causes some sites in - these languages to be garbled; Surfers to Eastern European sites - should change it to something closer. And then some page access - counters work by looking at the "REFERER" header; they may fail or - break if unavailable. The weather maps of Intellicast have been - blocked by their server when no "REFERER" or cookie is provided, is - another example. There are many, many other ways things can go wrong - when trying to fool a web server. - - If you have problems with a site, you will have to adjust your - configuration accordingly. Cookies are probably the most likely - adjustment that may be required, but by no means the only one. - _________________________________________________________________ - -1.4.9. Can Privoxy act as a "caching" proxy to speed up web browsing? - - No, it does not have this ability at all. You want something like - [70]Squid for this. And, yes, before you ask, Privoxy can co-exist - with other kinds of proxies like "Squid". - _________________________________________________________________ - -1.4.10. What about as a firewall? Can Privoxy protect me? - - Not in the way you mean, or in the way a true firewall can, or a proxy - that has this specific capability. Privoxy can help protect your - privacy, but not really protect you from intrusion attempts. - _________________________________________________________________ - -1.4.11. The Privoxy logo that replaces ads is very blocky and ugly looking. -Can't a better font be used? - - This is not a font problem. The logo is an image that is created by - Privoxy on the fly. So as to not waste memory, the image is rather - small. The blockiness comes when the image is scaled to fill a largish - area. There is not much to be done about this, other than to use one - of the other "imageblock" directives: pattern, blank, or a URL of your - choosing. - - Given the above problem, we have decided to remove the logo option - entirely [as of v2.9.13]. - _________________________________________________________________ - -1.4.12. I have large empty spaces now where ads used to be. Why does Privoxy -leave these large gaps? - - It would be easy enough to just eliminate this space altogether, - rather than fill it with blank space. But, this would create problems - with many pages that use the overall size of the ad to help organize - the page layout and position the various components of the page where - they were intended to be. It is best left this way. - _________________________________________________________________ - -1.4.13. How can Privoxy filter Secure (HTTPS) URLs? - - This is a limitation since HTTPS transactions are encrypted SSL - sessions between your browser and the secure site, and are meant to be - reliably secure and private. This means that all cookies and HTTP - header information are also encrypted from the time they leave your - browser, to the site, and vice versa. Privoxy does not try to - unencrypt this information, so it just passes through as is. Privoxy - can still catch images and ads that are embedded in the SSL stream - though. - _________________________________________________________________ - -1.4.14. Privoxy runs as a "server". How secure is it? Do I need to take any -special precautions? - - There are no known exploits that might effect Privoxy. On Unix-like - systems, Privoxy can run as a non-privileged user, which is how we - recommend it be run. Also, by default Privoxy only listens to requests - from "localhost". It is not itself directly exposed to the Internet in - this configuration. If you want to have Privoxy serve as a LAN proxy, - this will have to be opened up to allow for LAN requests. In this - case, we'd recommend you specify only the LAN gateway address, e.g. - 192.168.1.1 in the main Privoxy config file. All LAN hosts can then - use this as their proxy address in the browser proxy configuration. In - this way, Privoxy will not listen on any external ports. Of course, a - firewall is always good too. Better safe than sorry. - _________________________________________________________________ - -1.4.15. How can I temporarily disable Privoxy? - - The easiest way is to access Privoxy with your browser by using the - special URL: [71]http://p.p/ and select "Toggle Privoxy on or off" - from that page. - _________________________________________________________________ - -1.5. Troubleshooting - -1.5.1. I just upgraded and am getting "connection refused" with every web -page? - - Either Privoxy is not running, or your browser is configured for a - different port than what Privoxy is using. - - The old Privoxy (and also Junkbuster) used port 8000 by default. This - has been changed to port 8118 now, due to a conflict with NAS (Network - Audio Service), which uses port 8000. If you haven't, you need to - change your browser to the new port number, or alternately change - Privoxy's "listen-address" setting in the config file used to start - Privoxy. - _________________________________________________________________ - -1.5.2. I just added a new rule, but the steenkin ad is still getting -through. How? - - If the ad had been displayed before you added its URL, it will - probably be held in the browser's cache for some time, so it will be - displayed without the need for any request to the server, and Privoxy - will not be in the picture. The best thing to do is try flushing the - browser's caches. And then try again. - - If this doesn't help, you probably have an error in the rule you - applied. Try pasting the full URL of the offending ad into - [72]http://www.privoxy.org/config/show-url-info and see if any actions - match your new rule. - _________________________________________________________________ - -1.5.3. One of my favorite sites does not work with Privoxy. What can I do? - - First verify that it is indeed a Privoxy problem, by disabling Privoxy - filtering and blocking. Go to [73]http://p.p/ and click on "Toggle - Privoxy On or Off", then disable it. Now try that page again. - - If still a problem, go to "Show which actions apply to a URL and why" - from [74]http://p.p/ and paste the full URL of the page in question - into the prompt. See which actions are being applied to the URL. Now, - armed with this information, go to "Edit the actions list". Here you - should see various sections that have various Privoxy features - disabled for specific sites. Disabled "actions" will have a "-" (minus - sign) in front of them. Add your problem page URL to one of these - sections that looks like it is disabling the feature that is causing - the problem. Re-try the page. There might be some trial and error - involved. This is discussed in a little more detail in the - [75]user-manual appendix. - - Alternately, if you are comfortable with a text editor, you can - accomplish the same thing by editing the appropriate "actions" file. - _________________________________________________________________ - -1.5.4. What time is it? - - Time for you to go! - _________________________________________________________________ - -2. Copyright and History - - Please see the user manual for information on Copyright and History. - _________________________________________________________________ - -3. See also - - Please see the user manual for information on references. - -References - - 1. http://www.privoxy.org/faq/ - 2. http://www.privoxy.org/user-manual/contact.html - 3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUESTIONS - 4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#GENERAL - 5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWJB - 6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN37 - 7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DIFFERS - 8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FEATURES - 9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#PROXYMORON - 10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSERS2 - 11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LICENSE - 12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#JOINTEAM - 13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION - 14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHBROWSERS - 15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHOS - 16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWINSTALL - 17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN151 - 18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOCALHOST - 19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN176 - 20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURATION - 21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWCONFIG - 22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN192 - 23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSS - 24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN210 - 25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGFILES - 26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSECONFIG - 27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN327 - 28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN339 - 29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN351 - 30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN362 - 31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN367 - 32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#OTHERPROXY - 33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#MISC - 34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN386 - 35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOADINGTIMES - 36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURL - 37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BLOCKLIST - 38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWADS - 39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#IP - 40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN427 - 41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN438 - 42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN448 - 43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN456 - 44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN461 - 45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN470 - 46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN474 - 47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN481 - 48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TURNOFF - 49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN499 - 50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN501 - 51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN514 - 52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN520 - 53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN538 - 54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT - 55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO - 56. http://www.junkbusters.com/ - 57. http://ijbswa.sourceforge.net/ - 58. http://junkbusters.com/ - 59. http://p.p/ - 60. http://www.gnu.org/copyleft/gpl.html - 61. http://www.privoxy.org/user-manual/ - 62. http://p.p/ - 63. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE - 64. http://p.p/ - 65. http://www.privoxy.org/config/edit-actions - 66. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE - 67. http://p.p/ - 68. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#FORWARDING - 69. http://www.multiproxy.org/anon_list.htm - 70. http://www.squid-cache.org/ - 71. http://p.p/ - 72. http://www.privoxy.org/config/show-url-info - 73. http://p.p/ - 74. http://p.p/ - 75. file://localhost/home/swa/sf/current-org/doc/user-manual/appendix.html#ACTIONSANAT diff --git a/doc/text/user-manual.txt b/doc/text/user-manual.txt deleted file mode 100644 index 5a33782e..00000000 --- a/doc/text/user-manual.txt +++ /dev/null @@ -1,2097 +0,0 @@ - -Privoxy User Manual - - By: Privoxy Developers - - $Id: user-manual.sgml,v 1.60 2002/03/27 01:57:34 hal9 Exp $ - - The user manual gives users information on how to install, configure - and use Privoxy. Privoxy is a web proxy with advanced filtering - capabilities for protecting privacy, filtering web page content, - managing cookies, controlling access, and removing ads, banners, - pop-ups and other obnoxious Internet Junk. Privoxy has a very flexible - configuration and can be customized to suit individual needs and - tastes. Privoxy has application for both stand-alone systems and - multi-user networks. - - You can find the latest version of the user manual at - [1]http://www.privoxy.org/user-manual/. - _________________________________________________________________ - - Table of Contents - 1. [2]Introduction - - 1.1. [3]New Features - - 2. [4]Installation - - 2.1. [5]Source - 2.2. [6]Red Hat - 2.3. [7]SuSE - 2.4. [8]OS/2 - 2.5. [9]Windows - 2.6. [10]Other - - 3. [11]Privoxy Configuration - - 3.1. [12]Controlling Privoxy with Your Web Browser - 3.2. [13]Configuration Files Overview - 3.3. [14]The Main Configuration File - - 3.3.1. [15]Defining Other Configuration Files - 3.3.2. [16]Other Configuration Options - 3.3.3. [17]Access Control List (ACL) - 3.3.4. [18]Forwarding - 3.3.5. [19]Windows GUI Options - - 3.4. [20]The Actions File - - 3.4.1. [21]URL Domain and Path Syntax - 3.4.2. [22]Actions - 3.4.3. [23]Aliases - - 3.5. [24]The Filter File - 3.6. [25]Templates - - 4. [26]Quickstart to Using Privoxy - - 4.1. [27]Command Line Options - - 5. [28]Contacting the Developers, Bug Reporting and Feature Requests - 6. [29]Copyright and History - - 6.1. [30]License - 6.2. [31]History - - 7. [32]See also - 8. [33]Appendix - - 8.1. [34]Regular Expressions - - 21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - - 8.2. [35]Privoxy's Internal Pages - 8.3. [36]Anatomy of an Action - -1. Introduction - - Privoxy is a web proxy with advanced filtering capabilities for - protecting privacy, filtering web page content, managing cookies, - controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very flexible configuration and - can be customized to suit individual needs and tastes. Privoxy has - application for both stand-alone systems and multi-user networks. - - Privoxy is based on the code of the Internet Junkbuster. Junkbuster - was originally written by JunkBusters Corporation, and was released as - free open-source software under the GNU GPL. Stefan Waldherr made many - improvements, and started the SourceForge project to continue - development. - - Privoxy continues the Junkbuster tradition, but adds many refinements - and enhancements. - - This documentation is included with the current BETA version of - Privoxy and is mostly complete at this point. The most up to date - reference for the time being is still the comments in the source files - and in the individual configuration files. Development of version 3.0 - is currently nearing completion, and includes many significant changes - and enhancements over earlier versions. The target release date for - stable v3.0 is "soon" ;-) - - Since this is a BETA version, not all new features are well tested. - This documentation may be slightly out of sync as a result (especially - with CVS sources). And there may be bugs, though hopefully not many! - _________________________________________________________________ - -1.1. New Features - - In addition to Internet Junkbuster's traditional feature of ad and - banner blocking and cookie management, Privoxy provides new features, - some of them currently under development: - - * Integrated browser based configuration and control utility - ([37]http://p.p). Browser-based tracing of rule and filter - effects. - * Blocking of annoying pop-up browser windows. - * HTTP/1.1 compliant (most, but not all 1.1 features are supported). - * Support for Perl Compatible Regular Expressions in the - configuration files, and generally a more sophisticated and - flexible configuration syntax over previous versions. - * GIF de-animation. - * Web page content filtering (removes banners based on size, - invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.) - * Bypass many click-tracking scripts (avoids script redirection). - * Multi-threaded (POSIX and native threads). - * Auto-detection and re-reading of config file changes. - * User-customizable HTML templates (e.g. 404 error page). - * Improved cookie management features (e.g. session based cookies). - * Builds from source on most UNIX-like systems. Packages available - for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac - OSX, OS/2, HP-UX 11 and AmigaOS. - * In addition, the configuration is much more powerful and versatile - over-all. - _________________________________________________________________ - -2. Installation - - Privoxy is available as raw source code, or pre-compiled binaries. See - the [38]Privoxy Home Page for binaries and current release info. - Privoxy is also available via [39]CVS. This is the recommended - approach at this time. But please be aware that CVS is constantly - changing, and it may break in mysterious ways. - _________________________________________________________________ - -2.1. Source - - For gzipped tar archives, unpack the source: - - tar xzvf privoxy-2.9.13-beta-src* [.tgz or .tar.gz] - cd privoxy-2.9.13-beta - - For retrieving the current CVS sources, you'll need the CVS package - installed first. To download CVS source: - - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co cu -rrent - cd current - - This will create a directory named current/, which will contain the - source tree. - - Then, in either case, to build from tarball/CVS source: - - ./configure (--help to see options) - make (the make from gnu, gmake for *BSD) - su - make -n install (to see where all the files will go) - make install (to really install) - - For Redhat and SuSE Linux RPM packages, see below. - _________________________________________________________________ - -2.2. Red Hat - - To build Redhat RPM packages, install source as above. Then: - - autoheader - autoconf - ./configure - make redhat-dist - - This will create both binary and src RPMs in the usual places. - Example: - - /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - /usr/src/redhat/SRPMS/privoxy-2.9.11-1.src.rpm - - To install, of course: - - rpm -Uvv /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - This will place the Privoxy configuration files in /etc/privoxy/, and - log files in /var/log/privoxy/. - _________________________________________________________________ - -2.3. SuSE - - To build SuSE RPM packages, install source as above. Then: - - autoheader - autoconf - ./configure - make suse-dist - - This will create both binary and src RPMs in the usual places. - Example: - - /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - /usr/src/packages/SRPMS/privoxy-2.9.11-1.src.rpm - - To install, of course: - - rpm -Uvv /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - This will place the Privoxy configuration files in /etc/privoxy/, and - log files in /var/log/privoxy/. - _________________________________________________________________ - -2.4. OS/2 - - Privoxy is packaged in a WarpIN self- installing archive. The - self-installing program will be named depending on the release - version, something like: ijbos2_setup_1.2.3.exe. In order to install - it, simply run this executable or double-click on its icon and follow - the WarpIN installation panels. A shadow of the Privoxy executable - will be placed in your startup folder so it will start automatically - whenever OS/2 starts. - - The directory you choose to install Privoxy into will contain all of - the configuration files. - - If you would like to build binary images on OS/2 yourself, you will - need a few Unix-like tools: autoconf, autoheader and sh. These tools - will be used to create the required config.h file, which is not part - of the source distribution because it differs based on platform. You - will also need a compiler. The distribution has been created using IBM - VisualAge compilers, but you can use any compiler you like. GCC/EMX - has the disadvantage of needing to be single-threaded due to a - limitation of EMX's implementation of the select() socket call. - - In addition to needing the source code distribution as outlined - earlier, you will want to extract the os2seutp directory from CVS: - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co os2 -setup - - This will create a directory named os2setup/, which will contain the - Makefile.vac makefile and os2build.cmd which is used to completely - create the binary distribution. The sequence of events for building - the executable for yourself goes something like this: - cd current - autoheader - autoconf - sh configure - cd ..\os2setup - nmake -f Makefile.vac - - You will see this sequence laid out in os2build.cmd. - _________________________________________________________________ - -2.5. Windows - - Click-click. (I need help on this. Not a clue here. Also for - configuration section below. HB.) - _________________________________________________________________ - -2.6. Other - - Some quick notes on other Operating Systems. - - For FreeBSD (and other *BSDs?), the build will require gmake instead - of the included make. gmake is available from [40]http://www.gnu.org. - The rest should be the same as above for Linux/Unix. - _________________________________________________________________ - -3. Privoxy Configuration - - All Privoxy configuration is kept in text files. These files can be - edited with a text editor. Many important aspects of Privoxy can also - be controlled easily with a web browser. - _________________________________________________________________ - -3.1. Controlling Privoxy with Your Web Browser - - Privoxy can be reached by the special URL [41]http://p.p/ (or - alternately [42]http://www.privoxy.org/config/), which is an internal - page. You will see the following section: - -Please choose from the following options: - - * Show information about the current configuration - * Show the source code version numbers - * Show the client's request headers. - * Show which actions apply to a URL and why - * Toggle Privoxy on or off - * Edit the actions list - - - This should be self-explanatory. Note the last item is an editor for - the "actions list", which is where much of the ad, banner, cookie, and - URL blocking magic is configured as well as other advanced features of - Privoxy. This is an easy way to adjust various aspects of Privoxy - configuration. The actions file, and other configuration files, are - explained in detail below. Privoxy will automatically detect any - changes to these files. - - "Toggle Privoxy On or Off" is handy for sites that might have problems - with your current actions and filters, or just to test if a site - misbehaves, whether it is Privoxy causing the problem or not. Privoxy - continues to run as a proxy in this case, but all filtering is - disabled. - _________________________________________________________________ - -3.2. Configuration Files Overview - - For Unix, *BSD and Linux, all configuration files are located in - /etc/privoxy/ by default. For MS Windows, OS/2, and AmigaOS these are - all in the same directory as the Privoxy executable. The name and - number of configuration files has changed from previous versions, and - is subject to change as development progresses. - - The installed defaults provide a reasonable starting point, though - possibly aggressive by some standards. For the time being, there are - only three default configuration files (this will change in time): - - * The main configuration file is named config on Linux, Unix, BSD, - OS/2, and AmigaOS and config.txt on Windows. - * The default.action file is used to define various "actions" - relating to images, banners, pop-ups, access restrictions, banners - and cookies. There is a CGI based editor for this file that can be - accessed via [43]http://p.p. (Other actions files are included as - well with differing levels of filtering and blocking, e.g. - ijb-basic.action.) - * The default.filter file can be used to re-write the raw page - content, including viewable text as well as embedded HTML and - JavaScript, and whatever else lurks on any given web page. - - default.action and default.filter can use Perl style regular - expressions for maximum flexibility. All files use the "#" character - to denote a comment. Such lines are not processed by Privoxy. After - making any changes, there is no need to restart Privoxy in order for - the changes to take effect. Privoxy should detect such changes - automatically. - - While under development, the configuration content is subject to - change. The below documentation may not be accurate by the time you - read this. Also, what constitutes a "default" setting, may change, so - please check all your configuration files on important issues. - _________________________________________________________________ - -3.3. The Main Configuration File - - Again, the main configuration file is named config on Linux/Unix/BSD - and OS/2, and config.txt on Windows. Configuration lines consist of an - initial keyword followed by a list of values, all separated by - whitespace (any number of spaces or tabs). For example: - - blockfile blocklist.ini - - Indicates that the blockfile is named "blocklist.ini". (A default - installation does not use this.) - - A "#" indicates a comment. Any part of a line following a "#" is - ignored, except if the "#" is preceded by a "\". - - Thus, by placing a "#" at the start of an existing configuration line, - you can make it a comment and it will be treated as if it weren't - there. This is called "commenting out" an option and can be useful to - turn off features: If you comment out the "logfile" line, Privoxy will - not log to a file at all. Watch for the "default:" section in each - explanation to see what happens if the option is left unset (or - commented out). - - Long lines can be continued on the next line by using a "\" as the - very last character. - - There are various aspects of Privoxy behavior that can be tuned. - _________________________________________________________________ - -3.3.1. Defining Other Configuration Files - - Privoxy can use a number of other files to tell it what ads to block, - what cookies to accept, etc. This section of the configuration file - tells Privoxy where to find all those other files. - - On Windows and AmigaOS, Privoxy looks for these files in the same - directory as the executable. On Unix and OS/2, Privoxy looks for these - files in the current working directory. In either case, an absolute - path name can be used to avoid problems. - - When development goes modular and multi-user, the blocker, filter, and - per-user config will be stored in subdirectories of "confdir". For - now, only confdir/templates is used for storing HTML templates for CGI - results. - - The location of the configuration files: - - confdir /etc/privoxy # No trailing /, please. - - The directory where all logging (i.e. logfile and jarfile) takes - place. No trailing "/", please: - - logdir /var/log/privoxy - - Note that all file specifications below are relative to the above two - directories! - - The "default.action" file contains patterns to specify the actions to - apply to requests for each site. Default: Cookies to and from all - destinations are kept only during the current browser session (i.e. - they are not saved to disk). Pop-ups are disabled for all sites. All - sites are filtered through selected sections of "default.filter". No - sites are blocked. Privoxy displays a checkboard type pattern for - filtered ads and other images. The syntax of this file is explained in - detail [44]below. Other "actions" files are included, and you are free - to use any of them. They have varying degrees of aggressiveness. - - actionsfile default.action - - The "default.filter" file contains content modification rules that use - "regular expressions". These rules permit powerful changes on the - content of Web pages, e.g., you could disable your favorite JavaScript - annoyances, re-write the actual displayed text, or just have some fun - replacing "Microsoft" with "MicroSuck" wherever it appears on a Web - page. Default: whatever the developers are playing with :-/ - - Filtering requires buffering the page content, which may appear to - slow down page rendering since nothing is displayed until all content - has passed the filters. (It does not really take longer, but seems - that way since the page is not incrementally displayed.) This effect - will be more noticeable on slower connections. - - filterfile default.filter - - The logfile is where all logging and error messages are written. The - logfile can be useful for tracking down a problem with Privoxy (e.g., - it's not blocking an ad you think it should block) but in most cases - you probably will never look at it. - - Your logfile will grow indefinitely, and you will probably want to - periodically remove it. On Unix systems, you can do this with a cron - job (see "man cron"). For Redhat, a logrotate script has been - included. - - On SuSE Linux systems, you can place a line like "/var/log/privoxy.* - +1024k 644 nobody.nogroup" in /etc/logfiles, with the effect that - cron.daily will automatically archive, gzip, and empty the log, when - it exceeds 1M size. - - Default: Log to the a file named logfile. Comment out to disable - logging. - - logfile logfile - - The "jarfile" defines where Privoxy stores the cookies it intercepts. - Note that if you use a "jarfile", it may grow quite large. Default: - Don't store intercepted cookies. - - #jarfile jarfile - - If you specify a "trustfile", Privoxy will only allow access to sites - that are named in the trustfile. You can also mark sites as trusted - referrers, with the effect that access to untrusted sites will be - granted, if a link from a trusted referrer was used. The link target - will then be added to the "trustfile". This is a very restrictive - feature that typical users most probably want to leave disabled. - Default: Disabled, don't use the trust mechanism. - - #trustfile trust - - If you use the trust mechanism, it is a good idea to write up some - on-line documentation about your blocking policy and to specify the - URL(s) here. They will appear on the page that your users receive when - they try to access untrusted content. Use multiple times for multiple - URLs. Default: Don't display links on the "untrusted" info page. - - trust-info-url http://www.your-site.com/why_we_block.html - trust-info-url http://www.your-site.com/what_we_allow.html - _________________________________________________________________ - -3.3.2. Other Configuration Options - - This part of the configuration file contains options that control how - Privoxy operates. - - "Admin-address" should be set to the email address of the proxy - administrator. It is used in many of the proxy-generated pages. - Default: fill@me.in.please. - - #admin-address fill@me.in.please - - "Proxy-info-url" can be set to a URL that contains more info about - this Privoxy installation, it's configuration and policies. It is used - in many of the proxy-generated pages and its use is highly recommended - in multi-user installations, since your users will want to know why - certain content is blocked or modified. Default: Don't show a link to - on-line documentation. - - proxy-info-url http://www.your-site.com/proxy.html - - "Listen-address" specifies the address and port where Privoxy will - listen for connections from your Web browser. The default is to listen - on the localhost port 8118, and this is suitable for most users. (In - your web browser, under proxy configuration, list the proxy server as - "localhost" and the port as "8118"). - - If you already have another service running on port 8118, or if you - want to serve requests from other machines (e.g. on your local - network) as well, you will need to override the default. The syntax is - "listen-address []:". If you leave out the IP - address, Privoxy will bind to all interfaces (addresses) on your - machine and may become reachable from the Internet. In that case, - consider using access control lists (acl's) (see "aclfile" above), or - a firewall. - - For example, suppose you are running Privoxy on a machine which has - the address 192.168.0.1 on your local private network (192.168.0.0) - and has another outside connection with a different address. You want - it to serve requests from inside only: - - listen-address 192.168.0.1:8118 - - If you want it to listen on all addresses (including the outside - connection): - - listen-address :8118 - - If you do this, consider using ACLs (see "aclfile" above). Note: you - will need to point your browser(s) to the address and port that you - have configured here. Default: localhost:8118 (127.0.0.1:8118). - - The debug option sets the level of debugging information to log in the - logfile (and to the console in the Windows version). A debug level of - 1 is informative because it will show you each request as it happens. - Higher levels of debug are probably only of interest to developers. - - debug 1 # GPC = show each GET/POST/CONNECT request - debug 2 # CONN = show each connection status - debug 4 # IO = show I/O status - debug 8 # HDR = show header parsing - debug 16 # LOG = log all data into the logfile - debug 32 # FRC = debug force feature - debug 64 # REF = debug regular expression filter - debug 128 # = debug fast redirects - debug 256 # = debug GIF de-animation - debug 512 # CLF = Common Log Format - debug 1024 # = debug kill pop-ups - debug 4096 # INFO = Startup banner and warnings. - debug 8192 # ERROR = Non-fatal errors - - It is highly recommended that you enable ERROR reporting (debug 8192), - at least until v3.0 is released. - - The reporting of FATAL errors (i.e. ones which crash Privoxy) is - always on and cannot be disabled. - - If you want to use CLF (Common Log Format), you should set "debug 512" - ONLY, do not enable anything else. - - Multiple "debug" directives, are OK - they're logical-OR'd together. - - debug 15 # same as setting the first 4 listed above - - Default: - - debug 1 # URLs - debug 4096 # Info - debug 8192 # Errors - *we highly recommended enabling this* - - Privoxy normally uses "multi-threading", a software technique that - permits it to handle many different requests simultaneously. In some - cases you may wish to disable this -- particularly if you're trying to - debug a problem. The "single-threaded" option forces Privoxy to handle - requests sequentially. Default: Multi-threaded mode. - - #single-threaded - - "toggle" allows you to temporarily disable all Privoxy's filtering. - Just set "toggle 0". - - The Windows version of Privoxy puts an icon in the system tray, which - also allows you to change this option. If you right-click on that icon - (or select the "Options" menu), one choice is "Enable". Clicking on - enable toggles Privoxy on and off. This is useful if you want to - temporarily disable Privoxy, e.g., to access a site that requires - cookies which you would otherwise have blocked. This can also be - toggled via a web browser at the Privoxy internal address of - [45]http://p.p on any platform. - - "toggle 1" means Privoxy runs normally, "toggle 0" means that Privoxy - becomes a non-anonymizing non-blocking proxy. Default: 1 (on). - - toggle 1 - - For content filtering, i.e. the "+filter" and "+deanimate-gif" - actions, it is necessary that Privoxy buffers the entire document - body. This can be potentially dangerous, since a server could just - keep sending data indefinitely and wait for your RAM to exhaust. With - nasty consequences. - - The buffer-limit option lets you set the maximum size in Kbytes that - each buffer may use. When the documents buffer exceeds this size, it - is flushed to the client unfiltered and no further attempt to filter - the rest of it is made. Remember that there may multiple threads - running, which might require increasing the "buffer-limit" Kbytes - each, unless you have enabled "single-threaded" above. - - buffer-limit 4069 - - To enable the web-based default.action file editor set - enable-edit-actions to 1, or 0 to disable. Note that you must have - compiled Privoxy with support for this feature, otherwise this option - has no effect. This internal page can be reached at [46]http://p.p. - - Security note: If this is enabled, anyone who can use the proxy can - edit the actions file, and their changes will affect all users. For - shared proxies, you probably want to disable this. Default: enabled. - - enable-edit-actions 1 - - Allow Privoxy to be toggled on and off remotely, using your web - browser. Set "enable-remote-toggle"to 1 to enable, and 0 to disable. - Note that you must have compiled Privoxy with support for this - feature, otherwise this option has no effect. - - Security note: If this is enabled, anyone who can use the proxy can - toggle it on or off (see [47]http://p.p), and their changes will - affect all users. For shared proxies, you probably want to disable - this. Default: enabled. - - enable-remote-toggle 1 - _________________________________________________________________ - -3.3.3. Access Control List (ACL) - - Access controls are included at the request of some ISPs and systems - administrators, and are not usually needed by individual users. Please - note the warnings in the FAQ that this proxy is not intended to be a - substitute for a firewall or to encourage anyone to defer addressing - basic security weaknesses. - - If no access settings are specified, the proxy talks to anyone that - connects. If any access settings file are specified, then the proxy - talks only to IP addresses permitted somewhere in this file and not - denied later in this file. - - Summary -- if using an ACL: - - Client must have permission to receive service. - - LAST match in ACL wins. - - Default behavior is to deny service. - - The syntax for an entry in the Access Control List is: - - ACTION SRC_ADDR[/SRC_MASKLEN] [ DST_ADDR[/DST_MASKLEN] ] - - Where the individual fields are: - - ACTION = "permit-access" or "deny-access" - SRC_ADDR = client hostname or dotted IP address - SRC_MASKLEN = number of bits in the subnet mask for the source - DST_ADDR = server or forwarder hostname or dotted IP address - DST_MASKLEN = number of bits in the subnet mask for the target - - The field separator (FS) is whitespace (space or tab). - - IMPORTANT NOTE: If Privoxy is using a forwarder (see below) or a - gateway for a particular destination URL, the DST_ADDR that is - examined is the address of the forwarder or the gateway and NOT the - address of the ultimate target. This is necessary because it may be - impossible for the local Privoxy to determine the address of the - ultimate target (that's often what gateways are used for). - - Here are a few examples to show how the ACL features work: - - "localhost" is OK -- no DST_ADDR implies that ALL destination - addresses are OK: - - permit-access localhost - - A silly example to illustrate permitting any host on the class-C - subnet with Privoxy to go anywhere: - - permit-access www.privoxy.com/24 - - Except deny one particular IP address from using it at all: - - deny-access ident.privoxy.com - - You can also specify an explicit network address and subnet mask. - Explicit addresses do not have to be resolved to be used. - - permit-access 207.153.200.0/24 - - A subnet mask of 0 matches anything, so the next line permits - everyone. - - permit-access 0.0.0.0/0 - - Note, you cannot say: - - permit-access .org - - to allow all *.org domains. Every IP address listed must resolve - fully. - - An ISP may want to provide a Privoxy that is accessible by "the world" - and yet restrict use of some of their private content to hosts on its - internal network (i.e. its own subscribers). Say, for instance the ISP - owns the Class-B IP address block 123.124.0.0 (a 16 bit netmask). This - is how they could do it: - - permit-access 0.0.0.0/0 0.0.0.0/0 # other clients can go anywhere - # with the following exceptions - : - - deny-access 0.0.0.0/0 123.124.0.0/16 # block all external request - s for - # sites on the ISP's network - permit 0.0.0.0/0 www.my_isp.com # except for the ISP's main - # web site - permit 123.124.0.0/16 0.0.0.0/0 # the ISP's clients can go - # anywhere - - Note that if some hostnames are listed with multiple IP addresses, the - primary value returned by DNS (via gethostbyname()) is used. Default: - Anyone can access the proxy. - _________________________________________________________________ - -3.3.4. Forwarding - - This feature allows chaining of HTTP requests via multiple proxies. It - can be used to better protect privacy and confidentiality when - accessing specific domains by routing requests to those domains to a - special purpose filtering proxy such as lpwa.com. Or to use a caching - proxy to speed up browsing. - - It can also be used in an environment with multiple networks to route - requests via multiple gateways allowing transparent access to multiple - networks without having to modify browser configurations. - - Also specified here are SOCKS proxies. Privoxy SOCKS 4 and SOCKS 4A. - The difference is that SOCKS 4A will resolve the target hostname using - DNS on the SOCKS server, not our local DNS client. - - The syntax of each line is: - - forward target_domain[:port] http_proxy_host[:port] - forward-socks4 target_domain[:port] socks_proxy_host[:port] - http_proxy_host[:port] - forward-socks4a target_domain[:port] socks_proxy_host[:port] - http_proxy_host[:port] - - If http_proxy_host is ".", then requests are not forwarded to a HTTP - proxy but are made directly to the web servers. - - Lines are checked in sequence, and the last match wins. - - There is an implicit line equivalent to the following, which specifies - that anything not finding a match on the list is to go out without - forwarding or gateway protocol, like so: - - forward .* . # implicit - - In the following common configuration, everything goes to Lucent's - LPWA, except SSL on port 443 (which it doesn't handle): - - forward .* lpwa.com:8000 - forward :443 . - - Some users have reported difficulties related to LPWA's use of "." as - the last element of the domain, and have said that this can be fixed - with this: - - forward lpwa. lpwa.com:8000 - - (NOTE: the syntax for specifying target_domain has changed since the - previous paragraph was written -- it will not work now. More - information is welcome.) - - In this fictitious example, everything goes via an ISP's caching - proxy, except requests to that ISP: - - forward .* caching.myisp.net:8000 - forward myisp.net . - - For the @home network, we're told the forwarding configuration is - this: - - forward .* proxy:8080 - - Also, we're told they insist on getting cookies and JavaScript, so you - should allow cookies from home.com. We consider JavaScript a potential - security risk. Java need not be enabled. - - In this example direct connections are made to all "internal" domains, - but everything else goes through Lucent's LPWA by way of the company's - SOCKS gateway to the Internet. - - forward-socks4 .* lpwa.com:8000 firewall.my_company.com:1080 - forward my_company.com . - - This is how you could set up a site that always uses SOCKS but no - forwarders: - - forward-socks4a .* . firewall.my_company.com:1080 - - An advanced example for network administrators: - - If you have links to multiple ISPs that provide various special - content to their subscribers, you can configure forwarding to pass - requests to the specific host that's connected to that ISP so that - everybody can see all of the content on all of the ISPs. - - This is a bit tricky, but here's an example: - - host-a has a PPP connection to isp-a.com. And host-b has a PPP - connection to isp-b.com. host-a can run a Privoxy proxy with - forwarding like this: - - forward .* . - forward isp-b.com host-b:8118 - - host-b can run a Privoxy proxy with forwarding like this: - - forward .* . - forward isp-a.com host-a:8118 - - Now, anyone on the Internet (including users on host-a and host-b) can - set their browser's proxy to either host-a or host-b and be able to - browse the content on isp-a or isp-b. - - Here's another practical example, for University of Kent at Canterbury - students with a network connection in their room, who need to use the - University's Squid web cache. - - forward *. ssbcache.ukc.ac.uk:3128 # Use the proxy, except for: - forward .ukc.ac.uk . # Anything on the same domain as us - forward * . # Host with no domain specified - forward 129.12.*.* . # A dotted IP on our /16 network. - forward 127.*.*.* . # Loopback address - forward localhost.localdomain . # Loopback address - forward www.ukc.mirror.ac.uk . # Specific host - - If you intend to chain Privoxy and squid locally, then chain as - browser -> squid -> privoxy is the recommended way. - - Your squid configuration could then look like this: - - # Define Privoxy as parent cache - - cache_peer 127.0.0.1 parent 8118 0 no-query - - # Define ACL for protocol FTP - acl FTP proto FTP - # Do not forward ACL FTP to privoxy - always_direct allow FTP - # Do not forward ACL CONNECT (https) to privoxy - always_direct allow CONNECT - # Forward the rest to privoxy - never_direct allow all - _________________________________________________________________ - -3.3.5. Windows GUI Options - - Privoxy has a number of options specific to the Windows GUI interface: - - If "activity-animation" is set to 1, the Privoxy icon will animate - when "Privoxy" is active. To turn off, set to 0. - - activity-animation 1 - - If "log-messages" is set to 1, Privoxy will log messages to the - console window: - - log-messages 1 - - If "log-buffer-size" is set to 1, the size of the log buffer, i.e. the - amount of memory used for the log messages displayed in the console - window, will be limited to "log-max-lines" (see below). - - Warning: Setting this to 0 will result in the buffer to grow - infinitely and eat up all your memory! - - log-buffer-size 1 - - log-max-lines is the maximum number of lines held in the log buffer. - See above. - - log-max-lines 200 - - If "log-highlight-messages" is set to 1, Privoxy will highlight - portions of the log messages with a bold-faced font: - - log-highlight-messages 1 - - The font used in the console window: - - log-font-name Comic Sans MS - - Font size used in the console window: - - log-font-size 8 - - "show-on-task-bar" controls whether or not Privoxy will appear as a - button on the Task bar when minimized: - - show-on-task-bar 0 - - If "close-button-minimizes" is set to 1, the Windows close button will - minimize Privoxy instead of closing the program (close with the exit - option on the File menu). - - close-button-minimizes 1 - - The "hide-console" option is specific to the MS-Win console version of - Privoxy. If this option is used, Privoxy will disconnect from and hide - the command console. - - #hide-console - _________________________________________________________________ - -3.4. The Actions File - - The "default.action" file (formerly actionsfile or ijb.action) is used - to define what actions Privoxy takes, and thus determines how images, - cookies and various other aspects of HTTP content and transactions are - handled. Images can be anything you want, including ads, banners, or - just some obnoxious URL that you would rather not see. Cookies can be - accepted or rejected, or accepted only during the current browser - session (i.e. not written to disk). Changes to default.action should - be immediately visible to Privoxy without the need to restart. - - The easiest way to edit "actions" file is with a browser by loading - [48]http://p.p/, and then select "Edit Actions List". A text editor - can also be used. - - To determine which actions apply to a request, the URL of the request - is compared to all patterns in this file. Every time it matches, the - list of applicable actions for the URL is incrementally updated. You - can trace this process by visiting [49]http://p.p/show-url-info. - - There are four types of lines in this file: comments (begin with a "#" - character), actions, aliases and patterns, all of which are explained - below, as well as the configuration file syntax that Privoxy - understands. - _________________________________________________________________ - -3.4.1. URL Domain and Path Syntax - - Generally, a pattern has the form /, where both the - and part are optional. If you only specify a domain - part, the "/" can be left out: - - www.example.com - is a domain only pattern and will match any request - to "www.example.com". - - www.example.com/ - means exactly the same. - - www.example.com/index.html - matches only the single document - "/index.html" on "www.example.com". - - /index.html - matches the document "/index.html", regardless of the - domain. - - index.html - matches nothing, since it would be interpreted as a - domain name and there is no top-level domain called ".html". - - The matching of the domain part offers some flexible options: if the - domain starts or ends with a dot, it becomes unanchored at that end. - For example: - - .example.com - matches any domain that ENDS in ".example.com". - - www. - matches any domain that STARTS with "www". - - Additionally, there are wild-cards that you can use in the domain - names themselves. They work pretty similar to shell wild-cards: "*" - stands for zero or more arbitrary characters, "?" stands for any - single character. And you can define character classes in square - brackets and they can be freely mixed: - - ad*.example.com - matches "adserver.example.com", "ads.example.com", - etc but not "sfads.example.com". - - *ad*.example.com - matches all of the above, and then some. - - .?pix.com - matches "www.ipix.com", "pictures.epix.com", - "a.b.c.d.e.upix.com", etc. - - www[1-9a-ez].example.com - matches "www1.example.com", - "www4.example.com", "wwwd.example.com", "wwwz.example.com", etc., but - not "wwww.example.com". - - If Privoxy was compiled with "pcre" support (default), Perl compatible - regular expressions can be used. See the pcre/docs/ directory or "man - perlre" (also available on - [50]http://www.perldoc.com/perl5.6/pod/perlre.html) for details. A - brief discussion of regular expressions is in the [51]Appendix. For - instance: - - /.*/advert[0-9]+\.jpe?g - would match a URL from any domain, with any - path that includes "advert" followed immediately by one or more - digits, then a "." and ending in either "jpeg" or "jpg". So we match - "example.com/ads/advert2.jpg", and - "www.example.com/ads/banners/advert39.jpeg", but not - "www.example.com/ads/banners/advert39.gif" (no gifs in the example - pattern). - - Please note that matching in the path is case INSENSITIVE by default, - but you can switch to case sensitive at any point in the pattern by - using the "(?-i)" switch: - - www.example.com/(?-i)PaTtErN.* - will match only documents whose path - starts with "PaTtErN" in exactly this capitalization. - _________________________________________________________________ - -3.4.2. Actions - - Actions are enabled if preceded with a "+", and disabled if preceded - with a "-". Actions are invoked by enclosing the action name in curly - braces (e.g. {+some_action}), followed by a list of URLs to which the - action applies. There are three classes of actions: - - * Boolean (e.g. "+/-block"): - {+name} # enable this action - {-name} # disable this action - - * parameterized (e.g. "+/-hide-user-agent"): - {+name{param}} # enable action and set parameter to "param" - {-name} # disable action - - * Multi-value (e.g. "{+/-add-header{Name: value}}", - "{+/-wafer{name=value}}"): - {+name{param}} # enable action and add parameter "param" - {-name{param}} # remove the parameter "param" - {-name} # disable this action totally - - If nothing is specified in this file, no "actions" are taken. So in - this case Privoxy would just be a normal, non-blocking, - non-anonymizing proxy. You must specifically enable the privacy and - blocking features you need (although the provided default - default.action file will give a good starting point). - - Later defined actions always over-ride earlier ones. For multi-valued - actions, the actions are applied in the order they are specified. - - The list of valid Privoxy "actions" are: - - * Add the specified HTTP header, which is not checked for validity. - You may specify this many times to specify many different headers: - +add-header{Name: value} - - * Block this URL totally. In a default installation, a "blocked" URL - will result in bright red banner that says "BLOCKED", with a - reason why it is being blocked. - +block - - * De-animate all animated GIF images, i.e. reduce them to their last - frame. This will also shrink the images considerably (in bytes, - not pixels!). If the option "first" is given, the first frame of - the animation is used as the replacement. If "last" is given, the - last frame of the animation is used instead, which probably makes - more sense for most banner animations, but also has the risk of - not showing the entire last frame (if it is only a delta to an - earlier frame). - +deanimate-gifs{last} - +deanimate-gifs{first} - - * "+downgrade" will downgrade HTTP/1.1 client requests to HTTP/1.0 - and downgrade the responses as well. Use this action for servers - that use HTTP/1.1 protocol features that Privoxy doesn't handle - well yet. HTTP/1.1 is only partially implemented. Default is not - to downgrade requests. - +downgrade - - * Many sites, like yahoo.com, don't just link to other sites. - Instead, they will link to some script on their own server, giving - the destination as a parameter, which will then redirect you to - the final target. URLs resulting from this scheme typically look - like: http://some.place/some_script?http://some.where-else. - Sometimes, there are even multiple consecutive redirects encoded - in the URL. These redirections via scripts make your web browsing - more traceable, since the server from which you follow such a link - can see where you go to. Apart from that, valuable bandwidth and - time is wasted, while your browser ask the server for one redirect - after the other. Plus, it feeds the advertisers. - The "+fast-redirects" option enables interception of these - requests by Privoxy, who will cut off all but the last valid URL - in the request and send a local redirect back to your browser - without contacting the remote site. - +fast-redirects - - * Apply the filters in the section_header section of the - default.filter file to the site(s). default.filter sections are - grouped according to like functionality. - +filter{section_header} - - Filter sections that are pre-defined in the supplied - default.filter include: - - html-annoyances: Get rid of particularly annoying HTML abuse. - - js-annoyances: Get rid of particularly annoying JavaScript abuse - - no-poups: Kill all popups in JS and HTML - - frameset-borders: Give frames a border - - webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking) - - no-refresh: Automatic refresh sucks on auto-dialup lines - - fun: Text replacements for subversive browsing fun! - - nimda: Remove (virus) Nimda code. - - banners-by-size: Kill banners by size - - crude-parental: Kill all web pages that contain the words "sex" or - "warez" - - * Block any existing X-Forwarded-for header, and do not add a new - one: - +hide-forwarded - - * If the browser sends a "From:" header containing your e-mail - address, this either completely removes the header ("block"), or - changes it to the specified e-mail address. - +hide-from{block} - +hide-from{spam@sittingduck.xqq} - - * Don't send the "Referer:" (sic) header to the web site. You can - block it, forge a URL to the same server as the request (which is - preferred because some sites will not send images otherwise) or - set it to a constant string of your choice. - +hide-referer{block} - +hide-referer{forge} - +hide-referer{http://nowhere.com} - - * Alternative spelling of "+hide-referer". It has the same - parameters, and can be freely mixed with, "+hide-referer". - ("referrer" is the correct English spelling, however the HTTP - specification has a bug - it requires it to be spelled "referer".) - +hide-referrer{...} - - * Change the "User-Agent:" header so web servers can't tell your - browser type. Warning! This breaks many web sites. Specify the - user-agent value you want. Example, pretend to be using Netscape - on Linux: - +hide-user-agent{Mozilla (X11; I; Linux 2.0.32 i586)} - - * Treat this URL as an image. This only matters if it's also - "+block"ed, in which case a "blocked" image can be sent rather - than a HTML page. See "+image-blocker{}" below for the control - over what is actually sent. If you want invisible ads, they should - be defined as images and blocked. And also, "image-blocker" should - be set to "blank". - +image - - * Decides what to do with URLs that end up tagged with "{+block - +image}", e.g an advertizement. There are five options. - "-image-blocker" will send a HTML "blocked" page, usually - resulting in a "broken image" icon. "+image-blocker{blank}" will - send a 1x1 transparent GIF image. And finally, - "+image-blocker{http://xyz.com}" will send a HTTP temporary - redirect to the specified image. This has the advantage of the - icon being being cached by the browser, which will speed up the - display. "+image-blocker{pattern}" will send a checkboard type - pattern - +image-blocker{blank} - +image-blocker{pattern} - +image-blocker{http://p.p/send-banner} - - * By default (i.e. in the absence of a "+limit-connect" action), - Privoxy will only allow CONNECT requests to port 443, which is the - standard port for https as a precaution. - The CONNECT methods exists in HTTP to allow access to secure - websites (https:// URLs) through proxies. It works very simply: - the proxy connects to the server on the specified port, and then - short-circuits its connections to the client and to the remote - proxy. This can be a big security hole, since CONNECT-enabled - proxies can be abused as TCP relays very easily. - If you want to allow CONNECT for more ports than this, or want to - forbid CONNECT altogether, you can specify a comma separated list - of ports and port ranges (the latter using dashes, with the - minimum defaulting to 0 and max to 65K): - +limit-connect{443} # This is the default and need no be - specified. - +limit-connect{80,443} # Ports 80 and 443 are OK. - +limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to - 100 - #and above 500 are OK. - - * "+no-compression" prevents the website from compressing the data. - Some websites do this, which can be a problem for Privoxy, since - "+filter", "+no-popup" and "+gif-deanimate" will not work on - compressed data. This will slow down connections to those - websites, though. Default is "nocompression" is turned on. - +nocompression - - * If the website sets cookies, "no-cookies-keep" will make sure they - are erased when you exit and restart your web browser. This makes - profiling cookies useless, but won't break sites which require - cookies so that you can log in for transactions. Default: on. - +no-cookies-keep - - * Prevent the website from reading cookies: - +no-cookies-read - - * Prevent the website from setting cookies: - +no-cookies-set - - * Filter the website through a built-in filter to disable those - obnoxious JavaScript pop-up windows via window.open(), etc. The - two alternative spellings are equivalent. - +no-popup - +no-popups - - * This action only applies if you are using a jarfile for saving - cookies. It sends a cookie to every site stating that you do not - accept any copyright on cookies sent to you, and asking them not - to track you. Of course, this is a (relatively) unique header they - could use to track you. - +vanilla-wafer - - * This allows you to add an arbitrary cookie. It can be specified - multiple times in order to add as many cookies as you like. - +wafer{name=value} - - The meaning of any of the above is reversed by preceding the action - with a "-", in place of the "+". - - Some examples: - - Turn off cookies by default, then allow a few through for specified - sites: - - # Turn off all persistent cookies - { +no-cookies-read } - { +no-cookies-set } - # Allow cookies for this browser session ONLY - { +no-cookies-keep } - # Exceptions to the above, sites that benefit from persistent cookies - { -no-cookies-read } - { -no-cookies-set } - { -no-cookies-keep } - .javasoft.com - .sun.com - .yahoo.com - .msdn.microsoft.com - .redhat.com - # Alternative way of saying the same thing - {-no-cookies-set -no-cookies-read -no-cookies-keep} - .sourceforge.net - .sf.net - - Now turn off "fast redirects", and then we allow two exceptions: - - # Turn them off! - {+fast-redirects} - - # Reverse it for these two sites, which don't work right without it. - {-fast-redirects} - www.ukc.ac.uk/cgi-bin/wac\.cgi\? - login.yahoo.com - - Turn on page filtering according to rules in the defined sections of - refilterfile, and make one exception for sourceforge: - - # Run everything through the filter file, using only the - # specified sections: - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\ - +filter{webbugs} +filter{nimda} +filter{banners-by-size} - - # Then disable filtering of code from sourceforge! - {-filter} - .cvs.sourceforge.net - - Now some URLs that we want "blocked", ie we won't see them. Many of - these use regular expressions that will expand to match multiple URLs: - - # Blocklist: - {+block} - /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g)) - /.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/]) - /.*/(ng)?adclient\.cgi - /.*/(plain|live|rotate)[-_.]?ads?/ - /.*/(sponsor)s?[0-9]?/ - /.*/_?(plain|live)?ads?(-banners)?/ - /.*/abanners/ - /.*/ad(sdna_image|gifs?)/ - /.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe) - /.*/adbanners/ - /.*/adserver - /.*/adstream\.cgi - /.*/adv((er)?ts?|ertis(ing|ements?))?/ - /.*/banner_?ads/ - /.*/banners?/ - /.*/banners?\.cgi/ - /.*/cgi-bin/centralad/getimage - /.*/images/addver\.gif - /.*/images/marketing/.*\.(gif|jpe?g) - /.*/popupads/ - /.*/siteads/ - /.*/sponsor.*\.gif - /.*/sponsors?[0-9]?/ - /.*/advert[0-9]+\.jpg - /Media/Images/Adds/ - /ad_images/ - /adimages/ - /.*/ads/ - /bannerfarm/ - /grafikk/annonse/ - /graphics/defaultAd/ - /image\.ng/AdType - /image\.ng/transactionID - /images/.*/.*_anim\.gif # alvin brattli - /ip_img/.*\.(gif|jpe?g) - /rotateads/ - /rotations/ - /worldnet/ad\.cgi - /cgi-bin/nph-adclick.exe/ - /.*/Image/BannerAdvertising/ - /.*/ad-bin/ - /.*/adlib/server\.cgi - /autoads/ - - Note that many of these actions have the potential to cause a page to - misbehave, possibly even not to display at all. There are many ways a - site designer may choose to design his site, and what HTTP header - content he may depend on. There is no way to have hard and fast rules - for all sites. See the [52]Appendix for a brief example on - troubleshooting actions. - _________________________________________________________________ - -3.4.3. Aliases - - Custom "actions", known to Privoxy as "aliases", can be defined by - combining other "actions". These can in turn be invoked just like the - built-in "actions". Currently, an alias can contain any character - except space, tab, "=", "{" or "}". But please use only "a"- "z", - "0"-"9", "+", and "-". Alias names are not case sensitive, and must be - defined before anything else in the default.actionfile ! And there can - only be one set of "aliases" defined. - - Now let's define a few aliases: - - # Useful customer aliases we can use later. These must come first! - {{alias}} - +no-cookies = +no-cookies-set +no-cookies-read - -no-cookies = -no-cookies-set -no-cookies-read - fragile = -block -no-cookies -filter -fast-redirects -hide-refere - r -no-popups - shop = -no-cookies -filter -fast-redirects - +imageblock = +block +image - #For people who don't like to type too much: ;-) - c0 = +no-cookies - c1 = -no-cookies - c2 = -no-cookies-set +no-cookies-read - c3 = +no-cookies-set -no-cookies-read - #... etc. Customize to your heart's content. - - Some examples using our "shop" and "fragile" aliases from above: - - # These sites are very complex and require - # minimal interference. - {fragile} - .office.microsoft.com - .windowsupdate.microsoft.com - .nytimes.com - # Shopping sites - still want to block ads. - {shop} - .quietpc.com - .worldpay.com # for quietpc.com - .jungle.com - .scan.co.uk - # These shops require pop-ups - {shop -no-popups} - .dabs.com - .overclockers.co.uk - _________________________________________________________________ - -3.5. The Filter File - - Any web page can be dynamically modified with the filter file. This - modification can be removal, or re-writing, of any web page content, - including tags and non-visible content. The default filter file is - default.filter, located in the config directory. - - The included example file is divided into sections. Each section - begins with the FILTER keyword, followed by the identifier for that - section, e.g. "FILTER: webbugs". Each section performs a similar type - of filtering, such as "html-annoyances". - - This file uses regular expressions to alter or remove any string in - the target page. The expressions can only operate on one line at a - time. Some examples from the included default default.filter: - - Stop web pages from displaying annoying messages in the status bar by - deleting such references: - - FILTER: html-annoyances - # New browser windows should be resizeable and have a location and st - atus - # bar. Make it so. - # - s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig - s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig - s/scrolling="?(no|0|Auto)"?/scrolling=1/ig - s/menubar="?(no|0)"?/menubar=1/ig - # The tag was a crime! - # - s*|**ig - # Is this evil? - # - #s/framespacing="?(no|0)"?//ig - #s/margin(height|width)=[0-9]*//gi - - Just for kicks, replace any occurrence of "Microsoft" with - "MicroSuck", and have a little fun with topical buzzwords: - - FILTER: fun - s/microsoft(?!.com)/MicroSuck/ig - # Buzzword Bingo: - # - s/industry-leading|cutting-edge|award-winning/BING - O!/ig - - Kill those pesky little web-bugs: - - # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking) - FILTER: webbugs - s/]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\ - s*['"]?1(\D[^>]*?)?>//sig - _________________________________________________________________ - -3.6. Templates - - When Privoxy displays one of its internal pages, such as a 404 Not - Found error page, it uses the appropriate template. On Linux, BSD, and - Unix, these are located in /etc/privoxy/templates by default. These - may be customized, if desired. - _________________________________________________________________ - -4. Quickstart to Using Privoxy - - Install package, then run and enjoy! Privoxy is typically started by - specifying the main configuration file to be used on the command line. - Example Unix startup command: - - - # /usr/sbin/privoxy /etc/privoxy/config - - - An init script is provided for SuSE and Redhat. - - For for SuSE: /etc/rc.d/privoxy start - - For RedHat: /etc/rc.d/init.d/privoxy start - - If no configuration file is specified on the command line, Privoxy - will look for a file named config in the current directory. Except on - Win32 where it will try config.txt. If no file is specified on the - command line and no default configuration file can be found, Privoxy - will fail to start. - - Be sure your browser is set to use the proxy which is by default at - localhost, port 8118. With Netscape (and Mozilla), this can be set - under Edit -> Preferences -> Advanced -> Proxies -> HTTP Proxy. For - Internet Explorer: Tools > Internet Properties -> Connections -> LAN - Setting. Then, check "Use Proxy" and fill in the appropriate info - (Address: localhost, Port: 8118). Include if HTTPS proxy support too. - - The included default configuration files should give a reasonable - starting point, though may be somewhat aggressive in blocking junk. - You will probably want to keep an eye out for sites that require - persistent cookies, and add these to default.action as needed. By - default, most of these will be accepted only during the current - browser session, until you add them to the configuration. If you want - the browser to handle this instead, you will need to edit - default.action and disable this feature. If you use more than one - browser, it would make more sense to let Privoxy handle this. In which - case, the browser(s) should be set to accept all cookies. - - If a particular site shows problems loading properly, try adding it to - the {fragile} section of default.action. This will turn off most - actions for this site. - - Privoxy is HTTP/1.1 compliant, but not all 1.1 features are as yet - implemented. If browsers that support HTTP/1.1 (like Mozilla or recent - versions of I.E.) experience problems, you might try to force HTTP/1.0 - compatibility. For Mozilla, look under Edit -> Preferences -> Debug -> - Networking. Or set the "+downgrade" config option in default.action. - - After running Privoxy for a while, you can start to fine tune the - configuration to suit your personal, or site, preferences and - requirements. There are many, many aspects that can be customized. - "Actions" (as specified in default.action) can be adjusted by pointing - your browser to [53]http://p.p/, and then follow the link to "edit the - actions list". (This is an internal page and does not require Internet - access.) - - In fact, various aspects of Privoxy configuration can be viewed from - this page, including current configuration parameters, source code - version numbers, the browser's request headers, and "actions" that - apply to a given URL. In addition to the default.action file editor - mentioned above, Privoxy can also be turned "on" and "off" from this - page. - - If you encounter problems, please verify it is a Privoxy bug, by - disabling Privoxy, and then trying the same page. Also, try another - browser if possible to eliminate browser or site problems. Before - reporting it as a bug, see if there is not a configuration option that - is enabled that is causing the page not to load. You can then add an - exception for that page or site. If a bug, please report it to the - developers (see below). - _________________________________________________________________ - -4.1. Command Line Options - - Privoxy may be invoked with the following command-line options: - - * --version - Print version info and exit, Unix only. - * --help - Print a short usage info and exit, Unix only. - * --no-daemon - Don't become a daemon, i.e. don't fork and become process group - leader, don't detach from controlling tty. Unix only. - * --pidfile FILE - On startup, write the process ID to FILE. Delete the FILE on exit. - Failiure to create or delete the FILE is non-fatal. If no FILE - option is given, no PID file will be used. Unix only. - * --user USER[.GROUP] - After (optionally) writing the PID file, assume the user ID of - USER, and if included the GID of GROUP. Exit if the privileges are - not sufficient to do so. Unix only. - * configfile - If no configfile is included on the command line, Privoxy will - look for a file named "config" in the current directory (except on - Win32 where it will look for "config.txt" instead). Specify full - path to avoid confusion. - _________________________________________________________________ - -5. Contacting the Developers, Bug Reporting and Feature Requests - - We value your feedback. However, to provide you with the best support, - please note: - - * Use the [54]Sourceforge support forum to get help. - * Submit bugs only thru our [55]Sourceforge bug forum. Make sure - that the bug has not already been submitted. Please try to verify - that it is a Privoxy bug, and not a browser or site bug first. If - you are using your own custom configuration, please try the stock - configs to see if the problem is a configuration related bug. And - if not using the latest development snapshot, please try the - latest one. Or even better, CVS sources. - * Submit feature requests only thru our [56]Sourceforge feature - request forum. - - For any other issues, feel free to use the [57]mailing lists. - - Anyone interested in actively participating in development and related - discussions can join the appropriate mailing list [58]here. Archives - are available here too. - _________________________________________________________________ - -6. Copyright and History - -6.1. License - - Privoxy 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, which is available from - [59]the Free Software Foundation, Inc, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - _________________________________________________________________ - -6.2. History - - Privoxy is derived from the Internet Junkbuster, with many improvments - and enhancements over the original. - - Junkbuster was originally written by Anonymous Coders and - [60]Junkbuster's Corporation, and was released as free open-source - software under the GNU GPL. [61]Stefan Waldherr made many - improvements, and started the [62]SourceForge project Privoxy to - rekindle development. There are now several active developers - contributing. The last stable release of Junkbuster was v2.0.2, which - has now grown whiskers ;-). - _________________________________________________________________ - -7. See also - - [63]http://sourceforge.net/projects/ijbswa - - [64]http://www.privoxy.org/ - - [65]http://p.p/ - - [66]http://www.junkbusters.com/ht/en/cookies.html - - [67]http://www.waldherr.org/junkbuster/ - - [68]http://privacy.net/analyze/ - - [69]http://www.squid-cache.org/ - _________________________________________________________________ - -8. Appendix - -8.1. Regular Expressions - - Privoxy can use "regular expressions" in various config files. - Assuming support for "pcre" (Perl Compatible Regular Expressions) is - compiled in, which is the default. Such configuration directives do - not require regular expressions, but they can be used to increase - flexibility by matching a pattern with wild-cards against URLs. - - If you are reading this, you probably don't understand what "regular - expressions" are, or what they can do. So this will be a very brief - introduction only. A full explanation would require a book ;-) - - "Regular expressions" is a way of matching one character expression - against another to see if it matches or not. One of the "expressions" - is a literal string of readable characters (letter, numbers, etc), and - the other is a complex string of literal characters combined with - wild-cards, and other special characters, called meta-characters. The - "meta-characters" have special meanings and are used to build the - complex pattern to be matched against. Perl Compatible Regular - Expressions is an enhanced form of the regular expression language - with backward compatibility. - - To make a simple analogy, we do something similar when we use - wild-card characters when listing files with the dir command in DOS. - *.* matches all filenames. The "special" character here is the - asterisk which matches any and all characters. We can be more specific - and use ? to match just individual characters. So "dir file?.text" - would match "file1.txt", "file2.txt", etc. We are pattern matching, - using a similar technique to "regular expressions"! - - Regular expressions do essentially the same thing, but are much, much - more powerful. There are many more "special characters" and ways of - building complex patterns however. Let's look at a few of the common - ones, and then some examples: - - . - Matches any single character, e.g. "a", "A", "4", ":", or "@". - - ? - The preceding character or expression is matched ZERO or ONE - times. Either/or. - - + - The preceding character or expression is matched ONE or MORE - times. - - * - The preceding character or expression is matched ZERO or MORE - times. - - \ - The "escape" character denotes that the following character should - be taken literally. This is used where one of the special characters - (e.g. ".") needs to be taken literally and not as a special - meta-character. - - [] - Characters enclosed in brackets will be matched if any of the - enclosed characters are encountered. - - () - parentheses are used to group a sub-expression, or multiple - sub-expressions. - - | - The "bar" character works like an "or" conditional statement. A - match is successful if the sub-expression on either side of "|" - matches. - - s/string1/string2/g - This is used to rewrite strings of text. - "string1" is replaced by "string2" in this example. - - These are just some of the ones you are likely to use when matching - URLs with Privoxy, and is a long way from a definitive list. This is - enough to get us started with a few simple examples which may be more - illuminating: - - /.*/banners/.* - A simple example that uses the common combination of - "." and "*" to denote any character, zero or more times. In other - words, any string at all. So we start with a literal forward slash, - then our regular expression pattern (".*") another literal forward - slash, the string "banners", another forward slash, and lastly another - ".*". We are building a directory path here. This will match any file - with the path that has a directory named "banners" in it. The ".*" - matches any characters, and this could conceivably be more forward - slashes, so it might expand into a much longer looking path. For - example, this could match: - "/eye/hate/spammers/banners/annoy_me_please.gif", or just - "/banners/annoying.html", or almost an infinite number of other - possible combinations, just so it has "banners" in the path somewhere. - - A now something a little more complex: - - /.*/adv((er)?ts?|ertis(ing|ements?))?/ - We have several literal - forward slashes again ("/"), so we are building another expression - that is a file path statement. We have another ".*", so we are - matching against any conceivable sub-path, just so it matches our - expression. The only true literal that must match our pattern is adv, - together with the forward slashes. What comes after the "adv" string - is the interesting part. - - Remember the "?" means the preceding expression (either a literal - character or anything grouped with "(...)" in this case) can exist or - not, since this means either zero or one match. So - "((er)?ts?|ertis(ing|ements?))" is optional, as are the individual - sub-expressions: "(er)", "(ing|ements?)", and the "s". The "|" means - "or". We have two of those. For instance, "(ing|ements?)", can expand - to match either "ing" OR "ements?". What is being done here, is an - attempt at matching as many variations of "advertisement", and - similar, as possible. So this would expand to match just "adv", or - "advert", or "adverts", or "advertising", or "advertisement", or - "advertisements". You get the idea. But it would not match - "advertizements" (with a "z"). We could fix that by changing our - regular expression to: "/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/", - which would then match either spelling. - - /.*/advert[0-9]+\.(gif|jpe?g) - Again another path statement with - forward slashes. Anything in the square brackets "[]" can be matched. - This is using "0-9" as a shorthand expression to mean any digit one - through nine. It is the same as saying "0123456789". So any digit - matches. The "+" means one or more of the preceding expression must be - included. The preceding expression here is what is in the square - brackets -- in this case, any digit one through nine. Then, at the - end, we have a grouping: "(gif|jpe?g)". This includes a "|", so this - needs to match the expression on either side of that bar character - also. A simple "gif" on one side, and the other side will in turn - match either "jpeg" or "jpg", since the "?" means the letter "e" is - optional and can be matched once or not at all. So we are building an - expression here to match image GIF or JPEG type image file. It must - include the literal string "advert", then one or more digits, and a - "." (which is now a literal, and not a special character, since it is - escaped with "\"), and lastly either "gif", or "jpeg", or "jpg". Some - possible matches would include: "//advert1.jpg", - "/nasty/ads/advert1234.gif", "/banners/from/hell/advert99.jpg". It - would not match "advert1.gif" (no leading slash), or "/adverts232.jpg" - (the expression does not include an "s"), or "/advert1.jsp" ("jsp" is - not in the expression anywhere). - - s/microsoft(?!.com)/MicroSuck/i - This is a substitution. "MicroSuck" - will replace any occurrence of "microsoft". The "i" at the end of the - expression means ignore case. The "(?!.com)" means the match should - fail if "microsoft" is followed by ".com". In other words, this acts - like a "NOT" modifier. In case this is a hyperlink, we don't want to - break it ;-). - - We are barely scratching the surface of regular expressions here so - that you can understand the default Privoxy configuration files, and - maybe use this knowledge to customize your own installation. There is - much, much more that can be done with regular expressions. Now that - you know enough to get started, you can learn more on your own :/ - - More reading on Perl Compatible Regular expressions: - [70]http://www.perldoc.com/perl5.6/pod/perlre.html - _________________________________________________________________ - -8.2. Privoxy's Internal Pages - - Since Privoxy proxies each requested web page, it is easy for Privoxy - to trap certain URLs. In this way, we can talk directly to Privoxy, - and see how it is configured, see how our rules are being applied, - change these rules and other configuration options, and even turn - Privoxy's filtering off, all with a web browser. - - The URLs listed below are the special ones that allow direct access to - Privoxy. Of course, Privoxy must be running to access these. If not, - you will get a friendly error message. Internet access is not - necessary either. - - * Privoxy main page: - - [71]http://www.privoxy.org/config/ - Alternately, this may be reached at [72]http://p.p/, but this - variation may not work as reliably as the above in some - configurations. - * Show information about the current configuration: - - [73]http://www.privoxy.org/config/show-status - * Show the source code version numbers: - - [74]http://www.privoxy.org/config/show-version - * Show the client's request headers: - - [75]http://www.privoxy.org/config/show-request - * Show which actions apply to a URL and why: - - [76]http://www.privoxy.org/config/show-url-info - * Toggle Privoxy on or off: - - [77]http://www.privoxy.org/config/toggle - Short cuts. Turn off, then on: - - [78]http://www.privoxy.org/config/toggle?set=disable - - [79]http://www.privoxy.org/config/toggle?set=enable - * Edit the actions list file: - - [80]http://www.privoxy.org/config/edit-actions - - These may be bookmarked for quick reference. - _________________________________________________________________ - -8.3. Anatomy of an Action - - The way Privoxy applies "actions" to any given URL can be complex, and - not always so easy to understand what is happening. And sometimes we - need to be able to see just what Privoxy is doing. Especially, if - something Privoxy is doing is causing us a problem inadvertantly. It - can be a little daunting to look at the actions files themselves, - since they tend to be filled with "regular expressions" whose - consequences are not always so obvious. Privoxy provides the - [81]http://www.privoxy.org/config/show-url-info page that can show us - very specifically how actions are being applied to any given URL. This - is a big help for troubleshooting. - - First, enter one URL (or partial URL) at the prompt, and then Privoxy - will tell us how the current configuration will handle it. This will - not help with filtering effects from the default.filter file! It also - will not tell you about any other URLs that may be embedded within the - URL you are testing. For instance, images such as ads are expressed as - URLs within the raw page source of HTML pages. So you will only get - info for the actual URL that is pasted into the prompt area -- not any - sub-URLs. If you want to know about embedded URLs like ads, you will - have to dig those out of the HTML source. Use your browser's "View - Page Source" option for this. - - Let's look at an example, [82]google.com, one section at a time: - - System default actions: - - { -add-header -block -deanimate-gifs -downgrade -fast-redirects -filter - -hide-forwarded -hide-from -hide-referer -hide-user-agent -image - -image-blocker -limit-connect -no-compression -no-cookies-keep - -no-cookies-read -no-cookies-set -no-popups -vanilla-wafer -wafer } - - - This is the top section, and only tells us of the compiled in - defaults. This is basically what Privoxy would do if there were not - any "actions" defined, i.e. it does nothing. Every action is disabled. - This is not particularly informative for our purposes here. OK, next - section: - - Matches for http://google.com: - - { -add-header -block +deanimate-gifs -downgrade +fast-redirects - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} - +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} - +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} - -hide-user-agent -image +image-blocker{blank} +no-compression - +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups - -vanilla-wafer -wafer } - / - - { -no-cookies-keep -no-cookies-read -no-cookies-set } - .google.com - - { -fast-redirects } - .google.com - - - This is much more informative, and tells us how we have defined our - "actions", and which ones match for our example, "google.com". The - first grouping shows our default settings, which would apply to all - URLs. If you look at your "actions" file, this would be the section - just below the "aliases" section near the top. This applies to all - URLs as signified by the single forward slash -- "/". - - These are the default actions we have enabled. But we can define - additional actions that would be exceptions to these general rules, - and then list specific URLs that these exceptions would apply to. Last - match wins. Just below this then are two explict matches for - ".google.com". The first is negating our various cookie blocking - actions (i.e. we will allow cookies here). The second is allowing - "fast-redirects". Note that there is a leading dot here -- - ".google.com". This will match any hosts and sub-domains, in the - google.com domain also, such as "www.google.com". So, apparently, we - have these actions defined somewhere in the lower part of our actions - file, and "google.com" is referenced in these sections. - - And now we pull it altogether in the bottom section and summarize how - Privoxy is appying all its "actions" to "google.com": - - Final results: - - -add-header -block -deanimate-gifs -downgrade -fast-redirects - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} - +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} - +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} - -hide-user-agent -image +image-blocker{blank} -limit-connect +no-compression - -no-cookies-keep -no-cookies-read -no-cookies-set +no-popups -vanilla-wafer - -wafer - - - Now another example, "ad.doubleclick.net": - - { +block +image } - .ad.doubleclick.net - - { +block +image } - ad*. - - { +block +image } - .doubleclick.net - - - We'll just show the interesting part here, the explicit matches. It is - matched three different times. Each as an "+block +image", which is - the expanded form of one of our aliases that had been defined as: - "+imageblock". ("Aliases" are defined in the first section of the - actions file and typically used to combine more than one action.) - - Any one of these would have done the trick and blocked this as an - unwanted image. This is unnecessarily redundant since the last case - effectively would also cover the first. No point in taking chances - with these guys though ;-) Note that if you want an ad or obnoxious - URL to be invisible, it should be defined as "ad.doubleclick.net" is - done here -- as both a "+block" and an "+image". The custom alias - "+imageblock" does this for us. - - One last example. Let's try "http://www.rhapsodyk.net/adsl/HOWTO/". - This one is giving us problems. We are getting a blank page. Hmmm... - - Matches for http://www.rhapsodyk.net/adsl/HOWTO/: - - { -add-header -block +deanimate-gifs -downgrade +fast-redirects - +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} - +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} - +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} - -hide-user-agent -image +image-blocker{blank} +no-compression - +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups - -vanilla-wafer -wafer } - / - - { +block +image } - /ads - - - Ooops, the "/adsl/" is matching "/ads"! But we did not want this at - all! Now we see why we get the blank page. We could now add a new - action below this that explictly does not block (-block) pages with - "adsl". There are various ways to handle such exceptions. Example: - - { -block } - /adsl - - - Now the page displays ;-) - - But now what about a situation where we get no explicit matches like - we did with: - - { -block } - /adsl - - - That actually was very telling and pointed us quickly to where the - problem was. If you don't get this kind of match, then it means one of - the default rules in the first section is causing the problem. This - would require some guesswork, and maybe a little trial and error to - isolate the offending rule. One likely cause would be one of the - "{+filter}" actions. Try adding the URL for the site to one of aliases - that turn off "+filter": - - {shop} - .quietpc.com - .worldpay.com # for quietpc.com - .jungle.com - .scan.co.uk - .forbes.com - - - "{shop}" is an "alias" that expands to "{ -filter -no-cookies - -no-cookies-keep }". Or you could do your own exception to negate - filtering: - - {-filter} - .forbes.com - -References - - Visible links - 1. http://www.privoxy.org/user-manual/ - 2. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INTRODUCTION - 3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN35 - 4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION - 5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-SOURCE - 6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-RH - 7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-SUSE - 8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-OS2 - 9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-WIN - 10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-OTHER - 11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURATION - 12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN154 - 13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN172 - 14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN203 - 15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN236 - 16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN329 - 17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN466 - 18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FORWARDING - 19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN663 - 20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSFILE - 21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN762 - 22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN836 - 23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1153 - 24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FILTERFILE - 25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1212 - 26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUICKSTART - 27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1268 - 28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONTACT - 29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT - 30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1327 - 31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1333 - 32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO - 33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#APPENDIX - 34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#REGEX - 35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1521 - 36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSANAT - 37. http://p.p/ - 38. http://sourceforge.net/projects/ijbswa/ - 39. http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/current/ - 40. http://www.gnu.org/ - 41. http://p.p/ - 42. http://www.privoxy.org/config/ - 43. http://p.p/ - 44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSFILE - 45. http://p.p/ - 46. http://p.p/ - 47. http://p.p/ - 48. http://p.p/ - 49. http://p.p/show-url-info - 50. http://www.perldoc.com/perl5.6/pod/perlre.html - 51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#REGEX - 52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSANAT - 53. http://p.p/ - 54. http://sourceforge.net/tracker/?group_id=11118&atid=211118 - 55. http://sourceforge.net/tracker/?group_id=11118&atid=111118 - 56. http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse - 57. http://sourceforge.net/mail/?group_id=11118 - 58. http://sourceforge.net/mail/?group_id=11118 - 59. http://www.gnu.org/copyleft/gpl.html - 60. http://www.junkbusters.com/ - 61. http://www.waldherr.org/junkbuster/ - 62. http://sourceforge.net/projects/ijbswa/ - 63. http://sourceforge.net/projects/ijbswa - 64. http://www.privoxy.org/ - 65. http://p.p/ - 66. http://www.junkbusters.com/ht/en/cookies.html - 67. http://www.waldherr.org/junkbuster/ - 68. http://privacy.net/analyze/ - 69. http://www.squid-cache.org/ - 70. http://www.perldoc.com/perl5.6/pod/perlre.html - 71. http://www.privoxy.org/config/ - 72. http://p.p/ - 73. http://www.privoxy.org/config/show-status - 74. http://www.privoxy.org/config/show-version - 75. http://www.privoxy.org/config/show-request - 76. http://www.privoxy.org/config/show-url-info - 77. http://www.privoxy.org/config/toggle - 78. http://www.privoxy.org/config/toggle?set=disable - 79. http://www.privoxy.org/config/toggle?set=enable - 80. http://www.privoxy.org/config/edit-actions - 81. http://www.privoxy.org/config/show-url-info - 82. http://google.com/ - - Hidden links: - 83. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1393 - 84. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1401 - 85. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1404 - 86. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1407 - 87. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1410 - 88. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1415 - 89. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1418 - 90. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1421 - 91. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1427 diff --git a/doc/obsolete/top.gif b/doc/top.gif similarity index 100% rename from doc/obsolete/top.gif rename to doc/top.gif diff --git a/doc/webserver/.gitignore b/doc/webserver/.gitignore deleted file mode 100644 index 7184d633..00000000 --- a/doc/webserver/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -developer-manual -faq -user-manual -man-page \ No newline at end of file diff --git a/doc/webserver/.htaccess b/doc/webserver/.htaccess deleted file mode 100644 index 0ecf688d..00000000 --- a/doc/webserver/.htaccess +++ /dev/null @@ -1,26 +0,0 @@ -# http://privoxy.org/.htaccess -# -# By Jon Foster -# -# Intercepts requests for these servers: -# http://ijbswa.sourceforge.net/ -# http://privoxy.com/ -# http://www.privoxy.com/ -# http://www.privoxy.org/ -# -# And redirects all requests to the canonical web server: -# http://privoxy.org/ -# -# -# Uses Apache's mod_rewrite -# See http://httpd.apache.org/docs/mod/mod_rewrite.html -# - -# Enable mod_rewrite -RewriteEngine on - - -RewriteCond %{HTTP_HOST} !^privoxy\.org\.?$ [NC] -RewriteCond %{HTTP_HOST} !^$ -RewriteRule ^(.*)$ http://privoxy.org/$1 [R,L] - diff --git a/doc/webserver/README.txt b/doc/webserver/README.txt index 4221e3a8..60680f9f 100644 --- a/doc/webserver/README.txt +++ b/doc/webserver/README.txt @@ -3,7 +3,6 @@ on the project's homepage ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ -which is indeed http://ijbswa.sourceforge.net -and http://www.privoxy.org/. +which is indeed http://ijbswa.sourceforge.net. --Stefan, April 2002 \ No newline at end of file +-Stefan, June 2001 \ No newline at end of file diff --git a/doc/webserver/config/.htaccess b/doc/webserver/config/.htaccess deleted file mode 100644 index 0a2bfbf9..00000000 --- a/doc/webserver/config/.htaccess +++ /dev/null @@ -1,34 +0,0 @@ -# http://ijbswa.sourceforge.net/config/.htaccess -# -# By Jon Foster -# -# Redirects any request for any file in this directory tree -# to an error page. The error page is reached through the -# URL http://privoxy.org/config/ and is actually in -# the file index.php -# -# Uses Apache's mod_rewrite -# See http://httpd.apache.org/docs/mod/mod_rewrite.html -# - -# Enable mod_rewrite -RewriteEngine on - -# we are reached via /config/ prefix -RewriteBase /config/ - -# The only file which really exists is index.php - allow this -RewriteCond %{HTTP_HOST} ^privoxy\.org\.?$ [NC,OR] -RewriteCond %{HTTP_HOST} ^$ -RewriteRule index.php - [L] - -# Silently redirect the config dir to index.php -RewriteCond %{HTTP_HOST} ^privoxy\.org\.?$ [NC,OR] -RewriteCond %{HTTP_HOST} ^$ -RewriteRule ^$ index.php [L] - -# anything else gets redirected to the config dir, and we update -# the browser's location bar. -RewriteRule ^(.*)$ http://privoxy.org/config/ [R,L] - - diff --git a/doc/webserver/config/index.php b/doc/webserver/config/index.php deleted file mode 100644 index 38f59768..00000000 --- a/doc/webserver/config/index.php +++ /dev/null @@ -1,22 +0,0 @@ - - -Privoxy not running - - - - -

    Privoxy isn't working

    - -

    If you were redirected to this page, it means that you aren't using -Privoxy.   Please check your browser settings.

    - -

    Junkbuster 2.9.x was renamed Privoxy. If you recently upgraded, then -the web-based interface has moved - it is now at http://config.privoxy.org/ -(Short form: p.p [Privoxy Proxy]).

    - -

    Privoxy home page

    - - - - diff --git a/doc/webserver/default_page.php b/doc/webserver/default_page.php deleted file mode 100644 index 75a4fdcc..00000000 --- a/doc/webserver/default_page.php +++ /dev/null @@ -1,69 +0,0 @@ - - - -SourceForge: Welcome - - - - - - - - - - - -
       - Home | - About | - Partners | - Contact Us
    - - - - - - - - - -
    - - - VA Linux Systems -
    - - - - - - - -
    -

    -

    Welcome to http:///

    -

    We're Sorry but this Project hasn't yet uploaded their personal webpage yet.
    - Please check back soon for updates or visit SourceForge


    -
    -
    - - - - - - - -
    - All trademarks and copyrights on this page are properties of their respective owners. Forum comments are owned by the poster. The rest is copyright ©1999-2000 VA Linux Systems, Inc. -
    - - - - diff --git a/doc/webserver/developer-manual.html b/doc/webserver/developer-manual.html new file mode 100644 index 00000000..2a74cd17 --- /dev/null +++ b/doc/webserver/developer-manual.html @@ -0,0 +1,71 @@ + + + + +Junkbuster|Developer Manual + + + + + + + +

    +

    +

    How to quickly dive into Junkbuster Development:

    +

    + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:49 CEST 2001 + + + + diff --git a/doc/webserver/documentation-guidelines.html b/doc/webserver/documentation-guidelines.html new file mode 100644 index 00000000..f6a23fe5 --- /dev/null +++ b/doc/webserver/documentation-guidelines.html @@ -0,0 +1,86 @@ + + + + +Junkbuster|Documentation Guidelines + + + + + + + +

    +

    +

    Documentation guideline:

    +

    +All docs should be ... +

      +
    • in a format that is widely used. I propose HTML. +
    • we either +
        +
      • generate man pages from the documentation (let's _NOT_ write them manually), or +
      • we have a man page that points to the documentation (I propose + this option) +
      +
    • have a consistent layout +
    • have a link to the latest version of the document (i.e. point to a URL at sf) +
    • be consistent with the redirect script (i.e. the junkbuster program + points via the redirect URL at sf to valid end-points in the document) +
    • started from scratch but recycle parts from the original junkbuster documents +
    + +
    + +
    +

    the developers

    + +Last modified: Wed Jun 13 16:26:48 CEST 2001 + + + + diff --git a/doc/webserver/faq.html b/doc/webserver/faq.html new file mode 100644 index 00000000..a97c036c --- /dev/null +++ b/doc/webserver/faq.html @@ -0,0 +1,115 @@ + + + + +Junkbuster|FAQ + + + + + + + +

    +

    +

    Questions

    + +

    + +Please read the Junkbuster FAQ at Junkbuster Corp. and some other docs first. + +

    Installation

    +

    Mail accounts

    +

    +How can I make my Yahoo account work? +

    +How can I make my Hotmail account work? +

    +How can I make my GMX account work? +

    Misc

    +

    +How can I hide my IP address? +

    +What is the imagefile (simage.ini, etc.) for? +

    Removal

    + +

    Answers

    + +

    How can I make my Yahoo account work?

    +

    +to be filled +

    + +

    How can I make my Hotmail account work?

    +

    +to be filled +

    + +

    How can I make my GMX account work?

    +

    +to be filled + +

    How can I hide my IP address?

    +

    +You cannot hide your IP address with Junkbuster. + +

    What is the imagefile (simage.ini, etc.) for?

    +

    +Anytime the Junkbuster determines (with the help of the blocklist) that a URL +contains an advertisement, it has to decide whether this advertisement is an +image or not. The Junkbuster uses the imagefile for that purpose.. + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:47 CEST 2001 + + + + diff --git a/doc/webserver/index.html b/doc/webserver/index.html index e3bf7298..00bf0b73 100644 --- a/doc/webserver/index.html +++ b/doc/webserver/index.html @@ -1,131 +1,75 @@ - + - - - Privoxy|Project Homepage - - - - - - - + +Junkbuster|Project Homepage + -

    Privoxy

    + -

    Privoxy is a web proxy with advanced filtering capabilities -for protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other obnoxious -Internet junk. Privoxy has a very flexible configuration and can be -customized to suit individual needs and tastes. Privoxy has -application for both stand-alone systems and multi-user networks.

    + -

    Privoxy is based on the code of the Internet Junkbuster. Junkbuster was -originally written by JunkBusters - Corporation, and was released as free open-source software - under the GNU GPL. Stefan Waldherr made - many improvements, and started the SourceForge - project to continue development.

    + -

    More infos ...

    +

    -

    - -

    Download

    -

    -

    - -

    Documentation

    -

    -

    - -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - -
    +



    -SourceForge Logo +You will be redirected in a couple of moments. This page will soon have more content.
    +
    +

    the developers

    + +Last modified: Wed Jun 13 16:26:46 CEST 2001 + - + + diff --git a/doc/webserver/p_doc.css b/doc/webserver/p_doc.css deleted file mode 100644 index 8eb2159a..00000000 --- a/doc/webserver/p_doc.css +++ /dev/null @@ -1,11 +0,0 @@ -hr { width: 95% } -body { background: #EEEEEE; } -h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif } -code { color: green } -pre { margin-left: 2% } -# p { margin-left:20px } -body { margin-left:20px } -h1 { color: #404; font-size: 175%; margin-left:0px } -h2 { color: #606; margin-left:0px } -h3, h4 { color: #806; margin-left:0px } -ul { list-style-type: square } diff --git a/doc/webserver/p_web.css b/doc/webserver/p_web.css deleted file mode 100644 index 8eb2159a..00000000 --- a/doc/webserver/p_web.css +++ /dev/null @@ -1,11 +0,0 @@ -hr { width: 95% } -body { background: #EEEEEE; } -h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif } -code { color: green } -pre { margin-left: 2% } -# p { margin-left:20px } -body { margin-left:20px } -h1 { color: #404; font-size: 175%; margin-left:0px } -h2 { color: #606; margin-left:0px } -h3, h4 { color: #806; margin-left:0px } -ul { list-style-type: square } diff --git a/doc/webserver/redirect.php b/doc/webserver/redirect.php index a85b2c64..70d7e0b9 100755 --- a/doc/webserver/redirect.php +++ b/doc/webserver/redirect.php @@ -1,11 +1,21 @@ - + +// 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. +// +// +// $Log: Makefile.in,v $ +// diff --git a/doc/webserver/robots.txt b/doc/webserver/robots.txt deleted file mode 100644 index 790f3ffc..00000000 --- a/doc/webserver/robots.txt +++ /dev/null @@ -1,15 +0,0 @@ -# This is the Internet Junkbuster web site. -# -# If the robot is connecting through a JunkBuster, then the -# control interface is at /config. It isn't very useful -# to index it, and you're likely to break stuff. So go away! -# -# Even if you're not connected through a JunkBuster, the -# one "JunkBuster's not working" page there is not very -# interesting. - -User-agent: * -Disallow: /config/ - - - diff --git a/doc/webserver/swa.css b/doc/webserver/swa.css new file mode 100644 index 00000000..22489e52 --- /dev/null +++ b/doc/webserver/swa.css @@ -0,0 +1,9 @@ +body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px;} +h1 { margin-left:20px; font-family:Helvetica,Arial; font-size:18pt;} +h2 { margin-left:25px; font-family:Helvetica,Arial; font-size:14pt; } +h3 { margin-left:25px; font-family:Helvetica,Arial; font-size:12pt; } +p { margin-left:27px; margin-right:20px; font-size:10pt; } +# next definition removes bullets for netscape +# li { margin-left:27px; margin-right:20px; font-size:10pt; } +form,pre,ul,ol { margin-left:27px; margin-right:20px; font-size:10pt; } +div,td,th,address,nobr,b,i { font-size:10pt; } diff --git a/doc/webserver/testplan.html b/doc/webserver/testplan.html new file mode 100644 index 00000000..050a66d2 --- /dev/null +++ b/doc/webserver/testplan.html @@ -0,0 +1,102 @@ + + + + +Junkbuster|Testplan + + + + + + + +

    +

    +

    Testplan for releases:

    +

    +

      +
    1. Remove any existing rpm with rpm -e +
    2. Remove any file that was left over. This includes (but is not limited + to) +
        +
      • /var/log/junkbuster +
      • /etc/junkbuster +
      • /usr/sbin/junkbuster +
      • /etc/init.d/junkbuster +
      • /usr/doc/junkbuster* +
      +
    3. Install the rpm. Any error messages? +
    4. start,stop,status junkbuster with the specific script + (e.g. /etc/rc.d/init/junkbuster stop). Reboot your machine. Does + autostart work? +
    5. Start browsing. Does the junkbuster work? Logfile written? +
    6. Remove the rpm. Any error messages? All files removed? +
    + +

    Test reports:

    +

    +Please submit test reports only with the test form +at sourceforge. Three simple steps: +

      +
    • Select category: the distribution you test on. +
    • Select group: the version of Junkbuster that we are about to release. +
    • Fill the Summary and Detailed Description with something intelligent + (keep it short and precise). +
    +

    +Do not mail to the mailinglist (we cannot keep track on issues there). + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:44 CEST 2001 + + + + diff --git a/doc/webserver/user-manual.html b/doc/webserver/user-manual.html new file mode 100644 index 00000000..e90fad37 --- /dev/null +++ b/doc/webserver/user-manual.html @@ -0,0 +1,71 @@ + + + + +Junkbuster|User Manual + + + + + + + +

    +

    +

    To be filled:

    +

    + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:43 CEST 2001 + + + + diff --git a/encode.c b/encode.c index 09c7b5f7..7e82acd8 100644 --- a/encode.c +++ b/encode.c @@ -1,4 +1,4 @@ -const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; +const char encode_rcs[] = "$Id: encode.c,v 1.1.1.1 2001/05/15 13:58:51 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/encode.c,v $ @@ -7,7 +7,7 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; * encode cookies and HTML text. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -33,27 +33,6 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; * * Revisions : * $Log: encode.c,v $ - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.5 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.4 2002/01/22 23:28:07 jongfoster - * Adding convenience function html_encode_and_free_original() - * Making all functions accept NULL paramaters - in this case, they - * simply return NULL. This allows error-checking to be deferred. - * - * Revision 1.3 2001/11/13 00:16:40 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.2 2001/05/17 22:52:35 oes - * - Cleaned CRLF's from the sources and related files - * * Revision 1.1.1.1 2001/05/15 13:58:51 oes * Initial import of version 2.9.3 source tree * @@ -64,8 +43,8 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; #include "config.h" #include -#include #include +#include #include "encode.h" @@ -176,20 +155,12 @@ static const char * const cookie_code_map[256] = { * * Returns : Encoded string, newly allocated on the heap. * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. * *********************************************************************/ char * html_encode(const char *s) { - char * buf; - - if (s == NULL) - { - return NULL; - } - /* each input char can expand to at most 6 chars */ - buf = (char *) malloc((strlen(s) * 6) + 1); + char * buf = (char *) malloc((strlen(s) * 6) + 1); if (buf) { @@ -215,41 +186,6 @@ char * html_encode(const char *s) return(buf); } - -/********************************************************************* - * - * Function : html_encode_and_free_original - * - * Description : Encodes a string so it's not interpreted as - * containing HTML tags or entities. - * Replaces <, >, &, and " with the appropriate HTML - * entities. Free()s original string. - * If original string is NULL, simply returns NULL. - * - * Parameters : - * 1 : s = String to encode. Null-terminated. - * - * Returns : Encoded string, newly allocated on the heap. - * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. - * - *********************************************************************/ -char * html_encode_and_free_original(char *s) -{ - char * result; - - if (s == NULL) - { - return NULL; - } - - result = html_encode(s); - free(s); - - return result; -} - - /********************************************************************* * * Function : cookie_encode @@ -263,20 +199,12 @@ char * html_encode_and_free_original(char *s) * * Returns : Encoded string, newly allocated on the heap. * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. * *********************************************************************/ char * cookie_encode(const char *s) { - char * buf; - - if (s == NULL) - { - return NULL; - } - /* each input char can expand to at most 3 chars */ - buf = (char *) malloc((strlen(s) * 3) + 1); + char * buf = (char *) malloc((strlen(s) * 3) + 1); if (buf) { @@ -315,20 +243,12 @@ char * cookie_encode(const char *s) * * Returns : Encoded string, newly allocated on the heap. * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. * *********************************************************************/ char * url_encode(const char *s) { - char * buf; - - if (s == NULL) - { - return NULL; - } - /* each input char can expand to at most 3 chars */ - buf = (char *) malloc((strlen(s) * 3) + 1); + char * buf = (char *) malloc((strlen(s) * 3) + 1); if (buf) { @@ -368,7 +288,7 @@ char * url_encode(const char *s) * Returns : The integer value, or -1 for non-hex characters. * *********************************************************************/ -static int xdtoi(const int d) +static int xdtoi(char d) { if ((d >= '0') && (d <= '9')) { @@ -406,10 +326,10 @@ static int xtoi(const char *s) { int d1, d2; - d1 = xdtoi(*s); + d1 = xdtoi(*s++); if(d1 >= 0) { - d2 = xdtoi(*(s+1)); + d2 = xdtoi(*s); if(d2 >= 0) { return (d1 << 4) + d2; @@ -451,7 +371,7 @@ char *url_decode(const char * s) break; case '%': - if ((*q = xtoi(s + 1)) != '\0') + if ((*q = xtoi(s + 1))) { s += 3; q++; diff --git a/encode.h b/encode.h index 875b9662..ba0b6cf0 100644 --- a/encode.h +++ b/encode.h @@ -1,15 +1,15 @@ -#ifndef ENCODE_H_INCLUDED -#define ENCODE_H_INCLUDED -#define ENCODE_H_VERSION "$Id: encode.h,v 1.4 2002/03/24 13:25:43 swa Exp $" +#ifndef _ENCODE_H +#define _ENCODE_H +#define ENCODE_H_VERSION "$Id: encode.h,v 1.1 2001/05/13 21:57:06 administrator Exp $" /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/encode.h,v $ + * File : $Source: /home/administrator/cvs/ijb/encode.h,v $ * * Purpose : Functions to encode and decode URLs, and also to * encode cookies and HTML text. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,21 +35,6 @@ * * Revisions : * $Log: encode.h,v $ - * Revision 1.4 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.3 2002/01/22 23:28:07 jongfoster - * Adding convenience function html_encode_and_free_original() - * Making all functions accept NULL paramaters - in this case, they - * simply return NULL. This allows error-checking to be deferred. - * - * Revision 1.2 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.1.1.1 2001/05/15 13:58:51 oes - * Initial import of version 2.9.3 source tree - * * *********************************************************************/ @@ -63,8 +48,6 @@ extern char * cookie_encode(const char *s); extern char * url_encode(const char *s); extern char * url_decode(const char *str); -extern char * html_encode_and_free_original(char *s); - /* Revision control strings from this header and associated .c file */ extern const char encode_rcs[]; extern const char encode_h_rcs[]; @@ -73,7 +56,7 @@ extern const char encode_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef ENCODE_H_INCLUDED */ +#endif /* ndef _ENCODE_H */ /* Local Variables: diff --git a/errlog.c b/errlog.c index ec623b8f..f069875c 100644 --- a/errlog.c +++ b/errlog.c @@ -1,4 +1,4 @@ -const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; +const char errlog_rcs[] = "$Id: errlog.c,v 1.13 2001/07/13 13:58:58 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/errlog.c,v $ @@ -7,7 +7,7 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; * printf-like fashion. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -33,89 +33,6 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; * * Revisions : * $Log: errlog.c,v $ - * Revision 1.36 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.35 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.34 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.33 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.32 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.31 2002/03/06 23:02:57 jongfoster - * Removing tabs - * - * Revision 1.30 2002/03/05 22:43:45 david__schmidt - * - Better error reporting on OS/2 - * - Fix double-slash comment (oops) - * - * Revision 1.29 2002/03/04 23:45:13 jongfoster - * Printing thread ID if using Win32 native threads - * - * Revision 1.28 2002/03/04 17:59:59 oes - * Deleted deletePidFile(), cosmetics - * - * Revision 1.27 2002/03/04 02:08:01 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.26 2002/01/09 19:05:45 steudten - * Fix big memory leak. - * - * Revision 1.25 2002/01/09 14:32:08 oes - * Added support for gmtime_r and localtime_r. - * - * Revision 1.24 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.23 2001/11/07 00:02:13 steudten - * Add line number in error output for lineparsing for - * actionsfile and configfile. - * Special handling for CLF added. - * - * Revision 1.22 2001/11/05 23:43:05 steudten - * Add time+date to log files. - * - * Revision 1.21 2001/10/25 03:40:47 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.20 2001/09/16 23:04:34 jongfoster - * Fixing a warning - * - * Revision 1.19 2001/09/13 20:08:06 jongfoster - * Adding support for LOG_LEVEL_CGI - * - * Revision 1.18 2001/09/10 11:27:24 oes - * Declaration of w32_socket_strerr now conditional - * - * Revision 1.17 2001/09/10 10:17:13 oes - * Removed unused variable; Fixed sprintf format - * - * Revision 1.16 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.15 2001/07/29 17:41:10 jongfoster - * Now prints thread ID for each message (pthreads only) - * - * Revision 1.14 2001/07/19 19:03:48 haroon - * - Added case for LOG_LEVEL_POPUPS - * * Revision 1.13 2001/07/13 13:58:58 oes * - Added case for LOG_LEVEL_DEANIMATE * - Removed all #ifdef PCRS @@ -206,22 +123,18 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; #include "config.h" -#include "miscutil.h" #include #include #include #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include -#endif /* !defined(_WIN32) && !defined(__OS2__) */ +#endif /* ndef _WIN32 */ #include -#include -#ifdef FEATURE_PTHREAD -#include -#endif /* def FEATURE_PTHREAD */ +/* #include */ #ifdef _WIN32 #include @@ -230,15 +143,8 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; #endif /* ndef _WIN_CONSOLE */ #endif /* def _WIN32 */ -#ifdef __OS2__ -#include /* For sock_errno */ -#define INCL_DOS -#include -#endif - #include "errlog.h" #include "project.h" -#include "jcc.h" const char errlog_h_rcs[] = ERRLOG_H_VERSION; @@ -253,14 +159,16 @@ const char errlog_h_rcs[] = ERRLOG_H_VERSION; /* where to log (default: stderr) */ static FILE *logfp = NULL; +/* where to log (NULL == stderr) */ +static char * logfilename = NULL; + /* logging detail level. */ static int debug = (LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO); /* static functions */ static void fatal_error(const char * error_message); -#ifdef _WIN32 -static char *w32_socket_strerr(int errcode, char *tmp_buf); -#endif +static char * w32_socket_strerr(int errcode, char * tmp_buf); + /********************************************************************* * @@ -279,7 +187,7 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf); static void fatal_error(const char * error_message) { #if defined(_WIN32) && !defined(_WIN_CONSOLE) - MessageBox(g_hwndLogFrame, error_message, "Privoxy Error", + MessageBox(g_hwndLogFrame, error_message, "Internet JunkBuster Error", MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); /* Cleanup - remove taskbar icon etc. */ @@ -289,17 +197,13 @@ static void fatal_error(const char * error_message) fputs(error_message, stderr); #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ -#if defined(unix) - unlink(pidfile); -#endif /* unix */ - exit(1); } /********************************************************************* * - * Function : init_error_log + * Function : init_errlog * * Description : Initializes the logging module. Must call before * calling log_error. @@ -323,7 +227,6 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) if ((logfp != NULL) && (logfp != stderr)) { - log_error(LOG_LEVEL_INFO, "(Re-)Open logfile %s", logfname ? logfname : "none"); fclose(logfp); } logfp = stderr; @@ -331,9 +234,9 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) /* set the designated log file */ if( logfname ) { - if( NULL == (fp = fopen(logfname, "a")) ) + if( !(fp = fopen(logfname, "a")) ) { - log_error(LOG_LEVEL_FATAL, "init_error_log(): can't open logfile: %s", logfname); + log_error(LOG_LEVEL_FATAL, "init_errlog(): can't open logfile: %s", logfname); } /* set logging to be completely unbuffered */ @@ -342,7 +245,7 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) logfp = fp; } - log_error(LOG_LEVEL_INFO, "Privoxy version " VERSION); + log_error(LOG_LEVEL_INFO, "Internet JunkBuster version " VERSION); if (prog_name != NULL) { log_error(LOG_LEVEL_INFO, "Program name: %s", prog_name); @@ -370,15 +273,10 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) void log_error(int loglevel, char *fmt, ...) { va_list ap; - char *outbuf= NULL; - static char *outbuf_save = NULL; + char outbuf[BUFFER_SIZE]; char * src = fmt; int outc = 0; long this_thread = 1; /* was: pthread_t this_thread;*/ -#ifdef __OS2__ - PTIB ptib; - APIRET ulrc; -#endif /* __OS2__ */ #if defined(_WIN32) && !defined(_WIN_CONSOLE) /* @@ -399,95 +297,58 @@ void log_error(int loglevel, char *fmt, ...) } /* FIXME get current thread id */ -#ifdef FEATURE_PTHREAD - this_thread = (long)pthread_self(); -#elif defined(_WIN32) - this_thread = GetCurrentThreadId(); -#elif defined(__OS2__) - ulrc = DosGetInfoBlocks(&ptib, NULL); - if (ulrc == 0) - this_thread = ptib -> tib_ptib2 -> tib2_ultid; -#endif /* def FEATURE_PTHREAD */ - - if ( !outbuf_save ) - { - outbuf_save = outbuf = (char*)malloc(BUFFER_SIZE); - assert(outbuf); - } - outbuf = outbuf_save; - - { - /* - * Write timestamp into tempbuf. - * - * Complex because not all OSs have tm_gmtoff or - * the %z field in strftime() - */ - time_t now; - struct tm tm_now; - time (&now); -#ifdef HAVE_LOCALTIME_R - tm_now = *localtime_r(&now, &tm_now); -#else - tm_now = *localtime (&now); -#endif - strftime(outbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); - outbuf += strlen( outbuf ); - } + /* this_thread = (long)pthread_self(); */ + switch (loglevel) { case LOG_LEVEL_ERROR: - outc = sprintf(outbuf, "Privoxy(%ld) Error: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Error: ", this_thread); break; case LOG_LEVEL_FATAL: - outc = sprintf(outbuf, "Privoxy(%ld) Fatal error: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Fatal error: ", this_thread); break; case LOG_LEVEL_GPC: - outc = sprintf(outbuf, "Privoxy(%ld) Request: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Request: ", this_thread); break; case LOG_LEVEL_CONNECT: - outc = sprintf(outbuf, "Privoxy(%ld) Connect: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Connect: ", this_thread); break; case LOG_LEVEL_LOG: - outc = sprintf(outbuf, "Privoxy(%ld) Writing: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Writing: ", this_thread); break; case LOG_LEVEL_HEADER: - outc = sprintf(outbuf, "Privoxy(%ld) Header: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Header: ", this_thread); break; case LOG_LEVEL_INFO: - outc = sprintf(outbuf, "Privoxy(%ld) Info: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Info: ", this_thread); break; case LOG_LEVEL_RE_FILTER: - outc = sprintf(outbuf, "Privoxy(%ld) Re-Filter: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Re-Filter: ", this_thread); break; -#ifdef FEATURE_FORCE_LOAD +#ifdef FORCE_LOAD case LOG_LEVEL_FORCE: - outc = sprintf(outbuf, "Privoxy(%ld) Force: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Force: ", this_thread); break; -#endif /* def FEATURE_FORCE_LOAD */ -#ifdef FEATURE_FAST_REDIRECTS +#endif /* def FORCE_LOAD */ +#ifdef FAST_REDIRECTS case LOG_LEVEL_REDIRECTS: - outc = sprintf(outbuf, "Privoxy(%ld) Redirect: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Redirect: ", this_thread); break; -#endif /* def FEATURE_FAST_REDIRECTS */ +#endif /* def FAST_REDIRECTS */ case LOG_LEVEL_DEANIMATE: - outc = sprintf(outbuf, "Privoxy(%ld) Gif-Deanimate: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Gif-Deanimate: ", this_thread); break; case LOG_LEVEL_CLF: - outbuf = outbuf_save; outc = 0; outbuf[0] = '\0'; break; -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS case LOG_LEVEL_POPUPS: - outc = sprintf(outbuf, "Privoxy(%ld) Kill-Popups: ", this_thread); - break; -#endif /* def FEATURE_KILL_POPUPS */ - case LOG_LEVEL_CGI: - outc = sprintf(outbuf, "Privoxy(%ld) CGI: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Kill-Popups: ", this_thread); break; +#endif /* def KILLPOPUPS */ default: - outc = sprintf(outbuf, "Privoxy(%ld) UNKNOWN LOG TYPE(%d): ", this_thread, loglevel); + outc = sprintf(outbuf, "IJB(%d) UNKNOWN LOG TYPE(%d): ", this_thread, loglevel); break; } @@ -498,7 +359,7 @@ void log_error(int loglevel, char *fmt, ...) while ((*src) && (outc < BUFFER_SIZE-2)) { char tempbuf[BUFFER_SIZE]; - char *sval = NULL; + char *sval; int ival; unsigned uval; long lval; @@ -562,7 +423,7 @@ void log_error(int loglevel, char *fmt, ...) else { /* Error */ - sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n" + sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n" "Format = \"%s\"\n" "Exiting.", this_thread, fmt); /* FIXME RACE HAZARD: should start critical section error_log_use here */ @@ -619,7 +480,7 @@ void log_error(int loglevel, char *fmt, ...) outc += ival; if (outc < BUFFER_SIZE-1) { - memcpy(outbuf + oldoutc, sval, (size_t) ival); + memcpy(outbuf + oldoutc, sval, ival); } else { @@ -631,11 +492,6 @@ void log_error(int loglevel, char *fmt, ...) #ifdef _WIN32 ival = WSAGetLastError(); sval = w32_socket_strerr(ival, tempbuf); -#elif __OS2__ - ival = sock_errno(); - if (ival == 0) - ival = errno; - sval = strerror(ival); #else /* ifndef _WIN32 */ ival = errno; #ifdef HAVE_STRERROR @@ -671,22 +527,11 @@ void log_error(int loglevel, char *fmt, ...) */ time_t now; struct tm *tm_now; - struct tm gmt; -#ifdef HAVE_LOCALTIME_R - struct tm dummy; -#endif + struct tm gmt; int days, hrs, mins; time (&now); -#ifdef HAVE_GMTIME_R - gmt = *gmtime_r(&now, &gmt); -#else - gmt = *gmtime(&now); -#endif -#ifdef HAVE_LOCALTIME_R - tm_now = localtime_r(&now, &dummy); -#else + gmt = *gmtime (&now); tm_now = localtime (&now); -#endif days = tm_now->tm_yday - gmt.tm_yday; hrs = ((days < -1 ? 24 : 1 < days ? -24 : days * 24) + tm_now->tm_hour - gmt.tm_hour); mins = hrs * 60 + tm_now->tm_min - gmt.tm_min; @@ -705,7 +550,7 @@ void log_error(int loglevel, char *fmt, ...) } break; default: - sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n" + sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n" "Format = \"%s\"\n" "Exiting.", this_thread, fmt); /* FIXME RACE HAZARD: should start critical section error_log_use here */ @@ -713,9 +558,9 @@ void log_error(int loglevel, char *fmt, ...) { logfp = stderr; } - fputs(outbuf_save, logfp); + fputs(outbuf, logfp); /* FIXME RACE HAZARD: should end critical section error_log_use here */ - fatal_error(outbuf_save); + fatal_error(outbuf); /* Never get here */ break; @@ -759,11 +604,11 @@ void log_error(int loglevel, char *fmt, ...) logfp = stderr; } - fputs(outbuf_save, logfp); + fputs(outbuf, logfp); if (loglevel == LOG_LEVEL_FATAL) { - fatal_error(outbuf_save); + fatal_error(outbuf); /* Never get here */ } @@ -771,7 +616,7 @@ void log_error(int loglevel, char *fmt, ...) #if defined(_WIN32) && !defined(_WIN_CONSOLE) /* Write to display */ - LogPutString(outbuf_save); + LogPutString(outbuf); #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ } @@ -795,7 +640,7 @@ void log_error(int loglevel, char *fmt, ...) * tmp_buf. * *********************************************************************/ -static char *w32_socket_strerr(int errcode, char *tmp_buf) +static char * w32_socket_strerr(int errcode, char * tmp_buf) { #define TEXT_FOR_ERROR(code,text) \ if (errcode == code) \ @@ -872,3 +717,4 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf) tab-width: 3 end: */ + diff --git a/errlog.h b/errlog.h index c3424dd0..d5edaaef 100644 --- a/errlog.h +++ b/errlog.h @@ -1,6 +1,6 @@ -#ifndef ERRLOG_H_INCLUDED -#define ERRLOG_H_INCLUDED -#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.12 2002/03/24 13:25:43 swa Exp $" +#ifndef _ERRLOG_H +#define _ERRLOG_H +#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.6 2001/07/13 13:59:22 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/errlog.h,v $ @@ -9,7 +9,7 @@ * printf-like fashion. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,28 +35,6 @@ * * Revisions : * $Log: errlog.h,v $ - * Revision 1.12 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.11 2002/03/06 23:02:57 jongfoster - * Removing tabs - * - * Revision 1.10 2001/09/13 20:08:06 jongfoster - * Adding support for LOG_LEVEL_CGI - * - * Revision 1.9 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.8 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.7 2001/07/19 19:02:53 haroon - * Added define for LOG_LEVEL_POPUPS - * * Revision 1.6 2001/07/13 13:59:22 oes * - Added LOG_LEVEL_DEANIMATE * - Changed LOG_LEVEL_CLF @@ -135,21 +113,19 @@ extern "C" { #define LOG_LEVEL_IO 0x0004 #define LOG_LEVEL_HEADER 0x0008 #define LOG_LEVEL_LOG 0x0010 -#ifdef FEATURE_FORCE_LOAD +#ifdef FORCE_LOAD #define LOG_LEVEL_FORCE 0x0020 -#endif /* def FEATURE_FORCE_LOAD */ +#endif /* def FORCE_LOAD */ #define LOG_LEVEL_RE_FILTER 0x0040 -#ifdef FEATURE_FAST_REDIRECTS +#ifdef FAST_REDIRECTS #define LOG_LEVEL_REDIRECTS 0x0080 -#endif /* def FEATURE_FAST_REDIRECTS */ +#endif /* def FAST_REDIRECTS */ #define LOG_LEVEL_DEANIMATE 0x0100 #define LOG_LEVEL_CLF 0x0200 /* Common Log File format */ -#ifdef FEATURE_KILL_POPUPS -#define LOG_LEVEL_POPUPS 0x0400 /* Kill Popups */ -#endif /* def FEATURE_KILL_POPUPS */ - -#define LOG_LEVEL_CGI 0x0800 /* CGI / templates */ +#ifdef KILLPOPUPS +#define LOG_LEVEL_POPUPS 0x0400 /* Kill Popups */ +#endif /* def KILLPOPUPS */ /* Following are always on: */ #define LOG_LEVEL_INFO 0x1000 @@ -167,7 +143,7 @@ extern const char errlog_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef ERRLOG_H_INCLUDED */ +#endif /* ndef _ERRLOG_H */ /* Local Variables: diff --git a/filters.c b/filters.c index 6f16d847..a3a523ca 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster Exp $"; +const char filters_rcs[] = "$Id: filters.c,v 1.23 2001/07/23 13:40:12 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.c,v $ @@ -6,19 +6,19 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster * Purpose : Declares functions to parse/crunch headers and pages. * Functions declared include: * `acl_addr', `add_stats', `block_acl', `block_imageurl', - * `block_url', `url_actions', `domain_split', + * `block_url', `url_actions', `domaincmp', `dsplit', * `filter_popups', `forward_url', 'redirect_url', * `ij_untrusted_url', `intercept_url', `pcrs_filter_respose', - * 'ijb_send_banner', and `trust_url' + * `show_proxy_args', 'ijb_send_banner', and `trust_url' * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -38,150 +38,6 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster * * Revisions : * $Log: filters.c,v $ - * Revision 1.52 2002/03/24 16:35:57 jongfoster - * Removing logo - * - * Revision 1.51 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.50 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.49 2002/03/16 20:29:14 oes - * Cosmetics - * - * Revision 1.48 2002/03/13 20:25:34 oes - * Better logging for content filters - * - * Revision 1.47 2002/03/13 00:30:52 jongfoster - * Killing warnings - * Added option of always sending redirect for imageblock, - * currently disabled with #if 0. - * - * Revision 1.46 2002/03/12 01:42:49 oes - * Introduced modular filters - * - * Revision 1.45 2002/03/08 16:47:50 oes - * Added choice beween GIF and PNG built-in images - * - * Revision 1.44 2002/03/07 03:49:31 oes - * - Fixed compiler warnings etc - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - Added a 4x4 pattern PNG which is less intrusive - * than the logo but also clearly marks the deleted banners - * - * Revision 1.43 2002/01/22 23:51:59 jongfoster - * Replacing strsav() with the safer string_append(). - * - * Adding missing html_encode() to error message generators. Where encoded - * and unencoded versions of a string were provided, removing the unencoded - * one. - * - * Revision 1.42 2002/01/17 21:00:32 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Using a single, simple url_match(pattern,url) function - rather than - * the 3-line match routine which was repeated all over the place. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Using parse_http_url() to parse URLs without faking a HTTP - * request line for parse_http_request(). - * - * Revision 1.41 2001/11/13 00:14:07 jongfoster - * Fixing stupid bug now I've figured out what || means. - * (It always returns 0 or 1, not one of it's paramaters.) - * - * Revision 1.40 2001/10/26 17:37:55 oes - * - Re-enabled Netscape 200/404 bug workaround in block_url(): - * - Removed OS/2 special case - * - Made block_url() independant from sed() having been run - * - Made trust_url independant from sed() having been run - * - Made is_imageurl independant from sed() having been run. - * It now checks User-Agent: and Accept: by itself. - * - * - * Revision 1.39 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.38 2001/10/23 21:32:33 jongfoster - * Adding error-checking to selected functions - * - * Revision 1.37 2001/10/22 15:33:56 david__schmidt - * Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in - * filters.c. Added a FIXME in front of the offending code. I'll gladly - * put in a better/more robust fix for all parties if one is presented... - * It seems that just returning 200 instead of 404 would pretty much fix - * it for everyone, but I don't know all the history of the problem. - * - * Revision 1.36 2001/10/10 16:44:16 oes - * Added match_portlist function - * - * Revision 1.35 2001/10/07 15:41:23 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * New function remove_chunked_transfer_coding that strips chunked - * transfer coding to plain and is called by pcrs_filter_response - * and gif_deanimate_response if neccessary - * - * Improved handling of zero-change re_filter runs - * - * pcrs_filter_response and gif_deanimate_response now remove - * chunked transfer codeing before processing the body. - * - * Revision 1.34 2001/09/20 15:49:36 steudten - * - * Fix BUG: Change int size to size_t size in pcrs_filter_response(). - * See cgi.c fill_template(). - * - * Revision 1.33 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.32 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.31 2001/09/16 11:38:02 jongfoster - * Splitting fill_template() into 2 functions: - * template_load() loads the file - * template_fill() performs the PCRS regexps. - * This is because the CGI edit interface has a "table row" - * template which is used many times in the page - this - * change means it's only loaded from disk once. - * - * Revision 1.30 2001/09/16 11:00:10 jongfoster - * New function alloc_http_response, for symmetry with free_http_response - * - * Revision 1.29 2001/09/13 23:32:40 jongfoster - * Moving image data to cgi.c rather than cgi.h - * Fixing a GPF under Win32 (and any other OS that protects global - * constants from being written to). - * - * Revision 1.28 2001/09/10 10:18:51 oes - * Silenced compiler warnings - * - * Revision 1.27 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.26 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.25 2001/07/26 10:09:46 oes - * Made browser detection a little less naive - * - * Revision 1.24 2001/07/25 17:22:51 oes - * Added workaround for Netscape bug that prevents display of page when loading a component fails. - * * Revision 1.23 2001/07/23 13:40:12 oes * Fixed bug that caused document body to be dropped when pcrs joblist was empty. * @@ -386,26 +242,23 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster #include #include #include -#include #ifndef _WIN32 -#ifndef __OS2__ #include -#endif /* ndef __OS2__ */ #include #else #include -#endif /* ndef _WIN32 */ - -#ifdef __OS2__ -#include -#endif /* def __OS2__ */ +#endif #include "project.h" #include "filters.h" #include "encode.h" +#include "jcc.h" +#include "showargs.h" #include "parsers.h" #include "ssplit.h" +#include "gateway.h" +#include "jbsockets.h" #include "errlog.h" #include "jbsockets.h" #include "miscutil.h" @@ -413,7 +266,6 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster #include "cgi.h" #include "list.h" #include "deanimate.h" -#include "urlmatch.h" #ifdef _WIN32 #include "win32.h" @@ -431,7 +283,7 @@ const char filters_h_rcs[] = FILTERS_H_VERSION; #define ijb_isdigit(__X) isdigit((int)(unsigned char)(__X)) -#ifdef FEATURE_ACL +#ifdef ACL_FILES /********************************************************************* * * Function : block_acl @@ -496,7 +348,7 @@ int block_acl(struct access_control_addr *dst, struct client_state *csp) * * Function : acl_addr * - * Description : Called from `load_config' to parse an ACL address. + * Description : Called from `load_aclfile' to parse an ACL address. * * Parameters : * 1 : aspec = String specifying ACL address. @@ -513,7 +365,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca) masklength = 32; port = 0; - if ((p = strchr(aspec, '/')) != NULL) + if ((p = strchr(aspec, '/'))) { *p++ = '\0'; @@ -529,7 +381,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca) return(-1); } - if ((p = strchr(aspec, ':')) != NULL) + if ((p = strchr(aspec, ':'))) { *p++ = '\0'; @@ -544,8 +396,9 @@ int acl_addr(char *aspec, struct access_control_addr *aca) aca->addr = ntohl(resolve_hostname_to_ip(aspec)); - if (aca->addr == INADDR_NONE) + if (aca->addr == -1) { + log_error(LOG_LEVEL_ERROR, "can't resolve address for %s", aspec); return(-1); } @@ -564,87 +417,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca) return(0); } -#endif /* def FEATURE_ACL */ - - -/********************************************************************* - * - * Function : match_portlist - * - * Description : Check if a given number is covered by a comma - * separated list of numbers and ranges (a,b-c,d,..) - * - * Parameters : - * 1 : portlist = String with list - * 2 : port = port to check - * - * Returns : 0 => no match - * 1 => match - * - *********************************************************************/ -int match_portlist(const char *portlist, int port) -{ - char *min, *max, *next, *portlist_copy; - - min = next = portlist_copy = strdup(portlist); - - /* - * Zero-terminate first item and remember offset for next - */ - if (NULL != (next = strchr(portlist_copy, (int) ','))) - { - *next++ = '\0'; - } - - /* - * Loop through all items, checking for match - */ - while(min) - { - if (NULL == (max = strchr(min, (int) '-'))) - { - /* - * No dash, check for equality - */ - if (port == atoi(min)) - { - free(portlist_copy); - return(1); - } - } - else - { - /* - * This is a range, so check if between min and max, - * or, if max was omitted, between min and 65K - */ - *max++ = '\0'; - if(port >= atoi(min) && port <= (atoi(max) ? atoi(max) : 65535)) - { - free(portlist_copy); - return(1); - } - - } - - /* - * Jump to next item - */ - min = next; - - /* - * Zero-terminate next item and remember offset for n+1 - */ - if ((NULL != next) && (NULL != (next = strchr(next, (int) ',')))) - { - *next++ = '\0'; - } - } - - free(portlist_copy); - return 0; - -} +#endif /* def ACL_FILES */ /********************************************************************* @@ -661,188 +434,104 @@ int match_portlist(const char *portlist, int port) *********************************************************************/ struct http_response *block_url(struct client_state *csp) { -#ifdef FEATURE_IMAGE_BLOCKING char *p; -#endif /* def FEATURE_IMAGE_BLOCKING */ struct http_response *rsp; + struct map *exports = NULL; - /* + /* * If it's not blocked, don't block it ;-) */ if ((csp->action->flags & ACTION_BLOCK) == 0) { - return NULL; + return(NULL); } - /* + /* * Else, prepare a response */ - if (NULL == (rsp = alloc_http_response())) + if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp)))) { - return cgi_error_memory(); + return NULL; } /* * If it's an image-url, send back an image or redirect * as specified by the relevant +image action */ -#ifdef FEATURE_IMAGE_BLOCKING +#ifdef IMAGE_BLOCKING if (((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0) && is_imageurl(csp)) { /* determine HOW images should be blocked */ p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER]; -#if 1 /* Two alternative strategies, use this one for now: */ - /* and handle accordingly: */ - if ((p == NULL) || (0 == strcmpic(p, "pattern"))) + if ((p == NULL) || (0 == strcmpic(p, "logo"))) { - rsp->body = bindup(image_pattern_data, image_pattern_length); - if (rsp->body == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->content_length = image_pattern_length; - - if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE)) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = bindup(JBGIF, sizeof(JBGIF)); + rsp->content_length = sizeof(JBGIF); + enlist_unique_header(rsp->headers, "Content-Type", "image/gif"); } else if (0 == strcmpic(p, "blank")) { - rsp->body = bindup(image_blank_data, image_blank_length); - if (rsp->body == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->content_length = image_blank_length; - - if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE)) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = bindup(BLANKGIF, sizeof(BLANKGIF)); + rsp->content_length = sizeof(BLANKGIF); + enlist_unique_header(rsp->headers, "Content-Type", "image/gif"); } else { - rsp->status = strdup("302 Local Redirect from Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - - if (enlist_unique_header(rsp->headers, "Location", p)) - { - free_http_response(rsp); - return cgi_error_memory(); - } - } - -#else /* Following code is disabled for now */ - - /* and handle accordingly: */ - if ((p == NULL) || (0 == strcmpic(p, "pattern"))) - { - p = CGI_PREFIX "send-banner?type=pattern"; - } - else if (0 == strcmpic(p, "blank")) - { - p = CGI_PREFIX "send-banner?type=blank"; - } - rsp->status = strdup("302 Local Redirect from Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); + rsp->status = strdup("302 Local Redirect from Junkbuster"); + enlist_unique_header(rsp->headers, "Location", p); } - - if (enlist_unique_header(rsp->headers, "Location", p)) - { - free_http_response(rsp); - return cgi_error_memory(); - } -#endif /* Preceeding code is disabled for now */ - } + } else -#endif /* def FEATURE_IMAGE_BLOCKING */ +#endif /* def IMAGE_BLOCKING */ - /* + /* * Else, generate an HTML "blocked" message: */ { - jb_err err; - struct map * exports; + exports = default_exports(csp, NULL); +#ifdef FORCE_LOAD + exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1); +#else + exports = map_block_killer(exports, "force-support"); +#endif /* ndef FORCE_LOAD */ + + exports = map(exports, "hostport", 1, csp->http->hostport, 1); + exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0); + exports = map(exports, "path", 1, csp->http->path, 1); + exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0); + + rsp->body = fill_template(csp, "blocked", exports); + free_map(exports); + /* * Workaround for stupid Netscape bug which prevents * pages from being displayed if loading a referenced * JavaScript or style sheet fails. So make it appear * as if it succeeded. */ - if ( NULL != (p = get_header_value(csp->headers, "User-Agent:")) - && !strncmpic(p, "mozilla", 7) /* Catch Netscape but */ - && !strstr(p, "Gecko") /* save Mozilla, */ - && !strstr(p, "compatible") /* MSIE */ - && !strstr(p, "Opera")) /* and Opera. */ + if (csp->http->user_agent && !strncmpic(csp->http->user_agent, "mozilla", 7)) { - rsp->status = strdup("200 Request for blocked URL"); + rsp->status = strdup("200 Request for blocked URL"); } else { - rsp->status = strdup("404 Request for blocked URL"); - } - - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); + rsp->status = strdup("404 Request for blocked URL"); } - exports = default_exports(csp, NULL); - if (exports == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - -#ifdef FEATURE_FORCE_LOAD - err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1); -#else /* ifndef FEATURE_FORCE_LOAD */ - err = map_block_killer(exports, "force-support"); -#endif /* ndef FEATURE_FORCE_LOAD */ - - if (!err) err = map(exports, "hostport", 1, html_encode(csp->http->hostport), 0); - if (!err) err = map(exports, "path", 1, html_encode(csp->http->path), 0); - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } - - err = template_fill_for_cgi(csp, "blocked", exports, rsp); - if (err) - { - free_http_response(rsp); - return cgi_error_memory(); - } } - return finish_http_response(rsp); + return(finish_http_response(rsp)); } -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES /********************************************************************* * * Function : trust_url FIXME: I should be called distrust_url @@ -859,12 +548,9 @@ struct http_response *block_url(struct client_state *csp) struct http_response *trust_url(struct client_state *csp) { struct http_response *rsp; - struct map * exports; - char buf[BUFFER_SIZE]; - char *p; - struct url_spec **tl; - struct url_spec *t; - jb_err err; + struct map *exports = NULL; + char buf[BUFFER_SIZE], *p = NULL; + struct url_spec **tl, *t; /* * Don't bother to work on trusted URLs @@ -874,120 +560,86 @@ struct http_response *trust_url(struct client_state *csp) return NULL; } - /* + /* * Else, prepare a response: */ - if (NULL == (rsp = alloc_http_response())) + if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp)))) { - return cgi_error_memory(); + return NULL; } - exports = default_exports(csp, NULL); - if (exports == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - /* + /* * Export the host, port, and referrer information */ - err = map(exports, "hostport", 1, csp->http->hostport, 1); - if (!err) err = map(exports, "path", 1, csp->http->path, 1); + exports = map(exports, "hostport", 1, csp->http->hostport, 1); + exports = map(exports, "path", 1, csp->http->path, 1); + exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0); + exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0); - if (NULL != (p = get_header_value(csp->headers, "Referer:"))) + if (csp->referrer && strlen(csp->referrer) > 9) { - if (!err) err = map(exports, "referrer", 1, html_encode(p), 0); + exports = map(exports, "referrer", 1, csp->referrer + 9, 1); + exports = map(exports, "referrer-html", 1, html_encode(csp->referrer + 9), 0); } else { - if (!err) err = map(exports, "referrer", 1, "unknown", 1); - } - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); + exports = map(exports, "referrer", 1, "unknown", 1); + exports = map(exports, "referrer-html", 1, "unknown", 1); } /* * Export the trust list */ - p = strdup(""); - for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++) + for (tl = csp->config->trust_list; (t = *tl) ; tl++) { sprintf(buf, "

  • %s
  • \n", t->spec); - string_append(&p, buf); - } - err = map(exports, "trusted-referrers", 1, p, 0); - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); + p = strsav(p, buf); } + exports = map(exports, "trusted-referrers", 1, p, 0); + p = NULL; /* * Export the trust info, if available */ - if (csp->config->trust_info->first) + if (csp->config->trust_info->next) { - struct list_entry *l; + struct list *l; - p = strdup(""); - for (l = csp->config->trust_info->first; l ; l = l->next) + for (l = csp->config->trust_info->next; l ; l = l->next) { sprintf(buf, "
  • %s
    \n",l->str, l->str); - string_append(&p, buf); + p = strsav(p, buf); } - err = map(exports, "trust-info", 1, p, 0); + exports = map(exports, "trust-info", 1, p, 0); } else { - err = map_block_killer(exports, "have-trust-info"); + exports = map_block_killer(exports, "have-trust-info"); } - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } - + /* * Export the force prefix or the force conditional block killer */ -#ifdef FEATURE_FORCE_LOAD - err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1); -#else /* ifndef FEATURE_FORCE_LOAD */ - err = map_block_killer(exports, "force-support"); -#endif /* ndef FEATURE_FORCE_LOAD */ - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } +#ifdef FORCE_LOAD + exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1); +#else + exports = map_block_killer(exports, "force-support"); +#endif /* ndef FORCE_LOAD */ /* * Build the response */ - err = template_fill_for_cgi(csp, "untrusted", exports, rsp); - if (err) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = fill_template(csp, "untrusted", exports); + free_map(exports); + + return(finish_http_response(rsp)); - return finish_http_response(rsp); } -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ -#ifdef FEATURE_FAST_REDIRECTS +#ifdef FAST_REDIRECTS /********************************************************************* * * Function : redirect_url @@ -1009,54 +661,50 @@ struct http_response *redirect_url(struct client_state *csp) p = q = csp->http->path; log_error(LOG_LEVEL_REDIRECTS, "checking path for redirects: %s", p); - /* + /* * find the last URL encoded in the request */ - while ((p = strstr(p, "http://")) != NULL) + while (p = strstr(p, "http://")) { q = p++; } - /* + /* * if there was any, generate and return a HTTP redirect */ if (q != csp->http->path) { log_error(LOG_LEVEL_REDIRECTS, "redirecting to: %s", q); - if (NULL == (rsp = alloc_http_response())) + if (NULL == ( rsp = zalloc(sizeof(*rsp)))) { - return cgi_error_memory(); + return NULL; } - if ( enlist_unique_header(rsp->headers, "Location", q) - || (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy"))) ) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->status = strdup("302 Local Redirect from Junkbuster"); + enlist_unique_header(rsp->headers, "Location", q); - return finish_http_response(rsp); + return(finish_http_response(rsp)); } else { - return NULL; + return(NULL); } } -#endif /* def FEATURE_FAST_REDIRECTS */ +#endif /* def FAST_REDIRECTS */ -#ifdef FEATURE_IMAGE_BLOCKING +#ifdef IMAGE_BLOCKING /********************************************************************* * * Function : is_imageurl * * Description : Given a URL, decide whether it is an image or not, * using either the info from a previous +image action - * or, #ifdef FEATURE_IMAGE_DETECT_MSIE, the info from - * the browser's accept header. - * + * or, #ifdef DETECT_MSIE_IMAGES, the info from the + * browser's accept header. + * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * @@ -1066,34 +714,28 @@ struct http_response *redirect_url(struct client_state *csp) *********************************************************************/ int is_imageurl(struct client_state *csp) { -#ifdef FEATURE_IMAGE_DETECT_MSIE - char *tmp; - - tmp = get_header_value(csp->headers, "User-Agent:"); - if (tmp && strstr(tmp, "MSIE")) +#ifdef DETECT_MSIE_IMAGES + if ((csp->accept_types + & (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE|ACCEPT_TYPE_MSIE_HTML)) + == (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE)) { - tmp = get_header_value(csp->headers, "Accept:"); - if (tmp && strstr(tmp, "image/gif")) - { - /* Client will accept HTML. If this seems counterintuitive, - * blame Microsoft. - */ - return(0); - } - else - { - return(1); - } + return 1; } -#endif /* def FEATURE_IMAGE_DETECT_MSIE */ + else if ((csp->accept_types + & (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE|ACCEPT_TYPE_MSIE_HTML)) + == (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_HTML)) + { + return 0; + } +#endif return ((csp->action->flags & ACTION_IMAGE) != 0); } -#endif /* def FEATURE_IMAGE_BLOCKING */ +#endif /* def IMAGE_BLOCKING */ -#ifdef FEATURE_COOKIE_JAR +#ifdef TRUST_FILES /********************************************************************* * * Function : is_untrusted_url @@ -1115,221 +757,211 @@ int is_untrusted_url(struct client_state *csp) { struct file_list *fl; struct block_spec *b; - struct url_spec **trusted_url; + struct url_spec url[1], **tl, *t; struct http_request rhttp[1]; - const char * referer; - jb_err err; + char *p, *h; /* * If we don't have a trustlist, we trust everybody */ if (((fl = csp->tlist) == NULL) || ((b = fl->f) == NULL)) { - return 0; + return(0); } - memset(rhttp, '\0', sizeof(*rhttp)); /* * Do we trust the request URL itself? */ + *url = dsplit(csp->http->host); + + /* if splitting the domain fails, punt */ + if (url->dbuf == NULL) return(0); + + memset(rhttp, '\0', sizeof(*rhttp)); + for (b = b->next; b ; b = b->next) { - if (url_match(b->url, csp->http)) + if ((b->url->port == 0) || (b->url->port == csp->http->port)) { - return b->reject; + if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0)) + { + if ((b->url->path == NULL) || +#ifdef REGEX + (regexec(b->url->preg, csp->http->path, 0, NULL, 0) == 0) +#else + (strncmp(b->url->path, csp->http->path, b->url->pathlen) == 0) +#endif + ) + { + freez(url->dbuf); + freez(url->dvec); + + if (b->reject == 0) return(0); + + return(1); + } + } } } - if (NULL == (referer = get_header_value(csp->headers, "Referer:"))) + freez(url->dbuf); + freez(url->dvec); + + if ((csp->referrer == NULL)|| (strlen(csp->referrer) <= 9)) { /* no referrer was supplied */ - return 1; + return(1); } - /* - * If not, do we maybe trust its referrer? + /* forge a URL from the referrer so we can use + * convert_url() to parse it into its components. */ + p = NULL; + p = strsav(p, "GET "); + p = strsav(p, csp->referrer + 9); /* skip over "Referer: " */ + p = strsav(p, " HTTP/1.0"); - /* - * Parse the URL from the referrer - */ + parse_http_request(p, rhttp, csp); + freez(p); - err = parse_http_url(referer, rhttp, csp); - if (err) + if (rhttp->cmd == NULL) { - return 1; + return(1); } - for (trusted_url = csp->config->trust_list; *trusted_url != NULL; trusted_url++) - { - if (url_match(*trusted_url, rhttp)) - { - /* if the URL's referrer is from a trusted referrer, then - * add the target spec to the trustfile as an unblocked - * domain and return NULL (which means it's OK). - */ - - FILE *fp; - if (NULL != (fp = fopen(csp->config->trustfile, "a"))) - { - char * path; - char * path_end; - char * new_entry = strdup("~"); + /* + * If not, do we maybe trust its referrer? + */ + *url = dsplit(rhttp->host); - string_append(&new_entry, csp->http->hostport); + /* if splitting the domain fails, punt */ + if (url->dbuf == NULL) return(1); - path = csp->http->path; - if ( (path[0] == '/') - && (path[1] == '~') - && ((path_end = strchr(path + 2, '/')) != NULL)) + for (tl = csp->config->trust_list; (t = *tl) ; tl++) + { + if ((t->port == 0) || (t->port == rhttp->port)) + { + if ((t->domain[0] == '\0') || domaincmp(t, url) == 0) + { + if ((t->path == NULL) || +#ifdef REGEX + (regexec(t->preg, rhttp->path, 0, NULL, 0) == 0) +#else + (strncmp(t->path, rhttp->path, t->pathlen) == 0) +#endif + ) { - /* since this path points into a user's home space - * be sure to include this spec in the trustfile. + /* if the URL's referrer is from a trusted referrer, then + * add the target spec to the trustfile as an unblocked + * domain and return NULL (which means it's OK). */ - int path_len = path_end - path; /* save offset */ - path = strdup(path); /* Copy string */ - if (path != NULL) + + FILE *fp; + + freez(url->dbuf); + freez(url->dvec); + + if ((fp = fopen(csp->config->trustfile, "a"))) { - path_end = path + path_len; /* regenerate ptr to new buffer */ - *(path_end + 1) = '\0'; /* Truncate path after '/' */ + h = NULL; + + h = strsav(h, "~"); + h = strsav(h, csp->http->hostport); + + p = csp->http->path; + if ((*p++ == '/') + && (*p++ == '~')) + { + /* since this path points into a user's home space + * be sure to include this spec in the trustfile. + */ + if ((p = strchr(p, '/'))) + { + *p = '\0'; + h = strsav(h, csp->http->path); /* FIXME: p?! */ + h = strsav(h, "/"); + } + } + + fprintf(fp, "%s\n", h); + freez(h); + fclose(fp); } - string_join(&new_entry, path); - } - - if (new_entry != NULL) - { - fprintf(fp, "%s\n", new_entry); - free(new_entry); - } - else - { - /* FIXME: No way to handle out-of memory, so mostly ignoring it */ - log_error(LOG_LEVEL_ERROR, "Out of memory adding pattern to trust file"); + return(0); } - - fclose(fp); } - return 0; } } - return 1; + return(1); } -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def TRUST_FILES */ /********************************************************************* * * Function : pcrs_filter_response * - * Description : Ecexute all text substitutions from all applying - * +filter actions on the text buffer that's been accumulated - * in csp->iob->buf. If this changes the contents, set - * csp->content_length to the modified size and raise the - * CSP_FLAG_MODIFIED flag. + * Description : Apply all the pcrs jobs from the joblist (re_filterfile) + * to the text buffer that's been accumulated in + * csp->iob->buf and set csp->content_length to the modified + * size. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * * Returns : a pointer to the (newly allocated) modified buffer. - * or NULL if there were no hits or something went wrong - * + * or NULL in case something went wrong + * *********************************************************************/ char *pcrs_filter_response(struct client_state *csp) { int hits=0; - size_t size; + int size = csp->iob->eod - csp->iob->cur; char *old = csp->iob->cur, *new = NULL; pcrs_job *job; struct file_list *fl; struct re_filterfile_spec *b; - struct list_entry *filtername; - /* - * Sanity first - */ - if (csp->iob->cur >= csp->iob->eod) + /* Sanity first ;-) */ + if (size <= 0) { return(NULL); } - size = csp->iob->eod - csp->iob->cur; - if ( ( NULL == (fl = csp->rlist) ) || ( NULL == fl->f) ) + if ( ( NULL == (fl = csp->rlist) ) || ( NULL == (b = fl->f) ) ) { log_error(LOG_LEVEL_ERROR, "Unable to get current state of regexp filtering."); return(NULL); } - /* - * If the body has a "chunked" transfer-encoding, - * get rid of it first, adjusting size and iob->eod - */ - if (csp->flags & CSP_FLAG_CHUNKED) + if ( NULL == b->joblist ) { - log_error(LOG_LEVEL_RE_FILTER, "Need to de-chunk first"); - if (0 == (size = remove_chunked_transfer_coding(csp->iob->cur, size))) - { - return(NULL); - } - csp->iob->eod = csp->iob->cur + size; - csp->flags |= CSP_FLAG_MODIFIED; + log_error(LOG_LEVEL_RE_FILTER, "Empty joblist. Nothing to do."); + return(NULL); } - /* - * For all applying +filter actions, look if a filter by that - * name exists and if yes, execute it's pcrs_joblist on the - * buffer. - */ - for (b = fl->f; b; b = b->next) - { - for (filtername = csp->action->multi[ACTION_MULTI_FILTER]->first; - filtername ; filtername = filtername->next) - { - if (strcmp(b->name, filtername->str) == 0) - { - int current_hits = 0; + log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) ...", + csp->http->hostport, csp->http->path, size); - if ( NULL == b->joblist ) - { - log_error(LOG_LEVEL_RE_FILTER, "Filter %s has empty joblist. Nothing to do.", b->name); - return(NULL); - } - - log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) with filter %s...", - csp->http->hostport, csp->http->path, size, b->name); - - /* Apply all jobs from the joblist */ - for (job = b->joblist; NULL != job; job = job->next) - { - current_hits += pcrs_execute(job, old, size, &new, &size); - if (old != csp->iob->cur) free(old); - old=new; - } - - log_error(LOG_LEVEL_RE_FILTER, " ...produced %d hits (new size %d).", current_hits, size); - hits += current_hits; - } - } - } - - /* - * If there were no hits, destroy our copy and let - * chat() use the original in csp->iob - */ - if (!hits) + /* Apply all jobs from the joblist */ + for (job = b->joblist; NULL != job; job = job->next) { - free(new); - return(NULL); + hits += pcrs_execute(job, old, size, &new, &size); + if (old != csp->iob->cur) free(old); + old=new; } - csp->flags |= CSP_FLAG_MODIFIED; + log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size); + csp->content_length = size; - IOB_RESET(csp); + /* fwiw, reset the iob */ + IOB_RESET(csp); return(new); } @@ -1339,37 +971,22 @@ char *pcrs_filter_response(struct client_state *csp) * * Function : gif_deanimate_response * - * Description : Deanimate the GIF image that has been accumulated in - * csp->iob->buf, set csp->content_length to the modified - * size and raise the CSP_FLAG_MODIFIED flag. + * Description : Deanimate the GIF image that has been accumulated in + * csp->iob->buf and set csp->content_length to the modified + * size. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * * Returns : a pointer to the (newly allocated) modified buffer. * or NULL in case something went wrong. - * + * *********************************************************************/ char *gif_deanimate_response(struct client_state *csp) { struct binbuffer *in, *out; char *p; - size_t size = csp->iob->eod - csp->iob->cur; - - /* - * If the body has a "chunked" transfer-encoding, - * get rid of it first, adjusting size and iob->eod - */ - if (csp->flags & CSP_FLAG_CHUNKED) - { - log_error(LOG_LEVEL_DEANIMATE, "Need to de-chunk first"); - if (0 == (size = remove_chunked_transfer_coding(csp->iob->cur, size))) - { - return(NULL); - } - csp->iob->eod = csp->iob->cur + size; - csp->flags |= CSP_FLAG_MODIFIED; - } + int size = csp->iob->eod - csp->iob->cur; if ( (NULL == (in = (struct binbuffer *)zalloc(sizeof *in ))) || (NULL == (out = (struct binbuffer *)zalloc(sizeof *out))) ) @@ -1390,80 +1007,13 @@ char *gif_deanimate_response(struct client_state *csp) } else { - if ((int)size == out->offset) - { - log_error(LOG_LEVEL_DEANIMATE, "GIF not changed."); - } - else - { - log_error(LOG_LEVEL_DEANIMATE, "Success! GIF shrunk from %d bytes to %d.", size, out->offset); - } + log_error(LOG_LEVEL_DEANIMATE, "Success! GIF shrunk from %d bytes to %d.", size, out->offset); csp->content_length = out->offset; - csp->flags |= CSP_FLAG_MODIFIED; p = out->buffer; free(in); free(out); return(p); - } - -} - - -/********************************************************************* - * - * Function : remove_chunked_transfer_coding - * - * Description : In-situ remove the "chunked" transfer coding as defined - * in rfc2616 from a buffer. - * - * Parameters : - * 1 : buffer = Pointer to the text buffer - * 2 : size = Number of bytes to be processed - * - * Returns : The new size, i.e. the number of bytes from buffer which - * are occupied by the stripped body, or 0 in case something - * went wrong - * - *********************************************************************/ -int remove_chunked_transfer_coding(char *buffer, const size_t size) -{ - size_t newsize = 0; - unsigned int chunksize = 0; - char *from_p, *to_p; - - assert(buffer); - from_p = to_p = buffer; - - if (sscanf(buffer, "%x", &chunksize) != 1) - { - log_error(LOG_LEVEL_ERROR, "Invalid first chunksize while stripping \"chunked\" transfer coding"); - return(0); - } - - while (chunksize > 0) - { - if (NULL == (from_p = strstr(from_p, "\r\n"))) - { - log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding"); - return(0); - } - newsize += chunksize; - from_p += 2; - - memmove(to_p, from_p, (size_t) chunksize); - to_p = buffer + newsize; - from_p += chunksize + 2; - - if (sscanf(from_p, "%x", &chunksize) != 1) - { - log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding"); - return(0); - } - } - - /* FIXME: Should this get its own loglevel? */ - log_error(LOG_LEVEL_RE_FILTER, "De-chunking successful. Shrunk from %d to %d\n", size, newsize); - return(newsize); + } } @@ -1481,7 +1031,7 @@ int remove_chunked_transfer_coding(char *buffer, const size_t size) * Returns : N/A * *********************************************************************/ -void url_actions(struct http_request *http, +void url_actions(struct http_request *http, struct client_state *csp) { struct file_list *fl; @@ -1513,23 +1063,48 @@ void url_actions(struct http_request *http, * Returns : N/A * *********************************************************************/ -void apply_url_actions(struct current_action_spec *action, - struct http_request *http, +void apply_url_actions(struct current_action_spec *action, + struct http_request *http, struct url_actions *b) { + struct url_spec url[1]; + if (b == NULL) { /* Should never happen */ return; } + *url = dsplit(http->host); + + /* if splitting the domain fails, punt */ + if (url->dbuf == NULL) + { + return; + } + for (b = b->next; NULL != b; b = b->next) { - if (url_match(b->url, http)) + if ((b->url->port == 0) || (b->url->port == http->port)) { - merge_current_action(action, b->action); + if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0)) + { + if ((b->url->path == NULL) || +#ifdef REGEX + (regexec(b->url->preg, http->path, 0, NULL, 0) == 0) +#else + (strncmp(b->url->path, http->path, b->url->pathlen) == 0) +#endif + ) + { + merge_current_action(action, b->action); + } + } } } + + freez(url->dbuf); + freez(url->dvec); } @@ -1549,24 +1124,229 @@ void apply_url_actions(struct current_action_spec *action, const struct forward_spec * forward_url(struct http_request *http, struct client_state *csp) { - static const struct forward_spec fwd_default[1] = { FORWARD_SPEC_INITIALIZER }; + static const struct forward_spec fwd_default[1] = { 0 }; /* All zeroes */ struct forward_spec *fwd = csp->config->forward; + struct url_spec url[1]; if (fwd == NULL) { - return fwd_default; + return(fwd_default); + } + + *url = dsplit(http->host); + + /* if splitting the domain fails, punt */ + if (url->dbuf == NULL) + { + return(fwd_default); } while (fwd != NULL) { - if (url_match(fwd->url, http)) + if ((fwd->url->port == 0) || (fwd->url->port == http->port)) { - return fwd; + if ((fwd->url->domain[0] == '\0') || (domaincmp(fwd->url, url) == 0)) + { + if ((fwd->url->path == NULL) || +#ifdef REGEX + (regexec(fwd->url->preg, http->path, 0, NULL, 0) == 0) +#else + (strncmp(fwd->url->path, http->path, fwd->url->pathlen) == 0) +#endif + ) + { + freez(url->dbuf); + freez(url->dvec); + return(fwd); + } + } } fwd = fwd->next; } - return fwd_default; + freez(url->dbuf); + freez(url->dvec); + return(fwd_default); + +} + + +/********************************************************************* + * + * Function : dsplit + * + * Description : Takes a domain and returns a pointer to a url_spec + * structure populated with dbuf, dcnt and dvec. The + * other fields in the structure that is returned are zero. + * + * Parameters : + * 1 : domain = a URL address + * + * Returns : url_spec structure populated with dbuf, dcnt and dvec. + * + *********************************************************************/ +struct url_spec dsplit(char *domain) +{ + struct url_spec ret[1]; + char *v[BUFFER_SIZE]; + int size; + char *p; + + memset(ret, '\0', sizeof(*ret)); + + if (domain[strlen(domain) - 1] == '.') + { + ret->unanchored |= ANCHOR_RIGHT; + } + + if (domain[0] == '.') + { + ret->unanchored |= ANCHOR_LEFT; + } + + ret->dbuf = strdup(domain); + + /* map to lower case */ + for (p = ret->dbuf; *p ; p++) *p = tolower(*p); + + /* split the domain name into components */ + ret->dcnt = ssplit(ret->dbuf, ".", v, SZ(v), 1, 1); + + if (ret->dcnt <= 0) + { + memset(ret, '\0', sizeof(ret)); + return(*ret); + } + + /* save a copy of the pointers in dvec */ + size = ret->dcnt * sizeof(*ret->dvec); + + if ((ret->dvec = (char **)malloc(size))) + { + memcpy(ret->dvec, v, size); + } + + return(*ret); + +} + + +/********************************************************************* + * + * Function : simple_domaincmp + * + * Description : Domain-wise Compare fqdn's. The comparison is + * both left- and right-anchored. The individual + * domain names are compared with simplematch(). + * This is only used by domaincmp. + * + * Parameters : + * 1 : pv = array of patterns to compare + * 2 : fv = array of domain components to compare + * 3 : len = length of the arrays (both arrays are the + * same length - if they weren't, it couldn't + * possibly be a match). + * + * Returns : 0 => domains are equivalent, else no match. + * + *********************************************************************/ +static int simple_domaincmp(char **pv, char **fv, int len) +{ + int n; + + for (n = 0; n < len; n++) + { + if (simplematch(pv[n], fv[n])) + { + return 1; + } + } + + return 0; + +} + + +/********************************************************************* + * + * Function : domaincmp + * + * Description : Domain-wise Compare fqdn's. Governed by the bimap in + * pattern->unachored, the comparison is un-, left-, + * right-anchored, or both. + * The individual domain names are compared with + * simplematch(). + * + * Parameters : + * 1 : pattern = a domain that may contain a '*' as a wildcard. + * 2 : fqdn = domain name against which the patterns are compared. + * + * Returns : 0 => domains are equivalent, else no match. + * + *********************************************************************/ +int domaincmp(struct url_spec *pattern, struct url_spec *fqdn) +{ + char **pv, **fv; /* vectors */ + int plen, flen; + int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT); + + plen = pattern->dcnt; + flen = fqdn->dcnt; + + if (flen < plen) + { + /* fqdn is too short to match this pattern */ + return 1; + } + + pv = pattern->dvec; + fv = fqdn->dvec; + + if (unanchored == ANCHOR_LEFT) + { + /* + * Right anchored. + * + * Convert this into a fully anchored pattern with + * the fqdn and pattern the same length + */ + fv += (flen - plen); /* flen - plen >= 0 due to check above */ + return simple_domaincmp(pv, fv, plen); + } + else if (unanchored == 0) + { + /* Fully anchored, check length */ + if (flen != plen) + { + return 1; + } + return simple_domaincmp(pv, fv, plen); + } + else if (unanchored == ANCHOR_RIGHT) + { + /* Left anchored, ignore all extra in fqdn */ + return simple_domaincmp(pv, fv, plen); + } + else + { + /* Unanchored */ + int n; + int maxn = flen - plen; + for (n = 0; n <= maxn; n++) + { + if (!simple_domaincmp(pv, fv, plen)) + { + return 0; + } + /* + * Doesn't match from start of fqdn + * Try skipping first part of fqdn + */ + fv++; + } + return 1; + } + } diff --git a/filters.h b/filters.h index 82b59cef..ec22e365 100644 --- a/filters.h +++ b/filters.h @@ -1,6 +1,6 @@ -#ifndef FILTERS_H_INCLUDED -#define FILTERS_H_INCLUDED -#define FILTERS_H_VERSION "$Id: filters.h,v 1.18 2002/03/25 22:12:45 oes Exp $" +#ifndef _FILTERS_H +#define _FILTERS_H +#define FILTERS_H_VERSION "$Id: filters.h,v 1.10 2001/06/29 13:29:01 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.h,v $ @@ -8,12 +8,13 @@ * Purpose : Declares functions to parse/crunch headers and pages. * Functions declared include: * `acl_addr', `add_stats', `block_acl', `block_imageurl', - * `block_url', `url_actions', `filter_popups', `forward_url' + * `block_url', `url_actions', `domaincmp', `dsplit', + * `filter_popups', `forward_url' * `ij_untrusted_url', `intercept_url', `re_process_buffer', * `show_proxy_args', and `trust_url' * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -39,36 +40,6 @@ * * Revisions : * $Log: filters.h,v $ - * Revision 1.18 2002/03/25 22:12:45 oes - * Added fix for undefined INADDR_NONE on Solaris by Bart Schelstraete - * - * Revision 1.17 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.16 2002/01/17 21:01:02 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Revision 1.15 2001/10/10 16:44:16 oes - * Added match_portlist function - * - * Revision 1.14 2001/10/07 15:41:40 oes - * Added prototype for remove_chunked_transfer_coding - * - * Revision 1.13 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.12 2001/07/29 19:01:11 jongfoster - * Changed _FILENAME_H to FILENAME_H_INCLUDED. - * Added forward declarations for needed structures. - * - * Revision 1.11 2001/07/13 14:00:18 oes - * - Introduced gif_deanimate_response - * - Renamed re_process_buffer to pcrs_filter_response - * - Removed all #ifdef PCRS - * * Revision 1.10 2001/06/29 13:29:01 oes * Cleaned up and updated to reflect the changesin * filters.c @@ -195,43 +166,32 @@ extern "C" { #endif - -struct access_control_addr; -struct client_state; -struct http_request; -struct http_response; -struct current_action_spec; -struct url_actions; -struct url_spec; - - /* * ACL checking */ -#ifdef FEATURE_ACL +#ifdef ACL_FILES extern int block_acl(struct access_control_addr *dst, struct client_state *csp); extern int acl_addr(char *aspec, struct access_control_addr *aca); -#endif /* def FEATURE_ACL */ -extern int match_portlist(const char *portlist, int port); +#endif /* def ACL_FILES */ /* * Interceptors */ extern struct http_response *block_url(struct client_state *csp); extern struct http_response *redirect_url(struct client_state *csp); -#ifdef FEATURE_COOKIE_JAR +#ifdef TRUST_FILES extern struct http_response *trust_url(struct client_state *csp); -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def TRUST_FILES */ /* * Request inspectors */ -#ifdef FEATURE_COOKIE_JAR +#ifdef TRUST_FILES extern int is_untrusted_url(struct client_state *csp); -#endif /* def FEATURE_COOKIE_JAR */ -#ifdef FEATURE_IMAGE_BLOCKING +#endif /* def TRUST_FILES */ +#ifdef IMAGE_BLOCKING extern int is_imageurl(struct client_state *csp); -#endif /* def FEATURE_IMAGE_BLOCKING */ +#endif /* def IMAGE_BLOCKING */ /* * Determining applicable actions @@ -246,19 +206,14 @@ extern void apply_url_actions(struct current_action_spec *action, */ extern const struct forward_spec *forward_url(struct http_request *http, struct client_state *csp); +extern struct url_spec dsplit(char *domain); +extern int domaincmp(struct url_spec *pattern, struct url_spec *fqdn); + /* * Content modification */ extern char *pcrs_filter_response(struct client_state *csp); extern char *gif_deanimate_response(struct client_state *csp); -extern int remove_chunked_transfer_coding(char *buffer, const size_t size); - -/* - * Solaris fix: - */ -#ifndef INADDR_NONE -#define INADDR_NONE -1 -#endif /* * Revision control strings from this header and associated .c file @@ -270,7 +225,7 @@ extern const char filters_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef FILTERS_H_INCLUDED */ +#endif /* ndef _FILTERS_H */ /* Local Variables: diff --git a/gateway.c b/gateway.c index cff71726..b7d4e33d 100644 --- a/gateway.c +++ b/gateway.c @@ -1,20 +1,20 @@ -const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; +const char gateway_rcs[] = "$Id: gateway.c,v 1.3 2001/06/09 10:55:28 jongfoster Exp $"; /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/gateway.c,v $ + * File : $Source: /cvsroot/ijbswa//current/gateway.c,v $ * * Purpose : Contains functions to connect to a server, possibly * using a "forwarder" (i.e. HTTP proxy and/or a SOCKS4 * proxy). * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -34,65 +34,6 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: gateway.c,v $ - * Revision 1.14 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.13 2002/03/13 00:29:59 jongfoster - * Killing warnings - * - * Revision 1.12 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.11 2002/03/08 17:46:04 jongfoster - * Fixing int/size_t warnings - * - * Revision 1.10 2002/03/07 03:50:19 oes - * - Improved handling of failed DNS lookups - * - Fixed compiler warnings - * - * Revision 1.9 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.8 2001/09/13 20:10:12 jongfoster - * Fixing missing #include under Windows - * - * Revision 1.7 2001/09/12 17:58:26 steudten - * - * add #include - * - * Revision 1.6 2001/09/10 10:41:16 oes - * Added #include in.h - * - * Revision 1.5 2001/07/29 18:47:57 jongfoster - * Adding missing #include project.h - * - * Revision 1.4 2001/07/24 12:47:06 oes - * Applied BeOS support update by Eugenia - * * Revision 1.3 2001/06/09 10:55:28 jongfoster * Changing BUFSIZ ==> BUFFER_SIZE * @@ -118,13 +59,7 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" #include #include - -#ifndef _WIN32 -#include -#endif - #include -#include #ifdef _WIN32 #include @@ -134,11 +69,6 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" #include #endif /* def __BEOS__ */ -#ifdef __OS2__ -#include -#endif /* def __OS2__ */ - -#include "project.h" #include "jcc.h" #include "errlog.h" #include "jbsockets.h" @@ -146,10 +76,10 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" const char gateway_h_rcs[] = GATEWAY_H_VERSION; -static jb_socket socks4_connect(const struct forward_spec * fwd, - const char * target_host, - int target_port, - struct client_state *csp); +static int socks4_connect(const struct forward_spec * fwd, + const char * target_host, + int target_port, + struct client_state *csp); #define SOCKS_REQUEST_GRANTED 90 @@ -193,9 +123,9 @@ static const char socks_userid[] = "anonymous"; * Returns : -1 => failure, else it is the socket file descriptor. * *********************************************************************/ -jb_socket forwarded_connect(const struct forward_spec * fwd, - struct http_request *http, - struct client_state *csp) +int forwarded_connect(const struct forward_spec * fwd, + struct http_request *http, + struct client_state *csp) { const char * dest_host; int dest_port; @@ -228,7 +158,7 @@ jb_socket forwarded_connect(const struct forward_spec * fwd, /* Should never get here */ log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type."); errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } } @@ -251,19 +181,19 @@ jb_socket forwarded_connect(const struct forward_spec * fwd, * Returns : -1 => failure, else a socket file descriptor. * *********************************************************************/ -static jb_socket socks4_connect(const struct forward_spec * fwd, - const char * target_host, - int target_port, - struct client_state *csp) +static int socks4_connect(const struct forward_spec * fwd, + const char * target_host, + int target_port, + struct client_state *csp) { int web_server_addr; - char cbuf[BUFFER_SIZE]; - char sbuf[BUFFER_SIZE]; + unsigned char cbuf[BUFFER_SIZE]; + unsigned char sbuf[BUFFER_SIZE]; struct socks_op *c = (struct socks_op *)cbuf; struct socks_reply *s = (struct socks_reply *)sbuf; - size_t n; - size_t csiz; - jb_socket sfd; + int n; + int csiz; + int sfd; int err = 0; char *errstr; @@ -282,7 +212,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, if (err) { errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } /* build a socks request for connection to the web server */ @@ -295,11 +225,6 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, { case SOCKS_4: web_server_addr = htonl(resolve_hostname_to_ip(target_host)); - if (web_server_addr == INADDR_NONE) - { - log_error(LOG_LEVEL_CONNECT, "socks4_connect: could not resolve target host %s", target_host); - return(JB_INVALID_SOCKET); - } break; case SOCKS_4A: web_server_addr = 0x00000001; @@ -307,16 +232,16 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, if (n > sizeof(cbuf)) { errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } - strcpy(cbuf + csiz, target_host); + strcpy(((char *)cbuf) + csiz, target_host); csiz = n; break; default: /* Should never get here */ log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type."); errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } c->vn = 4; @@ -331,23 +256,23 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, /* pass the request to the socks server */ sfd = connect_to(fwd->gateway_host, fwd->gateway_port, csp); - if (sfd == JB_INVALID_SOCKET) + if (sfd < 0) { - return(JB_INVALID_SOCKET); + return(-1); } - if (write_socket(sfd, (char *)c, csiz)) + if ((n = write_socket(sfd, (char *)c, csiz)) != csiz) { log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation write failed..."); close_socket(sfd); - return(JB_INVALID_SOCKET); + return(-1); } - if (read_socket(sfd, sbuf, sizeof(sbuf)) != sizeof(*s)) + if ((n = read_socket(sfd, sbuf, sizeof(sbuf))) != sizeof(*s)) { log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation read failed..."); close_socket(sfd); - return(JB_INVALID_SOCKET); + return(-1); } switch (s->cd) @@ -371,7 +296,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, errno = EACCES; break; default: - errstr = cbuf; + errstr = (char *) cbuf; errno = ENOENT; sprintf(errstr, "SOCKS request rejected for reason code %d\n", s->cd); @@ -380,7 +305,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s ...", errstr); close_socket(sfd); - return(JB_INVALID_SOCKET); + return(-1); } diff --git a/gateway.h b/gateway.h index d96bc58d..5f1eb826 100644 --- a/gateway.h +++ b/gateway.h @@ -1,6 +1,6 @@ -#ifndef GATEWAY_H_INCLUDED -#define GATEWAY_H_INCLUDED -#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.6 2002/03/25 22:12:45 oes Exp $" +#ifndef _GATEWAY_H +#define _GATEWAY_H +#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/gateway.h,v $ @@ -10,7 +10,7 @@ * proxy). Also contains the list of gateway types. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -36,48 +36,6 @@ * * Revisions : * $Log: gateway.h,v $ - * Revision 1.6 2002/03/25 22:12:45 oes - * Added fix for undefined INADDR_NONE on Solaris by Bart Schelstraete - * - * Revision 1.5 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.4 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.3 2001/07/29 18:58:15 jongfoster - * Removing nested #includes, adding forward declarations for needed - * structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED. - * - * Revision 1.2 2001/06/07 23:12:14 jongfoster - * Removing gateways[] list - no longer used. - * Replacing function pointer in struct gateway with a directly - * called function forwarded_connect(), which can do the common - * task of deciding whether to connect to the web server or HTTP - * proxy. - * Replacing struct gateway with struct forward_spec - * * Revision 1.1.1.1 2001/05/15 13:58:54 oes * Initial import of version 2.9.3 source tree * @@ -85,28 +43,17 @@ *********************************************************************/ +#include "project.h" + #ifdef __cplusplus extern "C" { #endif -struct forward_spec; -struct http_request; -struct client_state; +extern int forwarded_connect(const struct forward_spec * fwd, + struct http_request *http, + struct client_state *csp); -extern jb_socket forwarded_connect(const struct forward_spec * fwd, - struct http_request *http, - struct client_state *csp); - -/* - * Solaris fix - */ -#ifndef INADDR_NONE -#define INADDR_NONE -1 -#endif - -/* - * Revision control strings from this header and associated .c file - */ +/* Revision control strings from this header and associated .c file */ extern const char gateway_rcs[]; extern const char gateway_h_rcs[]; @@ -114,7 +61,7 @@ extern const char gateway_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef GATEWAY_H_INCLUDED */ +#endif /* ndef _GATEWAY_H */ /* Local Variables: diff --git a/icons/denyrule.ico b/icons/denyrule.ico new file mode 100644 index 0000000000000000000000000000000000000000..e5aa250604fb73ae2bedf554aed994cdac982f02 GIT binary patch literal 318 zcmZvXF%H5o6hmJnB$SCxtT1xSGBMIMw~5pP^bClhbH##0rC=vy!-?%L|No@~I-S1n zF)ke(?V^*j*s+sBD*8_b&}A5^NmY_klDm=1C1+Qnjw4G$7*z#`Q7$$Qs@)55ERNhG z3fvN+5+TI8BJ-$4f!8$h+o_wLZtxS94@|Gh=K>FLo#B0l?Ib_wFMGI7a9d&C{PxN( D6JJL~ literal 0 HcmV?d00001 diff --git a/icons/icon1.ico b/icons/icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..b96fe7c27d160d8fd002a84ab474d95dc5124340 GIT binary patch literal 318 zcmZvW!3{zo5JVru0yuf~hm&1cnso3>uoZ5<4HFyCn_k2j_(n|}csrBbB>{p?N(pNp zU~3odOd_yRh1%=CQb3ndhN&u2Yn6M@`lU4|q2rdzM{&fMryg?7_PDyb9z-?Y?i|;i oSNq`Gz0l;vw4L1;~mrO#lD@ literal 0 HcmV?d00001 diff --git a/icons/idle.ico b/icons/idle.ico index 5ef20fc1391b376205c3c83346a7754fc6f4df97..99470b54e0402ab4b18229f78ee0eb5121583796 100644 GIT binary patch delta 102 zcmdnTw2x`Rgcv0dU|`T%rL=055(CpJtwlhjpah|nFlZ&PJWvaeUIo$$;WI&K1qKMs L0H#+>d=mr!__HIV delta 102 zcmdnTw2x`Rgcz+wN=ix$3`!812|_C^9SR6#JS_M)GqE~_GMM_9C6GU7AXbwmn L&^!>B_$CMdJ?tAS diff --git a/icons/privoxy.ico b/icons/junkbust.ico similarity index 59% rename from icons/privoxy.ico rename to icons/junkbust.ico index 4c96d0b1a9d1f10fb1494c06c6ff05cd936a0710..41aafd0a203a7c7e451b068f5a08b265e775b72b 100644 GIT binary patch delta 102 zcmdnTw2x`RgqSlRz`$_+|C#^)&oJ=(KmP}a4xE9|XE5k9V0oYxApIYt6~gC%&<7YG MGy|CaKk-cv0Cy};9smFU delta 102 zcmdnTw2x`RgqZVx&YU^Jz;Fga^FZhWXCO3C3M>wy|NjT61kwM&^q(_GG!I1l0MHze MI-q$VF!46nx4Guxtph3RP*8Qe|#n#HrHd7%o$$GmoHFmD?PH2Us9iaOqM=WdTB% znRz75T?B;|4{R?=f z^qU3zEChCf7^6nXlG4$!3cqXV?wB>T&g(91X*X|NcWs}a>C*o&E&g@Ug`D&V(4}$+ zecwYoe^oK~p?lkiHVf z9OhzmeIJR~nV#_dAS2`4G4_sd$xlp)k;EiC^bO9PkEq8uFYf{frrtd3(k|^sHp(Ij z7XSakkcCGWqw@uEoz%wY?8|$cm0H23QhKzNE_Ad`2w%co_zAoP9)MR7XAN8d`LZs7 z_rNn81WfB13>Z&vLIcFPf=1zI7&Gsf-MC7kEBff9J|LQ>KgI|S%kp^x@9~{w3F-U1&f|bp%hEpH|8jdom z)^Z3`ot8u35zZ$vh}--vr*eb2I5V8z>74#pOPWv&x|aMMw{HSVT$_BHW7ge3#P{V? zuHCf22@BaahT&&@f8;Vko+ixY)2cVUgZ<0Wc_G9-UC69vi5e;Xb&#~XO^vA;$ z4X5*kj}7ffoyZ;O$${2`>lMFhIcK!3H!hjj)mCx9nsEvBej@;MgiwW%DN;&QHF9zA zIx~`{lER;O?SaRZw^o&*|6|G(^*-NeMzer3^HL*bQ8Gr0(ct2Er+cev3$@bcEH!FJ QeY>h2Rk^Q4KNmS@c4K68GY3E^T+pKH^)@F2e P9o)~%e1Qv{?GC&F|Die+ diff --git a/icons/os22.ico b/icons/os22.ico deleted file mode 100644 index d357dfba4eaefb36918d3f104f07017d465a5afa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmbtQu?@m75WE-)I@kcqWu^$EqG1B2U;>XqohdvLqM|c*ej_7c(Qxnkd;i7%QjUiU z8s^iPmkr}VoyZ;O$$`;>>oq@mIcKz~R}PuzYN|M3&HN2{zYzf*#Aw3I5-BCBj9d=5 zofXMYOX*KM_rQJ2T`Obk|Cq8x-upYf(ObZU;H816qC!`yD-yg(KQDxwv1*_?Yus$k LQs<3rPu=?hUAQ={ diff --git a/icons/os23.ico b/icons/os23.ico deleted file mode 100644 index 8ac037f045701b0bed5cadc3586b3d31ecfb3755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmbtQu?+$-5c3BLI@o~Mm6_s!iiQc8f(bGTb*9Kjh>9-QNzfyRXz<17obPid{eE}G zjKlH7V#T;qCvroM}sksV9EGx>ixC^@F1lIMy8miiBzNd z0k<=w=qf4vX^$;%TXWZdk_3Vb;*nzIUzc N(G+j3f%fr+2VT1WI5hwO diff --git a/icons/os26.ico b/icons/os26.ico deleted file mode 100644 index 408d89efd66fed1304cfe0cfa40295a27fba7ad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmbu5!41MN3`O0-0dav1h&oAu6Bj063MR-bJ!XoIgg9{v@5i7Z5pm%=-{1LeY^jI+ z#VU@cGnW-{M@P7Y0d_RETup3*qPln>{>Wu`^S_m>b<|y8@)B_hapG@fJ{<~EEJN;*UE72P -#ifndef __OS2__ #include -#endif #else #include #endif -#if defined(__EMX__) || defined (__OS2__) -#include /* OS/2/EMX needs a little help with select */ -#ifdef __OS2__ -#include -#endif -#endif - #endif #include "project.h" @@ -227,72 +136,58 @@ const char jbsockets_h_rcs[] = JBSOCKETS_H_VERSION; * 3 : csp = Current client state (buffers, headers, etc...) * Not modified, only used for source IP and ACL. * - * Returns : JB_INVALID_SOCKET => failure, else it is the socket - * file descriptor. + * Returns : -1 => failure, else it is the socket file descriptor. * *********************************************************************/ -jb_socket connect_to(const char *host, int portnum, struct client_state *csp) +int connect_to(const char *host, int portnum, struct client_state *csp) { struct sockaddr_in inaddr; - jb_socket fd; - int addr; + int fd, addr; fd_set wfds; struct timeval tv[1]; #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) int flags; #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ -#ifdef FEATURE_ACL +#ifdef ACL_FILES struct access_control_addr dst[1]; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ memset((char *)&inaddr, 0, sizeof inaddr); - if ((addr = resolve_hostname_to_ip(host)) == INADDR_NONE) + if ((addr = resolve_hostname_to_ip(host)) == -1) { csp->http->host_ip_addr_str = strdup("unknown"); - return(JB_INVALID_SOCKET); + return(-1); } -#ifdef FEATURE_ACL - dst->addr = ntohl((unsigned long) addr); +#ifdef ACL_FILES + dst->addr = ntohl(addr); dst->port = portnum; if (block_acl(dst, csp)) { -#ifdef __OS2__ - errno = SOCEPERM; -#else errno = EPERM; -#endif - return(JB_INVALID_SOCKET); + return(-1); } -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ inaddr.sin_addr.s_addr = addr; inaddr.sin_family = AF_INET; csp->http->host_ip_addr_str = strdup(inet_ntoa(inaddr.sin_addr)); -#ifndef _WIN32 if (sizeof(inaddr.sin_port) == sizeof(short)) -#endif /* ndef _WIN32 */ { - inaddr.sin_port = htons((unsigned short) portnum); + inaddr.sin_port = htons((short)portnum); } -#ifndef _WIN32 else { - inaddr.sin_port = htonl((unsigned long)portnum); + inaddr.sin_port = htonl(portnum); } -#endif /* ndef _WIN32 */ -#ifdef _WIN32 - if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) == JB_INVALID_SOCKET) -#else if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) < 0) -#endif { - return(JB_INVALID_SOCKET); + return(-1); } #ifdef TCP_NODELAY @@ -302,45 +197,39 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) } #endif /* def TCP_NODELAY */ -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) if ((flags = fcntl(fd, F_GETFL, 0)) != -1) { flags |= O_NDELAY; fcntl(fd, F_SETFL, flags); } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ - while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == JB_INVALID_SOCKET) + while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == -1) { #ifdef _WIN32 if (errno == WSAEINPROGRESS) -#elif __OS2__ - if (sock_errno() == EINPROGRESS) #else /* ifndef _WIN32 */ if (errno == EINPROGRESS) -#endif /* ndef _WIN32 || __OS2__ */ +#endif /* ndef _WIN32 */ { break; } -#ifdef __OS2__ - if (sock_errno() != EINTR) -#else if (errno != EINTR) -#endif /* __OS2__ */ { close_socket(fd); - return(JB_INVALID_SOCKET); + return(-1); } } -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) if (flags != -1) { flags &= ~O_NDELAY; fcntl(fd, F_SETFL, flags); } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ /* wait for connection to complete */ FD_ZERO(&wfds); @@ -349,11 +238,10 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) tv->tv_sec = 30; tv->tv_usec = 0; - /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */ - if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0) + if (select(fd + 1, NULL, &wfds, NULL, tv) <= 0) { close_socket(fd); - return(JB_INVALID_SOCKET); + return(-1); } return(fd); @@ -371,51 +259,24 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) * 2 : buf = pointer to data to be written. * 3 : len = length of data to be written to the socket "fd". * - * Returns : 0 on success (entire buffer sent). - * nonzero on error. + * Returns : Win32 & Unix: If no error occurs, returns the total number of + * bytes sent, which can be less than the number + * indicated by len. Otherwise, returns (-1). * *********************************************************************/ -int write_socket(jb_socket fd, const char *buf, size_t len) +int write_socket(int fd, const char *buf, int len) { - if (len == 0) - { - return 0; - } - - if (len < 0) + if (len <= 0) { - return 1; + return(0); } log_error(LOG_LEVEL_LOG, "%N", len, buf); -#if defined(_WIN32) - return (send(fd, buf, (int)len, 0) != (int)len); -#elif defined(__BEOS__) || defined(AMIGA) - return (send(fd, buf, len, 0) != len); -#elif defined(__OS2__) - /* - * Break the data up into SOCKET_SEND_MAX chunks for sending... - * OS/2 seemed to complain when the chunks were too large. - */ -#define SOCKET_SEND_MAX 65000 - { - int write_len = 0, send_len, send_rc = 0, i = 0; - while ((i < len) && (send_rc != -1)) - { - if ((i + SOCKET_SEND_MAX) > len) - send_len = len - i; - else - send_len = SOCKET_SEND_MAX; - send_rc = send(fd,(char*)buf + i, send_len, 0); - if (send_rc == -1) - return 1; - i = i + send_len; - } - return 0; - } +#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA) + return( send(fd, buf, len, 0)); #else - return (write(fd, buf, len) != len); + return( write(fd, buf, len)); #endif } @@ -439,26 +300,24 @@ int write_socket(jb_socket fd, const char *buf, size_t len) * smaller than the number of bytes requested; this may hap- * pen for example because fewer bytes are actually available * right now (maybe because we were close to end-of-file, or - * because we are reading from a pipe, or from a terminal, - * or because read() was interrupted by a signal). On error, + * because we are reading from a pipe, or from a terminal), + * or because read() was interrupted by a signal. On error, * -1 is returned, and errno is set appropriately. In this * case it is left unspecified whether the file position (if * any) changes. * *********************************************************************/ -int read_socket(jb_socket fd, char *buf, int len) +int read_socket(int fd, char *buf, int len) { if (len <= 0) { return(0); } -#if defined(_WIN32) - return(recv(fd, buf, len, 0)); -#elif defined(__BEOS__) || defined(AMIGA) || defined(__OS2__) - return(recv(fd, buf, (size_t)len, 0)); +#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA) + return( recv(fd, buf, len, 0)); #else - return(read(fd, buf, (size_t)len)); + return( read(fd, buf, len)); #endif } @@ -475,14 +334,12 @@ int read_socket(jb_socket fd, char *buf, int len) * Returns : void * *********************************************************************/ -void close_socket(jb_socket fd) +void close_socket(int fd) { #if defined(_WIN32) || defined(__BEOS__) closesocket(fd); #elif defined(AMIGA) CloseSocket(fd); -#elif defined(__OS2__) - soclose(fd); #else close(fd); #endif @@ -500,69 +357,44 @@ void close_socket(jb_socket fd) * Parameters : * 1 : hostnam = TCP/IP address to bind/listen to * 2 : portnum = port to listen on - * 3 : pfd = pointer used to return file descriptor. * - * Returns : if success, returns 0 and sets *pfd. - * if failure, returns -3 if address is in use, - * -2 if address unresolvable, - * -1 otherwise + * Returns : if success, return file descriptor + * if failure, returns -2 if address is in use, otherwise -1 + * *********************************************************************/ -int bind_port(const char *hostnam, int portnum, jb_socket *pfd) +int bind_port(const char *hostnam, int portnum) { struct sockaddr_in inaddr; - jb_socket fd; -#ifndef _WIN32 + int fd; int one = 1; -#endif /* ndef _WIN32 */ - - *pfd = JB_INVALID_SOCKET; memset((char *)&inaddr, '\0', sizeof inaddr); inaddr.sin_family = AF_INET; inaddr.sin_addr.s_addr = resolve_hostname_to_ip(hostnam); - if (inaddr.sin_addr.s_addr == INADDR_NONE) - { - return(-2); - } - -#ifndef _WIN32 if (sizeof(inaddr.sin_port) == sizeof(short)) -#endif /* ndef _WIN32 */ { - inaddr.sin_port = htons((unsigned short) portnum); + inaddr.sin_port = htons((short)portnum); } -#ifndef _WIN32 else { - inaddr.sin_port = htonl((unsigned long) portnum); + inaddr.sin_port = htonl(portnum); } -#endif /* ndef _WIN32 */ fd = socket(AF_INET, SOCK_STREAM, 0); -#ifdef _WIN32 - if (fd == JB_INVALID_SOCKET) -#else if (fd < 0) -#endif { return(-1); } #ifndef _WIN32 /* - * This is not needed for Win32 - in fact, it stops + * FIXME: This is not needed for Win32 - in fact, it stops * duplicate instances of JunkBuster from being caught. - * - * On UNIX, we assume the user is sensible enough not - * to start JunkBuster multiple times on the same IP. - * Without this, stopping and restarting JunkBuster - * from a script fails. - * Note: SO_REUSEADDR is meant to only take over - * sockets which are *not* in listen state in Linux, - * e.g. sockets in TIME_WAIT. YMMV. + * Is this really needed under UNIX, or should it be taked out? + * -- Jon */ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); #endif /* ndef _WIN32 */ @@ -576,7 +408,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) if (errno == EADDRINUSE) #endif { - return(-3); + return(-2); } else { @@ -592,8 +424,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) } } - *pfd = fd; - return 0; + return fd; } @@ -614,45 +445,23 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) * On an error it returns 0 (FALSE). * *********************************************************************/ -int accept_connection(struct client_state * csp, jb_socket fd) +int accept_connection(struct client_state * csp, int fd) { struct sockaddr_in client, server; struct hostent *host = NULL; - jb_socket afd; -#if defined(_WIN32) || defined(__OS2__) - /* Wierdness - fix a warning. */ - int c_length, s_length; -#else - size_t c_length, s_length; -#endif -#if defined(HAVE_GETHOSTBYADDR_R_8_ARGS) || defined(HAVE_GETHOSTBYADDR_R_7_ARGS) || defined(HAVE_GETHOSTBYADDR_R_5_ARGS) - struct hostent result; -#if defined(HAVE_GETHOSTBYADDR_R_5_ARGS) - struct hostent_data hdata; -#else - char hbuf[HOSTENT_BUFFER_SIZE]; - int thd_err; -#endif /* def HAVE_GETHOSTBYADDR_R_5_ARGS */ -#endif /* def HAVE_GETHOSTBYADDR_R_(8|7|5)_ARGS */ + int afd, c_length, s_length; c_length = s_length = sizeof(client); -#ifdef _WIN32 - afd = accept (fd, (struct sockaddr *) &client, &c_length); - if (afd == JB_INVALID_SOCKET) - { - return 0; - } -#else do { afd = accept (fd, (struct sockaddr *) &client, &c_length); } while (afd < 1 && errno == EINTR); + if (afd < 0) { return 0; } -#endif /* * Determine the IP-Adress that the client used to reach us @@ -661,30 +470,8 @@ int accept_connection(struct client_state * csp, jb_socket fd) if (!getsockname(afd, (struct sockaddr *) &server, &s_length)) { csp->my_ip_addr_str = strdup(inet_ntoa(server.sin_addr)); -#if defined(HAVE_GETHOSTBYADDR_R_8_ARGS) - gethostbyaddr_r((const char *)&server.sin_addr, - sizeof(server.sin_addr), AF_INET, - &result, hbuf, HOSTENT_BUFFER_SIZE, - &host, &thd_err); -#elif defined(HAVE_GETHOSTBYADDR_R_7_ARGS) - host = gethostbyaddr_r((const char *)&server.sin_addr, - sizeof(server.sin_addr), AF_INET, - &result, hbuf, HOSTENT_BUFFER_SIZE, &thd_err); -#elif defined(HAVE_GETHOSTBYADDR_R_5_ARGS) - if (0 == gethostbyaddr_r((const char *)&server.sin_addr, - sizeof(server.sin_addr), AF_INET, - &result, &hdata)) - { - host = &result; - } - else - { - host = NULL; - } -#else - host = gethostbyaddr((const char *)&server.sin_addr, - sizeof(server.sin_addr), AF_INET); -#endif + + host = gethostbyaddr(&server.sin_addr, sizeof(server.sin_addr), AF_INET); if (host == NULL) { log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %E\n"); @@ -714,22 +501,13 @@ int accept_connection(struct client_state * csp, jb_socket fd) * Parameters : * 1 : host = hostname to resolve * - * Returns : INADDR_NONE => failure, INADDR_ANY or tcp/ip address if succesful. + * Returns : -1 => failure, INADDR_ANY or tcp/ip address if succesful. * *********************************************************************/ -unsigned long resolve_hostname_to_ip(const char *host) +int resolve_hostname_to_ip(const char *host) { struct sockaddr_in inaddr; struct hostent *hostp; -#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS) - struct hostent result; -#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) - char hbuf[HOSTENT_BUFFER_SIZE]; - int thd_err; -#else /* defined(HAVE_GETHOSTBYNAME_R_3_ARGS) */ - struct hostent_data hdata; -#endif /* def HAVE_GETHOSTBYNAME_R_(6|5)_ARGS */ -#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */ if ((host == NULL) || (*host == '\0')) { @@ -740,29 +518,10 @@ unsigned long resolve_hostname_to_ip(const char *host) if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1) { -#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) - gethostbyname_r(host, &result, hbuf, - HOSTENT_BUFFER_SIZE, &hostp, &thd_err); -#elif defined(HAVE_GETHOSTBYNAME_R_5_ARGS) - hostp = gethostbyname_r(host, &result, hbuf, - HOSTENT_BUFFER_SIZE, &thd_err); -#elif defined(HAVE_GETHOSTBYNAME_R_3_ARGS) - if (0 == gethostbyname_r(host, &result, &hdata)) - { - hostp = &result; - } - else - { - hostp = NULL; - } -#else - hostp = gethostbyname(host); -#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */ - if (hostp == NULL) + if ((hostp = gethostbyname(host)) == NULL) { errno = EINVAL; - log_error(LOG_LEVEL_ERROR, "could not resolve hostname %s", host); - return(INADDR_NONE); + return(-1); } if (hostp->h_addrtype != AF_INET) { @@ -770,9 +529,8 @@ unsigned long resolve_hostname_to_ip(const char *host) errno = WSAEPROTOTYPE; #else errno = EPROTOTYPE; -#endif - log_error(LOG_LEVEL_ERROR, "hostname %s resolves to unknown address type.", host); - return(INADDR_NONE); +#endif + return(-1); } memcpy( (char *) &inaddr.sin_addr, diff --git a/jbsockets.h b/jbsockets.h index 31393301..7c1ee588 100644 --- a/jbsockets.h +++ b/jbsockets.h @@ -1,6 +1,6 @@ -#ifndef JBSOCKETS_H_INCLUDED -#define JBSOCKETS_H_INCLUDED -#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.7 2002/03/24 13:25:43 swa Exp $" +#ifndef _JBSOCKETS_H +#define _JBSOCKETS_H +#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jbsockets.h,v $ @@ -11,7 +11,7 @@ * on many platforms. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,47 +37,6 @@ * * Revisions : * $Log: jbsockets.h,v $ - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.5 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.4 2002/03/07 03:51:36 oes - * - Improved handling of failed DNS lookups - * - Fixed compiler warnings etc - * - * Revision 1.3 2001/07/29 19:01:11 jongfoster - * Changed _FILENAME_H to FILENAME_H_INCLUDED. - * Added forward declarations for needed structures. - * - * Revision 1.2 2001/06/07 23:06:09 jongfoster - * The host parameter to connect_to() is now const. - * * Revision 1.1.1.1 2001/05/15 13:58:54 oes * Initial import of version 2.9.3 source tree * @@ -85,23 +44,19 @@ *********************************************************************/ -#include "project.h" - #ifdef __cplusplus extern "C" { #endif -struct client_state; - -extern jb_socket connect_to(const char *host, int portnum, struct client_state *csp); -extern int write_socket(jb_socket fd, const char *buf, size_t n); -extern int read_socket(jb_socket fd, char *buf, int n); -extern void close_socket(jb_socket fd); +extern int connect_to(const char *host, int portnum, struct client_state *csp); +extern int write_socket(int fd, const char *buf, int n); +extern int read_socket(int fd, char *buf, int n); +extern void close_socket(int fd); -extern int bind_port(const char *hostnam, int portnum, jb_socket *pfd); -extern int accept_connection(struct client_state * csp, jb_socket fd); +extern int bind_port(const char *hostnam, int portnum); +extern int accept_connection(struct client_state * csp, int fd); -extern unsigned long resolve_hostname_to_ip(const char *host); +extern int resolve_hostname_to_ip(const char *host); /* Revision control strings from this header and associated .c file */ extern const char jbsockets_rcs[]; @@ -111,7 +66,7 @@ extern const char jbsockets_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef JBSOCKETS_H_INCLUDED */ +#endif /* ndef _JBSOCKETS_H */ /* Local Variables: diff --git a/jcc.c b/jcc.c index f3cd6e96..78c66bd5 100644 --- a/jcc.c +++ b/jcc.c @@ -1,19 +1,19 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.28 2001/07/23 13:26:12 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ * - * Purpose : Main file. Contains main() method, main loop, and + * Purpose : Main file. Contains main() method, main loop, and * the main connection-handling function. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -33,266 +33,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; * * Revisions : * $Log: jcc.c,v $ - * Revision 1.87 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.86 2002/03/25 17:04:55 david__schmidt - * Workaround for closing the jarfile before load_config() comes around again - * - * Revision 1.85 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.84 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.83 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.82 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.81 2002/03/12 01:42:50 oes - * Introduced modular filters - * - * Revision 1.80 2002/03/11 22:07:05 david__schmidt - * OS/2 port maintenance: - * - Fixed EMX build - it had decayed a little - * - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro. - * substituted a memset for now. - * - * Revision 1.79 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.78 2002/03/08 21:35:04 oes - * Added optional group supplement to --user option. Will now use default group of user if no group given - * - * Revision 1.77 2002/03/07 03:52:06 oes - * - Fixed compiler warnings etc - * - Improved handling of failed DNS lookups - * - * Revision 1.76 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.75 2002/03/06 10:02:19 oes - * Fixed stupid bug when --user was not given - * - * Revision 1.74 2002/03/06 00:49:31 jongfoster - * Fixing warning on Windows - * Making #ifdefs that refer to the same variable consistently - * use #ifdef unix rather than mixing #ifdef unix & #ifndef OS2 - * - * Revision 1.73 2002/03/05 23:57:30 hal9 - * Stray character 's' on line 1618 was breaking build. - * - * Revision 1.72 2002/03/05 21:33:45 david__schmidt - * - Re-enable OS/2 building after new parms were added - * - Fix false out of memory report when resolving CGI templates when no IP - * address is available of failed attempt (a la no such domain) - * - * Revision 1.71 2002/03/05 18:13:56 oes - * Added --user option - * - * Revision 1.70 2002/03/05 04:52:42 oes - * Deleted non-errlog debugging code - * - * Revision 1.69 2002/03/04 23:50:00 jongfoster - * Splitting off bind_port() call into bind_port_helper(), with - * improved logging. - * - * Revision 1.68 2002/03/04 20:17:32 oes - * Fixed usage info - * - * Revision 1.67 2002/03/04 18:18:57 oes - * - Removed _DEBUG mode - * - Cleand up cmdline parsing - * - Introduced --no-daemon, --pidfile options - * - Cleaned up signal handling: - * - Terminate cleanly on INT, TERM and ABRT - * - Schedule logfile for re-opening on HUP - * - Ignore CHLD and PIPE - * - Leave the rest with their default handlers - * - Uniform handler registration - * - Added usage() function - * - Played styleguide police - * - * Revision 1.66 2002/03/03 15:06:55 oes - * Re-enabled automatic config reloading - * - * Revision 1.65 2002/03/03 14:49:11 oes - * Fixed CLF logging: Now uses client's original HTTP request - * - * Revision 1.64 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.63 2002/03/02 04:14:50 david__schmidt - * Clean up a little CRLF unpleasantness that suddenly appeared - * - * Revision 1.62 2002/02/20 23:17:23 jongfoster - * Detecting some out-of memory conditions and exiting with a log message. - * - * Revision 1.61 2002/01/17 21:01:52 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Revision 1.60 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.59 2001/12/13 14:07:18 oes - * Fixed Bug: 503 error page now sent OK - * - * Revision 1.58 2001/11/30 23:37:24 jongfoster - * Renaming the Win32 config file to config.txt - this is almost the - * same as the corresponding UNIX name "config" - * - * Revision 1.57 2001/11/16 00:47:43 jongfoster - * Changing the tty-disconnection code to use setsid(). - * - * Revision 1.56 2001/11/13 20:20:54 jongfoster - * Tabs->spaces, fixing a bug with missing {} around an if() - * - * Revision 1.55 2001/11/13 20:14:53 jongfoster - * Patch for FreeBSD setpgrp() as suggested by Alexander Lazic - * - * Revision 1.54 2001/11/07 00:03:14 steudten - * Give reliable return value if an error - * occurs not just 0 with new daemon mode. - * - * Revision 1.53 2001/11/05 21:41:43 steudten - * Add changes to be a real daemon just for unix os. - * (change cwd to /, detach from controlling tty, set - * process group and session leader to the own process. - * Add DBG() Macro. - * Add some fatal-error log message for failed malloc(). - * Add '-d' if compiled with 'configure --with-debug' to - * enable debug output. - * - * Revision 1.52 2001/10/26 20:11:20 jongfoster - * Fixing type mismatch - * - * Revision 1.51 2001/10/26 17:38:28 oes - * Cosmetics - * - * Revision 1.50 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.49 2001/10/23 21:41:35 jongfoster - * Added call to initialize the (statically-allocated of course) - * "out of memory" CGI response. - * - * Revision 1.48 2001/10/10 19:56:46 jongfoster - * Moving some code that wasn't cookie-related out of an #ifdef - * FEATURE_COOKIE_JAR - * - * Revision 1.47 2001/10/10 16:44:36 oes - * Added CONNECT destination port limitation check - * - * Revision 1.46 2001/10/08 15:17:41 oes - * Re-enabled SSL forwarding - * - * Revision 1.45 2001/10/07 15:42:11 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Moved downgrading of the HTTP version from parse_http_request to - * chat(), since we can't decide if it is necessary before we have - * determined the actions for the URL. The HTTP command is now - * *always* re-built so the repairs need no longer be special-cased. - * - * filter_popups now gets a csp pointer so it can raise the new - * CSP_FLAG_MODIFIED flag. - * - * Bugfix - * - * Added configurable size limit for the IOB. If the IOB grows so - * large that the next read would exceed the limit, the header - * is generated, and the header & unfiltered buffer are flushed - * to the client. Chat then continues in non-buffering, - * non-filtering body mode. - * - * Revision 1.44 2001/10/02 18:13:57 oes - * Ooops - * - * Revision 1.43 2001/10/02 15:32:13 oes - * Moved generation of hdr - * - * Revision 1.42 2001/09/21 23:02:02 david__schmidt - * Cleaning up 2 compiler warnings on OS/2. - * - * Revision 1.41 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.40 2001/09/16 15:41:45 jongfoster - * Fixing signed/unsigned comparison warning. - * - * Revision 1.39 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.38 2001/09/16 13:01:46 jongfoster - * Removing redundant function call that zeroed zalloc()'d memory. - * - * Revision 1.37 2001/09/10 11:12:24 oes - * Deleted unused variable - * - * Revision 1.36 2001/09/10 10:56:15 oes - * Silenced compiler warnings - * - * Revision 1.35 2001/07/31 14:44:22 oes - * Deleted unused size parameter from filter_popups() - * - * Revision 1.34 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.33 2001/07/29 19:32:00 jongfoster - * Renaming _main() [mingw32 only] to real_main(), for ANSI compliance. - * - * Revision 1.32 2001/07/29 18:47:05 jongfoster - * Adding missing #include "loadcfg.h" - * - * Revision 1.31 2001/07/29 12:17:48 oes - * Applied pthread fix by Paul Lieverse - * - * Revision 1.30 2001/07/25 22:57:13 jongfoster - * __BEOS__ no longer overrides FEATURE_PTHREAD. - * This is because FEATURE_PTHREAD will soon be widely used, so I - * want to keep it simple. - * - * Revision 1.29 2001/07/24 12:47:06 oes - * Applied BeOS support update by Eugenia - * * Revision 1.28 2001/07/23 13:26:12 oes * Fixed bug in popup-killing for the first read that caused binary garbage to be sent between headers and body * @@ -521,9 +261,9 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #include #include -#ifdef FEATURE_PTHREAD +#if defined(FEATURE_PTHREAD) && !defined(__BEOS__) #include -#endif /* def FEATURE_PTHREAD */ +#endif /* def FEATURE_PTHREAD && ndef __BEOS__ */ #ifdef _WIN32 # ifndef FEATURE_PTHREAD @@ -538,23 +278,10 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #else /* ifndef _WIN32 */ -# if !defined (__OS2__) # include -# include -# endif /* ndef __OS2__ */ # include +# include # include -# include - -#ifdef sun -#include -#endif /* sun */ - -#ifdef unix -#include -#include -#endif - # include # ifdef __BEOS__ @@ -562,15 +289,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; # include /* declarations for threads and stuff. */ # endif -# if defined(__EMX__) || defined(__OS2__) -# include /* OS/2/EMX needs a little help with select */ -# endif -# ifdef __OS2__ -#define INCL_DOS -# include -#define bzero(B,N) memset(B,0x00,n) -# endif - # ifndef FD_ZERO # include # endif @@ -582,6 +300,7 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #include "jcc.h" #include "filters.h" #include "loaders.h" +#include "showargs.h" #include "parsers.h" #include "killpopup.h" #include "miscutil.h" @@ -590,24 +309,18 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #include "gateway.h" #include "actions.h" #include "cgi.h" -#include "loadcfg.h" -#include "urlmatch.h" const char jcc_h_rcs[] = JCC_H_VERSION; const char project_h_rcs[] = PROJECT_H_VERSION; -int no_daemon = 0; struct client_state clients[1]; struct file_list files[1]; -#ifdef FEATURE_STATISTICS +#ifdef STATISTICS int urls_read = 0; /* total nr of urls read inc rejected */ int urls_rejected = 0; /* total nr of urls rejected */ -#endif /* def FEATURE_STATISTICS */ +#endif /* def STATISTICS */ -#ifdef FEATURE_GRACEFUL_TERMINATION -int g_terminate = 0; -#endif static void listen_loop(void); static void chat(struct client_state *csp); @@ -625,15 +338,6 @@ static int32 server_thread(void *data); #define sleep(N) Sleep(((N) * 1000)) #endif -#ifdef __OS2__ -#define sleep(N) DosSleep(((N) * 100)) -#endif - -#if defined(unix) || defined(__EMX__) -const char *basedir; -const char *pidfile = NULL; -int received_hup_signal = 0; -#endif /* defined unix */ /* The vanilla wafer. */ static const char VANILLA_WAFER[] = @@ -646,60 +350,13 @@ static const char VANILLA_WAFER[] = "(copyright_or_otherwise)_applying_to_any_cookie._"; -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) -/********************************************************************* - * - * Function : sig_handler - * - * Description : Signal handler for different signals. - * Exit gracefully on ABRT, TERM and INT - * or set a flag that will cause the errlog - * to be reopened by the main thread on HUP. - * - * Parameters : - * 1 : the_signal = the signal cause this function to call - * - * Returns : - - * - *********************************************************************/ -static void sig_handler(int the_signal) -{ - switch(the_signal) - { - case SIGABRT: - case SIGTERM: - case SIGINT: - log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal); -#if defined(unix) - unlink(pidfile); -#endif /* unix */ - exit(the_signal); - break; - - case SIGHUP: - received_hup_signal = 1; - break; - - default: - /* - * We shouldn't be here, unless we catch signals - * in main() that we can't handle here! - */ - log_error(LOG_LEVEL_FATAL, "sig_handler: exiting on unexpected signal %d", the_signal); - } - return; - -} -#endif - - /********************************************************************* * * Function : chat * * Description : Once a connection to the client has been accepted, * this function is called (via serve()) to handle the - * main business of the communication. When this + * main business of the communication. When this * function returns, the caller must close the client * socket handle. * @@ -717,47 +374,42 @@ static void sig_handler(int the_signal) static void chat(struct client_state *csp) { /* - * This next lines are a little ugly, but they simplifies the if statements - * below. Basically if TOGGLE, then we want the if to test if the - * CSP_FLAG_TOGGLED_ON flag ist set, else we don't. And if FEATURE_FORCE_LOAD, - * then we want the if to test for CSP_FLAG_FORCED , else we don't + * This next lines are a little ugly, but they simplifies the if statements below. + * Basically if TOGGLE, then we want the if to test "csp->toggled_on", else we don't + * And if FORCE_LOAD, then we want the if to test "csp->toggled_on", else we don't */ -#ifdef FEATURE_TOGGLE -# define IS_TOGGLED_ON_AND (csp->flags & CSP_FLAG_TOGGLED_ON) && -#else /* ifndef FEATURE_TOGGLE */ +#ifdef TOGGLE +# define IS_TOGGLED_ON_AND (csp->toggled_on) && +#else /* ifndef TOGGLE */ # define IS_TOGGLED_ON_AND -#endif /* ndef FEATURE_TOGGLE */ -#ifdef FEATURE_FORCE_LOAD -# define IS_NOT_FORCED_AND !(csp->flags & CSP_FLAG_FORCED) && -#else /* ifndef FEATURE_FORCE_LOAD */ +#endif /* ndef TOGGLE */ +#ifdef FORCE_LOAD +# define IS_NOT_FORCED_AND (!csp->force) && +#else /* ifndef FORCE_LOAD */ # define IS_NOT_FORCED_AND -#endif /* def FEATURE_FORCE_LOAD */ +#endif /* def FORCE_LOAD */ #define IS_ENABLED_AND IS_TOGGLED_ON_AND IS_NOT_FORCED_AND char buf[BUFFER_SIZE]; - char *hdr; - char *p; - char *req; + char *hdr, *p, *req; + char *err = NULL; fd_set rfds; - int n; - jb_socket maxfd; - int server_body; + int n, maxfd, server_body; int ms_iis5_hack = 0; int byte_count = 0; const struct forward_spec * fwd; struct http_request *http; - int len; /* for buffer sizes */ -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS int block_popups; /* bool, 1==will block popups */ int block_popups_now = 0; /* bool, 1==currently blocking popups */ -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ int pcrs_filter; /* bool, 1==will filter through pcrs */ int gif_deanimate; /* bool, 1==will deanimate gifs */ /* Function that does the content filtering for the current request */ - char *(*content_filter)() = NULL; + char *(*content_filter)() = NULL; /* Skeleton for HTTP response, if we should intercept the request */ struct http_response *rsp; @@ -769,13 +421,13 @@ static void chat(struct client_state *csp) * could get blocked here if a client connected, then didn't say anything! */ - for (;;) + while (FOREVER) { - len = read_socket(csp->cfd, buf, sizeof(buf)); + n = read_socket(csp->cfd, buf, sizeof(buf)); - if (len <= 0) break; /* error! */ + if (n <= 0) break; /* error! */ - add_to_iob(csp, buf, len); + add_to_iob(csp, buf, n); req = get_header(csp); @@ -788,8 +440,8 @@ static void chat(struct client_state *csp) { continue; /* more to come! */ } - -#ifdef FEATURE_FORCE_LOAD + +#ifdef FORCE_LOAD /* If this request contains the FORCE_PREFIX, * better get rid of it now and set the force flag --oes */ @@ -798,11 +450,14 @@ static void chat(struct client_state *csp) { strclean(req, FORCE_PREFIX); log_error(LOG_LEVEL_FORCE, "Enforcing request \"%s\".\n", req); - csp->flags |= CSP_FLAG_FORCED; + csp->force = 1; + } + else + { + csp->force = 0; } - -#endif /* def FEATURE_FORCE_LOAD */ - +#endif /* def FORCE_LOAD */ + parse_http_request(req, http, csp); freez(req); break; @@ -830,171 +485,98 @@ static void chat(struct client_state *csp) * we have to do one of the following: * * create = use the original HTTP request to create a new - * HTTP request that has either the path component - * without the http://domainspec (w/path) or the - * full orininal URL (w/url) - * Note that the path and/or the HTTP version may - * have been altered by now. - * - * connect = Open a socket to the host:port of the server - * and short-circuit server and client socket. + * HTTP request that has only the path component + * without the http://domainspec + * pass = pass the original HTTP request unchanged * - * pass = Pass the request unchanged if forwarding a CONNECT - * request to a parent proxy. Note that we'll be sending - * the CFAIL message ourselves if connecting to the parent - * fails, but we won't send a CSUCCEED message if it works, - * since that would result in a double message (ours and the - * parent's). After sending the request to the parent, we simply - * tunnel. + * drop = drop the HTTP request * * here's the matrix: * SSL * 0 1 * +--------+--------+ * | | | - * 0 | create | connect| - * | w/path | | + * 0 | create | drop | + * | | | * Forwarding +--------+--------+ * | | | - * 1 | create | pass | - * | w/url | | + * 1 | pass | pass | + * | | | * +--------+--------+ * */ - /* - * Determine the actions for this URL - */ -#ifdef FEATURE_TOGGLE - if (!(csp->flags & CSP_FLAG_TOGGLED_ON)) + if (fwd->forward_host) { - /* Most compatible set of actions (i.e. none) */ - init_current_action(csp->action); + /* if forwarding, just pass the request as is */ + enlist(csp->headers, http->cmd); } else -#endif /* ndef FEATURE_TOGGLE */ - { - url_actions(http, csp); - } - - - /* - * Check if a CONNECT request is allowable: - * In the absence of a +limit-connect action, allow only port 443. - * If there is an action, allow whatever matches the specificaton. - */ - if(http->ssl) { - if( ( !(csp->action->flags & ACTION_LIMIT_CONNECT) && csp->http->port != 443) - || (csp->action->flags & ACTION_LIMIT_CONNECT - && !match_portlist(csp->action->string[ACTION_STRING_LIMIT_CONNECT], csp->http->port)) ) + if (http->ssl == 0) { - strcpy(buf, CFORBIDDEN); - write_socket(csp->cfd, buf, strlen(buf)); - - log_error(LOG_LEVEL_CONNECT, "Denying suspicious CONNECT request from %s", csp->ip_addr_str); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \" \" 403 0", csp->ip_addr_str); - - return; + /* otherwise elide the host information from the url */ + p = NULL; + p = strsav(p, http->gpc); + p = strsav(p, " "); + p = strsav(p, http->path); + p = strsav(p, " "); + p = strsav(p, http->ver); + enlist(csp->headers, p); + freez(p); } } + /* decide what we're to do with cookies */ - /* - * Downgrade http version from 1.1 to 1.0 if +downgrade - * action applies - */ - if ( (http->ssl == 0) - && (!strcmpic(http->ver, "HTTP/1.1")) - && (csp->action->flags & ACTION_DOWNGRADE)) +#ifdef TOGGLE + if (!csp->toggled_on) { - freez(http->ver); - http->ver = strdup("HTTP/1.0"); - - if (http->ver == NULL) - { - log_error(LOG_LEVEL_FATAL, "Out of memory downgrading HTTP version"); - } - } - - /* - * Save a copy of the original request for logging - */ - http->ocmd = strdup(http->cmd); - - if (http->ocmd == NULL) - { - log_error(LOG_LEVEL_FATAL, "Out of memory copying HTTP request line"); + /* Most compatible set of actions (i.e. none) */ + init_current_action(csp->action); } - - /* - * (Re)build the HTTP request for non-SSL requests. - * If forwarding, use the whole URL, else, use only the path. - */ - if (http->ssl == 0) + else +#endif /* ndef TOGGLE */ { - freez(http->cmd); - - http->cmd = strdup(http->gpc); - string_append(&http->cmd, " "); - - if (fwd->forward_host) - { - string_append(&http->cmd, http->url); - } - else - { - string_append(&http->cmd, http->path); - } - - string_append(&http->cmd, " "); - string_append(&http->cmd, http->ver); - - if (http->cmd == NULL) - { - log_error(LOG_LEVEL_FATAL, "Out of memory rewiting SSL command"); - } + url_actions(http, csp); } - enlist(csp->headers, http->cmd); - -#ifdef FEATURE_COOKIE_JAR +#ifdef JAR_FILES /* * If we're logging cookies in a cookie jar, and the user has not * supplied any wafers, and the user has not told us to suppress the * vanilla wafer, then send the vanilla wafer. */ if ((csp->config->jarfile != NULL) - && list_is_empty(csp->action->multi[ACTION_MULTI_WAFER]) + && (csp->action->multi[ACTION_MULTI_WAFER]->next == NULL) && ((csp->action->flags & ACTION_VANILLA_WAFER) != 0)) { enlist(csp->action->multi[ACTION_MULTI_WAFER], VANILLA_WAFER); } -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ - -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS block_popups = ((csp->action->flags & ACTION_NO_POPUPS) != 0); -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ pcrs_filter = (csp->rlist != NULL) && /* There are expressions to be used */ - (!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER])); + ((csp->action->flags & ACTION_FILTER) != 0); gif_deanimate = ((csp->action->flags & ACTION_DEANIMATE) != 0); /* grab the rest of the client's headers */ - for (;;) + while (FOREVER) { - if ( ( ( p = get_header(csp) ) != NULL) && ( *p == '\0' ) ) + if ( ( p = get_header(csp) ) && ( *p == '\0' ) ) { - len = read_socket(csp->cfd, buf, sizeof(buf)); - if (len <= 0) + n = read_socket(csp->cfd, buf, sizeof(buf)); + if (n <= 0) { log_error(LOG_LEVEL_ERROR, "read from client failed: %E"); return; } - add_to_iob(csp, buf, len); + add_to_iob(csp, buf, n); continue; } @@ -1003,52 +585,59 @@ static void chat(struct client_state *csp) enlist(csp->headers, p); freez(p); } - /* - * We have a request. Now, check to see if we need to - * intercept it, i.e. If .. - */ + /* We have a request. */ + + hdr = sed(client_patterns, add_client_headers, csp); + destroy_list(csp->headers); + + /* + * Now, check to see if we need to intercept it, i.e. + * If + */ + if ( /* a CGI call was detected and answered */ - (NULL != (rsp = dispatch_cgi(csp))) + (NULL != (rsp = dispatch_cgi(csp))) /* or we are enabled and... */ || (IS_ENABLED_AND ( /* ..the request was blocked */ - ( NULL != (rsp = block_url(csp))) + ( NULL != (rsp = block_url(csp))) /* ..or untrusted */ -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES || ( NULL != (rsp = trust_url(csp))) -#endif /* def FEATURE_TRUST */ +#endif /* ..or a fast redirect kicked in */ -#ifdef FEATURE_FAST_REDIRECTS - || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) && - (NULL != (rsp = redirect_url(csp)))) -#endif /* def FEATURE_FAST_REDIRECTS */ - )) - ) +#ifdef FAST_REDIRECTS + || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) && + (NULL != (rsp = redirect_url(csp)))) +#endif /* def FAST_REDIRECTS */ + )) + ) { /* Write the answer to the client */ - if (write_socket(csp->cfd, rsp->head, rsp->head_length) - || write_socket(csp->cfd, rsp->body, rsp->content_length)) - { + if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length) + || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) + { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); } -#ifdef FEATURE_STATISTICS +#ifdef STATISTICS /* Count as a rejected request */ - csp->flags |= CSP_FLAG_REJECTED; -#endif /* def FEATURE_STATISTICS */ + csp->rejected = 1; +#endif /* def STATISTICS */ /* Log (FIXME: All intercept reasons apprear as "crunch" with Status 200) */ log_error(LOG_LEVEL_GPC, "%s%s crunch!", http->hostport, http->path); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->cmd); /* Clean up and return */ free_http_response(rsp); + freez(hdr); return; } @@ -1068,74 +657,67 @@ static void chat(struct client_state *csp) csp->sfd = forwarded_connect(fwd, http, csp); - if (csp->sfd == JB_INVALID_SOCKET) + if (csp->sfd < 0) { log_error(LOG_LEVEL_CONNECT, "connect to: %s failed: %E", http->hostport); if (errno == EINVAL) { - rsp = error_response(csp, "no-such-domain", errno); + rsp = error_response(csp, "no-such-domain", errno); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0", + csp->ip_addr_str, http->cmd); } else { - rsp = error_response(csp, "connect-failed", errno); + rsp = error_response(csp, "connect-failed", errno); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", + csp->ip_addr_str, http->cmd); } - /* Write the answer to the client */ if(rsp) - { - if (write_socket(csp->cfd, rsp->head, rsp->head_length) - || write_socket(csp->cfd, rsp->body, rsp->content_length)) - { + { + if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length) + || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) + { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); } } free_http_response(rsp); + freez(hdr); return; } log_error(LOG_LEVEL_CONNECT, "OK"); - hdr = sed(client_patterns, add_client_headers, csp); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header"); - } - - list_remove_all(csp->headers); - if (fwd->forward_host || (http->ssl == 0)) { /* write the client's (modified) header to the server * (along with anything else that may be in the buffer) */ - if (write_socket(csp->sfd, hdr, strlen(hdr)) - || (flush_socket(csp->sfd, csp) < 0)) + n = strlen(hdr); + + if ((write_socket(csp->sfd, hdr, n) != n) + || (flush_socket(csp->sfd, csp ) < 0)) { log_error(LOG_LEVEL_CONNECT, "write header to: %s failed: %E", http->hostport); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", + csp->ip_addr_str, http->cmd); rsp = error_response(csp, "connect-failed", errno); if(rsp) { - if (write_socket(csp->cfd, rsp->head, rsp->head_length) - || write_socket(csp->cfd, rsp->body, rsp->content_length)) - { + if ((write_socket(csp->cfd, rsp->head, n) != n) + || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) + { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); } } @@ -1152,10 +734,10 @@ static void chat(struct client_state *csp) * so just send the "connect succeeded" message to the * client, flush the rest, and get out of the way. */ - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n", + csp->ip_addr_str, http->cmd); - if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1)) + if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1) < 0) { freez(hdr); return; @@ -1174,21 +756,14 @@ static void chat(struct client_state *csp) server_body = 0; - for (;;) + while (FOREVER) { -#ifdef __OS2__ - /* - * FD_ZERO here seems to point to an errant macro which crashes. - * So do this by hand for now... - */ - memset(&rfds,0x00,sizeof(fd_set)); -#else FD_ZERO(&rfds); -#endif + FD_SET(csp->cfd, &rfds); FD_SET(csp->sfd, &rfds); - n = select((int)maxfd+1, &rfds, NULL, NULL, NULL); + n = select(maxfd+1, &rfds, NULL, NULL, NULL); if (n < 0) { @@ -1202,14 +777,14 @@ static void chat(struct client_state *csp) if (FD_ISSET(csp->cfd, &rfds)) { - len = read_socket(csp->cfd, buf, sizeof(buf)); + n = read_socket(csp->cfd, buf, sizeof(buf)); - if (len <= 0) + if (n <= 0) { break; /* "game over, man" */ } - if (write_socket(csp->sfd, buf, (size_t)len)) + if (write_socket(csp->sfd, buf, n) != n) { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); return; @@ -1227,25 +802,25 @@ static void chat(struct client_state *csp) if (FD_ISSET(csp->sfd, &rfds)) { fflush( 0 ); - len = read_socket(csp->sfd, buf, sizeof(buf) - 1); + n = read_socket(csp->sfd, buf, sizeof(buf) - 1); - if (len < 0) + if (n < 0) { log_error(LOG_LEVEL_ERROR, "read from: %s failed: %E", http->host); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", + csp->ip_addr_str, http->cmd); rsp = error_response(csp, "connect-failed", errno); if(rsp) { - if (write_socket(csp->cfd, rsp->head, rsp->head_length) - || write_socket(csp->cfd, rsp->body, rsp->content_length)) - { + if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length) + || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) + { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); - } - } + } + } free_http_response(rsp); return; @@ -1254,15 +829,15 @@ static void chat(struct client_state *csp) /* Add a trailing zero. This lets filter_popups * use string operations. */ - buf[len] = '\0'; + buf[n] = '\0'; -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS /* Filter the popups on this read. */ if (block_popups_now) { - filter_popups(buf, csp); + filter_popups(buf, n); } -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ /* Normally, this would indicate that we've read * as much as the server has sent us and we can @@ -1282,9 +857,9 @@ static void chat(struct client_state *csp) * doesn't generate a valid header, then we won't * transmit anything to the client. */ - if (len == 0) + if (n == 0) { - + if (server_body || http->ssl) { /* @@ -1305,33 +880,27 @@ static void chat(struct client_state *csp) } hdr = sed(server_patterns, add_server_headers, csp); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); - } + n = strlen(hdr); - if (write_socket(csp->cfd, hdr, strlen(hdr)) - || write_socket(csp->cfd, p != NULL ? p : csp->iob->cur, csp->content_length)) + if ((write_socket(csp->cfd, hdr, n) != n) + || (write_socket(csp->cfd, p != NULL ? p : csp->iob->cur, csp->content_length) != csp->content_length)) { - log_error(LOG_LEVEL_ERROR, "write modified content to client failed: %E"); + log_error(LOG_LEVEL_CONNECT, "write modified content to client failed: %E"); return; } freez(hdr); - if (NULL != p) { - freez(p); - } + freez(p); } break; /* "game over, man" */ } /* - * This is NOT the body, so + * This is NOT the body, so * Let's pretend the server just sent us a blank line. */ - len = sprintf(buf, "\r\n"); + n = sprintf(buf, "\r\n"); /* * Now, let the normal header parsing algorithm below do its @@ -1351,55 +920,17 @@ static void chat(struct client_state *csp) { if (content_filter) { - add_to_iob(csp, buf, len); - - /* - * If the buffer limit will be reached on the next read, - * switch to non-filtering mode, i.e. make & write the - * header, flush the socket and get out of the way. - */ - if (((size_t)(csp->iob->eod - csp->iob->buf)) + (size_t)BUFFER_SIZE > csp->config->buffer_limit) - { - size_t hdrlen; - - log_error(LOG_LEVEL_ERROR, "Buffer size limit reached! Flushing and stepping back."); - - hdr = sed(server_patterns, add_server_headers, csp); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); - } - - hdrlen = strlen(hdr); - byte_count += hdrlen; - - if (write_socket(csp->cfd, hdr, hdrlen) - || ((len = flush_socket(csp->cfd, csp)) < 0)) - { - log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E"); - - freez(hdr); - return; - } - - freez(hdr); - byte_count += len; - - content_filter = NULL; - server_body = 1; - - } + add_to_iob(csp, buf, n); } else { - if (write_socket(csp->cfd, buf, (size_t)len)) + if (write_socket(csp->cfd, buf, n) != n) { log_error(LOG_LEVEL_ERROR, "write to client failed: %E"); return; } } - byte_count += len; + byte_count += n; continue; } else @@ -1410,11 +941,11 @@ static void chat(struct client_state *csp) */ /* buffer up the data we just read */ - add_to_iob(csp, buf, len); + add_to_iob(csp, buf, n); /* get header lines from the iob */ - while ((p = get_header(csp)) != NULL) + while ((p = get_header(csp))) { if (*p == '\0') { @@ -1459,13 +990,14 @@ static void chat(struct client_state *csp) */ hdr = sed(server_patterns, add_server_headers, csp); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); - } + n = strlen(hdr); + + /* write the server's (modified) header to + * the client (along with anything else that + * may be in the buffer) + */ -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS /* Start blocking popups if appropriate. */ if ((csp->content_type & CT_TEXT) && /* It's a text / * MIME-Type */ @@ -1477,10 +1009,10 @@ static void chat(struct client_state *csp) * Filter the part of the body that came in the same read * as the last headers: */ - filter_popups(csp->iob->cur, csp); + filter_popups(csp->iob->cur, csp->iob->eod - csp->iob->cur); } -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ /* Buffer and pcrs filter this if appropriate. */ @@ -1500,32 +1032,25 @@ static void chat(struct client_state *csp) content_filter = gif_deanimate_response; } + /* * Only write if we're not buffering for content modification */ - if (!content_filter) + if (!content_filter && ((write_socket(csp->cfd, hdr, n) != n) + || (n = flush_socket(csp->cfd, csp) < 0))) { - /* write the server's (modified) header to - * the client (along with anything else that - * may be in the buffer) - */ - - if (write_socket(csp->cfd, hdr, strlen(hdr)) - || ((len = flush_socket(csp->cfd, csp)) < 0)) - { - log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E"); - - /* the write failed, so don't bother - * mentioning it to the client... - * it probably can't hear us anyway. - */ - freez(hdr); - return; - } + log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E"); - byte_count += len; + /* the write failed, so don't bother + * mentioning it to the client... + * it probably can't hear us anyway. + */ + freez(hdr); + return; } + !content_filter && (byte_count += n); + /* we're finished with the server's header */ freez(hdr); @@ -1547,8 +1072,8 @@ static void chat(struct client_state *csp) return; /* huh? we should never get here */ } - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d", - csp->ip_addr_str, http->ocmd, byte_count); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d", + csp->ip_addr_str, http->cmd, byte_count); } @@ -1574,12 +1099,12 @@ static void serve(struct client_state *csp) chat(csp); close_socket(csp->cfd); - if (csp->sfd != JB_INVALID_SOCKET) + if (csp->sfd >= 0) { close_socket(csp->sfd); } - csp->flags &= ~CSP_FLAG_ACTIVE; + csp->active = 0; } @@ -1606,28 +1131,6 @@ static int32 server_thread(void *data) #endif -/********************************************************************* - * - * Function : usage - * - * Description : Print usage info & exit. - * - * Parameters : Pointer to argv[0] for identifying ourselves - * - * Returns : No. ,-) - * - *********************************************************************/ -void usage(const char *myname) -{ - printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n" - "Usage: %s [--help] [--version] [--no-daemon] [--pidfile pidfile] [--user user[.group]] [configfile]\n" - "Aborting.\n", myname); - - exit(2); - -} - - /********************************************************************* * * Function : main @@ -1647,116 +1150,50 @@ void usage(const char *myname) * any load fails, and can't bind port. * * Else main never returns, the process must be signaled - * to terminate execution. Or, on Windows, use the + * to terminate execution. Or, on Windows, use the * "File", "Exit" menu option. * *********************************************************************/ #ifdef __MINGW32__ -int real_main(int argc, const char *argv[]) +int _main(int argc, const char *argv[]) #else int main(int argc, const char *argv[]) #endif { - int argc_pos = 0; -#ifdef unix - struct passwd *pw = NULL; - struct group *grp = NULL; - char *p; -#endif - - Argc = argc; - Argv = argv; - configfile = -#if !defined(_WIN32) +#ifdef AMIGA + "AmiTCP:db/junkbuster/config" +#elif !defined(_WIN32) "config" #else - "config.txt" + "junkbstr.txt" #endif ; - /* - * Parse the command line arguments - */ - while (++argc_pos < argc) - { #if !defined(_WIN32) || defined(_WIN_CONSOLE) - - if (strcmp(argv[argc_pos], "--help") == 0) - { - usage(argv[0]); - } - - else if(strcmp(argv[argc_pos], "--version") == 0) - { - printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n"); - exit(0); - } - - else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0) - { - no_daemon = 1; - } -#if defined(unix) - else if (strcmp(argv[argc_pos], "--pidfile" ) == 0) - { - if (++argc_pos == argc) usage(argv[0]); - pidfile = strdup(argv[argc_pos]); - } - - else if (strcmp(argv[argc_pos], "--user" ) == 0) - { - if (++argc_pos == argc) usage(argv[argc_pos]); - - if ((NULL != (p = strchr(argv[argc_pos], '.'))) && *(p + 1) != '0') - { - *p++ = '\0'; - if (NULL == (grp = getgrnam(p))) - { - log_error(LOG_LEVEL_FATAL, "Group %s not found.", p); - } - } - - if (NULL == (pw = getpwnam(argv[argc_pos]))) - { - log_error(LOG_LEVEL_FATAL, "User %s not found.", argv[argc_pos]); - } - - if (p != NULL) *--p = '\0'; - } -#endif /* defined(unix) */ - else -#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ - { - configfile = argv[argc_pos]; - } - - } /* -END- while (more arguments) */ - -#if defined(unix) - if ( *configfile != '/' ) + if ((argc >= 2) && (strcmp(argv[1], "--help")==0)) { - char *abs_file; + printf("JunkBuster proxy version " VERSION ".\n\n" + "Usage: %s [configfile]\n\n" + "See " HOME_PAGE_URL " for details.\n" + "This program is distributed under the GNU GPL, version 2 or later.\n", + argv[0]); + exit(2); + } + if ((argc >= 2) && (strcmp(argv[1], "--version")==0)) + { + printf(VERSION "\n"); + exit(2); + } +#endif /* !defined(_WIN32) || defined(_WIN_CONSOLE) */ - /* make config-filename absolute here */ - if ( !(basedir = getcwd( NULL, 1024 ))) - { - perror("get working dir failed"); - exit( 1 ); - } + Argc = argc; + Argv = argv; - if ( !(abs_file = malloc( strlen( basedir ) + strlen( configfile ) + 5 ))) - { - perror("malloc failed"); - exit( 1 ); - } - strcpy( abs_file, basedir ); - strcat( abs_file, "/" ); - strcat( abs_file, configfile ); - configfile = abs_file; + if (argc > 1) + { + configfile = argv[1]; } -#endif /* defined unix */ - files->next = NULL; @@ -1766,37 +1203,11 @@ int main(int argc, const char *argv[]) InitWin32(); #endif - /* - * Unix signal handling - * - * Catch the abort, interrupt and terminate signals for a graceful exit - * Catch the hangup signal so the errlog can be reopened. - * Ignore the broken pipe and child signals - * FIXME: Isn't ignoring the default for SIGCHLD anyway and why ignore SIGPIPE? - */ -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) -{ - int idx; - const int catched_signals[] = { SIGABRT, SIGTERM, SIGINT, SIGHUP, 0 }; - const int ignored_signals[] = { SIGPIPE, SIGCHLD, 0 }; - - for (idx = 0; catched_signals[idx] != 0; idx++) - { - if (signal(catched_signals[idx], sig_handler) == SIG_ERR) - { - log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal %d: %E", catched_signals[idx]); - } - } - for (idx = 0; ignored_signals[idx] != 0; idx++) - { - if (signal(ignored_signals[idx], SIG_IGN) == SIG_ERR) - { - log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for signal %d: %E", ignored_signals[idx]); - } - } +#ifndef _WIN32 + signal(SIGPIPE, SIG_IGN); + signal(SIGCHLD, SIG_IGN); -} #else /* ifdef _WIN32 */ # ifdef _WIN_CONSOLE /* @@ -1808,96 +1219,6 @@ int main(int argc, const char *argv[]) #endif /* def _WIN32 */ - /* Initialize the CGI subsystem */ - cgi_init_error_messages(); - - /* - * If runnig on unix and without the --nodaemon - * option, become a daemon. I.e. fork, detach - * from tty and get process group leadership - */ -#if defined(unix) -{ - pid_t pid = 0; -#if 0 - int fd; -#endif - - if (!no_daemon) - { - pid = fork(); - - if ( pid < 0 ) /* error */ - { - perror("fork"); - exit( 3 ); - } - else if ( pid != 0 ) /* parent */ - { - int status; - pid_t wpid; - /* - * must check for errors - * child died due to missing files aso - */ - sleep( 1 ); - wpid = waitpid( pid, &status, WNOHANG ); - if ( wpid != 0 ) - { - exit( 1 ); - } - exit( 0 ); - } - /* child */ -#if 1 - /* Should be more portable, but not as well tested */ - setsid(); -#else /* !1 */ -#ifdef __FreeBSD__ - setpgrp(0,0); -#else /* ndef __FreeBSD__ */ - setpgrp(); -#endif /* ndef __FreeBSD__ */ - fd = open("/dev/tty", O_RDONLY); - if ( fd ) - { - /* no error check here */ - ioctl( fd, TIOCNOTTY,0 ); - close ( fd ); - } -#endif /* 1 */ - /* FIXME: should close stderr (fd 2) here too, but the test - * for existence - * and load config file is done in listen_loop() and puts - * some messages on stderr there. - */ - - close( 0 ); - close( 1 ); - chdir("/"); - - } /* -END- if (!no_daemon) */ - - /* - * As soon as we have written the PID file, we can switch - * to the user and group ID indicated by the --user option - */ - write_pid_file(); - - if (NULL != pw) - { - if (((NULL != grp) && setgid(grp->gr_gid)) || (setgid(pw->pw_gid))) - { - log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions."); - } - if (setuid(pw->pw_uid)) - { - log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions."); - } - } -} -#endif /* defined unix */ - listen_loop(); /* NOTREACHED */ @@ -1906,78 +1227,6 @@ int main(int argc, const char *argv[]) } -/********************************************************************* - * - * Function : bind_port_helper - * - * Description : Bind the listen port. Handles logging, and aborts - * on failure. - * - * Parameters : - * 1 : config = Privoxy configuration. Specifies port - * to bind to. - * - * Returns : Port that was opened. - * - *********************************************************************/ -static jb_socket bind_port_helper(struct configuration_spec * config) -{ - int result; - jb_socket bfd; - - if ( (config->haddr != NULL) - && (config->haddr[0] == '1') - && (config->haddr[1] == '2') - && (config->haddr[2] == '7') - && (config->haddr[3] == '.') ) - { - log_error(LOG_LEVEL_INFO, "Listening on port %d for local connections only", - config->hport); - } - else if (config->haddr == NULL) - { - log_error(LOG_LEVEL_INFO, "Listening on port %d on all IP addresses", - config->hport); - } - else - { - log_error(LOG_LEVEL_INFO, "Listening on port %d on IP address %s", - config->hport, config->haddr); - } - - result = bind_port(config->haddr, config->hport, &bfd); - - if (result < 0) - { - switch(result) - { - case -3 : - log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " - "There may be another Privoxy or some other " - "proxy running on port %d", - (NULL != config->haddr) ? config->haddr : "INADDR_ANY", - config->hport, config->hport); - - case -2 : - log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " - "The hostname is not resolvable", - (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport); - - default : - log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: because %E", - (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport); - } - - /* shouldn't get here */ - return JB_INVALID_SOCKET; - } - - config->need_bind = 0; - - return bfd; -} - - /********************************************************************* * * Function : listen_loop @@ -1992,67 +1241,51 @@ static jb_socket bind_port_helper(struct configuration_spec * config) static void listen_loop(void) { struct client_state *csp = NULL; - jb_socket bfd; + int bfd; struct configuration_spec * config; config = load_config(); - bfd = bind_port_helper(config); + log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)", + config->haddr ? config->haddr : "INADDR_ANY", config->hport); -#ifdef FEATURE_GRACEFUL_TERMINATION - while (!g_terminate) -#else - for (;;) -#endif + bfd = bind_port(config->haddr, config->hport); + + if (bfd < 0) { -#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) + log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E " + "- There may be another junkbuster or some other " + "proxy running on port %d", + (NULL != config->haddr) ? config->haddr : "INADDR_ANY", + config->hport, config->hport + ); + /* shouldn't get here */ + return; + } + + config->need_bind = 0; + + + while (FOREVER) + { +#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) while (waitpid(-1, NULL, WNOHANG) > 0) { /* zombie children */ } #endif /* !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ - - /* - * Free data that was used by died threads - */ sweep(); -#if defined(unix) - /* - * Re-open the errlog after HUP signal - */ - if (received_hup_signal) - { - init_error_log(Argv[0], config->logfile, config->debug); - received_hup_signal = 0; - } -#endif - -#ifdef __OS2__ -#ifdef FEATURE_COOKIE_JAR - /* - * Need a workaround here: we have to fclose() the jarfile, or we die because it's - * already open. I think unload_configfile() is not being run, which should do - * this work. Until that can get resolved, we'll use this workaround. - */ - if (csp) - if(csp->config) - if (csp->config->jar) - { - fclose(csp->config->jar); - csp->config->jar = NULL; - } -#endif /* FEATURE_COOKIE_JAR */ -#endif /* __OS2__ */ - if ( NULL == (csp = (struct client_state *) zalloc(sizeof(*csp))) ) { log_error(LOG_LEVEL_FATAL, "malloc(%d) for csp failed: %E", sizeof(*csp)); continue; } - csp->flags |= CSP_FLAG_ACTIVE; - csp->sfd = JB_INVALID_SOCKET; + memset(csp, '\0', sizeof(*csp)); + + csp->active = 1; + csp->sfd = -1; csp->config = config = load_config(); @@ -2073,7 +1306,23 @@ static void listen_loop(void) close_socket(bfd); - bfd = bind_port_helper(config); + log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)", + config->haddr ? config->haddr : "INADDR_ANY", config->hport); + bfd = bind_port(config->haddr, config->hport); + + if (bfd < 0) + { + log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E " + "- There may be another junkbuster or some other " + "proxy running on port %d", + (NULL != config->haddr) ? config->haddr : "INADDR_ANY", + config->hport, config->hport + ); + /* shouldn't get here */ + return; + } + + config->need_bind = 0; } log_error(LOG_LEVEL_CONNECT, "accept connection ... "); @@ -2085,7 +1334,7 @@ static void listen_loop(void) #ifdef AMIGA if(!childs) { - exit(1); + exit(1); } #endif freez(csp); @@ -2096,12 +1345,10 @@ static void listen_loop(void) log_error(LOG_LEVEL_CONNECT, "OK"); } -#ifdef FEATURE_TOGGLE - if (g_bToggleIJB) - { - csp->flags |= CSP_FLAG_TOGGLED_ON; - } -#endif /* def FEATURE_TOGGLE */ +#if defined(TOGGLE) + /* by haroon - most of credit to srt19170 */ + csp->toggled_on = g_bToggleIJB; +#endif if (run_loader(csp)) { @@ -2109,7 +1356,7 @@ static void listen_loop(void) /* Never get here - LOG_LEVEL_FATAL causes program exit */ } -#ifdef FEATURE_ACL +#ifdef ACL_FILES if (block_acl(NULL,csp)) { log_error(LOG_LEVEL_CONNECT, "Connection dropped due to ACL"); @@ -2117,7 +1364,7 @@ static void listen_loop(void) freez(csp); continue; } -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ /* add it to the list of clients */ csp->next = clients->next; @@ -2138,7 +1385,6 @@ static void listen_loop(void) pthread_attr_t attrs; pthread_attr_init(&attrs); - pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED); child_id = (pthread_create(&the_thread, &attrs, (void*)serve, csp) ? -1 : 0); pthread_attr_destroy(&attrs); @@ -2148,16 +1394,7 @@ static void listen_loop(void) #if defined(_WIN32) && !defined(_CYGWIN) && !defined(SELECTED_ONE_OPTION) #define SELECTED_ONE_OPTION child_id = _beginthread( - (void (*)(void *))serve, - 64 * 1024, - csp); -#endif - -#if defined(__OS2__) && !defined(SELECTED_ONE_OPTION) -#define SELECTED_ONE_OPTION - child_id = _beginthread( - (void(* _Optlink)(void*))serve, - NULL, + (void*)serve, 64 * 1024, csp); #endif @@ -2186,7 +1423,7 @@ static void listen_loop(void) NP_Entry, (ULONG)server_thread, NP_Output, Output(), NP_CloseOutput, FALSE, - NP_Name, (ULONG)"privoxy child", + NP_Name, (ULONG)"junkbuster child", NP_StackSize, 200*1024, TAG_DONE))) { @@ -2221,7 +1458,7 @@ static void listen_loop(void) wait( NULL ); #endif /* !defined(_WIN32) && defined(__CYGWIN__) */ close_socket(csp->cfd); - csp->flags &= ~CSP_FLAG_ACTIVE; + csp->active = 0; } #endif @@ -2238,7 +1475,7 @@ static void listen_loop(void) write_socket(csp->cfd, buf, strlen(buf)); close_socket(csp->cfd); - csp->flags &= ~CSP_FLAG_ACTIVE; + csp->active = 0; sleep(5); continue; } @@ -2248,48 +1485,7 @@ static void listen_loop(void) serve(csp); } } - - /* NOTREACHED unless FEATURE_GRACEFUL_TERMINATION is defined */ - - /* Clean up. Aim: free all memory (no leaks) */ -#ifdef FEATURE_GRACEFUL_TERMINATION - - log_error(LOG_LEVEL_ERROR, "Graceful termination requested"); - - unload_current_config_file(); - unload_current_actions_file(); - unload_current_re_filterfile(); -#ifdef FEATURE_TRUST - unload_current_trust_file(); -#endif - - if (config->multi_threaded) - { - int i = 60; - do - { - sleep(1); - sweep(); - } while ((clients->next != NULL) && (--i > 0)); - - if (i <= 0) - { - log_error(LOG_LEVEL_ERROR, "Graceful termination failed - still some live clients after 1 minute wait."); - } - } - sweep(); - sweep(); - -#if defined(unix) - free(basedir); -#endif -#if defined(_WIN32) && !defined(_WIN_CONSOLE) - /* Cleanup - remove taskbar icon etc. */ - TermLogWindow(); -#endif - - exit(0); -#endif /* FEATURE_GRACEFUL_TERMINATION */ + /* NOTREACHED */ } diff --git a/jcc.h b/jcc.h index 1778f1ea..f2560d33 100644 --- a/jcc.h +++ b/jcc.h @@ -1,6 +1,6 @@ -#ifndef JCC_H_INCLUDED -#define JCC_H_INCLUDED -#define JCC_H_VERSION "$Id: jcc.h,v 1.11 2002/03/24 13:25:43 swa Exp $" +#ifndef _JCC_H +#define _JCC_H +#define JCC_H_VERSION "$Id: jcc.h,v 1.2 2001/05/31 21:24:47 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.h,v $ @@ -9,7 +9,7 @@ * the main connection-handling function. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,47 +35,6 @@ * * Revisions : * $Log: jcc.h,v $ - * Revision 1.11 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.10 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.9 2002/03/07 03:52:44 oes - * Set logging to tty for --no-daemon mode - * - * Revision 1.8 2002/03/04 18:19:49 oes - * Added extern const char *pidfile - * - * Revision 1.7 2001/11/05 21:41:43 steudten - * Add changes to be a real daemon just for unix os. - * (change cwd to /, detach from controlling tty, set - * process group and session leader to the own process. - * Add DBG() Macro. - * Add some fatal-error log message for failed malloc(). - * Add '-d' if compiled with 'configure --with-debug' to - * enable debug output. - * - * Revision 1.6 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.5 2001/07/29 19:32:00 jongfoster - * Renaming _main() [mingw32 only] to real_main(), for ANSI compliance. - * - * Revision 1.4 2001/07/29 18:58:15 jongfoster - * Removing nested #includes, adding forward declarations for needed - * structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED. - * - * Revision 1.3 2001/07/18 12:31:58 oes - * moved #define freez from jcc.h to project.h - * * Revision 1.2 2001/05/31 21:24:47 jongfoster * Changed "permission" to "action" throughout. * Removed DEFAULT_USER_AGENT - it must now be specified manually. @@ -89,36 +48,34 @@ *********************************************************************/ +/* Declare struct FILE for vars and funcs. */ +#include + +/* All of our project's data types. */ +#include "project.h" + +#include "loadcfg.h" + #ifdef __cplusplus extern "C" { #endif -struct client_state; -struct file_list; - /* Global variables */ -#ifdef FEATURE_STATISTICS +#ifdef STATISTICS extern int urls_read; extern int urls_rejected; -#endif /*def FEATURE_STATISTICS*/ +#endif /*def STATISTICS*/ extern struct client_state clients[]; -extern struct file_list files[]; -#ifdef unix -extern const char *pidfile; -#endif -extern int no_daemon; +extern struct file_list files[]; -#ifdef FEATURE_GRACEFUL_TERMINATION -extern int g_terminate; -#endif /* Functions */ #ifdef __MINGW32__ -int real_main(int argc, const char *argv[]); +int _main(int argc, const char *argv[]); #else int main(int argc, const char *argv[]); #endif @@ -131,7 +88,7 @@ extern const char jcc_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef JCC_H_INCLUDED */ +#endif /* ndef _JCC_H */ /* Local Variables: diff --git a/junkbuster-rh.spec b/junkbuster-rh.spec new file mode 100644 index 00000000..a20194f8 --- /dev/null +++ b/junkbuster-rh.spec @@ -0,0 +1,302 @@ +# $Id: junkbuster-rh.spec,v 1.10 2001/07/03 09:34:44 sarantis Exp $ +# +# 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. +# +# $Log: junkbuster-rh.spec,v $ +# Revision 1.10 2001/07/03 09:34:44 sarantis +# bumped up version number. +# +# Revision 1.9 2001/06/12 18:15:29 swa +# the % in front of configure (see tag below) confused +# the rpm build process on 7.1. +# +# Revision 1.8 2001/06/12 17:15:56 swa +# fixes, because a clean build on rh6.1 was impossible. +# GZIP confuses make, % configure confuses rpm, etc. +# +# Revision 1.7 2001/06/11 12:17:26 sarantis +# fix typo in %post +# +# Revision 1.6 2001/06/11 11:28:25 sarantis +# Further optimizations and adaptations in the spec file. +# +# Revision 1.5 2001/06/09 09:14:11 swa +# shamelessly adapted RPM stuff from the newest rpm that +# RedHat provided for the JB. +# +# Revision 1.4 2001/06/08 20:54:18 swa +# type with status file. remove forward et. al from file list. +# +# Revision 1.3 2001/06/07 17:28:10 swa +# cosmetics +# +# Revision 1.2 2001/06/04 18:31:58 swa +# files are now prefixed with either `confdir' or `logdir'. +# `make redhat-dist' replaces both entries confdir and logdir +# with redhat values +# +# Revision 1.1 2001/06/04 10:44:57 swa +# `make redhatr-dist' now works. Except for the paths +# in the config file. +# +# +# +Summary: The Internet Junkbuster +Vendor: http://ijbswa.sourceforge.net +Name: junkbuster +Version: 2.9.5 +Release: 1 +Source0: http://www.waldherr.org/junkbuster/ijbswa.tar.gz +Copyright: GPL +BuildRoot: %{_tmppath}/%{name}-root +Group: Networking/Utilities +URL: http://ijbswa.sourceforge.net/ +Packager: Stefan Waldherr +Obsoletes: junkbuster-raw junkbuster-blank +Prereq: /usr/sbin/useradd , /sbin/chkconfig , /sbin/service +Conflicts: junkbuster-raw junkbuster-blank + +%description +The Internet Junkbuster stops your browser from displaying the +advertisement images that pervade many commercial web pages. Since +your browser has to download fewer images, surfing the web should be +faster. + +%define ijbconf %{_sysconfdir}/junkbuster + +%prep +%setup -c -n ijbswa + +%build +./configure +make +strip junkbuster + +%pre +/usr/sbin/useradd -d /etc/junkbuster -u 73 -r junkbust > /dev/null 2>&1 || /bin/true + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} \ + ${RPM_BUILD_ROOT}%{_mandir}/man8 \ + ${RPM_BUILD_ROOT}/var/log/junkbuster \ + ${RPM_BUILD_ROOT}%{ijbconf}/templates \ + ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d \ + ${RPM_BUILD_ROOT}%{_sysconfdir}/rc.d/init.d + +install -s -m 744 junkbuster $RPM_BUILD_ROOT%{_sbindir}/junkbuster +cp -f junkbuster.1 $RPM_BUILD_ROOT%{_mandir}/man8/junkbuster.8 +cp -f actionsfile $RPM_BUILD_ROOT%{ijbconf}/actionsfile +cp -f re_filterfile $RPM_BUILD_ROOT%{ijbconf}/re_filterfile +cp -f trust $RPM_BUILD_ROOT%{ijbconf}/trust +cp -f templates/default $RPM_BUILD_ROOT%{ijbconf}/templates/ +cp -f templates/show-status $RPM_BUILD_ROOT%{ijbconf}/templates/ +cp -f templates/show-status-file $RPM_BUILD_ROOT%{ijbconf}/templates/ +cp -f junkbuster.logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/junkbuster +install -m 755 junkbuster.init $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/junkbuster +install -m 744 -d $RPM_BUILD_ROOT/var/log/junkbuster + +# verify all file locations, etc. in the config file +# don't start with ^ or commented lines are not replaced +cat config | \ + sed 's/^confdir.*/confdir \/etc\/junkbuster/g' | \ +# sed 's/^permissionsfile.*/permissionsfile \/etc\/junkbuster\/permissionsfile/g' | \ +# sed 's/^re_filterfile.*/re_filterfile \/etc\/junkbuster\/re_filterfile/g' | \ +# sed 's/^logfile.*/logfile \/var\/log\/junkbuster\/logfile/g' | \ +# sed 's/^jarfile.*/jarfile \/var\/log\/junkbuster\/jarfile/g' | \ +# sed 's/^forward.*/forward \/etc\/junkbuster\/forward/g' | \ +# sed 's/^aclfile.*/aclfile \/etc\/junkbuster\/aclfile/g' > \ + sed 's/^logdir.*/logdir \/var\/log\/junkbuster/g' > \ + $RPM_BUILD_ROOT%{ijbconf}/config + +%post +if [ "$1" = "1" ]; then + /sbin/chkconfig --add junkbuster +fi + +%preun +if [ "$1" = "0" ]; then + /sbin/service junkbuster stop > /dev/null 2>&1 ||: + /sbin/chkconfig --del junkbuster +fi + +%postun +if [ "$1" -ge "1" ]; then + /sbin/service junkbuster condrestart > /dev/null 2>&1 +fi + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +# %doc ijbfaq.html ijbman.html README README.TOO gpl.html +%doc junkbuster.weekly junkbuster.monthly +%dir %{ijbconf} +%config %{ijbconf}/* +%attr(0744,junkbust,junkbust) %dir /var/log/junkbuster +%config %{_sysconfdir}/logrotate.d/junkbuster +%attr(0744,junkbust,junkbust)/usr/sbin/junkbuster +%{_mandir}/man8/* +%config %{_sysconfdir}/rc.d/init.d/junkbuster + + +%changelog + +* Sun Jun 3 2001 Stefan Waldherr +- rework of RPM + +* Mon Sep 25 2000 Stefan Waldherr +- CLF Logging patch by davep@cyw.uklinux.net +- Hal DeVore fix akamaitech in blocklist + +* Sun Sep 17 2000 Stefan Waldherr +- Steve Kemp skx@tardis.ed.ac.uk's javascript popup patch. +- Markus Breitenbach breitenb@rbg.informatik.tu-darmstadt.de supplied + numerous fixes and enhancements for Steve's patch. +- adamlock@netscape.com (Adam Lock) in the windows version: + - Taskbar activity spinner always spins even when logging is + turned off (which is the default) - people who don't + like the spinner can turn it off from a menu option. + - Taskbar popup menu has a options submenu - people can now + open the settings files for cookies, blockers etc. + without opening the JB window. + - Logging functionality works again + - Buffer overflow is fixed - new code uses a bigger buffer + and snprintf so it shouldn't overflow anymore. +- Fixed userid swa, group learning problem while installing. + root must build RPM. +- Added patch by Benjamin Low that prevents JB to + core dump when there is no log file. +- Tweaked SuSE startup with the help of mohataj@gmx.net and Doc.B@gmx.de. +- Fixed man page to include imagefile and popupfile. +- Sanity check for the statistics function added. +- "Patrick D'Cruze" : It seems Microsoft + are transitioning Hotmail from FreeBSD/Apache to Windows 2000/IIS. + With IIS/5, it appears to omit the trailing \r\n from http header + only messages. eg, when I visit http://www.hotmail.com, IIS/5 + responds with a HTTP 302 redirect header. However, this header + message is missing the trailing \r\n. IIS/5 then closes the + connection. Junkbuster, unfortunately, discards the header becomes + it thinks it is incomplete - and it is. MS have transmitted an + incomplete header! +- Added bug reports and patch submission forms in the docs. + +* Mon Mar 20 2000 Stefan Waldherr + Andrew extended the JB: + Display of statistics of the total number of requests and the number + of requests filtered by junkbuster, also the percentage of requests + filtered. Suppression of the listing of files on the proxy-args page. + All stuff optional and configurable. + +* Sun Sep 12 1999 Stefan Waldherr + Jan Willamowius (jan@janhh.shnet.org) fixed a bug in the + code which prevented the JB from handling URLs of the form + user:password@www.foo.com. Fixed. + +* Mon Aug 2 1999 Stefan Waldherr + Blank images are no longer cached, thanks to a hint from Markus + Breitenbach . The user + agent is NO longer set by the Junkbuster. Sadly, many sites depend + on the correct browser version nowadays. Incorporated many + suggestions from Jan "Yenya" Kasprzak for the + spec file. Fixed logging problem and since runlevel 2 does not + use networking, I replaced /etc/rc.d/rc2.d/S84junkbuster with + /etc/rc.d/rc2.d/K09junkbuster thanks to Shaw Walker + . You should now be able to build this RPM as + a non-root user (mathias@weidner.sem.lipsia.de). + +* Sun Jan 31 1999 Stefan Waldherr + /var/log/junkbuster set to nobody. Added /etc/junkbuster/imagelist + to allow more sophisticated matching of blocked images. Logrotate + logfile. Added files for auto-updating the blocklist et al. + +* Wed Dec 16 1998 Stefan Waldherr + Configure blank version via config file. No separate blank + version anymore. Added Roland's + patch to show a logo instead of a blank area. Added a suggestion + from Alex : /var/lock/subsys/junkbuster. + More regexps in the blocklist. Prepared the forwardfile for + squid. Extended image regexp with help from gabriel + . + +* Thu Nov 19 1998 Stefan Waldherr + All RPMs now identify themselves in the show-proxy-args page. + Released Windoze version. Run junkbuster as nobody instead of + root. + +* Fri Oct 30 1998 Stefan Waldherr + Newest version. First release (hence the little version number + mixture -- 2.0.2-0 instead of 2.0-7). This version tightens + security over 2.0.1; some multi-user sites will need to change + the listen-address in the configuration file. The blank version of + the Internet Junkbuster has a more sophisticated way of replacing + images. All RPMs identify themselves in the show-proxy-args page. + +* Thu Sep 23 1998 Stefan Waldherr + Modified the blocking feature, so that only GIFs and JPEGs are + blocked and replaced but not HTML pages. Thanks to + "Gerd Flender" for this nice + idea. Added numerous stuff to the blocklist. Keep patches in + seperate files and no longer in diffs (easier to maintain). + +* Tue Jun 16 1998 Stefan Waldherr + Moved config files to /etc/junkbuster directory, moved man page, + added BuildRoot directive (Thanks to Alexey Nogin ) + Made new version junkbuster-raw (which is only a stripped version of + the junkuster rpm, i.e. without my blocklist, etc.) + +* Tue Jun 16 1998 (2.0-1) + Uhm, not that much. Just a new junkbuster version that + fixes a couple of bugs ... and of course a bigger + blocklist with the unique Now-less-ads-than-ever(SM) + feature. + Oh, one thing: I changed the default user agent to Linux -- no + need anymore to support Apple. + +* Tue Jun 16 1998 (2.0-0) + Now-less-ads-than-ever (SM) + compiled with gcc instead of cc + compiled with -O3, thus it should be a little faster + show-proxy-args now works + /etc/junkbuster.init wasn't necessary + +* Tue Jun 16 1998 (1.4) + some more config files were put into /etc + The junkbuster-blank rpm returns a 1x1 pixel image, that gets + displayed by Netscape instead of the blocked image. + Read http://www.waldherr.org/junkbuster/ for + further info. + +* Tue Jun 16 1998 (1.3) + The program has been moved to /usr/sbin (from /usr/local/bin) + Init- and stopscripts (/etc/rc.d/rc*) have been added so + that the junkbuster starts automatically during bootup. + The /etc/blocklist file is much more sophisticated. Theoretically + one should e.g. browse all major US and German newspapers without + seeing one annoying ad. + junkbuster.init was modified. It now starts junkbuster with an + additional "-r @" flag. diff --git a/junkbuster-suse.spec b/junkbuster-suse.spec new file mode 100644 index 00000000..9218a2fd --- /dev/null +++ b/junkbuster-suse.spec @@ -0,0 +1,175 @@ +# $Id: junkbuster-suse.spec,v 1.4 2001/06/08 20:53:36 swa Exp $ +# +# 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. +# +# $Log: junkbuster-suse.spec,v $ +# Revision 1.4 2001/06/08 20:53:36 swa +# use buildroot, export init to separate file (better manageability) +# +# Revision 1.3 2001/06/07 17:28:10 swa +# cosmetics +# +# Revision 1.2 2001/06/07 17:18:44 swa +# header fixed +# +# +# neededforbuild -ijb +# usedforbuild -ijb aaa_base aaa_dir autoconf automake base bash bindutil binutils bison bzip compress cpio cracklib db devs diffutils e2fsprogs file fileutils findutils flex gawk gcc gdbm gdbm-devel gettext glibc glibc-devel gpm gppshare groff gzip kbd less libtool libz lx_suse make mktemp modutils ncurses ncurses-devel net-tools netcfg nkitb pam pam-devel patch perl pgp ps rcs rpm sendmail sh-utils shadow strace syslogd sysvinit texinfo textutils timezone unzip util-linux vim xdevel xf86 xshared + +Vendor: http://ijbswa.sourceforge.net +Distribution: defineme +Name: junkbuster +Packager: Stefan Waldherr + +Copyright: GPL +BuildRoot: /tmp/junkbuster-rpmbuild +Group: Networking/Utilities +Provides: ijb +Obsoletes: ijb +Autoreqprov: on +Version: 2.9 +Release: 4 +Summary: The Internet Junkbuster +Source: http://www.waldherr.org/junkbuster/ijbswa.tar.gz + +# +# ----------------------------------------------------------------------------- +# +%description +The Internet Junkbuster stops your browser from displaying the +advertisement images that pervade many commercial web pages. Since +your browser has to download fewer images, surfing the web should be +faster. + +Authors: +-------- + http://ijbswa.sourceforge.net + +SuSE series: n + +# +# ----------------------------------------------------------------------------- +# +%prep +%setup -c -n ijbswa + +# +# ----------------------------------------------------------------------------- +# +%build +./configure +make + +# +# ----------------------------------------------------------------------------- +# +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/{var/log/junkbuster,usr/{sbin,share/man/man1},etc/{junkbuster,junkbuster/templates,init.d}} + +install -m 755 junkbuster.init.suse $RPM_BUILD_ROOT/etc/init.d/junkbuster +ln -sf $RPM_BUILD_ROOT/etc/init.d/junkbuster $RPM_BUILD_ROOT/usr/sbin/rcjunkbuster + +install -m 755 junkbuster $RPM_BUILD_ROOT/usr/sbin +install -d $RPM_BUILD_ROOT/etc/junkbuster +install -d $RPM_BUILD_ROOT/etc/junkbuster/templates +install -m 644 permissionsfile $RPM_BUILD_ROOT/etc/junkbuster +install -m 644 re_filterfile $RPM_BUILD_ROOT/etc/junkbuster +# verify all file locations, etc. in the config file +# don't start with ^ or commented lines are not replaced +cat config | \ + sed 's/^confdir.*/confdir \/etc\/junkbuster/g' | \ +# sed 's/^permissionsfile.*/permissionsfile \/etc\/junkbuster\/permissionsfile/g' | \ +# sed 's/^re_filterfile.*/re_filterfile \/etc\/junkbuster\/re_filterfile/g' | \ +# sed 's/^logfile.*/logfile \/var\/log\/junkbuster\/logfile/g' | \ +# sed 's/^jarfile.*/jarfile \/var\/log\/junkbuster\/jarfile/g' | \ +# sed 's/^forward.*/forward \/etc\/junkbuster\/forward/g' | \ +# sed 's/^aclfile.*/aclfile \/etc\/junkbuster\/aclfile/g' > \ + sed 's/^logdir.*/logdir \/var\/log\/junkbuster/g' > \ + config.tmp +cp -f config.tmp config +install -m 644 config $RPM_BUILD_ROOT/etc/junkbuster +#install -m 644 forward $RPM_BUILD_ROOT/etc/junkbuster +install -m 644 trust $RPM_BUILD_ROOT/etc/junkbuster +install -m 644 templates/default $RPM_BUILD_ROOT/etc/junkbuster/templates +install -m 644 templates/show-status $RPM_BUILD_ROOT/etc/junkbuster/templates +install -m 644 templates/show-status-file $RPM_BUILD_ROOT/etc/junkbuster/templates +install -m 644 junkbuster.1 $RPM_BUILD_ROOT/usr/share/man/man1 +%{?suse_check} + +# +# ----------------------------------------------------------------------------- +# +%post +sbin/insserv etc/init.d/junkbuster + +# +# ----------------------------------------------------------------------------- +# +%postun +sbin/insserv etc/init.d/ + +# +# ----------------------------------------------------------------------------- +# +%files +#%doc README *.html +/usr/sbin/junkbuster +/usr/share/man/man1/junkbuster.1.gz +%config(noreplace) /etc/junkbuster +/etc/init.d/junkbuster +/usr/sbin/rcjunkbuster + +# +# ----------------------------------------------------------------------------- +# +%changelog -n junkbuster +* Sun Jun 3 2001 Stefan Waldherr +- rework of RPM +* Wed Feb 14 2001 - uli@suse.de +- fixed init script +* Wed Dec 06 2000 - bjacke@suse.de +- renamed package to junkbuster +- fixed copyright tag +* Thu Nov 30 2000 - uli@suse.de +- moved init script to /etc/init.d +* Wed Feb 16 2000 - kukuk@suse.de +- Move /usr/man -> /usr/share/man +- Mark /etc/ijb as "config(noreplace)" +* Mon Sep 20 1999 - uli@suse.de +- fixed init script +* Mon Sep 13 1999 - bs@suse.de +- ran old prepare_spec on spec file to switch to new prepare_spec. +* Thu Apr 01 1999 - daniel@suse.de +- do not start ijb as root (security) +* Tue Mar 30 1999 - daniel@suse.de +- don´t use saclfile.ini +* Tue Mar 30 1999 - daniel@suse.de +- small fix to whitelist-configuration, + version is and was 2.0.2 WITHOUT Stefan Waldherr's patches + (http://www.waldherr.org/junkbuster/) +* Mon Mar 01 1999 - daniel@suse.de +- new package: version 2.0 diff --git a/junkbuster.1 b/junkbuster.1 new file mode 100644 index 00000000..d88294da --- /dev/null +++ b/junkbuster.1 @@ -0,0 +1,871 @@ +.TH JUNKBUSTER 1 "http://www.junkbusters.com/ht/en/ijb2.0man.html" +.SH NAME +\fBjunkbuster\fP +- The +Internet Junkbuster +Proxy +\s-2(TM)\s+2 +.SH SYNOPSIS +\fBjunkbuster\fP +\fI\&configfile\fP +(Version 2.0 onwards) +.br +\fBjunkbstr.exe\fP +\fI\&configfile\fP +(Windows) +.br +\fBjunkbuster\fP +[-a] +[-y] +[-s] +[-c] +[-v] +.br +[-u user_agent] +[-r referer] +[-t from] +.br +[-b blockfile] +[-j jarfile] +[-l logfile] +.br +[-w NAME=VALUE] +[-x Header_text] +.br +[-h [bind_host_address][:bind_port]] +.br +[-f forward_host[:port]] +[-d N] +.br +[-g gw_protocol[:[gw_host][:gw_port]]] +.br +(Version 1.4 and earlier) +.SH DESCRIPTION +\fBjunkbuster\fP +is an instrumentable proxy that filters the +\s-2HTTP\s0 +stream between +web servers and browsers. +Its main purpose is to enhance privacy. +.P +Versions before 2.0 used command-line options; +Versions from 2.0 onward use a configuration file. +The following descriptions of the options first give the older +command-line usage, then the new configfile line. +.P +In Versions 2.0.1 upwards on Windows, +a start-up message is printed and the configuration is read from the file +\fC\&junkbstr.ini\fP +if it exists and no argument was given. +.P +All files except the configfile +are checked for changes before each page is fetched, +so they may edited without restarting the proxy. +.SS OPTIONS +.TP +.\" anchor: o_b blockfile +\fI-b blockfile\fP (Old) blockfile \fIblockfile\fP (New) +Block\" ijbfaq.html#blocking +requests to +\s-2URL\s0s +matching any pattern given in the lines of the +\fI\&blockfile\fP. +The +\fBjunkbuster\fP +instead returns status 202, indicating that the request has been accepted +(though not completed), +and a +message identifying itself\" ijbfaq.html#show +(though the browser may +display only a broken image icon). +(Versions before 2.0 returned an error 403 (Forbidden).) +The syntax of a pattern is +\fB\&[domain][:port][/path]\fP +(the +\fB\&http://\fP +or +\fB\&https://\fP +protocol part is omitted). +To decide if a pattern matches a target, the domains are compared first, +then the paths. +.P +To compare the domains, +the pattern domain and the target +domain specified in the +\s-2URL\s0 +are each broken into their components. +(Components are separated by the +\fC\&.\fP +(period) character.) +Next each of the target components +is compared with the corresponding pattern component: last with last, +next-to-last with next-to-last, and so on. +(This is called +\fIright-anchored\fP +matching.) +If all of the pattern components find their match in the target, +then the domains are considered a match. +Case is irrelevant when comparing domain components. +.P +A successfully +matching pattern can be an anchored substring of a target, but +not vice versa. +Thus if a pattern doesn't specify a domain, +it matches all domains. +.\" anchor: wildcard +Furthermore, when comparing two components, +the components must either match in their entirety or up to a wildcard +\fC\&* \fP +(star character) in the pattern. The wildcard feature +implements only a "prefix" match capability ("abc*" vs. "abcdefg"), +not suffix matching ("*efg" vs. "abcdefg") or +infix matching ("abc*efg" vs. "abcdefg"). +The feature is restricted to the domain component; +it is unrelated to the optional +regular expression +feature in the path +(described below).\" ijbman.html#regex +.P +If a numeric port +is specified in the pattern domain, then the target port must +match as well. The default port in a target is port 80. +.P +If the domain and port match, +then the target +\s-2URL\s0 +path is checked for +a match against the path in the pattern. +Paths are compared with a simple case-sensitive +left-anchored substring comparison. +Once again, the pattern can be an +anchored substring of the target, but not vice versa. +A path of +\fC\&/\fP +(slash) would match all paths. Wildcards are not considered in +path comparisons. +.P +For example, the target +\s-2URL\s0 +.br +.ti +0.25i +\fB\&the.yellow-brick-road.com/TinMan/has_no_brain\fP +.br +would be matched (and blocked) by the following patterns +.br +.ti +0.25i +\fB\&yellow-brick-road.com\fP +.br +and +.br +.ti +0.25i +\fB\&Yellow*.COM\fP +.br +and +.br +.ti +0.25i +\fB\&/TinM\fP +.br +but not +.br +.ti +0.25i +\fB\&follow.the.yellow-brick-road.com\fP +.br +or +.br +.ti +0.25i +\fB\&/tinman\fP +.br +.P +Comments in a blockfile start with a +\fB\&#\fP +(hash) character and end at a new line. +Blank lines are also ignored. +.P +Lines beginning with a +\fC\&~\fP +(tilde) character are taken to be +exceptions:\" ijbfaq.html#exceptions +a +\s-2URL\s0 +blocked by previous patterns that matches the rest of +the line is let through. (The last match wins.) +.P +Patterns +may contain +\s-2POSIX\s0 +regular expressions\" ijbfaq.html#regex +provided the +\fBjunkbuster\fP +was compiled with this option +(the default in Version 2.0 on). +The idiom +\fC\&/*.*/ad\fP +can then be used +to match any +\s-2URL\s0 +containing +\fC\&/ad\fP +(such as +\fC\&http://nomatterwhere.com/images/advert/g3487.gif\fP +for example). +These expressions +don't work\" ijbman.html#substring +in the domain part. +.P +In version 1.3 and later +the blockfile and cookiefile are checked for changes before each request. +.TP +tinygif \fIN\fP +Set appearance of blocked GIFs. You can select one of the following +values: +.br +.br +\h'-\w"0 = "u'0 = Show a ``broken icon'' in the browser +.br +\h'-\w"1 = "u'1 = Show a one pixel transparent GIF +.br +\h'-\w"2 = "u'2 = Show a GIF with the word ``JUNKBUSTER'' +.TP +popupfile \fI\&popup\fP +Sets the name of the popupfile. If uncommented, the popupfile +controls on which sites Javascript popup windows are disabled. +.TP +.\" anchor: o_w wafer +\fI-w NAME=VALUE\fP (Old) wafer \fINAME=VALUE\fP (New) +Specifies a pair to be sent as a cookie with every request +to the server.\" ijbfaq.html#wafers +(Such boring cookies are called +\fI\&wafers\fP.) +This option may be called more than once to generate multiple wafers. +The original +Netscape specification +prohibited +semi-colons, commas and white space; +these characters will be +\s-2URL\s0-encoded +if used in wafers. +The Path and Domain attributes are not currently supported. +.TP +.\" anchor: o_c cookiefile +\fI-c cookiefile\fP (Old) cookiefile \fIcookiefile\fP (New) +Enforce the cookie management policy specified in the +\fI\&cookiefile.\fP +.\" anchor: java +If this option is not used all cookies are silently crunched, +so that users who never want cookies aren't bothered by browsers +asking whether each cookie should be accepted. +However, cookies can +still get through\" ijbfaq.html#breakthrough +via +JavaScript\" links.html#javascript +and +\s-2SSL\s0, +so alerts should be left on. +.P +In Version 1.2 and later +this option must be followed by a +filename\" ijbfaq.html#crumble +containing instructions on which sites are allowed to +receive and set cookies. +.\" anchor: drop +By default cookies are dropped in both the browser's request +and the server's response, unless the +\s-2URL\s0 +requested matches an entry in the +\fI\&cookiefile\fP. +The matching algorithm is the same as for the blockfile. +A leading +\fC\&>\fP +character allows +server-bound\" ijbfaq.html#directional +cookies only; +a +\fC\&<\fP +allows only browser-bound cookies; +a +\fC\&~\fP +character stops cookies in +both directions.\" ijbfaq.html#crumble +Thus a cookiefile containing a single line with the two characters +\fC\&>*\fP +will pass on all cookies to servers but not give any new ones to the browser. +.TP +.\" anchor: o_j jarfile +\fI-j jarfile\fP (Old) jarfile \fIjarfile\fP (New) +All Set-cookie attempts by the server are +logged\" ijbfaq.html#jar +to +\fI\&jarfile\fP. +If no wafer is specified, +one containing a +canned notice\" ijbfaq.html#notice +(the +\fI\&vanilla wafer\fP) +is added as an alert to the server +unless the +suppress-vanilla-wafer\" ijbman.html#suppress-vanilla-wafer +option is invoked. +.TP +.\" anchor: o_v suppress-vanilla-wafer +\fI-v\fP (Old) suppress-vanilla-wafer \fI\fP (New) +Suppress the vanilla wafer. +.TP +.\" anchor: o_t from +\fI-t from\fP (Old) from \fIfrom\fP (New) +If the browser +discloses an email address\" ijbfaq.html#from +in the +\fB\&FROM\fP +header (most don't), +replace it with +\fI\&from.\fP +If +\fI\&from\fP +is set to +\fB\&.\fP +(the period character) +the +\fB\&FROM\fP +is passed to the server unchanged. +The default is to delete the +\fB\&FROM\fP +header. +.TP +.\" anchor: o_r referer +\fI-r referer\fP (Old) referer \fIreferer\fP (New) +Whenever the browser discloses the +\s-2URL\s0 +that +led to\" ijbfaq.html#referer +the current request, +replace it with +\fI\&referer.\fP +If +\fI\&referer\fP +is set to +\fB\&.\fP +(period) +the +\s-2URL\s0 +is passed to the server unchanged. +In +Version 1.4 +and later, if referer is set to +\fB\&@\fP +(at) the +\s-2URL\s0 +is sent in cases where the cookiefile +specifies that a cookie would be sent. +(No way to send bogus referers selectively is provided.) +The default is to delete Referer. +.P +Version 2.0 also accepts the spelling +\fC\&referrer\fP, +which most dictionaries consider correct. +.TP +.\" anchor: o_u user-agent +\fI-u user-agent\fP (Old) user-agent \fIuser-agent\fP (New) +Information disclosed by the browser +about itself\" ijbfaq.html#agent +is replaced with the value +\fI\&user-agent.\fP +If +\fI\&user-agent\fP +is set to +\fB\&.\fP +(period) +the +\fB\&User-Agent\fP +header is passed to the server unchanged, +along with any +\fB\&UA\fP +headers produced by +\s-2MS-IE\s0 +(which would otherwise be deleted). +In +Version 1.4 +and later, if +\fI\&user-agent\fP +is set to +\fB\&@\fP +(at) these headers are sent unchanged in cases where the cookiefile +specifies that a cookie would be sent, +otherwise only default +\fB\&User-Agent\fP +header is sent. +That default +is Mozilla/3.0 (Netscape) +with an unremarkable +Macintosh\" ijbfaq.html#infer +configuration. +If used with a browser less advanced than Mozilla/3.0 or IE-3, the default +may encourage pages containing extensions that confuse the browser. +.TP +.\" anchor: o_h listen-address +\fI-h [host][:port]\fP (Old) listen-address \fI[host][:port]\fP (New) +If +\fI\&host\fP +is specified, +bind the +\fBjunkbuster\fP +to that +\s-2IP\s0 +address. +If a +\fI\&port\fP +is specified, use it. +The default +port +is 8000; +the default host is +\fC\&localhost\fP. +Before Version 2.0.2, +the default was to bind to all +\s-2IP\s0 +addresses +(\fB\&INADDR_ANY\fP); +but this has been restricted to +\fB\&localhost\fP +to avoid unintended security breaches. +(To open the proxy to all, use the line +.br +.ti +0.25i +\fB\&listen-address :8000\fP +.br +in the configuration file.) +.TP +.\" anchor: o_f forwardfile +\fI-f forward_host[:port]\fP (Old) forwardfile \fIforwardfile\fP (New) +Version 1.X required all +\s-2HTTP\s0 +requests from the client to be forwarded to the same destination. +Version 2.0 takes its routing specification from a +\fI\&forwardfile\fP, +allowing selection of the proxy (a.k.a. forwarding host) and gateway +according to the +\s-2URL\s0. +Here is a typical line. +.br +.ft CW +.S 8 +.nf +.sp +* lpwa.com:8000 . . +.S +.ft +.fi +.sp + +.P +Each line contains four fields: +\fB\&target\fP, +\fB\&forward_to\fP, +\fB\&via_gateway_type\fP +and +\fB\&gateway\fP. +As usual, the +last\" ijbman.html#compare +\fB\&target\fP +domain that matches the requested +\s-2URL\s0 +wins, +and the +\fC\&*\fP +character alone matches any domain. +The target domain need not be a fully qualified +hostname; it can be a general domain such as +\fC\&com\fP +or +\fC\&co.uk\fP +or even just a port number. +.\" anchor: nose +For example, because +LPWA +does not handle +SSL,\" ijbfaq.html#encrypt +the line above will typically be followed by a line such as +.br +.ft CW +.S 8 +.nf +.sp +:443 . . . +.S +.ft +.fi +.sp + +to allow SSL transactions to proceed directly. +The cautious would also +add an entry in their blockfile to stop transactions +to port 443 for all but specified trusted sites. +.P +If the winning +\fB\&forward_to\fP +field is +\fC\&.\fP +(the dot character) the proxy connects +directly to the server given in the +\s-2URL\s0, +otherwise it forwards to the host and port number specified. +The default port is 8000. +The +\fC\&via_gateway_type\fP +and +\fC\&gateway\fP +fields also use a dot to indicate no gateway protocol. +The gateway protocols are explained +below.\" ijbman.html#o_g +.P +The example line above in a forwardfile alone +would send everything through port 8000 at +\fC\&lpwa.com\fP +with no gateway protocol, +and is equivalent to the old +\fC\&-f lpwa.com:8000\fP +with no +\fC\&-g\fP +option. +For more information see the example file provided with the distribution. +.P +Configure with care: no loop detection is performed. +When setting up chains of proxies that might loop back, try adding +Squid.\" ijbman.html#squid +.TP +.\" anchor: o_g +\fI-g gw_protocol[:[gw_host][:gw_port]]\fP (Old) +Use +\fI\&gw_protocol\fP +as the gateway protocol. +This option was introduced in Version 1.4, +but was folded into the +forwardfile\" ijbman.html#forwardfile +option in Version 2.0. +The default is to use no gateway protocol; +this may be explicitly specified as +\fB\&direct\fP +on the command line +or the dot character in the forwardfile. +The +\fC\&SOCKS4\fP +protocol may be specified as +\fB\&socks\fP +or +\fB\&socks4\fP. +The +\fC\&SOCKS4A\fP +protocol is specified as +\fB\&socks4a\fP. +The +\fC\&SOCKS5\fP +protocol is not currently supported. +The default +\s-2SOCKS\s0 +\fI\&gw_port\fP +is 1080. +.P +The user's browser should +\fInot\fP +be +configured\" ijbfaq.html#socks +to use +\fC\&SOCKS\fP; +the proxy conducts the negotiations, not the browser. +.P +The user identification capabilities of +\fC\&SOCKS4\fP +are deliberately not used; +the user is always identified to the +\fC\&SOCKS\fP +server as +\fC\&userid=anonymous\fP. +If the server's policy is to reject requests from +\fC\&anonymous\fP, +the proxy will not work. +Use a +debug\" ijbman.html#o_d +value of 3 +to see the status returned by the server. +.TP +.\" anchor: o_d debug +\fI-d N\fP (Old) debug \fIN\fP (New) +Set debug mode. +The most common value is 1, +to +pinpoint\" ijbfaq.html#pinpoint +offensive +\s-2URL\s0s, +so they can be added to the blockfile. +The value of +\fB\&N\fP +is a bitwise +logical-\s-2OR\s0 +of the following values: +.br +.br +\h'-\w"1 = "u'1 = URLs (show each URL requested by the browser); +.br +\h'-\w"2 = "u'2 = Connections (show each connection to or from the proxy); +.br +\h'-\w"4 = "u'4 = I/O (log I/O errors); +.br +\h'-\w"8 = "u'8 = Headers (as each header is scanned, show the header and what is done to it); +.br +\h'-\w"16 = "u'16 = Log everything (including debugging traces and the contents of the pages). +.\" anchor: or +Multiple +\fB\&debug\fP +lines are permitted; they are logical OR-ed together. +.P +Because most browsers send several requests in parallel +the debugging output may appear intermingled, so the +single-threaded\" ijbman.html#single-threaded +option is recommended when using +debug\" ijbman.html#debug +with +\fB\&N\fP +greater than 1. +.TP +.\" anchor: o_y add-forwarded-header +\fI-y\fP (Old) add-forwarded-header \fI\fP (New) +Add +\fB\&X-Forwarded-For\fP +headers to the server-bound +\s-2HTTP\s0 +stream +indicating the client +\s-2IP\s0 +address +to the server,\" ijbfaq.html#detect +in the new style of +Squid 1.1.4.\" ijbman.html#squid +If you want the traditional +\fC\&HTTP_FORWARDED\fP +response header, add it manually with the +-x\" ijbman.html#o_x +option. +.TP +.\" anchor: o_x add-header +\fI-x HeaderText\fP (Old) add-header \fIHeaderText\fP (New) +Add the +\fI\&HeaderText\fP +verbatim to requests to the server. +Typical uses include +adding old-style forwarding notices such as +\fB\&Forwarded: by http://pro-privacy-isp.net\fP +and reinstating the +\fB\&Proxy-Connection: Keep-Alive\fP +header +(which the +\fBjunkbuster\fP +deletes so as +not\" ijbfaq.html#detect +to reveal its existence). +No checking is done for correctness or plausibility, +so it can be used to throw any old trash into the server-bound +\s-2HTTP\s0 +stream. +Please don't litter. +.TP +.\" anchor: o_s single-threaded +\fI-s\fP (Old) single-threaded \fI\fP (New) +Doesn't +\fB\&fork()\fP +a separate process +(or create a separate thread) +to handle each connection. +Useful when debugging to keep the process single threaded. +.TP +.\" anchor: o_l logfile +\fI-l logfile\fP (Old) logfile \fIlogfile\fP (New) +Write all debugging data into +\fI\&logfile.\fP +The default +\fI\&logfile\fP +is the standard output. +.TP +.\" anchor: o_acl aclfile +aclfile \fIaclfile\fP (New) +Unless this option is used, the proxy talks to anyone who can connect to it, +and everyone who can has equal permissions on where they can go. +An access file allows restrictions to be placed on these two policies, +by distinguishing some +\fIsource\fP +\s-2IP\s0 +addresses and/or +some +\fIdestination\fP +addresses. +(If a +forwarder or a gateway\" ijbman.html#forwardfile +is being used, its address is considered the destination address, +not the ultimate +\s-2IP\s0 +address of the +\s-2URL\s0 +requested.) +.P +Each line of the access file begins with +either the word +\fB\&permit\fP +or +\fB\&deny\fP +followed by source and (optionally) destination addresses +to be matched against those of the +\s-2HTTP\s0 +request. +The last matching line specifies the result: if it was a +\fB\&deny\fP +line or if no line matched, +the request will be refused. +.P +A source or destination +can be specified as a single numeric +\s-2IP\s0 +address, +or with a hostname, provided that the host's name +can be resolved to a numeric address: this cannot be used to block all +\fB\&.mil \fP +domains for example, +because there is no single address associated with that domain name. +Either form may be followed by a slash and an integer +\fB\&N\fP, +specifying a subnet mask of +\fB\&N\fP +bits. +For example, +\fB\&permit 207.153.200.72/24\fP +matches the entire Class-C subnet from +207.153.200.0 +through 207.153.200.255. +(A netmask of 255.255.255.0 corresponds to 24 bits of +ones in the netmask, as with +\fC\&*_MASKLEN=24\fP.) +A value of 16 would be used for a Class-B subnet. +A value of zero for +\fB\&N\fP +in the subnet mask length will cause any address to match; +this can be used to express a default rule. +For more information see the example file provided with the distribution. +.P +If you like these access controls +you should probably have +firewall;\" ijbfaq.html#firewall +they are not intended to replace one. +.TP +.\" anchor: o_tf trustfile +trustfile \fItrustfile\fP (New) +This feature is experimental, has not been fully documented and is +very subject to change. +The goal is for parents to be able to choose a page or site whose +links they regard suitable for their +young children\" ijbfaq.html#children +and for the proxy to allow access only to sites mentioned there. +To do this the proxy examines the +referer\" ijbman.html#o_r +variable on each page request to check they resulted from +a click on the ``trusted referer'' site: if so the referred site +is added to a list of trusted sites, so that the child can +then move around that site. +There are several uncertainties in this scheme that experience may be +able to iron out; check back in the months ahead. +.TP +.\" anchor: o_ti trust_info_url +trust_info_url \fItrust_info_url\fP (New) +When access is denied due to lack of a trusted referer, this +\s-2URL\s0 +is displayed with a message pointing the user to it for further information. +.TP +.\" anchor: o_hc hide-console +hide-console \fI\fP (New) +In the Windows version only, instructs the program +to disconnect from and hide the command console after starting. +.TP +.\" anchor: o_a +\fI-a\fP (Old) +(Obsolete) Accept the server's +\fB\&Set-cookie\fP +headers, passing them through to the browser. +.\" anchor: obsolete +This option was removed in Version 1.2 +and replaced by an improvement to the +-c\" ijbman.html#o_c +option. +.LE +.SH INSTALLATION AND USE +Browsers must be told where to find the +\fBjunkbuster\fP +(e.g. +\fB\&localhost\fP +port 8000). +To set the +\s-2HTTP\s0 +proxy in Netscape 3.0, +go through: +\fB\&Options\fP; +\fB\&Network Preferences\fP; +\fB\&Proxies\fP; +\fB\&Manual Proxy Configuration\fP; +\fB\&View\fP. +See the +\s-2FAQ\s0 +for other browsers. +The +Security Proxy\" ijbfaq.html#security +should also be set to the same values, +otherwise +\fB\&shttp:\fP +\s-2URL\s0s +won't work. +.P +Note the limitations +explained in the +\s-2FAQ\s0. +.SH CHECKING OPTIONS +To allow users to +check\" ijbfaq.html#show +that a +\fBjunkbuster\fP +is running and how it is configured, +it intercepts requests for any +\s-2URL\s0 +ending in +\fB\&/show-proxy-args\fP +and blocks it, +returning instead returns information on its +version number and +current configuration +including the contents of its blockfile. +To get an explicit warning that no +\fBjunkbuster\fP +intervened if the proxy was not configured, +it's best to point it to a +\s-2URL\s0 +that does this, such as +http://internet.junkbuster.com/cgi-bin/show-proxy-args +on Junkbusters's website. +.SH SEE ALSO +http://www.waldherr.org/junkbuster/\" waldherr.org# +.br +http://www.junkbusters.com/ht/en/ijbfaq.html\" ijbfaq.html# +.br +http://www.junkbusters.com/ht/en/cookies.html\" cookies.html# +.br +http://internet.junkbuster.com/cgi-bin/show-proxy-args +.br +http://www.cis.ohio-state.edu/htbin/rfc/rfc2109.html +.br +http://squid.nlanr.net/Squid/ +.br +http://www-math.uni-paderborn.de/~axel/ +.SH COPYRIGHT AND GPL +Written and copyright by the Anonymous Coders and Junkbusters Corporation +and made available under the +GNU General Public License (GPL).\" gpl.html# +This software comes with +NO WARRANTY.\" gpl.html#nowarr +Internet Junkbuster +Proxy +is a +trademark\" legal.html#marks +of Junkbusters Corporation. diff --git a/junkbuster.init b/junkbuster.init new file mode 100644 index 00000000..f35001a8 --- /dev/null +++ b/junkbuster.init @@ -0,0 +1,133 @@ +#!/bin/sh +# ******************************************************************** +# +# File : $Source: /cvsroot/ijbswa/current/junkbuster.init,v $ +# +# Purpose : This shell script takes care of starting and stopping +# junkbuster. +# This works only correctly if the user `nobody' is allowed +# to be in the directory where this file is called +# (for example: /root is NOT ok) +# +# 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: junkbuster.init,v $ +# Revision 1.7 2001/06/28 13:40:26 sarantis +# remove single quotes from $JB; it was not expanded. +# +# Revision 1.6 2001/06/28 13:38:42 sarantis +# formatting changes; individual return values are returned from the init script. +# +# Revision 1.5 2001/06/11 11:37:40 sarantis +# Minor editing changes. +# +# Revision 1.4 2001/06/09 09:14:11 swa +# shamelessly adapted RPM stuff from the newest rpm that +# RedHat provided for the JB. +# +# Revision 1.3 2001/05/25 10:12:44 oes +# Fixed default case in switch statement (# -> *) +# +# Revision 1.2 2001/05/24 07:52:24 swa +# added header. removed ^M. +# +# +# ********************************************************************/ + +# This is file /etc/rc.d/init.d/junkbuster and was put here +# by the junkbuster rpm +# +# chkconfig: 235 84 09 +# +# description: This shell script takes care of starting and stopping \ +# junkbuster. +# + +# Source function library. +. /etc/rc.d/init.d/functions + +. /etc/sysconfig/network + +# Check that networking is up. +[ ${NETWORKING} = "no" ] && exit 0 +[ -f /usr/sbin/junkbuster ] || exit 0 + +[ -f /etc/junkbuster/config ] || exit 0 + +# See how we were called. + +JB="/usr/sbin/junkbuster /etc/junkbuster/config & " +start () { + # start daemon + [ -f /var/lock/subsys/junkbuster ] && exit 0 + echo -n $"Starting junkbuster: " + daemon --user junkbust $JB + RETVAL=$? + echo + [ $RETVAL = 0 ] && touch /var/lock/subsys/junkbuster + return $RETVAL +} + +stop () { + # stop daemon + echo -n $"Stopping junkbuster: " + killproc junkbuster && rm -f /var/lock/subsys/junkbuster + RETVAL=$? + echo + return $RETVAL +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + reload|restart) + stop + start + RETVAL=$? + ;; + condrestart) + # restart only if already running + if [ -f /var/lock/subsys/junkbuster ] ; then + stop + start + RETVAL=$? + fi + ;; + status) + status junkbuster + RETVAL=$? + ;; + *) + echo $"Usage: junkbuster {start|stop|reload|restart|condrestart|status}" + exit 1 +esac + +exit $RETVAL diff --git a/junkbuster.init.suse b/junkbuster.init.suse new file mode 100644 index 00000000..e49579e1 --- /dev/null +++ b/junkbuster.init.suse @@ -0,0 +1,76 @@ +#! /bin/sh +# ******************************************************************** +# +# File : $Source: /cvsroot/ijbswa/current/junkbuster.init,v $ +# +# Purpose : This shell script takes care of starting and stopping +# junkbuster. +# +# 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: junkbuster.init,v $ +# +# +# ********************************************************************/ +### BEGIN INIT INFO +# Provides: junkbuster ijb +# Required-Start: $network syslog +# Required-Stop: +# Default-Start: 3 5 +# Default-Stop: +# Description: Starts the Internet Junkbuster +### END INIT INFO +. /etc/rc.config +base=\${0##*/} +link=\${base#*[SK][0-9][0-9]} +#test \$link = \$base && START_IJB=yes +#test "\$START_IJB" = "yes" || exit 0 +return=\$rc_done +case "\$1" in + start) + echo -n "Starting The Internet Junkbuster" + su - nobody -c 'nohup /usr/sbin/junkbuster /etc/junkbuster/config < /dev/null > /dev/null &' + sleep 1 + echo -e "\$return" + ;; + stop) + echo -n "Shutting down The Internet Junkbuster" + killproc -TERM /usr/sbin/junkbuster || return=\$rc_failed + echo -e "\$return" + ;; + restart|reload) + \$0 stop && \$0 start || return=\$rc_failed + ;; + status) + checkproc /usr/sbin/junkbuster && echo OK || echo No process + ;; + *) + echo "Usage: \$0 {start|restart|status|stop}" + exit 1 +esac +test "\$return" = "\$rc_done" || exit 1 +exit 0 diff --git a/privoxy.logrotate b/junkbuster.logrotate similarity index 56% rename from privoxy.logrotate rename to junkbuster.logrotate index 035112a5..e13ee1d5 100644 --- a/privoxy.logrotate +++ b/junkbuster.logrotate @@ -1,15 +1,15 @@ # -# Logrotate file for Privoxy RPM +# Logrotate file for Junkbuster RPM # # ******************************************************************** # -# File : $Source: /cvsroot/ijbswa/current/privoxy.logrotate,v $ +# File : $Source: /cvsroot/ijbswa/current/junkbuster.logrotate,v $ # -# Purpose : Rotates all potential Privoxy logfiles +# Purpose : Rotates all potential Junkbuster logfiles # # # Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ +# IJBSWA team. http://ijbswa.sourceforge.net # # Based on the Internet Junkbuster originally written # by and Copyright (C) 1997 Anonymous Coders and @@ -34,35 +34,7 @@ # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Revisions : -# $Log: privoxy.logrotate,v $ -# Revision 1.3 2002/03/24 15:19:57 swa -# name change related issue. -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.7 2001/12/30 14:07:32 steudten -# - Add signal handling (unix) -# - Add SIGHUP handler (unix) -# - Add creation of pidfile (unix) -# - Add action 'top' in rc file (RH) -# - Add entry 'SIGNALS' to manpage -# - Add exit message to logfile (unix) -# -# Revision 1.6 2001/12/13 23:19:43 steudten -# Add 'restart' of junkbuster service after rotate logfiles. -# Better we could use the well known 'kill -HUP', but the handler -# isn't there at this time. -# -# Revision 1.5 2001/11/05 21:31:51 steudten -# Change switch mode from weekly to size 1M -# -# Revision 1.4 2001/06/28 13:30:22 sarantis -# add missingok for the jarfile entry -# +# $Log: junkbuster.logrotate,v $ # Revision 1.3 2001/06/04 18:31:58 swa # files are now prefixed with either `confdir' or `logdir'. # `make redhat-dist' replaces both entries confdir and logdir @@ -78,19 +50,13 @@ # # ********************************************************************/ -/var/log/privoxy/logfile { +/var/log/junkbuster/logfile { compress - size 1M - postrotate - /sbin/service privoxy reload 2> /dev/null || true - endscript + weekly } -/var/log/privoxy/jarfile { - missingok - compress - size 1M - postrotate - /sbin/service privoxy reload 2> /dev/null || true - endscript +/var/log/junkbuster/jarfile { + missingok + compress + weekly } diff --git a/privoxy.monthly b/junkbuster.monthly similarity index 87% rename from privoxy.monthly rename to junkbuster.monthly index 15734ddf..89dac657 100644 --- a/privoxy.monthly +++ b/junkbuster.monthly @@ -2,13 +2,13 @@ # ******************************************************************** # -# File : $Source: /cvsroot/ijbswa/current/privoxy.monthly,v $ +# File : $Source: /cvsroot/ijbswa/current/gateway.h,v $ # # Purpose : Downloads updated configuration (blocklists, ...) # to the machine. # # Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ +# IJBSWA team. http://ijbswa.sourceforge.net # # Based on the Internet Junkbuster originally written # by and Copyright (C) 1997 Anonymous Coders and @@ -33,16 +33,7 @@ # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Revisions : -# $Log: privoxy.monthly,v $ -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.3 2001/05/24 07:41:33 swa -# added header -# +# $Log: gateway.h,v $ # # # ********************************************************************/ diff --git a/privoxy.weekly b/junkbuster.weekly similarity index 84% rename from privoxy.weekly rename to junkbuster.weekly index 81424f8d..fdd5bf14 100644 --- a/privoxy.weekly +++ b/junkbuster.weekly @@ -2,13 +2,13 @@ # ******************************************************************** # -# File : $Source: /cvsroot/ijbswa/current/privoxy.weekly,v $ +# File : $Source: /cvsroot/ijbswa/current/junkbuster.monthly,v $ # # Purpose : Downloads updated configuration (blocklists, ...) # to the machine. # # Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ +# IJBSWA team. http://ijbswa.sourceforge.net # # Based on the Internet Junkbuster originally written # by and Copyright (C) 1997 Anonymous Coders and @@ -33,16 +33,7 @@ # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Revisions : -# $Log: privoxy.weekly,v $ -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.2 2001/05/24 07:52:24 swa -# added header. removed ^M. -# +# $Log: junkbuster.monthly,v $ # Revision 1.3 2001/05/24 07:41:33 swa # added header # diff --git a/killpopup.c b/killpopup.c index 34653738..f191b08e 100644 --- a/killpopup.c +++ b/killpopup.c @@ -1,4 +1,4 @@ -const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Exp $"; +const char killpopup_rcs[] = "$Id: killpopup.c,v 1.6 2001/07/19 19:11:35 haroon Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/killpopup.c,v $ @@ -6,13 +6,13 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex * Purpose : Handles the filtering of popups. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -32,44 +32,6 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex * * Revisions : * $Log: killpopup.c,v $ - * Revision 1.15 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.14 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.13 2001/11/13 00:16:40 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.12 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.11 2001/10/07 15:42:41 oes - * filter_popups now gets a csp pointer so it can raise the new - * CSP_FLAG_MODIFIED flag. - * - * Revision 1.10 2001/09/22 16:34:44 jongfoster - * Removing unneeded #includes - * - * Revision 1.9 2001/07/31 14:44:22 oes - * Deleted unused size parameter from filter_popups() - * - * Revision 1.8 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.7 2001/07/20 19:29:25 haroon - * - In v1.5 forgot to add that I implemented LOG_LEVEL_POPUPS in errlog.c, - * errlog.h and killpopup.c. In that case, it is superfluous to have define for - * POPUP_VERBOSE, so I removed the defines and logging is now done - * via log_error(LOG_LEVEL_POPUPS, ....) - * * Revision 1.6 2001/07/19 19:11:35 haroon * - Implemented Guy's idea of replacing window.open( with 1;''.concat( * - Implemented Guy's idea of replacing .resizeTo( with .scrollTo( @@ -109,102 +71,99 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex #include #include #include +#include #include #include #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #endif #include "project.h" #include "killpopup.h" +#include "jcc.h" #include "errlog.h" const char killpopup_h_rcs[] = KILLPOPUP_H_VERSION; -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS /********************************************************************* * * Function : filter_popups * - * Description : Filter the block of data that's been read from the server - * for javascript popup code and replace by syntactically - * neutral code of the same size. - * Raise the CSP_FLAG_MODIFIED flag on success. + * Description : Filter the block of data that's been read from the server. + * Caller is responsible for checking permissons list + * to determine if this function should be called. + * Remember not to change the content length (substitute char by char) * * Parameters : * 1 : buff = Buffer to scan and modify. Null terminated. - * 2 : csp = Client state pointer + * 2 : size = Buffer size, excluding null terminator. * * Returns : void * *********************************************************************/ -void filter_popups(char *buff, struct client_state *csp) +void filter_popups(char *buff, int size) { - char *start_p = NULL; - char *close_p = NULL; + char *popup = NULL; + char *close = NULL; char *p = NULL; - /* - * replace the window.open( with a harmless JavaScript replacement - * (notice the two single quotes) - */ - while ((start_p = strstr(buff, "window.open(")) != NULL) + while ((popup = strstr( buff, "window.open(" )) != NULL) { - if (start_p) + if ( popup ) { - strncpy(start_p, "1;''.concat(", 12); + /* + * replace the window.open( with a harmless JavaScript replacement (notice the two single quotes) + * Guy's idea (thanks) + */ + strncpy(popup, "1;''.concat(", 12); log_error(LOG_LEVEL_POPUPS, "Blocked popup window open"); - csp->flags |= CSP_FLAG_MODIFIED; } } - - /* - * replace the .resizeTo( with a harmless JavaScript replacement - */ - while ((start_p = strstr(buff, ".resizeTo(")) != NULL) + + while ((popup = strstr( buff, ".resizeTo(" )) != NULL) { - if (start_p) + if ( popup ) { - strncpy(start_p, ".scrollTo(", 10); + /* + * replace the .resizeTo( with a harmless JavaScript replacement + * Guy's idea (thanks) + */ + strncpy(popup, ".scrollTo(", 10); log_error(LOG_LEVEL_POPUPS, "Blocked popup window resize"); - csp->flags |= CSP_FLAG_MODIFIED; } } - /* - * Filter onUnload and onExit - */ - start_p = strstr(buff, "'); - if (close_p) + close=strchr(popup,'>'); + if (close) { - /* we are now between */ - p = strstr(start_p, "onUnload"); + /* we are now between FIXME: No, we're anywhere! --oes*/ + p=strstr(popup, "onUnload"); if (p) { - strncpy(p, "_nU_", 4); - csp->flags |= CSP_FLAG_MODIFIED; + strncpy(p,"_nU_",4); } - p = strstr(start_p, "onExit"); + p=strstr(popup, "onExit"); if (p) { - strncpy(p, "_nE_", 4); - csp->flags |= CSP_FLAG_MODIFIED; + strncpy(p,"_nE_",4); } } } } -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ /* Local Variables: diff --git a/killpopup.h b/killpopup.h index 7d2eadf6..23bd7d7b 100644 --- a/killpopup.h +++ b/killpopup.h @@ -1,6 +1,6 @@ -#ifndef KILLPOPUP_H_INCLUDED -#define KILLPOPUP_H_INCLUDED -#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.7 2002/03/24 13:25:43 swa Exp $" +#ifndef _KILLPOPUP_H +#define _KILLPOPUP_H +#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.1.1.1 2001/05/15 13:58:58 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/killpopup.h,v $ @@ -8,7 +8,7 @@ * Purpose : Handles the filtering of popups. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -34,39 +34,6 @@ * * Revisions : * $Log: killpopup.h,v $ - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2001/10/07 15:42:41 oes - * filter_popups now gets a csp pointer so it can raise the new - * CSP_FLAG_MODIFIED flag. - * - * Revision 1.5 2001/07/31 14:44:22 oes - * Deleted unused size parameter from filter_popups() - * - * Revision 1.4 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.3 2001/07/29 18:59:21 jongfoster - * - Changing #define _KILLPOPUP_H to KILLPOPUP_H_INCLUDED - * - Adding extern "C" {} - * - * Revision 1.2 2001/05/20 01:21:20 jongfoster - * Version 2.9.4 checkin. - * - Merged popupfile and cookiefile, and added control over PCRS - * filtering, in new "permissionsfile". - * - Implemented LOG_LEVEL_FATAL, so that if there is a configuration - * file error you now get a message box (in the Win32 GUI) rather - * than the program exiting with no explanation. - * - Made killpopup use the PCRS MIME-type checking and HTTP-header - * skipping. - * - Removed tabs from "config" - * - Moved duplicated url parsing code in "loaders.c" to a new funcition. - * - Bumped up version number. - * * Revision 1.1.1.1 2001/05/15 13:58:58 oes * Initial import of version 2.9.3 source tree * @@ -76,25 +43,17 @@ #include "project.h" -#ifdef __cplusplus -extern "C" { -#endif +#ifdef KILLPOPUPS -#ifdef FEATURE_KILL_POPUPS +extern void filter_popups(char *buff, int size); -extern void filter_popups(char *buff, struct client_state *csp); - -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ /* Revision control strings from this header and associated .c file */ extern const char killpopup_rcs[]; extern const char killpopup_h_rcs[]; -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef KILLPOPUP_H_INCLUDED */ +#endif /* ndef _KILLPOPUP_H */ /* Local Variables: diff --git a/list.c b/list.c index 6cd7f891..18e5da7e 100644 --- a/list.c +++ b/list.c @@ -1,4 +1,4 @@ -const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; +const char list_rcs[] = "$Id: list.c,v 1.4 2001/06/29 13:30:22 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/list.c,v $ @@ -8,13 +8,13 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; * `destroy_list', `enlist' and `list_to_text' * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -34,47 +34,6 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; * * Revisions : * $Log: list.c,v $ - * Revision 1.14 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.13 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.12 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.11 2001/10/23 21:21:03 jongfoster - * New error handling - error codes are now jb_errs, not ints. - * Changed the way map() handles out-of-memory, to dramatically - * reduce the amount of error-checking clutter needed. - * - * Revision 1.10 2001/09/16 17:30:24 jongfoster - * Fixing a compiler warning. - * - * Revision 1.9 2001/09/16 13:20:29 jongfoster - * Rewrite of list library. Now has seperate header and list_entry - * structures. Also added a large sprinking of assert()s to the list - * code. - * - * Revision 1.8 2001/08/07 14:00:20 oes - * Fixed comment - * - * Revision 1.7 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.6 2001/07/31 14:44:51 oes - * list_to_text() now appends empty line at end - * - * Revision 1.5 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * * Revision 1.4 2001/06/29 13:30:22 oes * - Added Convenience function enlist_unique_header(), * which takes the Header name and value as separate @@ -111,174 +70,23 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; #include "config.h" -#ifndef _WIN32 -/* FIXME: The following headers are not needed for Win32. Are they - * needed on other platforms? - */ #include #include #include #include -#endif #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #endif -#include - #include "project.h" +#include "jcc.h" #include "list.h" #include "miscutil.h" const char list_h_rcs[] = LIST_H_VERSION; - -static int list_is_valid (const struct list *the_list); - - -/********************************************************************* - * - * Function : list_init - * - * Description : Create a new, empty list in user-allocated memory. - * Caller should allocate a "struct list" variable, - * then pass it to this function. - * (Implementation note: Rather than calling this - * function, you can also just memset the memory to - * zero, e.g. if you have a larger structure you - * want to initialize quickly. However, that isn't - * really good design.) - * - * Parameters : - * 1 : the_list = pointer to list - * - * Returns : N/A - * - *********************************************************************/ -void init_list(struct list *the_list) -{ - memset(the_list, '\0', sizeof(*the_list)); -} - - -/********************************************************************* - * - * Function : destroy_list - * - * Description : Destroy a string list (opposite of list_init). - * On return, the memory used by the list entries has - * been freed, but not the memory used by the_list - * itself. You should not re-use the_list without - * calling list_init(). - * - * (Implementation note: You *can* reuse the_list - * without calling list_init(), but please don't. - * If you want to remove all entries from a list - * and still have a usable list, then use - * list_remove_all().) - * - * Parameters : - * 1 : the_list = pointer to list - * - * Returns : N/A - * - *********************************************************************/ -void destroy_list (struct list *the_list) -{ - struct list_entry *cur_entry, *next_entry; - - assert(the_list); - - for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry) - { - next_entry = cur_entry->next; - freez(cur_entry->str); - free(cur_entry); - } - - the_list->first = NULL; - the_list->last = NULL; -} - - -/********************************************************************* - * - * Function : list_is_valid - * - * Description : Check that a string list is valid. The intended - * usage is "assert(list_is_valid(the_list))". - * Currently this checks that "the_list->last" - * is correct, and that the list dosn't contain - * circular references. It is likely to crash if - * it's passed complete garbage. - * - * Parameters : - * 1 : the_list = pointer to list. Must be non-null. - * - * Returns : 1 if list is valid, 0 otherwise. - * - *********************************************************************/ -static int list_is_valid (const struct list *the_list) -{ - /* - * If you don't want this check, just change the line below - * from "#if 1" to "#if 0". - */ -#if 1 - const struct list_entry *cur_entry; - const struct list_entry *last_entry = NULL; - int length = 0; - - assert(the_list); - - for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next) - { - last_entry = cur_entry; - - if (cur_entry->str) - { - /* - * Just check that this string can be accessed - i.e. it's a valid - * pointer. - */ - strlen(cur_entry->str); - } - - /* - * Check for looping back to first - */ - if ((length != 0) && (cur_entry == the_list->first)) - { - return 0; - } - - /* - * Arbitrarily limit length to prevent infinite loops. - */ - if (++length > 1000) - { - return 0; - } - - /* - * Check this isn't marked as the last entry, unless of course it's - * *really* the last entry. - */ - if ((the_list->last == cur_entry) && (cur_entry->next != NULL)) - { - /* This is the last entry, but there's data after it !!?? */ - return 0; - } - } - - return (the_list->last == last_entry); -#else - return 1; -#endif -} - /********************************************************************* * * Function : enlist @@ -286,51 +94,32 @@ static int list_is_valid (const struct list *the_list) * Description : Append a string into a specified string list. * * Parameters : - * 1 : the_list = pointer to list + * 1 : header = pointer to list 'dummy' header * 2 : str = string to add to the list (maybe NULL) * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. + * Returns : N/A * *********************************************************************/ -jb_err enlist(struct list *the_list, const char *str) +void enlist(struct list *header, const char *str) { - struct list_entry *cur; - - assert(the_list); - assert(list_is_valid(the_list)); + struct list *cur = (struct list *)malloc(sizeof(*cur)); + struct list *last; - if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur)))) + if (cur) { - return JB_ERR_MEMORY; - } + cur->str = (str ? strdup(str) : NULL); + cur->next = NULL; - if (str) - { - if (NULL == (cur->str = strdup(str))) + last = header->last; + if (last == NULL) { - free(cur); - return JB_ERR_MEMORY; + last = header; } - } - /* else { cur->str = NULL; } - implied by zalloc */ - - /* cur->next = NULL; - implied by zalloc */ - if (the_list->last) - { - the_list->last->next = cur; - the_list->last = cur; - } - else - { - the_list->first = cur; - the_list->last = cur; + last->next = cur; + header->last = cur; } - assert(list_is_valid(the_list)); - return JB_ERR_OK; } @@ -342,46 +131,28 @@ jb_err enlist(struct list *the_list, const char *str) * string list. * * Parameters : - * 1 : the_list = pointer to list + * 1 : header = pointer to list 'dummy' header * 2 : str = string to add to the list (maybe NULL) * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. + * Returns : N/A * *********************************************************************/ -jb_err enlist_first(struct list *the_list, const char *str) +void enlist_first(struct list *header, const char *str) { - struct list_entry *cur; - - assert(the_list); - assert(list_is_valid(the_list)); + struct list *cur = (struct list *)malloc(sizeof(*cur)); - if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur)))) + if (cur) { - return JB_ERR_MEMORY; - } + cur->str = (str ? strdup(str) : NULL); + cur->next = header->next; - if (str) - { - if (NULL == (cur->str = strdup(str))) + header->next = cur; + if (header->last == NULL) { - free(cur); - return JB_ERR_MEMORY; + header->last = cur; } } - /* else { cur->str = NULL; } - implied by zalloc */ - - cur->next = the_list->first; - the_list->first = cur; - if (the_list->last == NULL) - { - the_list->last = cur; - } - - assert(list_is_valid(the_list)); - return JB_ERR_OK; } @@ -391,59 +162,49 @@ jb_err enlist_first(struct list *the_list, const char *str) * * Description : Append a string into a specified string list, * if & only if it's not there already. - * If the num_significant_chars argument is nonzero, - * only compare up to the nth character. + * If the n argument is nonzero, only compare up to + * the nth character. * * Parameters : - * 1 : the_list = pointer to list - * 2 : str = string to add to the list - * 3 : num_significant_chars = number of chars to use - * for uniqueness test, or 0 to require an exact match. + * 1 : header = pointer to list 'dummy' header + * 2 : str = string to add to the list (maybe NULL) + * 3 : n = number of chars to use for uniqueness test * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. - * "Success" does not indicate whether or not the - * item was already in the list. + * Returns : N/A * *********************************************************************/ -jb_err enlist_unique(struct list *the_list, const char *str, - size_t num_significant_chars) +void enlist_unique(struct list *header, const char *str, int n) { - struct list_entry *cur_entry; - - assert(the_list); - assert(list_is_valid(the_list)); - assert(str); - assert(num_significant_chars >= 0); - assert(num_significant_chars <= strlen(str)); + struct list *last; + struct list *cur = header->next; - if (num_significant_chars > 0) + while (cur != NULL) { - for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next) + if ((cur->str != NULL) && ( + (n && (0 == strncmp(str, cur->str, n))) || + (!n && (0 == strcmp(str, cur->str))))) { - if ( (cur_entry->str != NULL) - && (0 == strncmp(str, cur_entry->str, num_significant_chars))) - { - /* Already there */ - return JB_ERR_OK; - } + /* Already there */ + return; } + cur = cur->next; } - else + + cur = (struct list *)malloc(sizeof(*cur)); + + if (cur != NULL) { - /* Test whole string */ - for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next) + cur->str = (str ? strdup(str) : NULL); /* FIXME check retval */ + cur->next = NULL; + + last = header->last; + if (last == NULL) { - if ( (cur_entry->str != NULL) && (0 == strcmp(str, cur_entry->str))) - { - /* Already there */ - return JB_ERR_OK; - } + last = header; } + last->next = cur; + header->last = cur; } - - return enlist(the_list, str); } @@ -456,84 +217,80 @@ jb_err enlist_unique(struct list *the_list, const char *str, * if & only if there isn't already a header with that name. * * Parameters : - * 1 : the_list = pointer to list - * 2 : name = HTTP header name (e.g. "Content-type") - * 3 : value = HTTP header value (e.g. "text/html") + * 1 : header = pointer to list 'dummy' header + * 2 : first = first string to add to the list (maybe NULL) + * 3 : second = number of chars to use for uniqueness test * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. - * "Success" does not indicate whether or not the - * header was already in the list. + * Returns : N/A * *********************************************************************/ -jb_err enlist_unique_header(struct list *the_list, const char *name, - const char *value) +void enlist_unique_header(struct list *header, const char *name, const char *value) { - size_t length; - jb_err result; - char *str; + struct list *last; + struct list *cur = header->next; + int length; + char *dummy; + + if (name == NULL || value == NULL) return; - assert(the_list); - assert(list_is_valid(the_list)); - assert(name); - assert(value); + dummy = strdup(name); + dummy = strsav(dummy, ": "); + length = strlen(dummy); - length = strlen(name) + 2; - if (NULL == (str = (char *)malloc(length + strlen(value) + 1))) + while (cur != NULL) { - return JB_ERR_MEMORY; + if ((cur->str != NULL) && + (0 == strncmp(dummy, cur->str, length))) + { + /* Already there */ + return; + } + cur = cur->next; } - strcpy(str, name); - str[length - 2] = ':'; - str[length - 1] = ' '; - strcpy(str + length, value); - result = enlist_unique(the_list, str, length); + cur = (struct list *)malloc(sizeof(*cur)); - free(str); - - assert(list_is_valid(the_list)); - - return result; + if (cur != NULL) + { + cur->str = strsav(dummy, value); + cur->next = NULL; + last = header->last; + if (last == NULL) + { + last = header; + } + last->next = cur; + header->last = cur; + } } /********************************************************************* * - * Function : list_remove_all + * Function : destroy_list * - * Description : Remove all entries from a list. On return, the_list - * is a valid, empty list. Note that this is similar - * to destroy_list(), but the difference is that this - * function guarantees that the list structure is still - * valid after the call. + * Description : Destroy a string list (opposite of enlist) * * Parameters : - * 1 : the_list = pointer to list + * 1 : header = pointer to list 'dummy' header * * Returns : N/A * *********************************************************************/ -void list_remove_all(struct list *the_list) +void destroy_list(struct list *header) { - struct list_entry *cur_entry; - struct list_entry *next_entry; + struct list *p, *n; - assert(the_list); - assert(list_is_valid(the_list)); - - for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry) + for (p = header->next; p ; p = n) { - next_entry = cur_entry->next; - freez(cur_entry->str); - free(cur_entry); + n = p->next; + freez(p->str); + free(p); } - the_list->first = the_list->last = NULL; + memset(header, '\0', sizeof(*header)); - assert(list_is_valid(the_list)); } @@ -541,56 +298,52 @@ void list_remove_all(struct list *the_list) * * Function : list_to_text * - * Description : "Flatten" a string list into 1 long \r\n delimited string, - * adding an empty line at the end. NULL entries are ignored. - * This function does not change the_list. + * Description : "Flaten" a string list into 1 long \r\n delimited string. * * Parameters : - * 1 : the_list = pointer to list + * 1 : h = pointer to list 'dummy' header * * Returns : NULL on malloc error, else new long string. - * Caller must free() it. * *********************************************************************/ -char *list_to_text(const struct list *the_list) +char *list_to_text(struct list *h) { - struct list_entry *cur_entry; + struct list *p; char *ret = NULL; char *s; - size_t size = 2; + int size; - assert(the_list); - assert(list_is_valid(the_list)); + size = 0; - for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next) + for (p = h->next; p ; p = p->next) { - if (cur_entry->str) + if (p->str) { - size += strlen(cur_entry->str) + 2; + size += strlen(p->str) + 2; } } if ((ret = (char *)malloc(size + 1)) == NULL) { - return NULL; + return(NULL); } ret[size] = '\0'; s = ret; - for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next) + for (p = h->next; p ; p = p->next) { - if (cur_entry->str) + if (p->str) { - strcpy(s, cur_entry->str); + strcpy(s, p->str); s += strlen(s); *s++ = '\r'; *s++ = '\n'; } } - *s++ = '\r'; *s++ = '\n'; - return ret; + return(ret); + } @@ -601,54 +354,36 @@ char *list_to_text(const struct list *the_list) * Description : Remove a string from a specified string list. * * Parameters : - * 1 : the_list = pointer to list - * 2 : str = string to remove from the list - non-NULL + * 1 : header = pointer to list 'dummy' header + * 2 : str = string to remove from the list * * Returns : Number of times it was removed. * *********************************************************************/ -int list_remove_item(struct list *the_list, const char *str) +int list_remove_item(struct list *header, const char *str) { - struct list_entry *prev = NULL; - struct list_entry *cur; - struct list_entry *next; + struct list *prev = header; + struct list *cur = prev->next; int count = 0; - assert(the_list); - assert(list_is_valid(the_list)); - assert(str); - - cur = the_list->first; - while (cur != NULL) { - next = cur->next; - if ((cur->str != NULL) && (0 == strcmp(str, cur->str))) { count++; - if (prev != NULL) - { - prev->next = next; - } - else - { - the_list->first = next; - } - free((char *)cur->str); + prev->next = cur->next; + free(cur->str); free(cur); } else { prev = cur; } - cur = next; + cur = prev->next; } - the_list->last = prev; - - assert(list_is_valid(the_list)); + header->last = prev; return count; } @@ -671,25 +406,18 @@ int list_remove_item(struct list *the_list, const char *str) *********************************************************************/ int list_remove_list(struct list *dest, const struct list *src) { - struct list_entry *cur; + struct list *cur = src->next; int count = 0; - assert(src); - assert(dest); - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - for (cur = src->first; cur != NULL; cur = cur->next) + while (cur != NULL) { if (cur->str != NULL) { count += list_remove_item(dest, cur->str); } + cur = cur->next; } - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - return count; } @@ -698,96 +426,35 @@ int list_remove_list(struct list *dest, const struct list *src) * * Function : list_duplicate * - * Description : Copy a string list + * Description : Duplicate a string list * * Parameters : - * 1 : dest = Destination list. Must be a valid list. - * All existing entries will be removed. - * 1 : src = pointer to source list for copy. + * 1 : dest = pointer to destination for copy. Caller allocs. + * 2 : src = pointer to source for copy. * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, dest will be empty. + * Returns : N/A * *********************************************************************/ -jb_err list_duplicate(struct list *dest, const struct list *src) +void list_duplicate(struct list *dest, const struct list *src) { - struct list_entry * cur_src; - struct list_entry * cur_dest; + struct list * cur_src = src->next; + struct list * cur_dest = dest; - assert(src); - assert(dest); - assert(list_is_valid(src)); - assert(list_is_valid(dest)); + memset(dest, '\0', sizeof(*dest)); - list_remove_all(dest); - - /* Need to process first entry specially so we can set dest->first */ - cur_src = src->first; - if (cur_src) + while (cur_src) { - cur_dest = dest->first = (struct list_entry *)zalloc(sizeof(*cur_dest)); + cur_dest = cur_dest->next = (struct list *)zalloc(sizeof(*cur_dest)); if (cur_dest == NULL) { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; + return; } - - if (cur_src->str) - { - cur_dest->str = strdup(cur_src->str); - if (cur_dest->str == NULL) - { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - } - /* else { cur_dest->str = NULL; } - implied by zalloc */ - - /* Now process the rest */ - for (cur_src = cur_src->next; cur_src; cur_src = cur_src->next) - { - cur_dest = cur_dest->next = (struct list_entry *)zalloc(sizeof(*cur_dest)); - if (cur_dest == NULL) - { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - if (cur_src->str) - { - cur_dest->str = strdup(cur_src->str); - if (cur_dest->str == NULL) - { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - } - /* else { cur_dest->str = NULL; } - implied by zalloc */ - } - - dest->last = cur_dest; + cur_dest->str = strdup(cur_src->str); + cur_src = cur_src->next; } - assert(list_is_valid(src)); - assert(list_is_valid(dest)); + dest->last = cur_dest; - return JB_ERR_OK; } @@ -799,261 +466,120 @@ jb_err list_duplicate(struct list *dest, const struct list *src) * Duplicate items are not added. * * Parameters : - * 1 : dest = pointer to destination list for merge. + * 1 : dest = pointer to destination for merge. Caller allocs. * 2 : src = pointer to source for merge. * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, some (but not all) of src might have - * been copied into dest. + * Returns : N/A * *********************************************************************/ -jb_err list_append_list_unique(struct list *dest, const struct list *src) +void list_append_list_unique(struct list *dest, const struct list *src) { - struct list_entry * cur; - - assert(src); - assert(dest); - assert(list_is_valid(src)); - assert(list_is_valid(dest)); + struct list * cur = src->next; - for (cur = src->first; cur; cur = cur->next) + while (cur) { - if (cur->str) - { - if (enlist_unique(dest, cur->str, 0)) - { - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - } + enlist_unique(dest, cur->str, 0); + cur = cur->next; } - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_OK; } /********************************************************************* * - * Function : list_is_empty - * - * Description : Test whether a list is empty. Does not change the list. - * - * Parameters : - * 1 : the_list = pointer to list to test. - * - * Returns : Nonzero iff the list contains no entries. - * - *********************************************************************/ -int list_is_empty(const struct list *the_list) -{ - assert(the_list); - assert(list_is_valid(the_list)); - - return (the_list->first == NULL); -} - - -/********************************************************************* - * - * Function : new_map - * - * Description : Create a new, empty map. - * - * Parameters : N/A - * - * Returns : A new, empty map, or NULL if out of memory. - * - *********************************************************************/ -struct map *new_map(void) -{ - return (struct map *) zalloc(sizeof(struct map)); -} - - -/********************************************************************* + * Function : map * - * Function : free_map + * Description : Add a mapping from given name to given value to a + * given map. * - * Description : Free the memory occupied by a map and its - * depandant strings + * Note: Since all strings will be free()d in free_map() + * later, use the copy flags for constants or + * strings that will be independantly free()d. * * Parameters : - * 1 : the_map = map to be freed. May be NULL. + * 1 : map = map to add to + * 2 : name = name to add + * 3 : nc = flag set if a copy of name should be used + * 4 : value = value to add + * 5 : vc = flag set if a copy of value should be used * - * Returns : N/A + * Returns : pointer to extended map, or NULL if failiure * *********************************************************************/ -void free_map(struct map *the_map) +struct map *map(struct map *map, char *name, int nc, char *value, int vc) { - struct map_entry *cur_entry; - struct map_entry *next_entry; + struct map *cur; - if (the_map == NULL) + if (NULL == (cur = zalloc(sizeof(*cur)))) { - return; + return(NULL); } - for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = next_entry) - { - freez(cur_entry->name); - freez(cur_entry->value); - - next_entry = cur_entry->next; - free(cur_entry); - } + cur->name = nc ? strdup(name) : name; + cur->value = vc ? strdup(value) : value; + cur->next = map; - the_map->first = the_map->last = NULL; + return(cur); - free(the_map); } /********************************************************************* * - * Function : map - * - * Description : Add a mapping from given name to given value to a - * given map. - * - * Note: Since all strings will be free()d in free_map() - * later, set the copy flags for constants or - * strings that will be independantly free()d. - * - * Note2: This function allows NULL parameters - it - * returns JB_ERR_MEMORY in that case. - * - * Note3: If this function returns JB_ERR_MEMORY, - * it will free(name) unless you specify - * name_needs_copying, and similarly it will - * free(value) unless you specify - * value_needs_copying. - * - * Due to Note2 and Note3 above, the following code - * is legal, and will never crash or leak memory even - * if the system runs out of memory: - * - * err = map(mymap, "xyz", 1, html_encode(somestring), 0); + * Function : lookup * - * err will be set to JB_ERR_MEMORY if either call runs - * out-of-memory. Without these features, you would - * need to check the return value of html_encode in the - * above example for NULL, which (at least) doubles the - * amount of error-checking code needed. + * Description : Look up an item with a given name in a map, and + * return its value * * Parameters : - * 1 : the_map = map to add to - * 2 : name = name to add - * 3 : name_needs_copying = flag set if a copy of name should be used - * 4 : value = value to add - * 5 : value_needs_copying = flag set if a copy of value should be used + * 1 : name = name parameter to look for * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : the value if found, else the empty string * *********************************************************************/ -jb_err map(struct map *the_map, - const char *name, int name_needs_copying, - const char *value, int value_needs_copying) +char *lookup(struct map *map, char *name) { - struct map_entry *new_entry; + struct map *p = map; - assert(the_map); - - if ( (NULL == value) - || (NULL == name) - || (NULL == (new_entry = zalloc(sizeof(*new_entry)))) ) + while (p) { - if ((name != NULL) && (!name_needs_copying)) + if (!strcmp(name, p->name)) { - free((char *)name); + return p->value; } - if ((value != NULL) && (!value_needs_copying)) - { - free((char *)value); - } - return JB_ERR_MEMORY; - } - - if (name_needs_copying) - { - if (NULL == (name = strdup(name))) - { - free(new_entry); - if (!value_needs_copying) - { - free((char *)value); - } - return JB_ERR_MEMORY; - } - } - - if (value_needs_copying) - { - if (NULL == (value = strdup(value))) - { - free((char *)name); - free(new_entry); - return JB_ERR_MEMORY; - } - } - - new_entry->name = name; - new_entry->value = value; - /* new_entry->next = NULL; - implied by zalloc */ - - if (the_map->last) - { - the_map->last->next = new_entry; - the_map->last = new_entry; - } - else - { - the_map->first = new_entry; - the_map->last = new_entry; + p = p->next; } + return ""; - return JB_ERR_OK; } /********************************************************************* * - * Function : lookup + * Function : free_map * - * Description : Look up an item with a given name in a map, and - * return its value + * Description : Free the memory occupied by a map and its + * depandant strings * * Parameters : - * 1 : the_map = map to look in - * 2 : name = name parameter to look for + * 1 : list = list to bee freed * - * Returns : the value if found, else the empty string. - * Return value is alloced as part of the map, so - * it is freed when the map is destroyed. Caller - * must not free or modify it. + * Returns : N/A * *********************************************************************/ -const char *lookup(const struct map *the_map, const char *name) +void free_map(struct map *map) { - const struct map_entry *cur_entry; - - assert(the_map); - assert(name); + struct map *p = map; - for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = cur_entry->next) + while (p) { - if (!strcmp(name, cur_entry->name)) - { - return cur_entry->value; - } + free(p->name); + free(p->value); + + map = p->next; + free(p); + p = map; } - return ""; + } diff --git a/list.h b/list.h index afa44238..bbaa5aa1 100644 --- a/list.h +++ b/list.h @@ -1,6 +1,6 @@ -#ifndef LIST_H_INCLUDED -#define LIST_H_INCLUDED -#define LIST_H_VERSION "$Id: list.h,v 1.11 2002/03/24 13:25:43 swa Exp $" +#ifndef _LIST_H +#define _LIST_H +#define LIST_H_VERSION "$Id: list.h,v 1.3 2001/06/03 11:03:48 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/list.h,v $ @@ -10,7 +10,7 @@ * `destroy_list', `enlist' and `list_to_text' * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -36,40 +36,6 @@ * * Revisions : * $Log: list.h,v $ - * Revision 1.11 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.10 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.9 2001/10/23 21:21:03 jongfoster - * New error handling - error codes are now jb_errs, not ints. - * Changed the way map() handles out-of-memory, to dramatically - * reduce the amount of error-checking clutter needed. - * - * Revision 1.8 2001/09/16 17:30:24 jongfoster - * Fixing a compiler warning. - * - * Revision 1.7 2001/09/16 13:20:29 jongfoster - * Rewrite of list library. Now has seperate header and list_entry - * structures. Also added a large sprinking of assert()s to the list - * code. - * - * Revision 1.6 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.5 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.4 2001/06/29 13:30:37 oes - * - Introduced enlist_unique_header() - * - Removed logentry from cancelled commit - * * Revision 1.3 2001/06/03 11:03:48 oes * introduced functions for new list type "map": map(), lookup(), * free_map(), and extended enlist_unique @@ -104,48 +70,25 @@ extern "C" { #endif -/* - * struct list - * - * A linked list class. - */ - -extern void init_list (struct list *the_list); -extern void destroy_list (struct list *the_list); - -extern jb_err enlist (struct list *the_list, const char *str); -extern jb_err enlist_unique (struct list *the_list, const char *str, size_t num_significant_chars); -extern jb_err enlist_unique_header (struct list *the_list, const char *name, const char *value); -extern jb_err enlist_first (struct list *the_list, const char *str); -extern jb_err list_append_list_unique(struct list *dest, const struct list *src); -extern jb_err list_duplicate (struct list *dest, const struct list *src); - -extern int list_remove_item(struct list *the_list, const char *str); -extern int list_remove_list(struct list *dest, const struct list *src); -extern void list_remove_all (struct list *the_list); - -extern int list_is_empty(const struct list *the_list); +extern void enlist(struct list *h, const char *s); +extern void enlist_unique(struct list *header, const char *str, int n); +extern void enlist_unique_header(struct list *header, const char *name, const char *value); +extern void enlist_first(struct list *header, const char *str); -extern char * list_to_text(const struct list *the_list); +extern int list_remove_item(struct list *header, const char *str); +extern void list_append_list_unique(struct list *dest, const struct list *src); +extern void list_append_list_unique(struct list *dest, const struct list *src); +extern int list_remove_list(struct list *header, const struct list *to_remove); -/* - * struct map - * - * A class which maps names to values. - * - * Note: You must allocate this through new_map() and free it - * through free_map(). - */ - -extern struct map * new_map (void); -extern void free_map (struct map * the_map); +extern void list_duplicate(struct list *dest, const struct list *src); -extern int map (struct map * the_map, - const char * name, int name_needs_copying, - const char * value, int value_needs_copying); -extern const char * lookup (const struct map * the_map, const char * name); +extern void destroy_list(struct list *h); +extern char *list_to_text(struct list *h); +extern struct map* map(struct map* map, char *name, int nc, char *value, int vc); +extern char *lookup(struct map *list, char *name); +extern void free_map(struct map *list); /* Revision control strings from this header and associated .c file */ extern const char list_rcs[]; @@ -155,7 +98,7 @@ extern const char list_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef LIST_H_INCLUDED */ +#endif /* ndef _LIST_H */ /* Local Variables: diff --git a/loadcfg.c b/loadcfg.c index 10bba47e..d999b026 100644 --- a/loadcfg.c +++ b/loadcfg.c @@ -1,21 +1,21 @@ -const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"; +const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.18 2001/07/13 14:01:14 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loadcfg.c,v $ * * Purpose : Loads settings from the configuration file into - * global variables. This file contains both the + * global variables. This file contains both the * routine to load the configuration and the global * variables it writes to. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -35,96 +35,6 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: loadcfg.c,v $ - * Revision 1.39 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.38 2002/03/24 13:05:48 jongfoster - * Renaming re_filterfile to filterfile - * - * Revision 1.37 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.36 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.35 2002/03/07 03:52:44 oes - * Set logging to tty for --no-daemon mode - * - * Revision 1.34 2002/03/06 23:14:35 jongfoster - * Trivial cosmetic changes to make function comments easier to find. - * - * Revision 1.33 2002/03/05 04:52:42 oes - * Deleted non-errlog debugging code - * - * Revision 1.32 2002/03/04 18:24:53 oes - * Re-enabled output of unknown config directive hash - * - * Revision 1.31 2002/03/03 15:07:20 oes - * Re-enabled automatic config reloading - * - * Revision 1.30 2002/01/22 23:31:43 jongfoster - * Replacing strsav() with string_append() - * - * Revision 1.29 2002/01/17 21:02:30 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Revision 1.28 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.27 2001/11/07 00:02:13 steudten - * Add line number in error output for lineparsing for - * actionsfile and configfile. - * Special handling for CLF added. - * - * Revision 1.26 2001/11/05 21:41:43 steudten - * Add changes to be a real daemon just for unix os. - * (change cwd to /, detach from controlling tty, set - * process group and session leader to the own process. - * Add DBG() Macro. - * Add some fatal-error log message for failed malloc(). - * Add '-d' if compiled with 'configure --with-debug' to - * enable debug output. - * - * Revision 1.25 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.24 2001/10/23 21:40:30 jongfoster - * Added support for enable-edit-actions and enable-remote-toggle config - * file options. - * - * Revision 1.23 2001/10/07 15:36:00 oes - * Introduced new config option "buffer-limit" - * - * Revision 1.22 2001/09/22 16:36:59 jongfoster - * Removing unused parameter fs from read_config_line() - * - * Revision 1.21 2001/09/16 17:10:43 jongfoster - * Moving function savearg() here, since it was the only thing left in - * showargs.c. - * - * Revision 1.20 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.19 2001/07/15 17:45:16 jongfoster - * Removing some unused #includes - * * Revision 1.18 2001/07/13 14:01:14 oes * - Removed all #ifdef PCRS * - Removed vim-settings @@ -285,7 +195,6 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" #include #include #include -#include #ifdef _WIN32 @@ -301,11 +210,9 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" #else /* ifndef _WIN32 */ -#ifndef __OS2__ # include -# include -#endif # include +# include # include # include @@ -316,11 +223,14 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" #include "jcc.h" #include "filters.h" #include "loaders.h" +#include "showargs.h" +#include "parsers.h" +#include "killpopup.h" #include "miscutil.h" #include "errlog.h" +#include "jbsockets.h" +#include "gateway.h" #include "ssplit.h" -#include "encode.h" -#include "urlmatch.h" const char loadcfg_h_rcs[] = LOADCFG_H_VERSION; @@ -335,10 +245,10 @@ const char loadcfg_h_rcs[] = LOADCFG_H_VERSION; #define ijb_isupper(__X) isupper((int)(unsigned char)(__X)) #define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE /* by haroon - indicates if ijb is enabled */ int g_bToggleIJB = 1; /* JunkBusters is enabled by default. */ -#endif /* def FEATURE_TOGGLE */ +#endif /* The filename of the configfile */ const char *configfile = NULL; @@ -367,13 +277,9 @@ static struct file_list *current_configfile = NULL; #define hash_actions_file 1196306641ul /* "actionsfile" */ #define hash_admin_address 4112573064ul /* "admin-address" */ -#define hash_buffer_limit 1881726070ul /* "buffer-limit */ #define hash_confdir 1978389ul /* "confdir" */ #define hash_debug 78263ul /* "debug" */ #define hash_deny_access 1227333715ul /* "deny-access" */ -#define hash_enable_edit_actions 2517097536ul /* "enable-edit-actions" */ -#define hash_enable_remote_toggle 2979744683ul /* "enable-remote-toggle" */ -#define hash_filterfile 250887266ul /* "filterfile" */ #define hash_forward 2029845ul /* "forward" */ #define hash_forward_socks4 3963965521ul /* "forward-socks4" */ #define hash_forward_socks4a 2639958518ul /* "forward-socks4a" */ @@ -383,6 +289,7 @@ static struct file_list *current_configfile = NULL; #define hash_logfile 2114766ul /* "logfile" */ #define hash_permit_access 3587953268ul /* "permit-access" */ #define hash_proxy_info_url 3903079059ul /* "proxy-info-url" */ +#define hash_re_filterfile 3877522444ul /* "re_filterfile" */ #define hash_single_threaded 4250084780ul /* "single-threaded" */ #define hash_suppress_blocklists 1948693308ul /* "suppress-blocklists" */ #define hash_toggle 447966ul /* "toggle" */ @@ -401,7 +308,6 @@ static struct file_list *current_configfile = NULL; #define hash_show_on_task_bar 215410365ul /* "show-on-task-bar" */ -static void savearg(char *command, char *argument, struct configuration_spec * config); /********************************************************************* * @@ -419,7 +325,7 @@ void unload_configfile (void * data) { struct configuration_spec * config = (struct configuration_spec *)data; struct forward_spec *cur_fwd = config->forward; -#ifdef FEATURE_ACL +#ifdef ACL_FILES struct access_control_list *cur_acl = config->acl; while (cur_acl != NULL) @@ -429,12 +335,12 @@ void unload_configfile (void * data) cur_acl = next_acl; } config->acl = NULL; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ while (cur_fwd != NULL) { struct forward_spec * next_fwd = cur_fwd->next; - free_url_spec(cur_fwd->url); + free_url(cur_fwd->url); freez(cur_fwd->gateway_host); freez(cur_fwd->forward_host); @@ -442,57 +348,37 @@ void unload_configfile (void * data) cur_fwd = next_fwd; } config->forward = NULL; - -#ifdef FEATURE_COOKIE_JAR + +#ifdef JAR_FILES if ( NULL != config->jar ) { fclose( config->jar ); config->jar = NULL; } -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ - freez(config->confdir); - freez(config->logdir); + freez((char *)config->confdir); + freez((char *)config->logdir); - freez(config->haddr); - freez(config->logfile); + freez((char *)config->haddr); + freez((char *)config->logfile); - freez(config->actions_file); - freez(config->admin_address); - freez(config->proxy_info_url); - freez(config->proxy_args); + freez((char *)config->actions_file); + freez((char *)config->admin_address); + freez((char *)config->proxy_info_url); + freez((char *)config->proxy_args); -#ifdef FEATURE_COOKIE_JAR - freez(config->jarfile); -#endif /* def FEATURE_COOKIE_JAR */ +#ifdef JAR_FILES + freez((char *)config->jarfile); +#endif /* def JAR_FILES */ - freez(config->re_filterfile); +#ifndef SPLIT_PROXY_ARGS + freez((char *)config->suppress_message); +#endif /* ndef SPLIT_PROXY_ARGS */ -} + freez((char *)config->re_filterfile); - -#ifdef FEATURE_GRACEFUL_TERMINATION -/********************************************************************* - * - * Function : unload_current_config_file - * - * Description : Unloads current config file - reset to state at - * beginning of program. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void unload_current_config_file(void) -{ - if (current_configfile) - { - current_configfile->unloader = unload_configfile; - current_configfile = NULL; - } } -#endif /********************************************************************* @@ -502,7 +388,7 @@ void unload_current_config_file(void) * Description : Load the config file and all parameters. * * Parameters : - * 1 : csp = Client state (the config member will be + * 1 : csp = Client state (the config member will be * filled in by this function). * * Returns : 0 => Ok, everything else is an error. @@ -516,9 +402,8 @@ struct configuration_spec * load_config(void) struct configuration_spec * config = NULL; struct client_state * fake_csp; struct file_list *fs; - unsigned long linenum = 0; - if ( !check_file_changed(current_configfile, configfile, &fs)) + if (!check_file_changed(current_configfile, configfile, &fs)) { /* No need to load */ return ((struct configuration_spec *)current_configfile->f); @@ -531,9 +416,9 @@ struct configuration_spec * load_config(void) log_error(LOG_LEVEL_INFO, "loading configuration file '%s':", configfile); -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE g_bToggleIJB = 1; -#endif /* def FEATURE_TOGGLE */ +#endif fs->f = config = (struct configuration_spec *)zalloc(sizeof(*config)); @@ -547,9 +432,9 @@ struct configuration_spec * load_config(void) /* * This is backwards from how it's usually done. - * Following the usual pattern, "fs" would be stored in a member + * Following the usual pattern, "fs" would be stored in a member * variable in "csp", and then we'd access "config" from "fs->f", - * using a cast. However, "config" is used so often that a + * using a cast. However, "config" is used so often that a * cast each time would be very ugly, and the extra indirection * would waste CPU cycles. Therefore we store "config" in * "csp->config", and "fs" in "csp->config->config_file_list". @@ -562,8 +447,6 @@ struct configuration_spec * load_config(void) config->multi_threaded = 1; config->hport = HADDR_PORT; - config->buffer_limit = 4096 * 1024; - config->proxy_args = strdup(""); if ((configfp = fopen(configfile, "r")) == NULL) { @@ -572,14 +455,14 @@ struct configuration_spec * load_config(void) /* Never get here - LOG_LEVEL_FATAL causes program exit */ } - while (read_config_line(buf, sizeof(buf), configfp, &linenum) != NULL) + while (read_config_line(buf, sizeof(buf), configfp, fs) != NULL) { char cmd[BUFFER_SIZE]; char arg[BUFFER_SIZE]; char tmp[BUFFER_SIZE]; -#ifdef FEATURE_ACL +#ifdef ACL_FILES struct access_control_list *cur_acl; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ struct forward_spec *cur_fwd; int vec_count; char *vec[3]; @@ -625,50 +508,43 @@ struct configuration_spec * load_config(void) switch( hash_string( cmd ) ) { -/* ************************************************************************* +/**************************************************************************** * actionsfile actions-file-name * In confdir by default - * *************************************************************************/ + ****************************************************************************/ case hash_actions_file : - freez(config->actions_file); + freez((char *)config->actions_file); config->actions_file = make_path(config->confdir, arg); continue; -/* ************************************************************************* +/**************************************************************************** * admin-address email-address - * *************************************************************************/ + ****************************************************************************/ case hash_admin_address : - freez(config->admin_address); + freez((char *)config->admin_address); config->admin_address = strdup(arg); - continue; + continue; -/* ************************************************************************* - * buffer-limit n - * *************************************************************************/ - case hash_buffer_limit : - config->buffer_limit = (size_t) 1024 * atoi(arg); - continue; - -/* ************************************************************************* +/**************************************************************************** * confdir directory-name - * *************************************************************************/ + ****************************************************************************/ case hash_confdir : - freez(config->confdir); - config->confdir = make_path( NULL, arg); - continue; + freez((char *)config->confdir); + config->confdir = strdup(arg); + continue; -/* ************************************************************************* +/**************************************************************************** * debug n * Specifies debug level, multiple values are ORed together. - * *************************************************************************/ + ****************************************************************************/ case hash_debug : config->debug |= atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * deny-access source-ip[/significant-bits] [dest-ip[/significant-bits]] - * *************************************************************************/ -#ifdef FEATURE_ACL + ****************************************************************************/ +#ifdef ACL_FILES case hash_deny_access: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -676,7 +552,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "deny-access directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "deny-access directive in configuration file.

    \n"); continue; @@ -697,12 +573,12 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Invalid source IP for deny-access " "directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Invalid source IP for deny-access directive" " in configuration file: \""); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "\"

    \n"); freez(cur_acl); continue; @@ -713,12 +589,12 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Invalid destination IP for deny-access " "directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Invalid destination IP for deny-access directive" " in configuration file: \""); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "\"

    \n"); freez(cur_acl); continue; @@ -731,50 +607,18 @@ struct configuration_spec * load_config(void) * actions file, the last match wins. However, the internal * implementations are different: The actions file is stored * in the same order as the file, and scanned completely. - * With the ACL, we reverse the order as we load it, then + * With the ACL, we reverse the order as we load it, then * when we scan it we stop as soon as we get a match. */ cur_acl->next = config->acl; config->acl = cur_acl; continue; -#endif /* def FEATURE_ACL */ - -/* ************************************************************************* - * enable-edit-actions 0|1 - * *************************************************************************/ -#ifdef FEATURE_CGI_EDIT_ACTIONS - case hash_enable_edit_actions: - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_CGI_EDIT_ACTIONS; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_CGI_EDIT_ACTIONS; - } - continue; -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - -/* ************************************************************************* - * enable-remote-toggle 0|1 - * *************************************************************************/ -#ifdef FEATURE_CGI_EDIT_ACTIONS - case hash_enable_remote_toggle: - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_CGI_TOGGLE; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_CGI_TOGGLE; - } - continue; -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ +#endif /* def ACL_FILES */ -/* ************************************************************************* +/**************************************************************************** * forward url-pattern (.|http-proxy-host[:port]) - * *************************************************************************/ + ****************************************************************************/ case hash_forward: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -782,7 +626,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for forward " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "forward directive in configuration file."); continue; @@ -804,7 +648,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Bad URL specifier for " "forward directive in configuration file."); continue; @@ -817,7 +661,7 @@ struct configuration_spec * load_config(void) { cur_fwd->forward_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) + if ((p = strchr(cur_fwd->forward_host, ':'))) { *p++ = '\0'; cur_fwd->forward_port = atoi(p); @@ -835,9 +679,9 @@ struct configuration_spec * load_config(void) continue; -/* ************************************************************************* +/**************************************************************************** * forward-socks4 url-pattern socks-proxy[:port] (.|http-proxy[:port]) - * *************************************************************************/ + ****************************************************************************/ case hash_forward_socks4: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -845,7 +689,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "forward-socks4 directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "forward-socks4 directive in configuration file."); continue; @@ -867,7 +711,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4 " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Bad URL specifier for " "forward-socks4 directive in configuration file."); continue; @@ -880,7 +724,7 @@ struct configuration_spec * load_config(void) { cur_fwd->gateway_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->gateway_host, ':'))) + if ((p = strchr(cur_fwd->gateway_host, ':'))) { *p++ = '\0'; cur_fwd->gateway_port = atoi(p); @@ -898,7 +742,7 @@ struct configuration_spec * load_config(void) { cur_fwd->forward_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) + if ((p = strchr(cur_fwd->forward_host, ':'))) { *p++ = '\0'; cur_fwd->forward_port = atoi(p); @@ -913,12 +757,12 @@ struct configuration_spec * load_config(void) /* Add to list. */ cur_fwd->next = config->forward; config->forward = cur_fwd; - + continue; -/* ************************************************************************* +/**************************************************************************** * forward-socks4a url-pattern socks-proxy[:port] (.|http-proxy[:port]) - * *************************************************************************/ + ****************************************************************************/ case hash_forward_socks4a: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -926,7 +770,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "forward-socks4a directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "forward-socks4a directive in configuration file."); continue; @@ -948,7 +792,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4a " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Bad URL specifier for " "forward-socks4a directive in configuration file."); continue; @@ -959,7 +803,7 @@ struct configuration_spec * load_config(void) cur_fwd->gateway_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->gateway_host, ':'))) + if ((p = strchr(cur_fwd->gateway_host, ':'))) { *p++ = '\0'; cur_fwd->gateway_port = atoi(p); @@ -976,7 +820,7 @@ struct configuration_spec * load_config(void) { cur_fwd->forward_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) + if ((p = strchr(cur_fwd->forward_host, ':'))) { *p++ = '\0'; cur_fwd->forward_port = atoi(p); @@ -991,49 +835,49 @@ struct configuration_spec * load_config(void) /* Add to list. */ cur_fwd->next = config->forward; config->forward = cur_fwd; - + continue; -/* ************************************************************************* +/**************************************************************************** * jarfile jar-file-name * In logdir by default - * *************************************************************************/ -#ifdef FEATURE_COOKIE_JAR + ****************************************************************************/ +#ifdef JAR_FILES case hash_jarfile : - freez(config->jarfile); + freez((char *)config->jarfile); config->jarfile = make_path(config->logdir, arg); continue; -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ -/* ************************************************************************* +/**************************************************************************** * listen-address [ip][:port] - * *************************************************************************/ + ****************************************************************************/ case hash_listen_address : - freez(config->haddr); + freez((char *)config->haddr); config->haddr = strdup(arg); continue; -/* ************************************************************************* +/**************************************************************************** * logdir directory-name - * *************************************************************************/ + ****************************************************************************/ case hash_logdir : - freez(config->logdir); - config->logdir = make_path(NULL, arg); - continue; + freez((char *)config->logdir); + config->logdir = strdup(arg); + continue; -/* ************************************************************************* +/**************************************************************************** * logfile log-file-name * In logdir by default - * *************************************************************************/ + ****************************************************************************/ case hash_logfile : - freez(config->logfile); - config->logfile = no_daemon ? NULL : make_path(config->logdir, arg); + freez((char *)config->logfile); + config->logfile = make_path(config->logdir, arg); continue; -/* ************************************************************************* +/**************************************************************************** * permit-access source-ip[/significant-bits] [dest-ip[/significant-bits]] - * *************************************************************************/ -#ifdef FEATURE_ACL + ****************************************************************************/ +#ifdef ACL_FILES case hash_permit_access: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -1041,7 +885,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "permit-access directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "permit-access directive in configuration file.

    \n"); @@ -1063,12 +907,12 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Invalid source IP for permit-access " "directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Invalid source IP for permit-access directive" " in configuration file: \""); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "\"

    \n"); freez(cur_acl); continue; @@ -1080,12 +924,12 @@ struct configuration_spec * load_config(void) log_error(LOG_LEVEL_ERROR, "Invalid destination IP for " "permit-access directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Invalid destination IP for permit-access directive" " in configuration file: \""); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "\"

    \n"); freez(cur_acl); continue; @@ -1098,76 +942,95 @@ struct configuration_spec * load_config(void) * actions file, the last match wins. However, the internal * implementations are different: The actions file is stored * in the same order as the file, and scanned completely. - * With the ACL, we reverse the order as we load it, then + * With the ACL, we reverse the order as we load it, then * when we scan it we stop as soon as we get a match. */ cur_acl->next = config->acl; config->acl = cur_acl; continue; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ -/* ************************************************************************* +/**************************************************************************** * proxy-info-url url - * *************************************************************************/ + ****************************************************************************/ case hash_proxy_info_url : - freez(config->proxy_info_url); + freez((char *)config->proxy_info_url); config->proxy_info_url = strdup(arg); continue; -/* ************************************************************************* +/**************************************************************************** * re_filterfile file-name * In confdir by default. - * *************************************************************************/ - case hash_filterfile : - freez(config->re_filterfile); + ****************************************************************************/ + case hash_re_filterfile : + freez((char *)config->re_filterfile); config->re_filterfile = make_path(config->confdir, arg); continue; -/* ************************************************************************* +/**************************************************************************** * single-threaded - * *************************************************************************/ + ****************************************************************************/ case hash_single_threaded : config->multi_threaded = 0; continue; -/* ************************************************************************* +/**************************************************************************** + * FIXME: Document this FIXME2: Shouldn't we throw this out? --oes + ****************************************************************************/ +#ifndef SPLIT_PROXY_ARGS + case hash_suppress_blocklists : + if (arg[0] != '\0') + { + config->suppress_message = strdup(arg); + } + else + { + /* There will be NO reference in proxy-args. */ + config->suppress_message = NULL; + } + + config->suppress_blocklists = 1; + continue; +#endif /* ndef SPLIT_PROXY_ARGS */ + +/**************************************************************************** * toggle (0|1) - * *************************************************************************/ -#ifdef FEATURE_TOGGLE + ****************************************************************************/ +#ifdef TOGGLE case hash_toggle : g_bToggleIJB = atoi(arg); continue; -#endif /* def FEATURE_TOGGLE */ +#endif /* def TOGGLE */ -/* ************************************************************************* +/**************************************************************************** * trust-info-url url - * *************************************************************************/ -#ifdef FEATURE_TRUST + ****************************************************************************/ +#ifdef TRUST_FILES case hash_trust_info_url : enlist(config->trust_info, arg); continue; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ -/* ************************************************************************* +/**************************************************************************** * trustfile filename * (In confdir by default.) - * *************************************************************************/ -#ifdef FEATURE_TRUST + ****************************************************************************/ +#ifdef TRUST_FILES case hash_trustfile : - freez(config->trustfile); + freez((char *)config->trustfile); config->trustfile = make_path(config->confdir, arg); continue; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ -/* ************************************************************************* +/**************************************************************************** * Win32 Console options: - * *************************************************************************/ + ****************************************************************************/ -/* ************************************************************************* +/**************************************************************************** * hide-console - * *************************************************************************/ + ****************************************************************************/ #ifdef _WIN_CONSOLE case hash_hide_console : hideConsole = 1; @@ -1175,70 +1038,70 @@ struct configuration_spec * load_config(void) #endif /*def _WIN_CONSOLE*/ -/* ************************************************************************* +/**************************************************************************** * Win32 GUI options: - * *************************************************************************/ + ****************************************************************************/ #if defined(_WIN32) && ! defined(_WIN_CONSOLE) -/* ************************************************************************* +/**************************************************************************** * activity-animation (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_activity_animation : g_bShowActivityAnimation = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * close-button-minimizes (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_close_button_minimizes : g_bCloseHidesWindow = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-buffer-size (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_log_buffer_size : g_bLimitBufferSize = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-font-name fontnane - * *************************************************************************/ + ****************************************************************************/ case hash_log_font_name : strcpy( g_szFontFaceName, arg ); continue; -/* ************************************************************************* +/**************************************************************************** * log-font-size n - * *************************************************************************/ + ****************************************************************************/ case hash_log_font_size : g_nFontSize = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-highlight-messages (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_log_highlight_messages : g_bHighlightMessages = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-max-lines n - * *************************************************************************/ + ****************************************************************************/ case hash_log_max_lines : g_nMaxBufferLines = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-messages (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_log_messages : g_bLogMessages = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * show-on-task-bar (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_show_on_task_bar : g_bShowOnTaskBar = atoi(arg); continue; @@ -1246,29 +1109,28 @@ struct configuration_spec * load_config(void) #endif /* defined(_WIN32) && ! defined(_WIN_CONSOLE) */ -/* ************************************************************************* - * Warnings about unsupported features - * *************************************************************************/ -#ifndef FEATURE_ACL +/****************************************************************************/ +/* Warnings about unsupported features */ +/****************************************************************************/ +#ifndef ACL_FILES case hash_deny_access: -#endif /* ndef FEATURE_ACL */ -#ifndef FEATURE_CGI_EDIT_ACTIONS - case hash_enable_edit_actions: - case hash_enable_remote_toggle: -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ -#ifndef FEATURE_COOKIE_JAR +#endif /* ndef ACL_FILES */ +#ifndef JAR_FILES case hash_jarfile : -#endif /* ndef FEATURE_COOKIE_JAR */ -#ifndef FEATURE_ACL +#endif /* ndef JAR_FILES */ +#ifndef ACL_FILES case hash_permit_access: -#endif /* ndef FEATURE_ACL */ -#ifndef FEATURE_TOGGLE +#endif /* ndef ACL_FILES */ +#ifdef SPLIT_PROXY_ARGS + case hash_suppress_blocklists : +#endif /* def SPLIT_PROXY_ARGS */ +#ifndef TOGGLE case hash_toggle : -#endif /* ndef FEATURE_TOGGLE */ -#ifndef FEATURE_TRUST +#endif /* ndef TOGGLE */ +#ifndef TRUST_FILES case hash_trustfile : case hash_trust_info_url : -#endif /* ndef FEATURE_TRUST */ +#endif /* ndef TRUST_FILES */ #ifndef _WIN_CONSOLE case hash_hide_console : @@ -1289,32 +1151,27 @@ struct configuration_spec * load_config(void) /* log_error(LOG_LEVEL_INFO, "Unsupported directive \"%s\" ignored.", cmd); */ continue; -/* *************************************************************************/ +/****************************************************************************/ default : -/* *************************************************************************/ +/****************************************************************************/ /* * I decided that I liked this better as a warning than an * error. To change back to an error, just change log level * to LOG_LEVEL_FATAL. */ - log_error(LOG_LEVEL_ERROR, "Unrecognized directive '%s' (%luul) in line %lu in " - "configuration file (%s).", buf, hash_string(cmd), linenum, configfile); - string_append(&config->proxy_args, "
    \nWARNING: unrecognized directive : "); - string_append(&config->proxy_args, buf); - string_append(&config->proxy_args, "

    \n"); + log_error(LOG_LEVEL_ERROR, "Unrecognized directive (%luul) in " + "configuration file: \"%s\"", hash_string( cmd ), buf); + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: unrecognized directive : "); + config->proxy_args = strsav( config->proxy_args, buf); + config->proxy_args = strsav( config->proxy_args, "

    \n"); continue; -/* *************************************************************************/ +/****************************************************************************/ } /* end switch( hash_string(cmd) ) */ } /* end while ( read_config_line(...) ) */ fclose(configfp); - if (NULL == config->proxy_args) - { - log_error(LOG_LEVEL_FATAL, "Out of memory loading config - insufficient memory for config->proxy_args"); - } - init_error_log(Argv[0], config->logfile, config->debug); if (config->actions_file) @@ -1327,14 +1184,14 @@ struct configuration_spec * load_config(void) add_loader(load_re_filterfile, config); } -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES if (config->trustfile) { add_loader(load_trustfile, config); } -#endif /* def FEATURE_TRUST */ +#endif -#ifdef FEATURE_COOKIE_JAR +#ifdef JAR_FILES if ( NULL != config->jarfile ) { if ( NULL == (config->jar = fopen(config->jarfile, "a")) ) @@ -1344,7 +1201,7 @@ struct configuration_spec * load_config(void) } setbuf(config->jar, NULL); } -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ if ( NULL == config->haddr ) { @@ -1353,7 +1210,7 @@ struct configuration_spec * load_config(void) if ( NULL != config->haddr ) { - if (NULL != (p = strchr(config->haddr, ':'))) + if ((p = strchr(config->haddr, ':'))) { *p++ = '\0'; if (*p) @@ -1390,16 +1247,23 @@ struct configuration_spec * load_config(void) } freez(fake_csp); +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) + { + fs->proxy_args = strsav(fs->proxy_args, ""); + } +#endif /* ndef SPLIT_PROXY_ARGS */ + /* FIXME: this is a kludge for win32 */ #if defined(_WIN32) && !defined (_WIN_CONSOLE) g_actions_file = config->actions_file; g_re_filterfile = config->re_filterfile; -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES g_trustfile = config->trustfile; -#endif /* def FEATURE_TRUST */ - +#endif + #endif /* defined(_WIN32) && !defined (_WIN_CONSOLE) */ /* FIXME: end kludge */ @@ -1450,77 +1314,6 @@ struct configuration_spec * load_config(void) } -/********************************************************************* - * - * Function : savearg - * - * Description : Called from `load_config'. It saves each non-empty - * and non-comment line from config into - * config->proxy_args. This is used to create the - * show-proxy-args page. On error, frees - * config->proxy_args and sets it to NULL - * - * Parameters : - * 1 : command = config setting that was found - * 2 : argument = the setting's argument (if any) - * - * Returns : N/A - * - *********************************************************************/ -static void savearg(char *command, char *argument, struct configuration_spec * config) -{ - char * buf; - char * s; - - assert(command); - assert(*command); - assert(argument); - - buf = strdup(""); - - s = html_encode(command); - if (NULL == s) - { - freez(buf); - freez(config->proxy_args); - return; - } - string_append(&buf, ""); - string_join (&buf, s); - string_append(&buf, " "); - - if ( (NULL != argument) && ('\0' != *argument) ) - { - s = html_encode(argument); - if (NULL == s) - { - freez(buf); - freez(config->proxy_args); - return; - } - - if (strncmpic(argument, "http://", 7) == 0) - { - string_append(&buf, ""); - string_join (&buf, s); - string_append(&buf, ""); - } - else - { - string_join (&buf, s); - } - } - - string_append(&buf, "
    \n"); - - string_join(&config->proxy_args, buf); -} - - /* Local Variables: tab-width: 3 diff --git a/loadcfg.h b/loadcfg.h index 3e71b752..ea13f483 100644 --- a/loadcfg.h +++ b/loadcfg.h @@ -1,6 +1,6 @@ -#ifndef LOADCFG_H_INCLUDED -#define LOADCFG_H_INCLUDED -#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.10 2002/03/24 13:25:43 swa Exp $" +#ifndef _LOADCFG_H +#define _LOADCFG_H +#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.4 2001/05/22 18:46:04 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loadcfg.h,v $ @@ -11,7 +11,7 @@ * variables it writes to. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,41 +37,6 @@ * * Revisions : * $Log: loadcfg.h,v $ - * Revision 1.10 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.9 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.8 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.7 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.6 2001/07/29 18:58:15 jongfoster - * Removing nested #includes, adding forward declarations for needed - * structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED. - * - * Revision 1.5 2001/05/26 00:28:36 jongfoster - * Automatic reloading of config file. - * Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32). - * Most of the global variables have been moved to a new - * struct configuration_spec, accessed through csp->config->globalname - * Most of the globals remaining are used by the Win32 GUI. - * * Revision 1.4 2001/05/22 18:46:04 oes * * - Enabled filtering banners by size rather than URL @@ -139,19 +104,22 @@ *********************************************************************/ +/* Declare struct FILE for vars and funcs. */ +#include + +/* All of our project's data types. */ +#include "project.h" + #ifdef __cplusplus extern "C" { #endif -/* Don't need project.h, only this: */ -struct configuration_spec; - /* Global variables */ -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE /* indicates if ijb is enabled */ extern int g_bToggleIJB; -#endif /* def FEATURE_TOGGLE */ +#endif extern const char *configfile; @@ -163,14 +131,10 @@ extern const char *configfile; */ extern int Argc; extern const char **Argv; -extern short int MustReload; extern struct configuration_spec * load_config(void); -#ifdef FEATURE_GRACEFUL_TERMINATION -void unload_current_config_file(void); -#endif /* Revision control strings from this header and associated .c file */ extern const char loadcfg_rcs[]; @@ -180,7 +144,7 @@ extern const char loadcfg_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef LOADCFG_H_INCLUDED */ +#endif /* ndef _JCC_H */ /* Local Variables: diff --git a/loaders.c b/loaders.c index f63b9168..577a6531 100644 --- a/loaders.c +++ b/loaders.c @@ -1,21 +1,21 @@ -const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $"; +const char loaders_rcs[] = "$Id: loaders.c,v 1.22 2001/07/20 15:16:17 haroon Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loaders.c,v $ * * Purpose : Functions to load and unload the various * configuration files. Also contains code to manage - * the list of active loaders, and to automatically + * the list of active loaders, and to automatically * unload files that are no longer in use. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -35,108 +35,6 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: loaders.c,v $ - * Revision 1.46 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.45 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.44 2002/03/16 21:51:00 jongfoster - * Fixing free(NULL). - * - * Revision 1.43 2002/03/16 20:28:34 oes - * Added descriptions to the filters so users will know what they select in the cgi editor - * - * Revision 1.42 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.41 2002/03/12 01:42:50 oes - * Introduced modular filters - * - * Revision 1.40 2002/03/08 17:46:04 jongfoster - * Fixing int/size_t warnings - * - * Revision 1.39 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.38 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.37 2002/03/03 15:07:49 oes - * Re-enabled automatic config reloading - * - * Revision 1.36 2002/01/22 23:46:18 jongfoster - * Moving edit_read_line() and simple_read_line() to loaders.c, and - * extending them to support reading MS-DOS, Mac and UNIX style files - * on all platforms. - * - * Modifying read_config_line() (without changing it's prototype) to - * be a trivial wrapper for edit_read_line(). This means that we have - * one function to read a line and handle comments, which is common - * between the initialization code and the edit interface. - * - * Revision 1.35 2002/01/17 21:03:08 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Revision 1.34 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.33 2001/11/13 00:16:38 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.32 2001/11/07 00:02:13 steudten - * Add line number in error output for lineparsing for - * actionsfile and configfile. - * Special handling for CLF added. - * - * Revision 1.31 2001/10/26 17:39:01 oes - * Removed csp->referrer - * Moved ijb_isspace and ijb_tolower to project.h - * - * Revision 1.30 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.29 2001/10/23 21:38:53 jongfoster - * Adding error-checking to create_url_spec() - * - * Revision 1.28 2001/10/07 15:40:39 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Revision 1.27 2001/09/22 16:36:59 jongfoster - * Removing unused parameter fs from read_config_line() - * - * Revision 1.26 2001/09/22 14:05:22 jongfoster - * Bugfix: Multiple escaped "#" characters in a configuration - * file are now permitted. - * Also removing 3 unused headers. - * - * Revision 1.25 2001/09/13 22:44:03 jongfoster - * Adding {} to an if statement - * - * Revision 1.24 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.23 2001/07/20 15:51:54 oes - * Fixed indentation of prepocessor commands - * * Revision 1.22 2001/07/20 15:16:17 haroon * - per Guy's suggestion, added a while loop in sweep() to catch not just * the last inactive CSP but all other consecutive inactive CSPs after that @@ -262,36 +160,48 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $" #include #include #include +#include #include #include #include -#include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #endif #include "project.h" #include "list.h" #include "loaders.h" +#include "encode.h" #include "filters.h" #include "parsers.h" #include "jcc.h" +#include "ssplit.h" #include "miscutil.h" #include "errlog.h" +#include "gateway.h" #include "actions.h" -#include "urlmatch.h" const char loaders_h_rcs[] = LOADERS_H_VERSION; +/* Fix a problem with Solaris. There should be no effect on other + * platforms. + * Solaris's isspace() is a macro which uses it's argument directly + * as an array index. Therefore we need to make sure that high-bit + * characters generate +ve values, and ideally we also want to make + * the argument match the declared parameter type of "int". + */ +#define ijb_isspace(__X) isspace((int)(unsigned char)(__X)) + + /* * Currently active files. * These are also entered in the main linked list of files. */ -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES static struct file_list *current_trustfile = NULL; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ static struct file_list *current_re_filterfile = NULL; @@ -332,9 +242,9 @@ void sweep(void) fl->active = 0; } - for (csp = clients; csp && (NULL != (ncsp = csp->next)) ; csp = csp->next) + for (csp = clients; csp && (ncsp = csp->next) ; csp = csp->next) { - if (ncsp->flags & CSP_FLAG_ACTIVE) + if (ncsp->active) { /* mark this client's files as active */ @@ -355,56 +265,60 @@ void sweep(void) ncsp->rlist->active = 1; } -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES if (ncsp->tlist) /* trust files */ { ncsp->tlist->active = 1; } -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ } else - /* - * this client is not active, release its resources + /* + * this client is not active, release its resources * and the ones of all inactive clients that might * follow it */ { - while (!(ncsp->flags & CSP_FLAG_ACTIVE)) + while( !ncsp->active ) { csp->next = ncsp->next; - + freez(ncsp->ip_addr_str); freez(ncsp->my_ip_addr_str); freez(ncsp->my_hostname); + +#ifdef TRUST_FILES + freez(ncsp->referrer); +#endif /* def TRUST_FILES */ freez(ncsp->x_forwarded); freez(ncsp->iob->buf); - + free_http_request(ncsp->http); - + destroy_list(ncsp->headers); destroy_list(ncsp->cookie_list); - + free_current_action(ncsp->action); - -#ifdef FEATURE_STATISTICS + +#ifdef STATISTICS urls_read++; - if (ncsp->flags & CSP_FLAG_REJECTED) + if (ncsp->rejected) { urls_rejected++; } -#endif /* def FEATURE_STATISTICS */ - +#endif /* def STATISTICS */ + freez(ncsp); - + /* are there any more in sequence after it? */ - if( (ncsp = csp->next) == NULL) + if( !(ncsp = csp->next) ) break; } } } - for (fl = files; fl && ((nfl = fl->next) != NULL) ; fl = fl->next) + for (fl = files; fl && (nfl = fl->next) ; fl = fl->next) { if ( ( 0 == nfl->active ) && ( NULL != nfl->unloader ) ) { @@ -412,6 +326,10 @@ void sweep(void) (nfl->unloader)(nfl->f); +#ifndef SPLIT_PROXY_ARGS + freez(nfl->proxy_args); +#endif /* ndef SPLIT_PROXY_ARGS */ + freez(nfl->filename); freez(nfl); @@ -421,18 +339,171 @@ void sweep(void) } +/********************************************************************* + * + * Function : create_url_spec + * + * Description : Creates a "url_spec" structure from a string. + * When finished, free with unload_url(). + * + * Parameters : + * 1 : url = Target url_spec to be filled in. Must be + * zeroed out before the call (e.g. using zalloc). + * 2 : buf = Source pattern, null terminated. NOTE: The + * contents of this buffer are destroyed by this + * function. If this function succeeds, the + * buffer is copied to url->spec. If this + * function fails, the contents of the buffer + * are lost forever. + * + * Returns : 0 => Ok, everything else is an error. + * + *********************************************************************/ +int create_url_spec(struct url_spec * url, char * buf) +{ + char *p; + struct url_spec tmp_url[1]; + + /* paranoia - should never happen. */ + if ((url == NULL) || (buf == NULL)) + { + return 1; + } + + /* save a copy of the orignal specification */ + if ((url->spec = strdup(buf)) == NULL) + { + return 1; + } + + if ((p = strchr(buf, '/'))) + { + if (NULL == (url->path = strdup(p))) + { + freez(url->spec); + return 1; + } + url->pathlen = strlen(url->path); + *p = '\0'; + } + else + { + url->path = NULL; + url->pathlen = 0; + } +#ifdef REGEX + if (url->path) + { + int errcode; + char rebuf[BUFFER_SIZE]; + + if (NULL == (url->preg = zalloc(sizeof(*url->preg)))) + { + freez(url->spec); + freez(url->path); + return 1; + } + + sprintf(rebuf, "^(%s)", url->path); + + errcode = regcomp(url->preg, rebuf, + (REG_EXTENDED|REG_NOSUB|REG_ICASE)); + if (errcode) + { + size_t errlen = regerror(errcode, + url->preg, buf, sizeof(buf)); + + buf[errlen] = '\0'; + + log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", + url->spec, buf); + + freez(url->spec); + freez(url->path); + freez(url->preg); + + return 1; + } + } +#endif + if ((p = strchr(buf, ':')) == NULL) + { + url->port = 0; + } + else + { + *p++ = '\0'; + url->port = atoi(p); + } + + if ((url->domain = strdup(buf)) == NULL) + { + freez(url->spec); + freez(url->path); +#ifdef REGEX + freez(url->preg); +#endif /* def REGEX */ + return 1; + } + + /* split domain into components */ + + *tmp_url = dsplit(url->domain); + url->dbuf = tmp_url->dbuf; + url->dcnt = tmp_url->dcnt; + url->dvec = tmp_url->dvec; + url->unanchored = tmp_url->unanchored; + + return 0; /* OK */ + +} + + +/********************************************************************* + * + * Function : free_url + * + * Description : Called from the "unloaders". Freez the url + * structure elements. + * + * Parameters : + * 1 : url = pointer to a url_spec structure. + * + * Returns : N/A + * + *********************************************************************/ +void free_url(struct url_spec *url) +{ + if (url == NULL) return; + + freez(url->spec); + freez(url->domain); + freez(url->dbuf); + freez(url->dvec); + freez(url->path); +#ifdef REGEX + if (url->preg) + { + regfree(url->preg); + freez(url->preg); + } +#endif + +} + + /********************************************************************* * * Function : check_file_changed * * Description : Helper function to check if a file needs reloading. * If "current" is still current, return it. Otherwise - * allocates a new (zeroed) "struct file_list", fills + * allocates a new (zeroed) "struct file_list", fills * in the disk file name and timestamp, and returns it. * * Parameters : * 1 : current = The file_list currently being used - will - * be checked to see if it is out of date. + * be checked to see if it is out of date. * May be NULL (which is treated as out of * date). * 2 : filename = Name of file to check. @@ -440,7 +511,10 @@ void sweep(void) * This will be set to NULL, OR a struct * file_list newly allocated on the * heap, with the filename and lastmodified - * fields filled, and all others zeroed. + * fields filled, standard header giving file + * name in proxy_args, and all others zeroed. + * (proxy_args is only filled in if !defined + * SPLIT_PROXY_ARGS and !suppress_blocklists). * * Returns : If file unchanged: 0 (and sets newfl == NULL) * If file changed: 1 and sets newfl != NULL @@ -470,6 +544,7 @@ int check_file_changed(const struct file_list * current, } fs = (struct file_list *)zalloc(sizeof(struct file_list)); + if (fs == NULL) { /* Out of memory error */ @@ -485,468 +560,134 @@ int check_file_changed(const struct file_list * current, freez (fs); return 1; } - *newfl = fs; - return 1; -} - - -/********************************************************************* - * - * Function : simple_read_line - * - * Description : Read a single line from a file and return it. - * This is basically a version of fgets() that malloc()s - * it's own line buffer. Note that the buffer will - * always be a multiple of BUFFER_SIZE bytes long. - * Therefore if you are going to keep the string for - * an extended period of time, you should probably - * strdup() it and free() the original, to save memory. - * - * - * Parameters : - * 1 : dest = destination for newly malloc'd pointer to - * line data. Will be set to NULL on error. - * 2 : fp = File to read from - * 3 : newline = Standard for newlines in the file. - * Will be unchanged if it's value on input is not - * NEWLINE_UNKNOWN. - * On output, may be changed from NEWLINE_UNKNOWN to - * actual convention in file. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_FILE on EOF. - * - *********************************************************************/ -jb_err simple_read_line(FILE *fp, char **dest, int *newline) -{ - size_t len = 0; - size_t buflen = BUFFER_SIZE; - char * buf; - char * p; - int ch; - int realnewline = NEWLINE_UNKNOWN; - - if (NULL == (buf = malloc(buflen))) - { - return JB_ERR_MEMORY; - } - - p = buf; -/* - * Character codes. If you have a wierd compiler and the following are - * incorrect, you also need to fix NEWLINE() in loaders.h - */ -#define CHAR_CR '\r' /* ASCII 13 */ -#define CHAR_LF '\n' /* ASCII 10 */ - - for (;;) +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) { - ch = fgetc(fp); - if (ch == EOF) - { - if (len > 0) - { - *p = '\0'; - *dest = buf; - return JB_ERR_OK; - } - else - { - free(buf); - *dest = NULL; - return JB_ERR_FILE; - } - } - else if (ch == CHAR_CR) + char * p = html_encode(filename); + if (p) { - ch = getc(fp); - if (ch == CHAR_LF) - { - if (*newline == NEWLINE_UNKNOWN) - { - *newline = NEWLINE_DOS; - } - } - else - { - if (ch != EOF) - { - ungetc(ch, fp); - } - if (*newline == NEWLINE_UNKNOWN) - { - *newline = NEWLINE_MAC; - } - } - *p = '\0'; - *dest = buf; - if (*newline == NEWLINE_UNKNOWN) - { - *newline = realnewline; - } - return JB_ERR_OK; - } - else if (ch == CHAR_LF) - { - *p = '\0'; - *dest = buf; - if (*newline == NEWLINE_UNKNOWN) - { - *newline = NEWLINE_UNIX; - } - return JB_ERR_OK; - } - else if (ch == 0) - { - *p = '\0'; - *dest = buf; - return JB_ERR_OK; + fs->proxy_args = strsav(fs->proxy_args, "

    The file `"); + fs->proxy_args = strsav(fs->proxy_args, p); + fs->proxy_args = strsav(fs->proxy_args, + "' contains the following patterns

    \n"); + freez(p); } + fs->proxy_args = strsav(fs->proxy_args, "
    ");
    +   }
    +#endif /* ndef SPLIT_PROXY_ARGS */
     
    -      *p++ = ch;
    +   *newfl = fs;
    +   return 1;
     
    -      if (++len >= buflen)
    -      {
    -         buflen += BUFFER_SIZE;
    -         if (NULL == (p = realloc(buf, buflen)));
    -         {
    -            free(buf);
    -            return JB_ERR_MEMORY;
    -         }
    -         buf = p;
    -         p = buf + len;
    -      }
    -   }
     }
     
     
     /*********************************************************************
      *
    - * Function    :  edit_read_line
    + * Function    :  read_config_line
      *
      * Description :  Read a single non-empty line from a file and return
      *                it.  Trims comments, leading and trailing whitespace
      *                and respects escaping of newline and comment char.
    - *                Provides the line in 2 alternative forms: raw and
    - *                preprocessed.
    - *                - raw is the raw data read from the file.  If the
    - *                  line is not modified, then this should be written
    - *                  to the new file.
    - *                - prefix is any comments and blank lines that were
    - *                  read from the file.  If the line is modified, then
    - *                  this should be written out to the file followed
    - *                  by the modified data.  (If this string is non-empty
    - *                  then it will have a newline at the end).
    - *                - data is the actual data that will be parsed
    - *                  further by appropriate routines.
    - *                On EOF, the 3 strings will all be set to NULL and
    - *                0 will be returned.
    + *                Also writes the file to fs->proxy_args.
      *
      * Parameters  :
    - *          1  :  fp = File to read from
    - *          2  :  raw_out = destination for newly malloc'd pointer to
    - *                raw line data.  May be NULL if you don't want it.
    - *          3  :  prefix_out = destination for newly malloc'd pointer to
    - *                comments.  May be NULL if you don't want it.
    - *          4  :  data_out = destination for newly malloc'd pointer to
    - *                line data with comments and leading/trailing spaces
    - *                removed, and line continuation performed.  May be
    - *                NULL if you don't want it.
    - *          5  :  newline = Standard for newlines in the file.
    - *                On input, set to value to use or NEWLINE_UNKNOWN.
    - *                On output, may be changed from NEWLINE_UNKNOWN to
    - *                actual convention in file.  May be NULL if you
    - *                don't want it.
    - *          6  :  line_number = Line number in file.  In "lines" as
    - *                reported by a text editor, not lines containing data.
    - *
    - * Returns     :  JB_ERR_OK     on success
    - *                JB_ERR_MEMORY on out-of-memory
    - *                JB_ERR_FILE   on EOF.
    + *          1  :  buf = Buffer to use.
    + *          2  :  buflen = Size of buffer in bytes.
    + *          3  :  fp = File to read from
    + *          4  :  fs = File will be written to fs->proxy_args.  May
    + *                be NULL to disable this feature.
    + *
    + * Returns     :  NULL on EOF or error
    + *                Otherwise, returns buf.
      *
      *********************************************************************/
    -jb_err edit_read_line(FILE *fp,
    -                      char **raw_out,
    -                      char **prefix_out,
    -                      char **data_out,
    -                      int *newline,
    -                      unsigned long *line_number)
    +char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs)
     {
    -   char *p;          /* Temporary pointer   */
    -   char *linebuf;    /* Line read from file */
    -   char *linestart;  /* Start of linebuf, usually first non-whitespace char */
    -   int contflag = 0; /* Nonzero for line continuation - i.e. line ends '\' */
    -   int is_empty = 1; /* Flag if not got any data yet */
    -   char *raw    = NULL; /* String to be stored in raw_out    */
    -   char *prefix = NULL; /* String to be stored in prefix_out */
    -   char *data   = NULL; /* String to be stored in data_out   */
    -   int scrapnewline;    /* Used for (*newline) if newline==NULL */
    -   jb_err rval = JB_ERR_OK;
    -
    -   assert(fp);
    -   assert(raw_out || data_out);
    -   assert(newline == NULL
    -       || *newline == NEWLINE_UNKNOWN
    -       || *newline == NEWLINE_UNIX
    -       || *newline == NEWLINE_DOS
    -       || *newline == NEWLINE_MAC);
    -
    -   if (newline == NULL)
    -   {
    -      scrapnewline = NEWLINE_UNKNOWN;
    -      newline = &scrapnewline;
    -   }
    +   char *p, *q;
    +   char linebuf[BUFFER_SIZE];
    +   int contflag = 0;
     
    -   /* Set output parameters to NULL */
    -   if (raw_out)
    -   {
    -      *raw_out    = NULL;
    -   }
    -   if (prefix_out)
    -   {
    -      *prefix_out = NULL;
    -   }
    -   if (data_out)
    -   {
    -      *data_out   = NULL;
    -   }
    -
    -   /* Set string variables to new, empty strings. */
    +   *buf = '\0';
     
    -   if (raw_out)
    +   while (fgets(linebuf, sizeof(linebuf), fp))
        {
    -      if ((raw = malloc(1)) == NULL)
    +#ifndef SPLIT_PROXY_ARGS
    +      if (fs && !suppress_blocklists)
           {
    -         return JB_ERR_MEMORY;
    -      }
    -      *raw = '\0';
    -   }
    -   if (prefix_out)
    -   {
    -      if ((prefix = malloc(1)) == NULL)
    -      {
    -         freez(raw);
    -         return JB_ERR_MEMORY;
    -      }
    -      *prefix = '\0';
    -   }
    -   if (data_out)
    -   {
    -      if ((data = malloc(1)) == NULL)
    -      {
    -         freez(raw);
    -         freez(prefix);
    -         return JB_ERR_MEMORY;
    +         char *html_line = html_encode(linebuf);
    +         if (html_line != NULL)
    +         {
    +            fs->proxy_args = strsav(fs->proxy_args, html_line);
    +            freez(html_line);
    +         }
    +         fs->proxy_args = strsav(fs->proxy_args, "
    "); } - *data = '\0'; - } - - /* Main loop. Loop while we need more data & it's not EOF. */ +#endif /* ndef SPLIT_PROXY_ARGS */ - while ( (contflag || is_empty) - && (JB_ERR_OK == (rval = simple_read_line(fp, &linebuf, newline)))) - { - if (line_number) + /* Trim off newline */ + if ((p = strpbrk(linebuf, "\r\n")) != NULL) { - (*line_number)++; + *p = '\0'; } - if (raw) + else { - string_append(&raw,linebuf); - if (string_append(&raw,NEWLINE(*newline))) - { - freez(prefix); - freez(data); - free(linebuf); - return JB_ERR_MEMORY; - } + p = linebuf + strlen(linebuf); } /* Line continuation? Trim escape and set flag. */ - p = linebuf + strlen(linebuf) - 1; - contflag = ((*linebuf != '\0') && (*p == '\\')); - if (contflag) + if ((p != linebuf) && (*--p == '\\')) { + contflag = 1; *p = '\0'; } - /* Trim leading spaces if we're at the start of the line */ - linestart = linebuf; - if (*data == '\0') - { - /* Trim leading spaces */ - while (*linestart && isspace((int)(unsigned char)*linestart)) - { - linestart++; - } - } - - /* Handle comment characters. */ - p = linestart; - while ((p = strchr(p, '#')) != NULL) + /* If there's a comment char.. */ + if ((p = strpbrk(linebuf, "#")) != NULL) { - /* Found a comment char.. */ + /* ..and it's escaped, left-shift the line over the escape. */ if ((p != linebuf) && (*(p-1) == '\\')) { - /* ..and it's escaped, left-shift the line over the escape. */ - char *q = p - 1; - while ((*q = *(q + 1)) != '\0') - { - q++; - } - /* Now scan from just after the "#". */ + q = p-1; + while ((*q++ = *p++) != '\0') /* nop */; } + /* Else, chop off the rest of the line */ else { - /* Real comment. Save it... */ - if (p == linestart) - { - /* Special case: Line only contains a comment, so all the - * previous whitespace is considered part of the comment. - * Undo the whitespace skipping, if any. - */ - linestart = linebuf; - p = linestart; - } - if (prefix) - { - string_append(&prefix,p); - if (string_append(&prefix, NEWLINE(*newline))) - { - freez(raw); - freez(data); - free(linebuf); - return JB_ERR_MEMORY; - } - } - - /* ... and chop off the rest of the line */ *p = '\0'; } - } /* END while (there's a # character) */ + } /* Write to the buffer */ - if (*linestart) + if (*linebuf) { - is_empty = 0; - if (data) - { - if (string_append(&data, linestart)) - { - freez(raw); - freez(prefix); - free(linebuf); - return JB_ERR_MEMORY; - } - } + strncat(buf, linebuf, buflen - strlen(buf)); } - free(linebuf); - } /* END while(we need more data) */ - - /* Handle simple_read_line() errors - ignore EOF */ - if ((rval != JB_ERR_OK) && (rval != JB_ERR_FILE)) - { - freez(raw); - freez(prefix); - freez(data); - return rval; - } - - if (raw ? (*raw == '\0') : is_empty) - { - /* EOF and no data there. (Definition of "data" depends on whether - * the caller cares about "raw" or just "data"). - */ - - freez(raw); - freez(prefix); - freez(data); - - return JB_ERR_FILE; - } - else - { - /* Got at least some data */ - - /* Remove trailing whitespace */ - chomp(data); - - if (raw_out) - { - *raw_out = raw; - } - else - { - freez(raw); - } - if (prefix_out) - { - *prefix_out = prefix; - } - else - { - freez(prefix); - } - if (data_out) - { - *data_out = data; - } - else + /* Continue? */ + if (contflag) { - freez(data); + contflag = 0; + continue; } - return JB_ERR_OK; - } -} + /* Remove leading and trailing whitespace */ + chomp(buf); -/********************************************************************* - * - * Function : read_config_line - * - * Description : Read a single non-empty line from a file and return - * it. Trims comments, leading and trailing whitespace - * and respects escaping of newline and comment char. - * - * Parameters : - * 1 : buf = Buffer to use. - * 2 : buflen = Size of buffer in bytes. - * 3 : fp = File to read from - * 4 : linenum = linenumber in file - * - * Returns : NULL on EOF or error - * Otherwise, returns buf. - * - *********************************************************************/ -char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenum) -{ - jb_err err; - char *buf2 = NULL; - err = edit_read_line(fp, NULL, NULL, &buf2, NULL, linenum); - if (err) - { - if (err == JB_ERR_MEMORY) + if (*buf) { - log_error(LOG_LEVEL_FATAL, "Out of memory loading a config file"); + return buf; } - return NULL; - } - else - { - assert(buf2); - assert(strlen(buf2) + 1U < buflen); - strncpy(buf, buf2, buflen - 1); - free(buf2); - buf[buflen - 1] = '\0'; - return buf; } + + /* EOF */ + return NULL; + } -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES /********************************************************************* * * Function : unload_trustfile @@ -961,44 +702,16 @@ char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenu *********************************************************************/ static void unload_trustfile(void *f) { - struct block_spec *cur = (struct block_spec *)f; - struct block_spec *next; - - while (cur != NULL) - { - next = cur->next; + struct block_spec *b = (struct block_spec *)f; + if (b == NULL) return; - free_url_spec(cur->url); - free(cur); + unload_trustfile(b->next); /* Stack is cheap, isn't it? */ - cur = next; - } - -} + free_url(b->url); + freez(b); -#ifdef FEATURE_GRACEFUL_TERMINATION -/********************************************************************* - * - * Function : unload_current_trust_file - * - * Description : Unloads current trust file - reset to state at - * beginning of program. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void unload_current_trust_file(void) -{ - if (current_trustfile) - { - current_trustfile->unloader = unload_trustfile; - current_trustfile = NULL; - } } -#endif /* FEATURE_GRACEFUL_TERMINATION */ /********************************************************************* @@ -1023,7 +736,6 @@ int load_trustfile(struct client_state *csp) char buf[BUFFER_SIZE], *p, *q; int reject, trusted; struct file_list *fs; - unsigned long linenum = 0; if (!check_file_changed(current_trustfile, csp->config->trustfile, &fs)) { @@ -1052,7 +764,7 @@ int load_trustfile(struct client_state *csp) tl = csp->config->trust_list; - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) + while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) { trusted = 0; reject = 1; @@ -1068,7 +780,7 @@ int load_trustfile(struct client_state *csp) reject = 0; p = buf; q = p+1; - while ((*p++ = *q++) != '\0') + while ((*p++ = *q++)) { /* nop */ } @@ -1106,7 +818,6 @@ int load_trustfile(struct client_state *csp) if (trusted) { *tl++ = b->url; - /* FIXME BUFFER OVERFLOW if >=64 entries */ } } @@ -1114,6 +825,13 @@ int load_trustfile(struct client_state *csp) fclose(fp); +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) + { + fs->proxy_args = strsav(fs->proxy_args, "
    "); + } +#endif /* ndef SPLIT_PROXY_ARGS */ + /* the old one is now obsolete */ if (current_trustfile) { @@ -1137,15 +855,14 @@ load_trustfile_error: return(-1); } -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ /********************************************************************* * * Function : unload_re_filterfile * - * Description : Unload the re_filter list by freeing all chained - * re_filterfile specs and their data. + * Description : Unload the re_filter list. * * Parameters : * 1 : f = the data structure associated with the filterfile. @@ -1155,57 +872,24 @@ load_trustfile_error: *********************************************************************/ static void unload_re_filterfile(void *f) { - struct re_filterfile_spec *a, *b = (struct re_filterfile_spec *)f; + struct re_filterfile_spec *b = (struct re_filterfile_spec *)f; - while (b != NULL) - { - a = b->next; - - destroy_list(b->patterns); - pcrs_free_joblist(b->joblist); - freez(b->name); - freez(b->description); - freez(b); + if (b == NULL) return; - b = a; - } + destroy_list(b->patterns); + pcrs_free_joblist(b->joblist); + freez(b); return; } - -#ifdef FEATURE_GRACEFUL_TERMINATION -/********************************************************************* - * - * Function : unload_current_re_filterfile - * - * Description : Unloads current re_filter file - reset to state at - * beginning of program. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void unload_current_re_filterfile(void) -{ - if (current_re_filterfile) - { - current_re_filterfile->unloader = unload_re_filterfile; - current_re_filterfile = NULL; - } -} -#endif - - /********************************************************************* * * Function : load_re_filterfile * - * Description : Load the re_filterfile. - * Generate a chained list of re_filterfile_spec's from - * the "FILTER: " blocks, compiling all their substitutions - * into chained lists of pcrs_job structs. + * Description : Load the re_filterfile. Each non-comment, non-empty + * line is instantly added to the joblist, which is + * a chained list of pcrs_job structs. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) @@ -1217,19 +901,16 @@ int load_re_filterfile(struct client_state *csp) { FILE *fp; - struct re_filterfile_spec *new_bl, *bl = NULL; + struct re_filterfile_spec *bl; struct file_list *fs; char buf[BUFFER_SIZE]; int error; - unsigned long linenum = 0; pcrs_job *dummy; - /* - * No need to reload if unchanged - */ if (!check_file_changed(current_re_filterfile, csp->config->re_filterfile, &fs)) { + /* No need to load */ if (csp) { csp->rlist = current_re_filterfile; @@ -1241,105 +922,53 @@ int load_re_filterfile(struct client_state *csp) goto load_re_filterfile_error; } - /* - * Open the file or fail - */ - if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL) + fs->f = bl = (struct re_filterfile_spec *)zalloc(sizeof(*bl)); + if (bl == NULL) { goto load_re_filterfile_error; } - /* - * Read line by line - */ - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) + /* Open the file or fail */ + if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL) { - /* - * If this is the head of a new filter block, make it a - * re_filterfile spec of its own and chain it to the list: - */ - if (strncmp(buf, "FILTER:", 7) == 0) - { - new_bl = (struct re_filterfile_spec *)zalloc(sizeof(*bl)); - if (new_bl == NULL) - { - goto load_re_filterfile_error; - } - - new_bl->name = chomp(buf + 7); - - if (NULL != (new_bl->description = strchr(new_bl->name, ' '))) - { - *new_bl->description++ = '\0'; - new_bl->description = strdup(chomp(new_bl->description)); - } - else - { - new_bl->description = strdup("No description available for this filter"); - } - - new_bl->name = strdup(chomp(new_bl->name)); - - /* - * If this is the first filter block, chain it - * to the file_list rather than its (nonexistant) - * predecessor - */ - if (fs->f == NULL) - { - fs->f = new_bl; - } - else - { - bl->next = new_bl; - } - bl = new_bl; - - log_error(LOG_LEVEL_RE_FILTER, "Reading in filter \"%s\" (\"%s\")", bl->name, bl->description); + goto load_re_filterfile_error; + } - continue; - } + /* Read line by line */ + while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) + { + enlist( bl->patterns, buf ); - /* - * Else, save the expression, make it a pcrs_job - * and chain it into the current filter's joblist - */ - if (bl != NULL) + /* We have a meaningful line -> make it a job */ + if ((dummy = pcrs_compile_command(buf, &error)) == NULL) { - enlist(bl->patterns, buf); - - if ((dummy = pcrs_compile_command(buf, &error)) == NULL) - { - log_error(LOG_LEVEL_RE_FILTER, - "Adding re_filter job %s to filter %s failed with error %d.", buf, bl->name, error); - continue; - } - else - { - dummy->next = bl->joblist; - bl->joblist = dummy; - log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s to filter %s succeeded.", buf, bl->name); - } + log_error(LOG_LEVEL_RE_FILTER, + "Adding re_filter job %s failed with error %d.", buf, error); + continue; } else { - log_error(LOG_LEVEL_ERROR, "Ignoring job %s outside filter block in %s, line %d", buf, csp->config->re_filterfile, linenum); + dummy->next = bl->joblist; + bl->joblist = dummy; + log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s succeeded.", buf); } } fclose(fp); - /* - * Schedule the now-obsolete old data for unloading - */ +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) + { + fs->proxy_args = strsav(fs->proxy_args, ""); + } +#endif /* ndef SPLIT_PROXY_ARGS */ + + /* the old one is now obsolete */ if ( NULL != current_re_filterfile ) { current_re_filterfile->unloader = unload_re_filterfile; } - /* - * Chain this file into the global list of loaded files - */ fs->next = files->next; files->next = fs; current_re_filterfile = fs; @@ -1352,7 +981,7 @@ int load_re_filterfile(struct client_state *csp) return( 0 ); load_re_filterfile_error: - log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", + log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", csp->config->re_filterfile); return(-1); @@ -1374,7 +1003,7 @@ load_re_filterfile_error: * Returns : N/A * *********************************************************************/ -void add_loader(int (*loader)(struct client_state *), +void add_loader(int (*loader)(struct client_state *), struct configuration_spec * config) { int i; diff --git a/loaders.h b/loaders.h index 216c352d..2ebb564a 100644 --- a/loaders.h +++ b/loaders.h @@ -1,6 +1,6 @@ -#ifndef LOADERS_H_INCLUDED -#define LOADERS_H_INCLUDED -#define LOADERS_H_VERSION "$Id: loaders.h,v 1.18 2002/03/24 13:25:43 swa Exp $" +#ifndef _LOADERS_H +#define _LOADERS_H +#define LOADERS_H_VERSION "$Id: loaders.h,v 1.6 2001/06/07 23:14:38 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loaders.h,v $ @@ -11,7 +11,7 @@ * unload files that are no longer in use. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,66 +37,6 @@ * * Revisions : * $Log: loaders.h,v $ - * Revision 1.18 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.17 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.16 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.15 2002/01/22 23:46:18 jongfoster - * Moving edit_read_line() and simple_read_line() to loaders.c, and - * extending them to support reading MS-DOS, Mac and UNIX style files - * on all platforms. - * - * Modifying read_config_line() (without changing it's prototype) to - * be a trivial wrapper for edit_read_line(). This means that we have - * one function to read a line and handle comments, which is common - * between the initialization code and the edit interface. - * - * Revision 1.14 2002/01/17 21:03:08 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Revision 1.13 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.12 2001/11/07 00:02:13 steudten - * Add line number in error output for lineparsing for - * actionsfile and configfile. - * Special handling for CLF added. - * - * Revision 1.11 2001/10/23 21:38:53 jongfoster - * Adding error-checking to create_url_spec() - * - * Revision 1.10 2001/09/22 16:36:59 jongfoster - * Removing unused parameter fs from read_config_line() - * - * Revision 1.9 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.8 2001/07/29 18:58:15 jongfoster - * Removing nested #includes, adding forward declarations for needed - * structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED. - * - * Revision 1.7 2001/07/13 14:01:54 oes - * Removed all #ifdef PCRS - * * Revision 1.6 2001/06/07 23:14:38 jongfoster * Removing ACL and forward file loaders - these files have * been merged into the config file. @@ -155,64 +95,29 @@ *********************************************************************/ +#include "project.h" + #ifdef __cplusplus extern "C" { #endif -/* Structures taken from project.h */ -struct client_state; -struct file_list; -struct configuration_spec; -struct url_spec; - extern void sweep(void); -extern char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenum); +extern char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs); extern int check_file_changed(const struct file_list * current, const char * filename, struct file_list ** newfl); -extern jb_err edit_read_line(FILE *fp, - char **raw_out, - char **prefix_out, - char **data_out, - int *newline, - unsigned long *line_number); - -extern jb_err simple_read_line(FILE *fp, char **dest, int *newline); - -/* - * Various types of newlines that a file may contain. - */ -#define NEWLINE_UNKNOWN 0 /* Newline convention in file is unknown */ -#define NEWLINE_UNIX 1 /* Newline convention in file is '\n' (ASCII 10) */ -#define NEWLINE_DOS 2 /* Newline convention in file is '\r\n' (ASCII 13,10) */ -#define NEWLINE_MAC 3 /* Newline convention in file is '\r' (ASCII 13) */ - -/* - * Types of newlines that a file may contain, as strings. If you have an - * extremely wierd compiler that does not have '\r' == CR == ASCII 13 and - * '\n' == LF == ASCII 10), then fix CHAR_CR and CHAR_LF in loaders.c as - * well as these definitions. - */ -#define NEWLINE(style) ((style)==NEWLINE_DOS ? "\r\n" : \ - ((style)==NEWLINE_MAC ? "\r" : "\n")) - - -extern short int MustReload; extern int load_actions_file(struct client_state *csp); extern int load_re_filterfile(struct client_state *csp); -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES extern int load_trustfile(struct client_state *csp); -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ + -#ifdef FEATURE_GRACEFUL_TERMINATION -#ifdef FEATURE_TRUST -void unload_current_trust_file(void); -#endif -void unload_current_re_filterfile(void); -#endif /* FEATURE_GRACEFUL_TERMINATION */ +extern int create_url_spec(struct url_spec * url, char * buf); +extern void free_url(struct url_spec *url); extern void add_loader(int (*loader)(struct client_state *), struct configuration_spec * config); @@ -226,7 +131,7 @@ extern const char loaders_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef LOADERS_H_INCLUDED */ +#endif /* ndef _LOADERS_H */ /* Local Variables: diff --git a/miscutil.c b/miscutil.c index ec4de4fd..6650890e 100644 --- a/miscutil.c +++ b/miscutil.c @@ -1,16 +1,16 @@ -const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp $"; +const char miscutil_rcs[] = "$Id: miscutil.c,v 1.14 2001/06/29 21:45:41 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/miscutil.c,v $ * * Purpose : zalloc, hash_string, safe_strerror, strcmpic, - * strncmpic, chomp, and MinGW32 strdup + * strncmpic, strsav, chomp, and MinGW32 strdup * functions. * These are each too small to deserve their own file * but don't really fit in any other file. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -36,92 +36,6 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp * * Revisions : * $Log: miscutil.c,v $ - * Revision 1.34 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.33 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.32 2002/03/06 23:02:57 jongfoster - * Removing tabs - * - * Revision 1.31 2002/03/05 04:52:42 oes - * Deleted non-errlog debugging code - * - * Revision 1.30 2002/03/04 18:27:42 oes - * - Deleted deletePidFile - * - Made write_pid_file use the --pidfile option value - * (or no PID file, if the option was absent) - * - Played styleguide police - * - * Revision 1.29 2002/03/04 02:08:02 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.28 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.27 2002/01/21 00:52:32 jongfoster - * Adding string_join() - * - * Revision 1.26 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.25 2001/11/13 00:16:38 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.24 2001/11/05 21:41:43 steudten - * Add changes to be a real daemon just for unix os. - * (change cwd to /, detach from controlling tty, set - * process group and session leader to the own process. - * Add DBG() Macro. - * Add some fatal-error log message for failed malloc(). - * Add '-d' if compiled with 'configure --with-debug' to - * enable debug output. - * - * Revision 1.23 2001/10/29 03:48:10 david__schmidt - * OS/2 native needed a snprintf() routine. Added one to miscutil, brackedted - * by and __OS2__ ifdef. - * - * Revision 1.22 2001/10/26 17:39:38 oes - * Moved ijb_isspace and ijb_tolower to project.h - * - * Revision 1.21 2001/10/23 21:27:50 jongfoster - * Standardising error codes in string_append - * make_path() no longer adds '\\' if the dir already ends in '\\' (this - * is just copying a UNIX-specific fix to the Windows-specific part) - * - * Revision 1.20 2001/10/22 15:33:56 david__schmidt - * Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in - * filters.c. Added a FIXME in front of the offending code. I'll gladly - * put in a better/more robust fix for all parties if one is presented... - * It seems that just returning 200 instead of 404 would pretty much fix - * it for everyone, but I don't know all the history of the problem. - * - * Revision 1.19 2001/10/14 22:02:57 jongfoster - * New function string_append() which is like strsav(), but running - * out of memory isn't automatically FATAL. - * - * Revision 1.18 2001/09/20 13:33:43 steudten - * - * change long to int as return value in hash_string(). Remember the wraparound - * for int = long = sizeof(4) - thats maybe not what we want. - * - * Revision 1.17 2001/09/13 20:51:29 jongfoster - * Fixing potential problems with characters >=128 in simplematch() - * This was also a compiler warning. - * - * Revision 1.16 2001/09/10 10:56:59 oes - * Silenced compiler warnings - * - * Revision 1.15 2001/07/13 14:02:24 oes - * Removed vim-settings - * * Revision 1.14 2001/06/29 21:45:41 oes * Indentation, CRLF->LF, Tab-> Space * @@ -197,22 +111,31 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp #include "config.h" #include -#include #include -#if !defined(_WIN32) && !defined(__OS2__) -#include -#endif /* #if !defined(_WIN32) && !defined(__OS2__) */ #include +#include #include -#include +/* + * FIXME: Only need project.h for BUFFER_SIZE. It would be nice + * to remove this dependency. + */ #include "project.h" #include "miscutil.h" #include "errlog.h" -#include "jcc.h" const char miscutil_h_rcs[] = MISCUTIL_H_VERSION; +/* Fix a problem with Solaris. There should be no effect on other + * platforms. + * Solaris's isspace() is a macro which uses it's argument directly + * as an array index. Therefore we need to make sure that high-bit + * characters generate +ve values, and ideally we also want to make + * the argument match the declared parameter type of "int". + */ +#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) +#define ijb_isspace(__X) isspace((int)(unsigned char)(__X)) + /********************************************************************* * * Function : zalloc @@ -226,7 +149,7 @@ const char miscutil_h_rcs[] = MISCUTIL_H_VERSION; * Returns : Pointer to newly malloc'd memory chunk. * *********************************************************************/ -void *zalloc(size_t size) +void *zalloc(int size) { void * ret; @@ -236,47 +159,9 @@ void *zalloc(size_t size) } return(ret); - } -#if defined(unix) -/********************************************************************* - * - * Function : write_pid_file - * - * Description : Writes a pid file with the pid of the main process - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void write_pid_file(void) -{ - FILE *fp; - - /* - * If no --pidfile option was given, - * we can live without one. - */ - if (pidfile == NULL) return; - - if ((fp = fopen(pidfile, "w")) == NULL) - { - log_error(LOG_LEVEL_INFO, "can't open pidfile '%s': %E", pidfile); - } - else - { - fprintf(fp, "%u\n", (unsigned int) getpid()); - fclose (fp); - } - return; - -} -#endif /* def unix */ - - /********************************************************************* * * Function : hash_string @@ -291,9 +176,9 @@ void write_pid_file(void) * Returns : an unsigned long variable with the hashed value. * *********************************************************************/ -unsigned int hash_string( const char* s ) +unsigned long hash_string( const char* s ) { - unsigned int h = 0; + unsigned long h = 0ul; for ( ; *s; ++s ) { @@ -487,20 +372,17 @@ char *chomp(char *string) } - /********************************************************************* * * Function : strsav * * Description : Reallocate "old" and append text to it. This makes * it easier to append to malloc'd strings. - * Running out of memory is a FATAL error. * * Parameters : * 1 : old = Old text that is to be extended. Will be - * free()d by this routine. May be NULL. + * free()d by this routine. * 2 : text_to_append = Text to be appended to old. - * May be NULL. * * Returns : Pointer to newly malloc'ed appended string. * If there is no text to append, return old. Caller @@ -509,172 +391,45 @@ char *chomp(char *string) *********************************************************************/ char *strsav(char *old, const char *text_to_append) { - size_t old_len, new_len = 0; + int old_len, new_len; char *p; - if ((text_to_append == NULL) || (*text_to_append == '\0')) + if (( text_to_append == NULL) || (*text_to_append == '\0')) { return(old); } - if (NULL == old) - { - if ((p = strdup(text_to_append)) == NULL) - { - log_error(LOG_LEVEL_FATAL, "strdup() failed!"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - return p; - } - - old_len = strlen(old); - new_len = old_len + strlen(text_to_append) + 1; - - if ((p = realloc(old, new_len)) == NULL) - { - log_error(LOG_LEVEL_FATAL, "realloc(%d) bytes failed!", new_len); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - - strcpy(p + old_len, text_to_append); - return(p); -} - - -/********************************************************************* - * - * Function : string_append - * - * Description : Reallocate target_string and append text to it. - * This makes it easier to append to malloc'd strings. - * This is similar to the (removed) strsav(), but - * running out of memory isn't catastrophic. - * - * Programming style: - * - * The following style provides sufficient error - * checking for this routine, with minimal clutter - * in the source code. It is recommended if you - * have many calls to this function: - * - * char * s = strdup(...); // don't check for error - * string_append(&s, ...); // don't check for error - * string_append(&s, ...); // don't check for error - * string_append(&s, ...); // don't check for error - * if (NULL == s) { ... handle error ... } - * - * OR, equivalently: - * - * char * s = strdup(...); // don't check for error - * string_append(&s, ...); // don't check for error - * string_append(&s, ...); // don't check for error - * if (string_append(&s, ...)) {... handle error ...} - * - * Parameters : - * 1 : target_string = Pointer to old text that is to be - * extended. *target_string will be free()d by this - * routine. target_string must be non-NULL. - * If *target_string is NULL, this routine will - * do nothing and return with an error - this allows - * you to make many calls to this routine and only - * check for errors after the last one. - * 2 : text_to_append = Text to be appended to old. - * Must not be NULL. - * - * Returns : JB_ERR_OK on success, and sets *target_string - * to newly malloc'ed appended string. Caller - * must free(*target_string). - * JB_ERR_MEMORY on out-of-memory. (And free()s - * *target_string and sets it to NULL). - * JB_ERR_MEMORY if *target_string is NULL. - * - *********************************************************************/ -jb_err string_append(char **target_string, const char *text_to_append) -{ - size_t old_len; - char *new_string; - - assert(target_string); - assert(text_to_append); - - if (*target_string == NULL) + if (NULL != old) { - return JB_ERR_MEMORY; + old_len = strlen(old); } - - if (*text_to_append == '\0') + else { - return JB_ERR_OK; + old_len = 0; } - old_len = strlen(*target_string); + new_len = old_len + strlen(text_to_append) + 1; - if (NULL == (new_string = realloc(*target_string, - strlen(text_to_append) + old_len + 1))) + if (old) { - free(*target_string); - - *target_string = NULL; - return JB_ERR_MEMORY; + if ((p = realloc(old, new_len)) == NULL) + { + log_error(LOG_LEVEL_FATAL, "realloc(%d) bytes failed!", new_len); + /* Never get here - LOG_LEVEL_FATAL causes program exit */ + } } - - strcpy(new_string + old_len, text_to_append); - - *target_string = new_string; - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : string_join - * - * Description : Join two strings together. Frees BOTH the original - * strings. If either or both input strings are NULL, - * fails as if it had run out of memory. - * - * For comparison, string_append requires that the - * second string is non-NULL, and doesn't free it. - * - * Rationale: Too often, we want to do - * string_append(s, html_encode(s2)). That assert()s - * if s2 is NULL or if html_encode() runs out of memory. - * It also leaks memory. Proper checking is cumbersome. - * The solution: string_join(s, html_encode(s2)) is safe, - * and will free the memory allocated by html_encode(). - * - * Parameters : - * 1 : target_string = Pointer to old text that is to be - * extended. *target_string will be free()d by this - * routine. target_string must be non-NULL. - * 2 : text_to_append = Text to be appended to old. - * - * Returns : JB_ERR_OK on success, and sets *target_string - * to newly malloc'ed appended string. Caller - * must free(*target_string). - * JB_ERR_MEMORY on out-of-memory, or if - * *target_string or text_to_append is NULL. (In - * this case, frees *target_string and text_to_append, - * sets *target_string to NULL). - * - *********************************************************************/ -jb_err string_join(char **target_string, char *text_to_append) -{ - jb_err err; - - assert(target_string); - - if (text_to_append == NULL) + else { - freez(*target_string); - return JB_ERR_MEMORY; + if ((p = (char *)malloc(new_len)) == NULL) + { + log_error(LOG_LEVEL_FATAL, "malloc(%d) bytes failed!", new_len); + /* Never get here - LOG_LEVEL_FATAL causes program exit */ + } } - err = string_append(target_string, text_to_append); - - free(text_to_append); + strcpy(p + old_len, text_to_append); + return(p); - return err; } @@ -696,12 +451,12 @@ jb_err string_join(char **target_string, char *text_to_append) *********************************************************************/ int simplematch(char *pattern, char *text) { - unsigned char *pat = (unsigned char *) pattern; - unsigned char *txt = (unsigned char *) text; - unsigned char *fallback = pat; + char *fallback; + char *pat = pattern; + char *txt = text; int wildcard = 0; - unsigned char lastchar = 'a'; + char lastchar = 'a'; unsigned i; unsigned char charmap[32]; @@ -803,25 +558,25 @@ int simplematch(char *pattern, char *text) * * Parameters : * 1 : string = string to be duplicated - * 2 : len = number of bytes to duplicate + * 2 : n = number of bytes to duplicate * * Returns : pointer to copy, or NULL if failiure * *********************************************************************/ -char *bindup(const char *string, size_t len) +char *bindup(const char *string, int n) { - char *duplicate; + char *dup; - if (NULL == (duplicate = (char *)malloc(len))) + if (NULL == (dup = (char *)malloc(n))) { return NULL; } else { - memcpy(duplicate, string, len); + memcpy(dup, string, n); } - return duplicate; + return dup; } @@ -853,21 +608,7 @@ char * make_path(const char * dir, const char * file) if(dir) { - if(dir[0] == '.') - { - if(dir[1] == '/') - { - strncpy(path,dir+2,512); - } - else - { - strncpy(path,dir+1,512); - } - } - else - { - strncpy(path,dir,512); - } + strncpy(path,dir,512); path[511]=0; } else { path[0]=0; @@ -886,53 +627,24 @@ char * make_path(const char * dir, const char * file) } if ((dir == NULL) || (*dir == '\0') /* No directory specified */ -#if defined(_WIN32) || defined(__OS2__) +#ifdef _WIN32 || (*file == '\\') || (file[1] == ':') /* Absolute path (DOS) */ -#else /* ifndef _WIN32 || __OS2__ */ +#else /* ifndef _WIN32 */ || (*file == '/') /* Absolute path (U*ix) */ -#endif /* ifndef _WIN32 || __OS2__ */ +#endif /* ifndef _WIN32 */ ) { return strdup(file); } else { - char * path; - -#if defined(unix) - if ( *dir != '/' && basedir && *basedir ) - { - path = malloc( strlen( basedir ) + strlen(dir) + strlen(file) + 3); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); - strcpy(path, basedir); - strcat(path, "/"); - strcat(path, dir); - } - else - { - path = malloc(strlen(dir) + strlen(file) + 2); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); - strcpy(path, dir); - } -#else - - path = malloc(strlen(dir) + strlen(file) + 2); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); + char * path = malloc(strlen(dir) + strlen(file) + 2); strcpy(path, dir); - -#endif /* defined unix */ - -#if defined(_WIN32) || defined(__OS2__) - if(path[strlen(path)-1] != '\\') - { - strcat(path, "\\"); - } -#else /* ifndef _WIN32 || __OS2__ */ - if(path[strlen(path)-1] != '/') - { - strcat(path, "/"); - } -#endif /* ifndef _WIN32 || __OS2__ */ +#ifdef _WIN32 + strcat(path, "\\"); +#else /* ifndef _WIN32 */ + if(path[strlen(path)-1] != '/') strcat(path, "/"); +#endif /* ifndef _WIN32 */ strcat(path, file); return path; @@ -941,774 +653,6 @@ char * make_path(const char * dir, const char * file) } -/* - * What follows is a portable snprintf routine, written by Mark Martinec. - * See: http://www.ijs.si/software/snprintf/ - * Anyone who needs it can add a define for themselves... so far, only - * OS/2 (native) lacks snprintf. - - snprintf.c - - a portable implementation of snprintf, - including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf - - snprintf is a routine to convert numeric and string arguments to - formatted strings. It is similar to sprintf(3) provided in a system's - C library, yet it requires an additional argument - the buffer size - - and it guarantees never to store anything beyond the given buffer, - regardless of the format or arguments to be formatted. Some newer - operating systems do provide snprintf in their C library, but many do - not or do provide an inadequate (slow or idiosyncratic) version, which - calls for a portable implementation of this routine. - -Author - - Mark Martinec , April 1999, June 2000 - Copyright © 1999, Mark Martinec - - */ - -#ifdef __OS2__ - -#define PORTABLE_SNPRINTF_VERSION_MAJOR 2 -#define PORTABLE_SNPRINTF_VERSION_MINOR 2 - -#if defined(NEED_ASPRINTF) || defined(NEED_ASNPRINTF) || defined(NEED_VASPRINTF) || defined(NEED_VASNPRINTF) -# if defined(NEED_SNPRINTF_ONLY) -# undef NEED_SNPRINTF_ONLY -# endif -# if !defined(PREFER_PORTABLE_SNPRINTF) -# define PREFER_PORTABLE_SNPRINTF -# endif -#endif - -#if defined(SOLARIS_BUG_COMPATIBLE) && !defined(SOLARIS_COMPATIBLE) -#define SOLARIS_COMPATIBLE -#endif - -#if defined(HPUX_BUG_COMPATIBLE) && !defined(HPUX_COMPATIBLE) -#define HPUX_COMPATIBLE -#endif - -#if defined(DIGITAL_UNIX_BUG_COMPATIBLE) && !defined(DIGITAL_UNIX_COMPATIBLE) -#define DIGITAL_UNIX_COMPATIBLE -#endif - -#if defined(PERL_BUG_COMPATIBLE) && !defined(PERL_COMPATIBLE) -#define PERL_COMPATIBLE -#endif - -#if defined(LINUX_BUG_COMPATIBLE) && !defined(LINUX_COMPATIBLE) -#define LINUX_COMPATIBLE -#endif - -#include -#include -#include -#include -#include -#include -#include - -#ifdef isdigit -#undef isdigit -#endif -#define isdigit(c) ((c) >= '0' && (c) <= '9') - -/* For copying strings longer or equal to 'breakeven_point' - * it is more efficient to call memcpy() than to do it inline. - * The value depends mostly on the processor architecture, - * but also on the compiler and its optimization capabilities. - * The value is not critical, some small value greater than zero - * will be just fine if you don't care to squeeze every drop - * of performance out of the code. - * - * Small values favor memcpy, large values favor inline code. - */ -#if defined(__alpha__) || defined(__alpha) -# define breakeven_point 2 /* AXP (DEC Alpha) - gcc or cc or egcs */ -#endif -#if defined(__i386__) || defined(__i386) -# define breakeven_point 12 /* Intel Pentium/Linux - gcc 2.96 */ -#endif -#if defined(__hppa) -# define breakeven_point 10 /* HP-PA - gcc */ -#endif -#if defined(__sparc__) || defined(__sparc) -# define breakeven_point 33 /* Sun Sparc 5 - gcc 2.8.1 */ -#endif - -/* some other values of possible interest: */ -/* #define breakeven_point 8 */ /* VAX 4000 - vaxc */ -/* #define breakeven_point 19 */ /* VAX 4000 - gcc 2.7.0 */ - -#ifndef breakeven_point -# define breakeven_point 6 /* some reasonable one-size-fits-all value */ -#endif - -#define fast_memcpy(d,s,n) \ - { register size_t nn = (size_t)(n); \ - if (nn >= breakeven_point) memcpy((d), (s), nn); \ - else if (nn > 0) { /* proc call overhead is worth only for large strings*/\ - register char *dd; register const char *ss; \ - for (ss=(s), dd=(d); nn>0; nn--) *dd++ = *ss++; } } - -#define fast_memset(d,c,n) \ - { register size_t nn = (size_t)(n); \ - if (nn >= breakeven_point) memset((d), (int)(c), nn); \ - else if (nn > 0) { /* proc call overhead is worth only for large strings*/\ - register char *dd; register const int cc=(int)(c); \ - for (dd=(d); nn>0; nn--) *dd++ = cc; } } - -/* prototypes */ - -#if defined(NEED_ASPRINTF) -int asprintf (char **ptr, const char *fmt, /*args*/ ...); -#endif -#if defined(NEED_VASPRINTF) -int vasprintf (char **ptr, const char *fmt, va_list ap); -#endif -#if defined(NEED_ASNPRINTF) -int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...); -#endif -#if defined(NEED_VASNPRINTF) -int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap); -#endif - -#if defined(HAVE_SNPRINTF) -/* declare our portable snprintf routine under name portable_snprintf */ -/* declare our portable vsnprintf routine under name portable_vsnprintf */ -#else -/* declare our portable routines under names snprintf and vsnprintf */ -#define portable_snprintf snprintf -#if !defined(NEED_SNPRINTF_ONLY) -#define portable_vsnprintf vsnprintf -#endif -#endif - -#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) -int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...); -#if !defined(NEED_SNPRINTF_ONLY) -int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap); -#endif -#endif - -/* declarations */ - -static char credits[] = "\n\ -@(#)snprintf.c, v2.2: Mark Martinec, \n\ -@(#)snprintf.c, v2.2: Copyright 1999, Mark Martinec. Frontier Artistic License applies.\n\ -@(#)snprintf.c, v2.2: http://www.ijs.si/software/snprintf/\n"; - -#if defined(NEED_ASPRINTF) -int asprintf(char **ptr, const char *fmt, /*args*/ ...) { - va_list ap; - size_t str_m; - int str_l; - - *ptr = NULL; - va_start(ap, fmt); /* measure the required size */ - str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap); - va_end(ap); - assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ - *ptr = (char *) malloc(str_m = (size_t)str_l + 1); - if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } - else { - int str_l2; - va_start(ap, fmt); - str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); - va_end(ap); - assert(str_l2 == str_l); - } - return str_l; -} -#endif - -#if defined(NEED_VASPRINTF) -int vasprintf(char **ptr, const char *fmt, va_list ap) { - size_t str_m; - int str_l; - - *ptr = NULL; - { va_list ap2; - va_copy(ap2, ap); /* don't consume the original ap, we'll need it again */ - str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/ - va_end(ap2); - } - assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ - *ptr = (char *) malloc(str_m = (size_t)str_l + 1); - if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } - else { - int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); - assert(str_l2 == str_l); - } - return str_l; -} -#endif - -#if defined(NEED_ASNPRINTF) -int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...) { - va_list ap; - int str_l; - - *ptr = NULL; - va_start(ap, fmt); /* measure the required size */ - str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap); - va_end(ap); - assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ - if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1; /* truncate */ - /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */ - if (str_m == 0) { /* not interested in resulting string, just return size */ - } else { - *ptr = (char *) malloc(str_m); - if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } - else { - int str_l2; - va_start(ap, fmt); - str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); - va_end(ap); - assert(str_l2 == str_l); - } - } - return str_l; -} -#endif - -#if defined(NEED_VASNPRINTF) -int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap) { - int str_l; - - *ptr = NULL; - { va_list ap2; - va_copy(ap2, ap); /* don't consume the original ap, we'll need it again */ - str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/ - va_end(ap2); - } - assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ - if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1; /* truncate */ - /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */ - if (str_m == 0) { /* not interested in resulting string, just return size */ - } else { - *ptr = (char *) malloc(str_m); - if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } - else { - int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); - assert(str_l2 == str_l); - } - } - return str_l; -} -#endif - -/* - * If the system does have snprintf and the portable routine is not - * specifically required, this module produces no code for snprintf/vsnprintf. - */ -#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) - -#if !defined(NEED_SNPRINTF_ONLY) -int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) { - va_list ap; - int str_l; - - va_start(ap, fmt); - str_l = portable_vsnprintf(str, str_m, fmt, ap); - va_end(ap); - return str_l; -} -#endif - -#if defined(NEED_SNPRINTF_ONLY) -int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) { -#else -int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap) { -#endif - -#if defined(NEED_SNPRINTF_ONLY) - va_list ap; -#endif - size_t str_l = 0; - const char *p = fmt; - -/* In contrast with POSIX, the ISO C99 now says - * that str can be NULL and str_m can be 0. - * This is more useful than the old: if (str_m < 1) return -1; */ - -#if defined(NEED_SNPRINTF_ONLY) - va_start(ap, fmt); -#endif - if (!p) p = ""; - while (*p) { - if (*p != '%') { - /* if (str_l < str_m) str[str_l++] = *p++; -- this would be sufficient */ - /* but the following code achieves better performance for cases - * where format string is long and contains few conversions */ - const char *q = strchr(p+1,'%'); - size_t n = !q ? strlen(p) : (q-p); - if (str_l < str_m) { - size_t avail = str_m-str_l; - fast_memcpy(str+str_l, p, (n>avail?avail:n)); - } - p += n; str_l += n; - } else { - const char *starting_p; - size_t min_field_width = 0, precision = 0; - int zero_padding = 0, precision_specified = 0, justify_left = 0; - int alternate_form = 0, force_sign = 0; - int space_for_positive = 1; /* If both the ' ' and '+' flags appear, - the ' ' flag should be ignored. */ - char length_modifier = '\0'; /* allowed values: \0, h, l, L */ - char tmp[32];/* temporary buffer for simple numeric->string conversion */ - - const char *str_arg; /* string address in case of string argument */ - size_t str_arg_l; /* natural field width of arg without padding - and sign */ - unsigned char uchar_arg; - /* unsigned char argument value - only defined for c conversion. - N.B. standard explicitly states the char argument for - the c conversion is unsigned */ - - size_t number_of_zeros_to_pad = 0; - /* number of zeros to be inserted for numeric conversions - as required by the precision or minimal field width */ - - size_t zero_padding_insertion_ind = 0; - /* index into tmp where zero padding is to be inserted */ - - char fmt_spec = '\0'; - /* current conversion specifier character */ - - str_arg = credits;/* just to make compiler happy (defined but not used)*/ - str_arg = NULL; - starting_p = p; p++; /* skip '%' */ - /* parse flags */ - while (*p == '0' || *p == '-' || *p == '+' || - *p == ' ' || *p == '#' || *p == '\'') { - switch (*p) { - case '0': zero_padding = 1; break; - case '-': justify_left = 1; break; - case '+': force_sign = 1; space_for_positive = 0; break; - case ' ': force_sign = 1; - /* If both the ' ' and '+' flags appear, the ' ' flag should be ignored */ -#ifdef PERL_COMPATIBLE - /* ... but in Perl the last of ' ' and '+' applies */ - space_for_positive = 1; -#endif - break; - case '#': alternate_form = 1; break; - case '\'': break; - } - p++; - } - /* If the '0' and '-' flags both appear, the '0' flag should be ignored. */ - - /* parse field width */ - if (*p == '*') { - int j; - p++; j = va_arg(ap, int); - if (j >= 0) min_field_width = j; - else { min_field_width = -j; justify_left = 1; } - } else if (isdigit((int)(*p))) { - /* size_t could be wider than unsigned int; - make sure we treat argument like common implementations do */ - unsigned int uj = *p++ - '0'; - while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0'); - min_field_width = uj; - } - /* parse precision */ - if (*p == '.') { - p++; precision_specified = 1; - if (*p == '*') { - int j = va_arg(ap, int); - p++; - if (j >= 0) precision = j; - else { - precision_specified = 0; precision = 0; - /* NOTE: - * Solaris 2.6 man page claims that in this case the precision - * should be set to 0. Digital Unix 4.0, HPUX 10 and BSD man page - * claim that this case should be treated as unspecified precision, - * which is what we do here. - */ - } - } else if (isdigit((int)(*p))) { - /* size_t could be wider than unsigned int; - make sure we treat argument like common implementations do */ - unsigned int uj = *p++ - '0'; - while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0'); - precision = uj; - } - } - /* parse 'h', 'l' and 'll' length modifiers */ - if (*p == 'h' || *p == 'l') { - length_modifier = *p; p++; - if (length_modifier == 'l' && *p == 'l') { /* double l = long long */ -#ifdef SNPRINTF_LONGLONG_SUPPORT - length_modifier = '2'; /* double l encoded as '2' */ -#else - length_modifier = 'l'; /* treat it as a single 'l' */ -#endif - p++; - } - } - fmt_spec = *p; - /* common synonyms: */ - switch (fmt_spec) { - case 'i': fmt_spec = 'd'; break; - case 'D': fmt_spec = 'd'; length_modifier = 'l'; break; - case 'U': fmt_spec = 'u'; length_modifier = 'l'; break; - case 'O': fmt_spec = 'o'; length_modifier = 'l'; break; - default: break; - } - /* get parameter value, do initial processing */ - switch (fmt_spec) { - case '%': /* % behaves similar to 's' regarding flags and field widths */ - case 'c': /* c behaves similar to 's' regarding flags and field widths */ - case 's': - length_modifier = '\0'; /* wint_t and wchar_t not supported */ - /* the result of zero padding flag with non-numeric conversion specifier*/ - /* is undefined. Solaris and HPUX 10 does zero padding in this case, */ - /* Digital Unix and Linux does not. */ -#if !defined(SOLARIS_COMPATIBLE) && !defined(HPUX_COMPATIBLE) - zero_padding = 0; /* turn zero padding off for string conversions */ -#endif - str_arg_l = 1; - switch (fmt_spec) { - case '%': - str_arg = p; break; - case 'c': { - int j = va_arg(ap, int); - uchar_arg = (unsigned char) j; /* standard demands unsigned char */ - str_arg = (const char *) &uchar_arg; - break; - } - case 's': - str_arg = va_arg(ap, const char *); - if (!str_arg) str_arg_l = 0; - /* make sure not to address string beyond the specified precision !!! */ - else if (!precision_specified) str_arg_l = strlen(str_arg); - /* truncate string if necessary as requested by precision */ - else if (precision == 0) str_arg_l = 0; - else { - /* memchr on HP does not like n > 2^31 !!! */ - const char *q = memchr(str_arg, '\0', - precision <= 0x7fffffff ? precision : 0x7fffffff); - str_arg_l = !q ? precision : (q-str_arg); - } - break; - default: break; - } - break; - case 'd': case 'u': case 'o': case 'x': case 'X': case 'p': { - /* NOTE: the u, o, x, X and p conversion specifiers imply - the value is unsigned; d implies a signed value */ - - int arg_sign = 0; - /* 0 if numeric argument is zero (or if pointer is NULL for 'p'), - +1 if greater than zero (or nonzero for unsigned arguments), - -1 if negative (unsigned argument is never negative) */ - - int int_arg = 0; unsigned int uint_arg = 0; - /* only defined for length modifier h, or for no length modifiers */ - - long int long_arg = 0; unsigned long int ulong_arg = 0; - /* only defined for length modifier l */ - - void *ptr_arg = NULL; - /* pointer argument value -only defined for p conversion */ - -#ifdef SNPRINTF_LONGLONG_SUPPORT - long long int long_long_arg = 0; - unsigned long long int ulong_long_arg = 0; - /* only defined for length modifier ll */ -#endif - if (fmt_spec == 'p') { - /* HPUX 10: An l, h, ll or L before any other conversion character - * (other than d, i, u, o, x, or X) is ignored. - * Digital Unix: - * not specified, but seems to behave as HPUX does. - * Solaris: If an h, l, or L appears before any other conversion - * specifier (other than d, i, u, o, x, or X), the behavior - * is undefined. (Actually %hp converts only 16-bits of address - * and %llp treats address as 64-bit data which is incompatible - * with (void *) argument on a 32-bit system). - */ -#ifdef SOLARIS_COMPATIBLE -# ifdef SOLARIS_BUG_COMPATIBLE - /* keep length modifiers even if it represents 'll' */ -# else - if (length_modifier == '2') length_modifier = '\0'; -# endif -#else - length_modifier = '\0'; -#endif - ptr_arg = va_arg(ap, void *); - if (ptr_arg != NULL) arg_sign = 1; - } else if (fmt_spec == 'd') { /* signed */ - switch (length_modifier) { - case '\0': - case 'h': - /* It is non-portable to specify a second argument of char or short - * to va_arg, because arguments seen by the called function - * are not char or short. C converts char and short arguments - * to int before passing them to a function. - */ - int_arg = va_arg(ap, int); - if (int_arg > 0) arg_sign = 1; - else if (int_arg < 0) arg_sign = -1; - break; - case 'l': - long_arg = va_arg(ap, long int); - if (long_arg > 0) arg_sign = 1; - else if (long_arg < 0) arg_sign = -1; - break; -#ifdef SNPRINTF_LONGLONG_SUPPORT - case '2': - long_long_arg = va_arg(ap, long long int); - if (long_long_arg > 0) arg_sign = 1; - else if (long_long_arg < 0) arg_sign = -1; - break; -#endif - } - } else { /* unsigned */ - switch (length_modifier) { - case '\0': - case 'h': - uint_arg = va_arg(ap, unsigned int); - if (uint_arg) arg_sign = 1; - break; - case 'l': - ulong_arg = va_arg(ap, unsigned long int); - if (ulong_arg) arg_sign = 1; - break; -#ifdef SNPRINTF_LONGLONG_SUPPORT - case '2': - ulong_long_arg = va_arg(ap, unsigned long long int); - if (ulong_long_arg) arg_sign = 1; - break; -#endif - } - } - str_arg = tmp; str_arg_l = 0; - /* NOTE: - * For d, i, u, o, x, and X conversions, if precision is specified, - * the '0' flag should be ignored. This is so with Solaris 2.6, - * Digital UNIX 4.0, HPUX 10, Linux, FreeBSD, NetBSD; but not with Perl. - */ -#ifndef PERL_COMPATIBLE - if (precision_specified) zero_padding = 0; -#endif - if (fmt_spec == 'd') { - if (force_sign && arg_sign >= 0) - tmp[str_arg_l++] = space_for_positive ? ' ' : '+'; - /* leave negative numbers for sprintf to handle, - to avoid handling tricky cases like (short int)(-32768) */ -#ifdef LINUX_COMPATIBLE - } else if (fmt_spec == 'p' && force_sign && arg_sign > 0) { - tmp[str_arg_l++] = space_for_positive ? ' ' : '+'; -#endif - } else if (alternate_form) { - if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X') ) - { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = fmt_spec; } - /* alternate form should have no effect for p conversion, but ... */ -#ifdef HPUX_COMPATIBLE - else if (fmt_spec == 'p' - /* HPUX 10: for an alternate form of p conversion, - * a nonzero result is prefixed by 0x. */ -#ifndef HPUX_BUG_COMPATIBLE - /* Actually it uses 0x prefix even for a zero value. */ - && arg_sign != 0 -#endif - ) { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = 'x'; } -#endif - } - zero_padding_insertion_ind = str_arg_l; - if (!precision_specified) precision = 1; /* default precision is 1 */ - if (precision == 0 && arg_sign == 0 -#if defined(HPUX_BUG_COMPATIBLE) || defined(LINUX_COMPATIBLE) - && fmt_spec != 'p' - /* HPUX 10 man page claims: With conversion character p the result of - * converting a zero value with a precision of zero is a null string. - * Actually HP returns all zeroes, and Linux returns "(nil)". */ -#endif - ) { - /* converted to null string */ - /* When zero value is formatted with an explicit precision 0, - the resulting formatted string is empty (d, i, u, o, x, X, p). */ - } else { - char f[5]; int f_l = 0; - f[f_l++] = '%'; /* construct a simple format string for sprintf */ - if (!length_modifier) { } - else if (length_modifier=='2') { f[f_l++] = 'l'; f[f_l++] = 'l'; } - else f[f_l++] = length_modifier; - f[f_l++] = fmt_spec; f[f_l++] = '\0'; - if (fmt_spec == 'p') str_arg_l += sprintf(tmp+str_arg_l, f, ptr_arg); - else if (fmt_spec == 'd') { /* signed */ - switch (length_modifier) { - case '\0': - case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, int_arg); break; - case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, long_arg); break; -#ifdef SNPRINTF_LONGLONG_SUPPORT - case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,long_long_arg); break; -#endif - } - } else { /* unsigned */ - switch (length_modifier) { - case '\0': - case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, uint_arg); break; - case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, ulong_arg); break; -#ifdef SNPRINTF_LONGLONG_SUPPORT - case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,ulong_long_arg);break; -#endif - } - } - /* include the optional minus sign and possible "0x" - in the region before the zero padding insertion point */ - if (zero_padding_insertion_ind < str_arg_l && - tmp[zero_padding_insertion_ind] == '-') { - zero_padding_insertion_ind++; - } - if (zero_padding_insertion_ind+1 < str_arg_l && - tmp[zero_padding_insertion_ind] == '0' && - (tmp[zero_padding_insertion_ind+1] == 'x' || - tmp[zero_padding_insertion_ind+1] == 'X') ) { - zero_padding_insertion_ind += 2; - } - } - { size_t num_of_digits = str_arg_l - zero_padding_insertion_ind; - if (alternate_form && fmt_spec == 'o' -#ifdef HPUX_COMPATIBLE /* ("%#.o",0) -> "" */ - && (str_arg_l > 0) -#endif -#ifdef DIGITAL_UNIX_BUG_COMPATIBLE /* ("%#o",0) -> "00" */ -#else - /* unless zero is already the first character */ - && !(zero_padding_insertion_ind < str_arg_l - && tmp[zero_padding_insertion_ind] == '0') -#endif - ) { /* assure leading zero for alternate-form octal numbers */ - if (!precision_specified || precision < num_of_digits+1) { - /* precision is increased to force the first character to be zero, - except if a zero value is formatted with an explicit precision - of zero */ - precision = num_of_digits+1; precision_specified = 1; - } - } - /* zero padding to specified precision? */ - if (num_of_digits < precision) - number_of_zeros_to_pad = precision - num_of_digits; - } - /* zero padding to specified minimal field width? */ - if (!justify_left && zero_padding) { - int n = min_field_width - (str_arg_l+number_of_zeros_to_pad); - if (n > 0) number_of_zeros_to_pad += n; - } - break; - } - default: /* unrecognized conversion specifier, keep format string as-is*/ - zero_padding = 0; /* turn zero padding off for non-numeric convers. */ -#ifndef DIGITAL_UNIX_COMPATIBLE - justify_left = 1; min_field_width = 0; /* reset flags */ -#endif -#if defined(PERL_COMPATIBLE) || defined(LINUX_COMPATIBLE) - /* keep the entire format string unchanged */ - str_arg = starting_p; str_arg_l = p - starting_p; - /* well, not exactly so for Linux, which does something inbetween, - * and I don't feel an urge to imitate it: "%+++++hy" -> "%+y" */ -#else - /* discard the unrecognized conversion, just keep * - * the unrecognized conversion character */ - str_arg = p; str_arg_l = 0; -#endif - if (*p) str_arg_l++; /* include invalid conversion specifier unchanged - if not at end-of-string */ - break; - } - if (*p) p++; /* step over the just processed conversion specifier */ - /* insert padding to the left as requested by min_field_width; - this does not include the zero padding in case of numerical conversions*/ - if (!justify_left) { /* left padding with blank or zero */ - int n = min_field_width - (str_arg_l+number_of_zeros_to_pad); - if (n > 0) { - if (str_l < str_m) { - size_t avail = str_m-str_l; - fast_memset(str+str_l, (zero_padding?'0':' '), (n>avail?avail:n)); - } - str_l += n; - } - } - /* zero padding as requested by the precision or by the minimal field width - * for numeric conversions required? */ - if (number_of_zeros_to_pad <= 0) { - /* will not copy first part of numeric right now, * - * force it to be copied later in its entirety */ - zero_padding_insertion_ind = 0; - } else { - /* insert first part of numerics (sign or '0x') before zero padding */ - int n = zero_padding_insertion_ind; - if (n > 0) { - if (str_l < str_m) { - size_t avail = str_m-str_l; - fast_memcpy(str+str_l, str_arg, (n>avail?avail:n)); - } - str_l += n; - } - /* insert zero padding as requested by the precision or min field width */ - n = number_of_zeros_to_pad; - if (n > 0) { - if (str_l < str_m) { - size_t avail = str_m-str_l; - fast_memset(str+str_l, '0', (n>avail?avail:n)); - } - str_l += n; - } - } - /* insert formatted string - * (or as-is conversion specifier for unknown conversions) */ - { int n = str_arg_l - zero_padding_insertion_ind; - if (n > 0) { - if (str_l < str_m) { - size_t avail = str_m-str_l; - fast_memcpy(str+str_l, str_arg+zero_padding_insertion_ind, - (n>avail?avail:n)); - } - str_l += n; - } - } - /* insert right padding */ - if (justify_left) { /* right blank padding to the field width */ - int n = min_field_width - (str_arg_l+number_of_zeros_to_pad); - if (n > 0) { - if (str_l < str_m) { - size_t avail = str_m-str_l; - fast_memset(str+str_l, ' ', (n>avail?avail:n)); - } - str_l += n; - } - } - } - } -#if defined(NEED_SNPRINTF_ONLY) - va_end(ap); -#endif - if (str_m > 0) { /* make sure the string is null-terminated - even at the expense of overwriting the last character - (shouldn't happen, but just in case) */ - str[str_l <= str_m-1 ? str_l : str_m-1] = '\0'; - } - /* Return the number of characters formatted (excluding trailing null - * character), that is, the number of characters that would have been - * written to the buffer if it were large enough. - * - * The value of str_l should be returned, but str_l is of unsigned type - * size_t, and snprintf is int, possibly leading to an undetected - * integer overflow, resulting in a negative return value, which is illegal. - * Both XSH5 and ISO C99 (at least the draft) are silent on this issue. - * Should errno be set to EOVERFLOW and EOF returned in this case??? - */ - return (int) str_l; -} -#endif -#endif /* __OS2__ */ /* Local Variables: tab-width: 3 diff --git a/miscutil.h b/miscutil.h index 4e0b2646..2638be93 100644 --- a/miscutil.h +++ b/miscutil.h @@ -1,6 +1,6 @@ -#ifndef MISCUTIL_H_INCLUDED -#define MISCUTIL_H_INCLUDED -#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.19 2002/03/24 13:25:43 swa Exp $" +#ifndef _MISCUTIL_H +#define _MISCUTIL_H +#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.7 2001/06/05 22:32:01 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/miscutil.h,v $ @@ -11,7 +11,7 @@ * really fit in any other file. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,53 +37,6 @@ * * Revisions : * $Log: miscutil.h,v $ - * Revision 1.19 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.18 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.17 2002/03/04 18:28:32 oes - * Deleted deletePidFile, played syleguide police - * - * Revision 1.16 2002/01/21 00:53:36 jongfoster - * Adding string_join() - * - * Revision 1.15 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.14 2001/11/05 21:43:48 steudten - * Add global var 'basedir' for unix os. - * - * Revision 1.13 2001/10/29 03:48:10 david__schmidt - * OS/2 native needed a snprintf() routine. Added one to miscutil, brackedted - * by and __OS2__ ifdef. - * - * Revision 1.12 2001/10/23 21:27:50 jongfoster - * Standardising error codes in string_append - * make_path() no longer adds '\\' if the dir already ends in '\\' (this - * is just copying a UNIX-specific fix to the Windows-specific part) - * - * Revision 1.11 2001/10/14 22:02:57 jongfoster - * New function string_append() which is like strsav(), but running - * out of memory isn't automatically FATAL. - * - * Revision 1.10 2001/09/20 13:34:09 steudten - * - * change long to int for prototype hash_string() - * - * Revision 1.9 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.8 2001/06/29 13:32:14 oes - * Removed logentry from cancelled commit - * * Revision 1.7 2001/06/05 22:32:01 jongfoster * New function make_path() to splice directory and file names together. * @@ -134,20 +87,13 @@ *********************************************************************/ -#include "project.h" - #if defined(__cplusplus) extern "C" { #endif -extern const char *basedir; -extern void *zalloc(size_t size); +extern void *zalloc(int size); -#if defined(unix) -extern void write_pid_file(void); -#endif /* unix */ - -extern unsigned int hash_string(const char* s); +extern unsigned long hash_string(const char* s); extern char *safe_strerror(int err); @@ -155,13 +101,11 @@ extern int strcmpic(const char *s1, const char *s2); extern int strncmpic(const char *s1, const char *s2, size_t n); extern char *strsav(char *old, const char *text_to_append); -extern jb_err string_append(char **target_string, const char *text_to_append); -extern jb_err string_join (char **target_string, char *text_to_append); extern char *chomp(char *string); extern int simplematch(char *pattern, char *text); -extern char *bindup(const char *string, size_t len); +extern char *bindup(const char *string, int n); extern char *make_path(const char * dir, const char * file); @@ -169,10 +113,6 @@ extern char *make_path(const char * dir, const char * file); extern char *strdup(const char *s); #endif /* def __MINGW32__ */ -#ifdef __OS2__ -extern int snprintf(char *, size_t, const char *, /*args*/ ...); -#endif /* def __OS2__ */ - /* Revision control strings from this header and associated .c file */ extern const char miscutil_rcs[]; extern const char miscutil_h_rcs[]; @@ -181,7 +121,7 @@ extern const char miscutil_h_rcs[]; } #endif -#endif /* ndef MISCUTIL_H_INCLUDED */ +#endif /* ndef _MISCUTIL_H */ /* Local Variables: diff --git a/parsers.c b/parsers.c index 6129e0e4..7af93a4d 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.18 2001/07/13 14:02:46 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -10,17 +10,18 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" * `client_uagent', `client_x_forwarded', * `client_x_forwarded_adder', `client_xtra_adder', * `content_type', `crumble', `destroy_list', `enlist', - * `flush_socket', ``get_header', `sed', + * `flush_socket', `free_http_request', `get_header', + * `list_to_text', `parse_http_request', `sed', * and `server_set_cookie'. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -40,178 +41,6 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: parsers.c,v $ - * Revision 1.52 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.51 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.50 2002/03/12 01:45:35 oes - * More verbose logging - * - * Revision 1.49 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.48 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.47 2002/02/20 23:15:13 jongfoster - * Parsing functions now handle out-of-memory gracefully by returning - * an error code. - * - * Revision 1.46 2002/01/17 21:03:47 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Revision 1.45 2002/01/09 14:33:03 oes - * Added support for localtime_r. - * - * Revision 1.44 2001/12/14 01:22:54 steudten - * Remove 'user:pass@' from 'proto://user:pass@host' for the - * new added header 'Host: ..'. (See Req ID 491818) - * - * Revision 1.43 2001/11/23 00:26:38 jongfoster - * Fixing two really stupid errors in my previous commit - * - * Revision 1.42 2001/11/22 21:59:30 jongfoster - * Adding code to handle +no-cookies-keep - * - * Revision 1.41 2001/11/05 23:43:05 steudten - * Add time+date to log files. - * - * Revision 1.40 2001/10/26 20:13:09 jongfoster - * ctype.h is needed in Windows, too. - * - * Revision 1.39 2001/10/26 17:40:04 oes - * Introduced get_header_value() - * Removed http->user_agent, csp->referrer and csp->accept_types - * Removed client_accept() - * - * Revision 1.38 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.37 2001/10/23 21:36:02 jongfoster - * Documenting sed()'s error behaviou (doc change only) - * - * Revision 1.36 2001/10/13 12:51:51 joergs - * Removed client_host, (was only required for the old 2.0.2-11 http://noijb. - * force-load), instead crumble Host: and add it (again) in client_host_adder - * (in case we get a HTTP/1.0 request without Host: header and forward it to - * a HTTP/1.1 server/proxy). - * - * Revision 1.35 2001/10/09 22:39:21 jongfoster - * assert.h is also required under Win32, so moving out of #ifndef _WIN32 - * block. - * - * Revision 1.34 2001/10/07 18:50:55 oes - * Added server_content_encoding, renamed server_transfer_encoding - * - * Revision 1.33 2001/10/07 18:04:49 oes - * Changed server_http11 to server_http and its pattern to "HTTP". - * Additional functionality: it now saves the HTTP status into - * csp->http->status and sets CT_TABOO for Status 206 (partial range) - * - * Revision 1.32 2001/10/07 15:43:28 oes - * Removed FEATURE_DENY_GZIP and replaced it with client_accept_encoding, - * client_te and client_accept_encoding_adder, triggered by the new - * +no-compression action. For HTTP/1.1 the Accept-Encoding header is - * changed to allow only identity and chunked, and the TE header is - * crunched. For HTTP/1.0, Accept-Encoding is crunched. - * - * parse_http_request no longer does anything than parsing. The rewriting - * of http->cmd and version mangling are gone. It now also recognizes - * the put and delete methods and saves the url in http->url. Removed - * unused variable. - * - * renamed content_type and content_length to have the server_ prefix - * - * server_content_type now only works if csp->content_type != CT_TABOO - * - * added server_transfer_encoding, which - * - Sets CT_TABOO to prohibit filtering if encoding compresses - * - Raises the CSP_FLAG_CHUNKED flag if Encoding is "chunked" - * - Change from "chunked" to "identity" if body was chunked - * but has been de-chunked for filtering. - * - * added server_content_md5 which crunches any Content-MD5 headers - * if the body was modified. - * - * made server_http11 conditional on +downgrade action - * - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Revision 1.31 2001/10/05 14:25:02 oes - * Crumble Keep-Alive from Server - * - * Revision 1.30 2001/09/29 12:56:03 joergs - * IJB now changes HTTP/1.1 to HTTP/1.0 in requests and answers. - * - * Revision 1.29 2001/09/24 21:09:24 jongfoster - * Fixing 2 memory leaks that Guy spotted, where the paramater to - * enlist() was not being free()d. - * - * Revision 1.28 2001/09/22 16:32:28 jongfoster - * Removing unused #includes. - * - * Revision 1.27 2001/09/20 15:45:25 steudten - * - * add casting from size_t to int for printf() - * remove local variable shadow s2 - * - * Revision 1.26 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.25 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.24 2001/09/13 23:05:50 jongfoster - * Changing the string paramater to the header parsers a "const". - * - * Revision 1.23 2001/09/12 18:08:19 steudten - * - * In parse_http_request() header rewriting miss the host value, so - * from http://www.mydomain.com the result was just " / " not - * http://www.mydomain.com/ in case we forward. - * - * Revision 1.22 2001/09/10 10:58:53 oes - * Silenced compiler warnings - * - * Revision 1.21 2001/07/31 14:46:00 oes - * - Persistant connections now suppressed - * - sed() no longer appends empty header to csp->headers - * - * Revision 1.20 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.19 2001/07/25 17:21:54 oes - * client_uagent now saves copy of User-Agent: header value - * * Revision 1.18 2001/07/13 14:02:46 oes * - Included fix to repair broken HTTP requests that * don't contain a path, not even '/'. @@ -245,7 +74,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" * CRLF -> LF * * Revision 1.11 2001/05/29 20:11:19 joergs - * '/ * inside comment' warning removed. + * '/* inside comment' warning removed. * * Revision 1.10 2001/05/29 09:50:24 jongfoster * Unified blocklist/imagelist/permissionslist. @@ -371,17 +200,13 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" #include "config.h" -#ifndef _WIN32 #include #include -#endif - #include #include -#include #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #endif @@ -389,11 +214,15 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" #include "list.h" #include "parsers.h" #include "encode.h" +#include "filters.h" +#include "loaders.h" +#include "showargs.h" +#include "jcc.h" #include "ssplit.h" #include "errlog.h" #include "jbsockets.h" #include "miscutil.h" -#include "list.h" +#include "cgi.h" const char parsers_h_rcs[] = PARSERS_H_VERSION; @@ -403,8 +232,8 @@ const char parsers_h_rcs[] = PARSERS_H_VERSION; * as an array index. Therefore we need to make sure that high-bit * characters generate +ve values, and ideally we also want to make * the argument match the declared parameter type of "int". - * - * Why did they write a character function that can't take a simple + * + * Why did they write a character function that can't take a simple * "char" argument? Doh! */ #define ijb_isupper(__X) isupper((int)(unsigned char)(__X)) @@ -418,44 +247,39 @@ const struct parsers client_patterns[] = { { "from:", 5, client_from }, { "cookie:", 7, client_send_cookie }, { "x-forwarded-for:", 16, client_x_forwarded }, - { "Accept-Encoding:", 16, client_accept_encoding }, - { "TE:", 3, client_te }, - { "Host:", 5, crumble }, -/* { "if-modified-since:", 18, crumble }, */ - { "Keep-Alive:", 11, crumble }, - { "connection:", 11, crumble }, { "proxy-connection:", 17, crumble }, +#ifdef DENY_GZIP + { "Accept-Encoding: gzip", 21, crumble }, +#endif /* def DENY_GZIP */ +#if defined(DETECT_MSIE_IMAGES) + { "Accept:", 7, client_accept }, +#endif /* defined(DETECT_MSIE_IMAGES) */ +#ifdef FORCE_LOAD + { "Host:", 5, client_host }, +#endif /* def FORCE_LOAD */ +/* { "if-modified-since:", 18, crumble }, */ { NULL, 0, NULL } }; const struct parsers server_patterns[] = { - { "HTTP", 4, server_http }, { "set-cookie:", 11, server_set_cookie }, { "connection:", 11, crumble }, - { "Content-Type:", 13, server_content_type }, - { "Content-Length:", 15, server_content_length }, - { "Content-MD5:", 12, server_content_md5 }, - { "Content-Encoding:", 17, server_content_encoding }, - { "Transfer-Encoding:", 18, server_transfer_coding }, - { "Keep-Alive:", 11, crumble }, + { "Content-Type:", 13, content_type }, + { "Content-Length:", 15, content_length }, { NULL, 0, NULL } }; -const add_header_func_ptr add_client_headers[] = { - client_host_adder, +void (* const add_client_headers[])(struct client_state *) = { client_cookie_adder, client_x_forwarded_adder, client_xtra_adder, - client_accept_encoding_adder, - connection_close_adder, NULL }; -const add_header_func_ptr add_server_headers[] = { - connection_close_adder, +void (* const add_server_headers[])(struct client_state *) = { NULL }; @@ -478,22 +302,19 @@ const add_header_func_ptr add_server_headers[] = { * file, the results are not portable. * *********************************************************************/ -int flush_socket(jb_socket fd, struct client_state *csp) +int flush_socket(int fd, struct client_state *csp) { struct iob *iob = csp->iob; - int len = iob->eod - iob->cur; + int n = iob->eod - iob->cur; - if (len <= 0) + if (n <= 0) { return(0); } - if (write_socket(fd, iob->cur, (size_t)len)) - { - return(-1); - } + n = write_socket(fd, iob->cur, n); iob->eod = iob->cur = iob->buf; - return(len); + return(n); } @@ -509,27 +330,28 @@ int flush_socket(jb_socket fd, struct client_state *csp) * 2 : buf = holds the content to be added to the page * 3 : n = number of bytes to be added * - * Returns : None + * Returns : Number of bytes in the content buffer. * *********************************************************************/ -void add_to_iob(struct client_state *csp, char *buf, int n) +int add_to_iob(struct client_state *csp, char *buf, int n) { struct iob *iob = csp->iob; - size_t have, need; + int have, need; char *p; have = iob->eod - iob->cur; if (n <= 0) { - return; + return(have); } need = have + n; if ((p = (char *)malloc(need + 1)) == NULL) { - log_error(LOG_LEVEL_FATAL, "malloc() iob failed: %E"); + log_error(LOG_LEVEL_ERROR, "malloc() iob failed: %E"); + return(-1); } if (have) @@ -552,7 +374,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n) } /* copy the new data into the iob buffer */ - memcpy(p, buf, (size_t)n); + memcpy(p, buf, n); /* point to the end of the data */ p += n; @@ -564,7 +386,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n) iob->cur = iob->buf; iob->eod = p; - return; + return(need); } @@ -601,15 +423,10 @@ char *get_header(struct client_state *csp) *p = '\0'; ret = strdup(iob->cur); - if (ret == NULL) - { - /* FIXME No way to handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory in get_header()"); - } iob->cur = p+1; - if ((q = strchr(ret, '\r')) != NULL) *q = '\0'; + if ((q = strchr(ret, '\r'))) *q = '\0'; /* is this a blank linke (i.e. the end of the header) ? */ if (*ret == '\0') @@ -623,56 +440,6 @@ char *get_header(struct client_state *csp) } -/********************************************************************* - * - * Function : get_header_value - * - * Description : Get the value of a given header from a chained list - * of header lines or return NULL if no such header is - * present in the list. - * - * Parameters : - * 1 : header_list = pointer to list - * 2 : header_name = string with name of header to look for. - * Trailing colon required, capitalization - * doesn't matter. - * - * Returns : NULL if not found, else value of header - * - *********************************************************************/ -char *get_header_value(const struct list *header_list, const char *header_name) -{ - struct list_entry *cur_entry; - char *ret = NULL; - size_t length = 0; - - assert(header_list); - assert(header_name); - length = strlen(header_name); - - for (cur_entry = header_list->first; cur_entry ; cur_entry = cur_entry->next) - { - if (cur_entry->str) - { - if (!strncmpic(cur_entry->str, header_name, length)) - { - /* - * Found: return pointer to start of value - */ - ret = (char *) (cur_entry->str + length); - while (*ret && ijb_isspace(*ret)) ret++; - return(ret); - } - } - } - - /* - * Not found - */ - return NULL; - -} - /********************************************************************* * * Function : sed @@ -691,22 +458,19 @@ char *get_header_value(const struct list *header_list, const char *header_name) * headers (client or server) * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : Single pointer to a fully formed header, or NULL - * on out-of-memory error. + * Returns : Single pointer to a fully formed header. * *********************************************************************/ -char *sed(const struct parsers pats[], - const add_header_func_ptr more_headers[], - struct client_state *csp) +char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp) { - struct list_entry *p; + struct list *p; const struct parsers *v; - const add_header_func_ptr *f; - jb_err err = JB_ERR_OK; + char *hdr; + void (* const *f)(); - for (v = pats; (err == JB_ERR_OK) && (v->str != NULL) ; v++) + for (v = pats; v->str ; v++) { - for (p = csp->headers->first; (err == JB_ERR_OK) && (p != NULL) ; p = p->next) + for (p = csp->headers->next; p ; p = p->next) { /* Header crunch()ed in previous run? -> ignore */ if (p->str == NULL) continue; @@ -715,312 +479,311 @@ char *sed(const struct parsers pats[], if (strncmpic(p->str, v->str, v->len) == 0) { - err = v->parser(csp, (char **)&(p->str)); + hdr = v->parser(v, p->str, csp); + freez(p->str); + p->str = hdr; } } } /* place any additional headers on the csp->headers list */ - for (f = more_headers; (err == JB_ERR_OK) && (*f) ; f++) + for (f = more_headers; *f ; f++) { - err = (*f)(csp); + (*f)(csp); } - if (err != JB_ERR_OK) + /* add the blank line at the end of the header, if necessary */ + if ( (csp->headers->last == NULL) + || (csp->headers->last->str == NULL) + || (*csp->headers->last->str != '\0') ) { - return NULL; + enlist(csp->headers, ""); } - return list_to_text(csp->headers); -} + hdr = list_to_text(csp->headers); + return(hdr); -/* here begins the family of parser functions that reformat header lines */ +} /********************************************************************* * - * Function : crumble + * Function : free_http_request * - * Description : This is called if a header matches a pattern to "crunch" + * Description : Freez a http_request structure * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : http = points to a http_request structure to free * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err crumble(struct client_state *csp, char **header) +void free_http_request(struct http_request *http) { - log_error(LOG_LEVEL_HEADER, "crunch!"); - freez(*header); - return JB_ERR_OK; + freez(http->cmd); + freez(http->gpc); + freez(http->host); + freez(http->hostport); + freez(http->path); + freez(http->ver); + freez(http->host_ip_addr_str); + freez(http->user_agent); + } /********************************************************************* * - * Function : server_content_type + * Function : parse_http_request * - * Description : Set the content-type for filterable types (text/.*, - * javascript and image/gif) unless filtering has been - * forbidden (CT_TABOO) while parsing earlier headers. + * Description : Parse out the host and port from the URL. Find the + * hostname & path, port (if ':'), and/or password (if '@') * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : req = URL (or is it URI?) to break down + * 2 : http = pointer to the http structure to hold elements + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err server_content_type(struct client_state *csp, char **header) +void parse_http_request(char *req, struct http_request *http, struct client_state *csp) { - if (csp->content_type != CT_TABOO) - { - if (strstr(*header, " text/") - || strstr(*header, "application/x-javascript")) - csp->content_type = CT_TEXT; - else if (strstr(*header, " image/gif")) - csp->content_type = CT_GIF; - else - csp->content_type = 0; - } + char *buf, *v[10], *url, *p; + int n; - return JB_ERR_OK; -} + memset(http, '\0', sizeof(*http)); + http->cmd = strdup(req); -/********************************************************************* - * - * Function : server_transfer_coding - * - * Description : - Prohibit filtering (CT_TABOO) if transfer coding compresses - * - Raise the CSP_FLAG_CHUNKED flag if coding is "chunked" - * - Change from "chunked" to "identity" if body was chunked - * but has been de-chunked for filtering. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err server_transfer_coding(struct client_state *csp, char **header) -{ - /* - * Turn off pcrs and gif filtering if body compressed - */ - if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate")) - { - csp->content_type = CT_TABOO; - } + buf = strdup(req); + n = ssplit(buf, " \r\n", v, SZ(v), 1, 1); - /* - * Raise flag if body chunked - */ - if (strstr(*header, "chunked")) + if (n == 3) { - csp->flags |= CSP_FLAG_CHUNKED; + /* this could be a CONNECT request */ + if (strcmpic(v[0], "connect") == 0) + { + http->ssl = 1; + http->gpc = strdup(v[0]); + http->hostport = strdup(v[1]); + http->ver = strdup(v[2]); + } - /* - * If the body was modified, it has been - * de-chunked first, so adjust the header: - */ - if (csp->flags & CSP_FLAG_MODIFIED) +#ifdef WEBDAV + +/* This next line is a little ugly, but it simplifies the if statement below. */ +/* Basically if using webDAV, we want the OR condition to use these too. */ + +/* + * by haroon + * These are the headers as defined in RFC2518 to add webDAV support + */ + +#define OR_WEBDAV || \ + (0 == strcmpic(v[0], "propfind")) || \ + (0 == strcmpic(v[0], "proppatch")) || \ + (0 == strcmpic(v[0], "move")) || \ + (0 == strcmpic(v[0], "copy")) || \ + (0 == strcmpic(v[0], "mkcol")) || \ + (0 == strcmpic(v[0], "lock")) || \ + (0 == strcmpic(v[0], "unlock")) + +#else /* No webDAV support is enabled. Provide an empty OR_WEBDAV macro. */ + +#define OR_WEBDAV + +#endif + + /* or it could be a GET or a POST (possibly webDAV too) */ + if ((strcmpic(v[0], "get") == 0) || + (strcmpic(v[0], "head") == 0) OR_WEBDAV || + (strcmpic(v[0], "post") == 0)) { - freez(*header); - *header = strdup("Transfer-Encoding: identity"); - return (header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; + http->ssl = 0; + http->gpc = strdup(v[0]); + url = v[1]; + http->ver = strdup(v[2]); + + if (strncmpic(url, "http://", 7) == 0) + { + url += 7; + } + else if (strncmpic(url, "https://", 8) == 0) + { + url += 8; + } + else + { + url = NULL; + } + + if (url) + { + if (p = strchr(url, '/')) + { + http->path = strdup(p); + *p = '\0'; + http->hostport = strdup(url); + } + /* + * Repair broken HTTP requests that don't contain a path + */ + else + { + /* Repair hostport & path */ + http->path = strdup("/"); + http->hostport = strdup(url); + + /* Even repair cmd in case we're just forwarding. Boy are we nice ;-) */ + freez(http->cmd); + http->cmd = strsav(http->cmd, http->gpc); + http->cmd = strsav(http->cmd, " / "); + http->cmd = strsav(http->cmd, http->ver); + } + } } } - return JB_ERR_OK; -} + freez(buf); -/********************************************************************* - * - * Function : server_content_encoding - * - * Description : Prohibit filtering (CT_TABOO) if content encoding compresses - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err server_content_encoding(struct client_state *csp, char **header) -{ - /* - * Turn off pcrs and gif filtering if body compressed - */ - if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate")) + if (http->hostport == NULL) { - csp->content_type = CT_TABOO; + free_http_request(http); + return; } - return JB_ERR_OK; + buf = strdup(http->hostport); -} + /* check if url contains password */ + n = ssplit(buf, "@", v, SZ(v), 1, 1); + if (n == 2) + { + char * newbuf = NULL; + newbuf = strdup(v[1]); + freez(buf); + buf = newbuf; + } -/********************************************************************* - * - * Function : server_content_length - * - * Description : Adjust Content-Length header if we modified - * the body. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err server_content_length(struct client_state *csp, char **header) -{ - if (csp->content_length != 0) /* Content length has been modified */ + n = ssplit(buf, ":", v, SZ(v), 1, 1); + + if (n == 1) { - freez(*header); - *header = (char *) zalloc(100); - if (*header == NULL) - { - return JB_ERR_MEMORY; - } + http->host = strdup(v[0]); + http->port = 80; + } + + if (n == 2) + { + http->host = strdup(v[0]); + http->port = atoi(v[1]); + } - sprintf(*header, "Content-Length: %d", (int) csp->content_length); + freez(buf); - log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", (int) csp->content_length); + if (http->host == NULL) + { + free_http_request(http); + } + + if (http->path == NULL) + { + http->path = strdup(""); } - return JB_ERR_OK; } +/* here begins the family of parser functions that reformat header lines */ + + /********************************************************************* * - * Function : server_content_md5 + * Function : crumble * - * Description : Crumble any Content-MD5 headers if the document was - * modified. FIXME: Should we re-compute instead? + * Description : This is called if a header matches a pattern to "crunch" * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = Pointer to parsers structure, which basically holds + * headers (client or server) that we want to "crunch" + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : Always NULL. * *********************************************************************/ -jb_err server_content_md5(struct client_state *csp, char **header) +char *crumble(const struct parsers *v, char *s, struct client_state *csp) { - if (csp->flags & CSP_FLAG_MODIFIED) - { - log_error(LOG_LEVEL_HEADER, "Crunching Content-MD5"); - freez(*header); - } + log_error(LOG_LEVEL_HEADER, "crunch!"); + return(NULL); - return JB_ERR_OK; } /********************************************************************* * - * Function : client_accept_encoding + * Function : content_type * - * Description : Rewrite the client's Accept-Encoding header so that - * if doesn't allow compression, if the action applies. - * Note: For HTTP/1.0 the absence of the header is enough. + * Description : Is this a text/.* or javascript MIME Type? * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header string we are "considering" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : A duplicate string pointer to this header (ie. pass thru) * *********************************************************************/ -jb_err client_accept_encoding(struct client_state *csp, char **header) +char *content_type(const struct parsers *v, char *s, struct client_state *csp) { - if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0) - { - log_error(LOG_LEVEL_HEADER, "Supressed offer to compress content"); + if (strstr(s, " text/") || strstr(s, "application/x-javascript")) + csp->content_type = CT_TEXT; + else if (strstr(s, " image/gif")) + csp->content_type = CT_GIF; + else + csp->content_type = 0; - freez(*header); - if (!strcmpic(csp->http->ver, "HTTP/1.1")) - { - *header = strdup("Accept-Encoding: identity;q=1.0, *;q=0"); - if (*header == NULL) - { - return JB_ERR_MEMORY; - } - } - } + return(strdup(s)); - return JB_ERR_OK; } /********************************************************************* * - * Function : client_te + * Function : content_length * - * Description : Rewrite the client's TE header so that - * if doesn't allow compression, if the action applies. + * Description : Adjust Content-Length header if we modified + * the body. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header string we are "considering" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : A duplicate string pointer to this header (ie. pass thru) * *********************************************************************/ -jb_err client_te(struct client_state *csp, char **header) +char *content_length(const struct parsers *v, char *s, struct client_state *csp) { - if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0) + if (csp->content_length != 0) /* Content has been modified */ { - freez(*header); - log_error(LOG_LEVEL_HEADER, "Supressed offer to compress transfer"); + s = (char *) zalloc(100); + sprintf(s, "Content-Length: %d", csp->content_length); + + log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", csp->content_length); + return(s); + } + else + { + return(strdup(s)); } - return JB_ERR_OK; } + /********************************************************************* * * Function : client_referrer @@ -1029,81 +792,96 @@ jb_err client_te(struct client_state *csp, char **header) * Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : NULL if crunched, or a malloc'ed string with the original + * or modified header * *********************************************************************/ -jb_err client_referrer(struct client_state *csp, char **header) +char *client_referrer(const struct parsers *v, char *s, struct client_state *csp) { const char * newval; - -#ifdef FEATURE_FORCE_LOAD +#ifdef FORCE_LOAD /* Since the referrer can include the prefix even * even if the request itself is non-forced, we must - * clean it unconditionally + * clean it unconditionally */ - strclean(*header, FORCE_PREFIX); -#endif /* def FEATURE_FORCE_LOAD */ + strclean(s, FORCE_PREFIX); +#endif /* def FORCE_LOAD */ + +#ifdef TRUST_FILES + csp->referrer = strdup(s); +#endif /* def TRUST_FILES */ /* * Are we sending referer? */ if ((csp->action->flags & ACTION_HIDE_REFERER) == 0) { - return JB_ERR_OK; + return(strdup(s)); } - freez(*header); - newval = csp->action->string[ACTION_STRING_REFERER]; + /* + * Are we blocking referer? + */ if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { - /* - * Blocking referer - */ log_error(LOG_LEVEL_HEADER, "crunch!"); - return JB_ERR_OK; + return(NULL); } - else if (0 == strncmpic(newval, "http://", 7)) + + /* + * Are we forging referer? + */ + if (0 == strcmpic(newval, "forge")) { /* - * We have a specific (fixed) referer we want to send. + * Forge a referer as http://[hostname:port of REQUEST]/ + * to fool stupid checks for in-site links */ - log_error(LOG_LEVEL_HEADER, "modified"); - - *header = strdup("Referer: "); - string_append(header, newval); - - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; + log_error(LOG_LEVEL_HEADER, "crunch+forge!"); + s = strsav(NULL, "Referer: "); + s = strsav(s, "http://"); + s = strsav(s, csp->http->hostport); + s = strsav(s, "/"); + return(s); } - else + + /* + * Have we got a fixed referer? + */ + if (0 == strncmpic(newval, "http://", 7)) { /* - * Forge a referer as http://[hostname:port of REQUEST]/ - * to fool stupid checks for in-site links + * We have a specific (fixed) referer we want to send. */ - if (0 != strcmpic(newval, "forge")) - { - /* - * Invalid choice - but forge is probably the best default. - */ - log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval); - } - *header = strdup("Referer: http://"); - string_append(header, csp->http->hostport); - string_append(header, "/"); - log_error(LOG_LEVEL_HEADER, "crunch+forge to %s", *header); - - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; + log_error(LOG_LEVEL_HEADER, "modified"); + + s = strsav( NULL, "Referer: " ); + s = strsav( s, newval ); + return(s); } + + /* Should never get here! */ + log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval); + + /* + * Forge is probably the best default. + * + * Forge a referer as http://[hostname:port of REQUEST]/ + * to fool stupid checks for in-site links + */ + log_error(LOG_LEVEL_HEADER, "crunch+forge!"); + s = strsav(NULL, "Referer: "); + s = strsav(s, "http://"); + s = strsav(s, csp->http->hostport); + s = strsav(s, "/"); + return(s); } @@ -1116,38 +894,51 @@ jb_err client_referrer(struct client_state *csp, char **header) * bug workarounds. Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : A malloc'ed pointer to the default agent, or + * a malloc'ed string pointer to this header (ie. pass thru). * *********************************************************************/ -jb_err client_uagent(struct client_state *csp, char **header) +char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) { const char * newval; + /* Save the client's User-Agent: value */ + if (strlen(s) >= 12) + { + csp->http->user_agent = strdup(s + 12); + } + +#ifdef DETECT_MSIE_IMAGES + if (strstr (s, "MSIE ")) + { + /* This is Microsoft Internet Explorer. + * Enable auto-detect. + */ + csp->accept_types |= ACCEPT_TYPE_IS_MSIE; + } +#endif /* def DETECT_MSIE_IMAGES */ + if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) { - return JB_ERR_OK; + return(strdup(s)); } newval = csp->action->string[ACTION_STRING_USER_AGENT]; if (newval == NULL) { - return JB_ERR_OK; + return(strdup(s)); } log_error(LOG_LEVEL_HEADER, "modified"); - freez(*header); - *header = strdup("User-Agent: "); - string_append(header, newval); + s = strsav( NULL, "User-Agent: " ); + s = strsav( s, newval ); + return(s); - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; } @@ -1158,25 +949,24 @@ jb_err client_uagent(struct client_state *csp, char **header) * Description : Handle "ua-" headers properly. Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : NULL if crunched, or a malloc'ed string to original header * *********************************************************************/ -jb_err client_ua(struct client_state *csp, char **header) +char *client_ua(const struct parsers *v, char *s, struct client_state *csp) { - if ((csp->action->flags & ACTION_HIDE_USER_AGENT) != 0) + if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) + { + return(strdup(s)); + } + else { log_error(LOG_LEVEL_HEADER, "crunch!"); - freez(*header); + return(NULL); } - - return JB_ERR_OK; } @@ -1188,44 +978,40 @@ jb_err client_ua(struct client_state *csp, char **header) * Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : NULL if crunched, or a malloc'ed string to + * modified/original header. * *********************************************************************/ -jb_err client_from(struct client_state *csp, char **header) +char *client_from(const struct parsers *v, char *s, struct client_state *csp) { const char * newval; if ((csp->action->flags & ACTION_HIDE_FROM) == 0) { - return JB_ERR_OK; + return(strdup(s)); } - freez(*header); - newval = csp->action->string[ACTION_STRING_FROM]; /* - * Are we blocking the e-mail address? + * Are we blocking referer? */ if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { log_error(LOG_LEVEL_HEADER, "crunch!"); - return JB_ERR_OK; + return(NULL); } log_error(LOG_LEVEL_HEADER, " modified"); - *header = strdup("From: "); - string_append(header, newval); + s = strsav( NULL, "From: " ); + s = strsav( s, newval ); + return(s); - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; } @@ -1238,24 +1024,18 @@ jb_err client_from(struct client_state *csp, char **header) * else we crunch it. Mmmmmmmmmmm ... cookie ...... * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = pattern of cookie `sed' found matching + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : Always NULL. * *********************************************************************/ -jb_err client_send_cookie(struct client_state *csp, char **header) +char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp) { - jb_err result = JB_ERR_OK; - if ((csp->action->flags & ACTION_NO_COOKIE_READ) == 0) { - /* strlen("cookie: ") == 8 */ - result = enlist(csp->cookie_list, *header + 8); + enlist(csp->cookie_list, s + v->len + 1); } else { @@ -1263,12 +1043,11 @@ jb_err client_send_cookie(struct client_state *csp, char **header) } /* - * Always remove the cookie here. The cookie header + * Always return NULL here. The cookie header * will be sent at the end of the header. */ - freez(*header); + return(NULL); - return result; } @@ -1280,91 +1059,72 @@ jb_err client_send_cookie(struct client_state *csp, char **header) * also used in the add_client_headers list. Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : Always NULL. * *********************************************************************/ -jb_err client_x_forwarded(struct client_state *csp, char **header) +char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp) { if ((csp->action->flags & ACTION_HIDE_FORWARDED) == 0) { /* Save it so we can re-add it later */ - freez(csp->x_forwarded); - csp->x_forwarded = *header; - - /* - * Always set *header = NULL, since this information - * will be sent at the end of the header. - */ - *header = NULL; - } - else - { - freez(*header); - log_error(LOG_LEVEL_HEADER, " crunch!"); + csp->x_forwarded = strdup(s); } - return JB_ERR_OK; -} + /* + * Always return NULL, since this information + * will be sent at the end of the header. + */ -/* the following functions add headers directly to the header list */ + return(NULL); +} + +#if defined(DETECT_MSIE_IMAGES) /********************************************************************* * - * Function : client_host_adder + * Function : client_accept * - * Description : (re)adds the host header. Called from `sed'. + * Description : Detect whether the client wants HTML or an image. + * Clients do not always make this information available + * in a sane way. Always passes the header through + * the proxy unchanged. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) + * 1 : v = Ignored. + * 2 : s = Header string. Null terminated. + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : Duplicate of argument s. * *********************************************************************/ -jb_err client_host_adder(struct client_state *csp) +char *client_accept(const struct parsers *v, char *s, struct client_state *csp) { - char *p; - char *pos; - jb_err err; - - if ( !csp->http->hostport || !*(csp->http->hostport)) +#ifdef DETECT_MSIE_IMAGES + if (strstr (s, "image/gif")) { - return JB_ERR_OK; - } - - p = strdup("Host: "); - /* - ** remove 'user:pass@' from 'proto://user:pass@host' - */ - if ( (pos = strchr( csp->http->hostport, '@')) != NULL ) - { - string_append(&p, pos+1); + /* Client will accept HTML. If this seems counterintuitive, + * blame Microsoft. + */ + csp->accept_types |= ACCEPT_TYPE_MSIE_HTML; } else { - string_append(&p, csp->http->hostport); + csp->accept_types |= ACCEPT_TYPE_MSIE_IMAGE; } +#endif /* def DETECT_MSIE_IMAGES */ - if (p == NULL) - { - return JB_ERR_MEMORY; - } + return(strdup(s)); - log_error(LOG_LEVEL_HEADER, "addh: %s", p); +} +#endif /* defined(DETECT_MSIE_IMAGES) */ - err = enlist(csp->headers, p); - freez(p); - return err; -} +/* the following functions add headers directly to the header list */ /********************************************************************* @@ -1376,90 +1136,50 @@ jb_err client_host_adder(struct client_state *csp) * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err client_cookie_adder(struct client_state *csp) +void client_cookie_adder(struct client_state *csp) { - struct list_entry *lst; - char *tmp; - struct list_entry *list1 = csp->cookie_list->first; - struct list_entry *list2 = csp->action->multi[ACTION_MULTI_WAFER]->first; - int first_cookie = 1; - jb_err err; - - if ((list1 == NULL) && (list2 == NULL)) - { - /* Nothing to do */ - return JB_ERR_OK; - } - - tmp = strdup("Cookie: "); + struct list *lst; + char *tmp = NULL; + char *e; - for (lst = list1; lst ; lst = lst->next) + for (lst = csp->cookie_list->next; lst ; lst = lst->next) { - if (first_cookie) - { - first_cookie = 0; - } - else + if (tmp) { - string_append(&tmp, "; "); + tmp = strsav(tmp, "; "); } - string_append(&tmp, lst->str); + tmp = strsav(tmp, lst->str); } - for (lst = list2; lst ; lst = lst->next) + for (lst = csp->action->multi[ACTION_MULTI_WAFER]->next; lst ; lst = lst->next) { - if (first_cookie) + if (tmp) { - first_cookie = 0; + tmp = strsav(tmp, "; "); } - else + + if ((e = cookie_encode(lst->str))) { - string_append(&tmp, "; "); + tmp = strsav(tmp, e); + freez(e); } - string_join(&tmp, cookie_encode(lst->str)); } - if (tmp == NULL) + if (tmp) { - return JB_ERR_MEMORY; - } + char *ret; - log_error(LOG_LEVEL_HEADER, "addh: %s", tmp); - err = enlist(csp->headers, tmp); - free(tmp); - return err; -} - - -/********************************************************************* - * - * Function : client_accept_encoding_adder - * - * Description : Add an Accept-Encoding header to the client's request - * that disables compression if the action applies, and - * the header is not already there. Called from `sed'. - * Note: For HTTP/1.0, the absence of the header is enough. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err client_accept_encoding_adder(struct client_state *csp) -{ - if ( ((csp->action->flags & ACTION_NO_COMPRESSION) != 0) - && (!strcmpic(csp->http->ver, "HTTP/1.1")) ) - { - return enlist_unique(csp->headers, "Accept-Encoding: identity;q=1.0, *;q=0", 16); + ret = strdup("Cookie: "); + ret = strsav(ret, tmp); + log_error(LOG_LEVEL_HEADER, "addh: %s", ret); + enlist(csp->headers, ret); + freez(tmp); + freez(ret); } - return JB_ERR_OK; } @@ -1472,28 +1192,19 @@ jb_err client_accept_encoding_adder(struct client_state *csp) * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err client_xtra_adder(struct client_state *csp) +void client_xtra_adder(struct client_state *csp) { - struct list_entry *lst; - jb_err err; + struct list *lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]; - for (lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]->first; - lst ; lst = lst->next) + for (lst = lst->next; lst ; lst = lst->next) { log_error(LOG_LEVEL_HEADER, "addh: %s", lst->str); - err = enlist(csp->headers, lst->str); - if (err) - { - return err; - } - + enlist(csp->headers, lst->str); } - return JB_ERR_OK; } @@ -1506,234 +1217,105 @@ jb_err client_xtra_adder(struct client_state *csp) * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err client_x_forwarded_adder(struct client_state *csp) +void client_x_forwarded_adder(struct client_state *csp) { char *p = NULL; - jb_err err; if ((csp->action->flags & ACTION_HIDE_FORWARDED) != 0) { - return JB_ERR_OK; + return; } if (csp->x_forwarded) { - p = strdup(csp->x_forwarded); - string_append(&p, ", "); + p = strsav(p, csp->x_forwarded); + p = strsav(p, ", "); + p = strsav(p, csp->ip_addr_str); } else { - p = strdup("X-Forwarded-For: "); - } - string_append(&p, csp->ip_addr_str); - - if (p == NULL) - { - return JB_ERR_MEMORY; + p = strsav(p, "X-Forwarded-For: "); + p = strsav(p, csp->ip_addr_str); } log_error(LOG_LEVEL_HEADER, "addh: %s", p); - err = enlist(csp->headers, p); - free(p); + enlist(csp->headers, p); - return err; } /********************************************************************* * - * Function : connection_close_adder - * - * Description : Adds a "Connection: close" header to csp->headers - * as a temporary fix for the needed but missing HTTP/1.1 - * support. Called from `sed'. - * FIXME: This whole function shouldn't be neccessary! - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err connection_close_adder(struct client_state *csp) -{ - return enlist(csp->headers, "Connection: close"); -} - - -/********************************************************************* - * - * Function : server_http + * Function : server_set_cookie * - * Description : - Save the HTTP Status into csp->http->status - * - Set CT_TABOO to prevent filtering if the answer - * is a partial range (HTTP status 206) - * - Rewrite HTTP/1.1 answers to HTTP/1.0 if +downgrade - * action applies. + * Description : Handle the server "cookie" header properly. + * Log cookie to the jar file. Then "crunch" it, + * or accept it. Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = parser pattern that matched this header + * 2 : s = header that matched this pattern + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : `crumble' or a newly malloc'ed string. * *********************************************************************/ -jb_err server_http(struct client_state *csp, char **header) +char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp) { - sscanf(*header, "HTTP/%*d.%*d %d", &(csp->http->status)); - if (csp->http->status == 206) +#ifdef JAR_FILES + if (csp->config->jar) { - csp->content_type = CT_TABOO; + fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1)); } +#endif /* def JAR_FILES */ - if ((csp->action->flags & ACTION_DOWNGRADE) != 0) + if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0) { - (*header)[7] = '0'; - log_error(LOG_LEVEL_HEADER, "Downgraded answer to HTTP/1.0"); + return(crumble(v, s, csp)); } - return JB_ERR_OK; + return(strdup(s)); + } +#ifdef FORCE_LOAD /********************************************************************* * - * Function : server_set_cookie + * Function : client_host * - * Description : Handle the server "cookie" header properly. - * Log cookie to the jar file. Then "crunch" it, - * or accept it. Called from `sed'. + * Description : Clean the FORCE_PREFIX out of the 'host' http + * header, if we use force * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to clean + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : A malloc'ed pointer to the cleaned host header * *********************************************************************/ -jb_err server_set_cookie(struct client_state *csp, char **header) +char *client_host(const struct parsers *v, char *s, struct client_state *csp) { -#ifdef FEATURE_COOKIE_JAR - if (csp->config->jar) - { - /* - * Write timestamp into outbuf. - * - * Complex because not all OSs have tm_gmtoff or - * the %z field in strftime() - */ - char tempbuf[ BUFFER_SIZE ]; - time_t now; - struct tm tm_now; - time (&now); -#ifdef HAVE_LOCALTIME_R - tm_now = *localtime_r(&now, &tm_now); -#else - tm_now = *localtime (&now); -#endif - strftime(tempbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); - - /* strlen("set-cookie: ") = 12 */ - fprintf(csp->config->jar, "%s %s\t%s\n", tempbuf, csp->http->host, *header + 12); - } -#endif /* def FEATURE_COOKIE_JAR */ - - if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0) - { - return crumble(csp, header); - } - else if ((csp->action->flags & ACTION_NO_COOKIE_KEEP) != 0) - { - /* Flag whether or not to log a message */ - int changed = 0; - - /* A variable to store the tag we're working on */ - char * cur_tag; - - /* Skip "Set-Cookie:" (11 characters) in header */ - cur_tag = *header + 11; - - /* skip whitespace between "Set-Cookie:" and value */ - while (*cur_tag && ijb_isspace(*cur_tag)) - { - cur_tag++; - } - - /* Loop through each tag in the cookie */ - while (*cur_tag) - { - /* Find next tag */ - char * next_tag = strchr(cur_tag, ';'); - if (next_tag != NULL) - { - /* Skip the ';' character itself */ - next_tag++; - - /* skip whitespace ";" and start of tag */ - while (*next_tag && ijb_isspace(*next_tag)) - { - next_tag++; - } - } - else - { - /* "Next tag" is the end of the string */ - next_tag = cur_tag + strlen(cur_tag); - } - - /* Is this the "Expires" tag? */ - if (strncmpic(cur_tag, "expires=", 8) == 0) - { - /* Delete the tag by copying the rest of the string over it. - * (Note that we cannot just use "strcpy(cur_tag, next_tag)", - * since the behaviour of strcpy is undefined for overlapping - * strings.) - */ - memmove(cur_tag, next_tag, strlen(next_tag) + 1); - - /* That changed the header, need to issue a log message */ - changed = 1; - - /* Note that the next tag has now been moved to *cur_tag, - * so we do not need to update the cur_tag pointer. - */ - } - else - { - /* Move on to next cookie tag */ - cur_tag = next_tag; - } - } - - if (changed) - { - log_error(LOG_LEVEL_HEADER, "Changed cookie to a temporary one."); - } - } - - return JB_ERR_OK; + char *cleanhost = strdup(s); + + if(csp->force) + strclean(cleanhost, FORCE_PREFIX); + + return(cleanhost); } - - -#ifdef FEATURE_FORCE_LOAD +#endif /* def FORCE_LOAD */ + + +#ifdef FORCE_LOAD /********************************************************************* * * Function : strclean * - * Description : In-Situ-Eliminate all occurances of substring in + * Description : In-Situ-Eliminate all occurances of substring in * string * * Parameters : @@ -1748,12 +1330,12 @@ int strclean(const char *string, const char *substring) int hits = 0, len = strlen(substring); char *pos, *p; - while((pos = strstr(string, substring)) != NULL) + while((pos = strstr(string, substring))) { p = pos + len; do { - *(p - len) = *p; + *(p - len) = *p; } while (*p++ != '\0'); @@ -1762,7 +1344,7 @@ int strclean(const char *string, const char *substring) return(hits); } -#endif /* def FEATURE_FORCE_LOAD */ +#endif /* def FORCE_LOAD */ /* diff --git a/parsers.h b/parsers.h index d7e104b9..b68ee8db 100644 --- a/parsers.h +++ b/parsers.h @@ -1,6 +1,6 @@ -#ifndef PARSERS_H_INCLUDED -#define PARSERS_H_INCLUDED -#define PARSERS_H_VERSION "$Id: parsers.h,v 1.24 2002/03/24 13:25:43 swa Exp $" +#ifndef _PARSERS_H +#define _PARSERS_H +#define PARSERS_H_VERSION "$Id: parsers.h,v 1.7 2001/06/29 13:32:14 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.h,v $ @@ -17,7 +17,7 @@ * and `server_set_cookie'. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -43,88 +43,6 @@ * * Revisions : * $Log: parsers.h,v $ - * Revision 1.24 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.23 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.22 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.21 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.20 2002/02/20 23:15:13 jongfoster - * Parsing functions now handle out-of-memory gracefully by returning - * an error code. - * - * Revision 1.19 2002/01/17 21:03:47 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Revision 1.18 2001/10/26 17:40:23 oes - * Introduced get_header_value() - * Removed client_accept() - * - * Revision 1.17 2001/10/13 12:47:32 joergs - * Removed client_host, added client_host_adder - * - * Revision 1.16 2001/10/07 18:50:16 oes - * Added server_content_encoding, renamed server_transfer_encoding - * - * Revision 1.15 2001/10/07 18:01:55 oes - * Changed server_http11 to server_http - * - * Revision 1.14 2001/10/07 15:45:48 oes - * added client_accept_encoding, client_te, client_accept_encoding_adder - * - * renamed content_type and content_length - * - * fixed client_host and strclean prototypes - * - * Revision 1.13 2001/09/29 12:56:03 joergs - * IJB now changes HTTP/1.1 to HTTP/1.0 in requests and answers. - * - * Revision 1.12 2001/09/13 23:05:50 jongfoster - * Changing the string paramater to the header parsers a "const". - * - * Revision 1.11 2001/07/31 14:46:53 oes - * Added prototype for connection_close_adder - * - * Revision 1.10 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.9 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.8 2001/07/13 14:01:54 oes - * Removed all #ifdef PCRS - * * Revision 1.7 2001/06/29 13:32:14 oes * Removed logentry from cancelled commit * @@ -172,44 +90,42 @@ extern "C" { extern const struct parsers client_patterns[]; extern const struct parsers server_patterns[]; -extern const add_header_func_ptr add_client_headers[]; -extern const add_header_func_ptr add_server_headers[]; +extern void (* const add_client_headers[])(struct client_state *); +extern void (* const add_server_headers[])(struct client_state *); -extern int flush_socket(jb_socket fd, struct client_state *csp); -extern void add_to_iob(struct client_state *csp, char *buf, int n); +extern int flush_socket(int fd, struct client_state *csp); +extern int add_to_iob(struct client_state *csp, char *buf, int n); extern char *get_header(struct client_state *csp); -extern char *get_header_value(const struct list *header_list, const char *header_name); -extern char *sed(const struct parsers pats[], const add_header_func_ptr more_headers[], struct client_state *csp); - -extern jb_err crumble (struct client_state *csp, char **header); -extern jb_err client_referrer (struct client_state *csp, char **header); -extern jb_err client_uagent (struct client_state *csp, char **header); -extern jb_err client_ua (struct client_state *csp, char **header); -extern jb_err client_from (struct client_state *csp, char **header); -extern jb_err client_send_cookie (struct client_state *csp, char **header); -extern jb_err client_x_forwarded (struct client_state *csp, char **header); -extern jb_err client_accept_encoding (struct client_state *csp, char **header); -extern jb_err client_te (struct client_state *csp, char **header); - -extern jb_err client_host_adder (struct client_state *csp); -extern jb_err client_cookie_adder (struct client_state *csp); -extern jb_err client_xtra_adder (struct client_state *csp); -extern jb_err client_accept_encoding_adder(struct client_state *csp); -extern jb_err client_x_forwarded_adder (struct client_state *csp); - -extern jb_err connection_close_adder (struct client_state *csp); - -extern jb_err server_set_cookie (struct client_state *csp, char **header); -extern jb_err server_content_type (struct client_state *csp, char **header); -extern jb_err server_content_length (struct client_state *csp, char **header); -extern jb_err server_content_md5 (struct client_state *csp, char **header); -extern jb_err server_content_encoding(struct client_state *csp, char **header); -extern jb_err server_transfer_coding (struct client_state *csp, char **header); -extern jb_err server_http (struct client_state *csp, char **header); - -#ifdef FEATURE_FORCE_LOAD -extern int strclean(const char *string, const char *substring); -#endif /* def FEATURE_FORCE_LOAD */ + +extern char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp); + +extern void free_http_request(struct http_request *http); +extern void parse_http_request(char *req, struct http_request *http, struct client_state *csp); + +extern char *crumble(const struct parsers *v, char *s, struct client_state *csp); + +extern char *client_referrer(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_uagent(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_ua(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_from(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp); +extern void client_cookie_adder(struct client_state *csp); +extern void client_xtra_adder(struct client_state *csp); +extern void client_x_forwarded_adder(struct client_state *csp); +extern char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp); + +extern char *content_type(const struct parsers *v, char *s, struct client_state *csp); +extern char *content_length(const struct parsers *v, char *s, struct client_state *csp); + +#ifdef FORCE_LOAD +char *client_host(const struct parsers *v, char *s, struct client_state *csp); +int strclean(const char *string, const char *substring); +#endif /* def FORCE_LOAD */ + +#if defined(DETECT_MSIE_IMAGES) +extern char *client_accept(const struct parsers *v, char *s, struct client_state *csp); +#endif /* defined(DETECT_MSIE_IMAGES) */ /* Revision control strings from this header and associated .c file */ extern const char parsers_rcs[]; @@ -219,7 +135,7 @@ extern const char parsers_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef PARSERS_H_INCLUDED */ +#endif /* ndef _PARSERS_H */ /* Local Variables: diff --git a/pcre/config.h b/pcre/config.h index c767cbb4..89b7ac4b 100644 --- a/pcre/config.h +++ b/pcre/config.h @@ -1,5 +1,5 @@ -/* For Privoxy, we just use Privoxy's config.h */ +/* For JunkBuster, we just use JunkBuster's config.h */ #include "../config.h" diff --git a/pcre/pcre.in b/pcre/pcre.in index d698f403..1dffb02b 100644 --- a/pcre/pcre.in +++ b/pcre/pcre.in @@ -17,7 +17,7 @@ make changes to pcre.in. */ /* Win32 uses DLL by default */ #ifdef _WIN32 -# ifdef STATIC_PCRE +# ifdef STATIC # define PCRE_DL_IMPORT # else # define PCRE_DL_IMPORT __declspec(dllimport) diff --git a/pcre/pcreposix.c b/pcre/pcreposix.c index 519d2dd5..6aeb8828 100644 --- a/pcre/pcreposix.c +++ b/pcre/pcreposix.c @@ -251,7 +251,7 @@ if (rc == 0) rc = nmatch; /* All captured slots were filled in */ if (rc >= 0) { size_t i; - for (i = 0; i < (size_t)rc; i++) + for (i = 0; i < rc; i++) { pmatch[i].rm_so = ovector[i*2]; pmatch[i].rm_eo = ovector[i*2+1]; diff --git a/pcrs.c b/pcrs.c index 45a471b9..48c78fdf 100644 --- a/pcrs.c +++ b/pcrs.c @@ -1,80 +1,43 @@ -const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $"; +const char pcrs_rcs[] = "$Id: pcrs.c,v 1.8 2001/06/29 21:45:41 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/pcrs.c,v $ * - * Purpose : pcrs is a supplement to the pcre library by Philip Hazel - * and adds Perl-style substitution. That - * is, it mimics Perl's 's' operator. See pcrs(3) for details. + * Purpose : pcrs is a supplement to the brilliant pcre library by Philip + * Hazel (ph10@cam.ac.uk) and adds Perl-style substitution. That + * is, it mimics Perl's 's' operator. * + * Currently, there's no documentation besides comments and the + * source itself ;-) + * + * Note: In addition to perl's options, 'U' for ungreedy and 'T' + * for trivial (i.e.: ignore backrefs in the substitute) are + * supported. * * Copyright : Written and Copyright (C) 2000, 2001 by Andreas S. Oesterhelt * * * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU Lesser - * General Public License (LGPL), version 2.1, which should - * be included in this distribution (see LICENSE.txt), with - * the exception that the permission to replace that license - * with the GNU General Public License (GPL) given in section - * 3 is restricted to version 2 of the GPL. + * 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 license for more details. + * PARTICULAR PURPOSE. See the GNU General Public + * License for more details. * - * The GNU Lesser General Public License should be included - * with this file. If not, you can view it at - * http://www.gnu.org/licenses/lgpl.html + * 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: pcrs.c,v $ - * Revision 1.18 2002/03/08 14:17:14 oes - * Fixing -Wconversion warnings - * - * Revision 1.17 2002/03/08 13:45:48 oes - * Hiding internal functions - * - * Revision 1.16 2001/11/30 21:32:14 jongfoster - * Fixing signed/unsigned comparison (Andreas please check this!) - * One tab->space - * - * Revision 1.15 2001/09/20 16:11:06 steudten - * - * Add casting for some string functions. - * - * Revision 1.14 2001/09/09 21:41:57 oes - * Fixing yet another silly bug - * - * Revision 1.13 2001/09/06 14:05:59 oes - * Fixed silly bug - * - * Revision 1.12 2001/08/18 11:35:00 oes - * - Introduced pcrs_strerror() - * - made some NULL arguments non-fatal - * - added support for \n \r \e \b \t \f \a \0 in substitute - * - made quoting adhere to standard rules - * - added warning for bad backrefs - * - added pcrs_execute_list() - * - fixed comments - * - bugfix & cosmetics - * - * Revision 1.11 2001/08/15 15:32:03 oes - * - Added support for Perl's special variables $+, $' and $` - * - Improved the substitute parser - * - Replaced the hard limit for the maximum number of matches - * by dynamic reallocation - * - * Revision 1.10 2001/08/05 13:13:11 jongfoster - * Making parameters "const" where possible. - * - * Revision 1.9 2001/07/18 17:27:00 oes - * Changed interface; Cosmetics - * * Revision 1.8 2001/06/29 21:45:41 oes * Indentation, CRLF->LF, Tab-> Space * @@ -98,12 +61,33 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $"; * - Removed create_pcrs_job() which was useless * - Fixed a bug in pcrs_execute * - Success flag is now handled by pcrs instead of user + * - Removed logentry from cancelled commit * * Revision 1.6 2001/06/03 19:12:45 oes * added FIXME * * Revision 1.5 2001/05/29 09:50:24 jongfoster - * (Fixed one int -> size_t) + * Unified blocklist/imagelist/permissionslist. + * File format is still under discussion, but the internal changes + * are (mostly) done. + * + * Also modified interceptor behaviour: + * - We now intercept all URLs beginning with one of the following + * prefixes (and *only* these prefixes): + * * http://i.j.b/ + * * http://ijbswa.sf.net/config/ + * * http://ijbswa.sourceforge.net/config/ + * - New interceptors "home page" - go to http://i.j.b/ to see it. + * - Internal changes so that intercepted and fast redirect pages + * are not replaced with an image. + * - Interceptors now have the option to send a binary page direct + * to the client. (i.e. ijb-send-banner uses this) + * - Implemented show-url-info interceptor. (Which is why I needed + * the above interceptors changes - a typical URL is + * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". + * The previous mechanism would not have intercepted that, and + * if it had been intercepted then it then it would have replaced + * it with an image.) * * Revision 1.4 2001/05/25 14:12:40 oes * Fixed bug: Empty substitutes now detected @@ -113,12 +97,48 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $"; * * Revision 1.2 2001/05/22 18:46:04 oes * - * Added support for PCRE_UNGREEDY behaviour to pcrs, + * - Enabled filtering banners by size rather than URL + * by adding patterns that replace all standard banner + * sizes with the "Junkbuster" gif to the re_filterfile + * + * - Enabled filtering WebBugs by providing a pattern + * which kills all 1x1 images + * + * - Added support for PCRE_UNGREEDY behaviour to pcrs, * which is selected by the (nonstandard and therefore * capital) letter 'U' in the option string. * It causes the quantifiers to be ungreedy by default. * Appending a ? turns back to greedy (!). * + * - Added a new interceptor ijb-send-banner, which + * sends back the "Junkbuster" gif. Without imagelist or + * MSIE detection support, or if tinygif = 1, or the + * URL isn't recognized as an imageurl, a lame HTML + * explanation is sent instead. + * + * - Added new feature, which permits blocking remote + * script redirects and firing back a local redirect + * to the browser. + * The feature is conditionally compiled, i.e. it + * can be disabled with --disable-fast-redirects, + * plus it must be activated by a "fast-redirects" + * line in the config file, has its own log level + * and of course wants to be displayed by show-proxy-args + * Note: Boy, all the #ifdefs in 1001 locations and + * all the fumbling with configure.in and acconfig.h + * were *way* more work than the feature itself :-( + * + * - Because a generic redirect template was needed for + * this, tinygif = 3 now uses the same. + * + * - Moved GIFs, and other static HTTP response templates + * to project.h + * + * - Some minor fixes + * + * - Removed some >400 CRs again (Jon, you really worked + * a lot! ;-) + * * Revision 1.1.1.1 2001/05/15 13:59:02 oes * Initial import of version 2.9.3 source tree * @@ -128,71 +148,13 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $"; #include #include -#include - #include "pcrs.h" - const char pcrs_h_rcs[] = PCRS_H_VERSION; -/* - * Internal prototypes - */ - -static int pcrs_parse_perl_options(const char *optstring, int *flags); -static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, - int capturecount, int *errptr); - -/********************************************************************* - * - * Function : pcrs_strerror - * - * Description : Return a string describing a given error code. - * - * Parameters : - * 1 : error = the error code - * - * Returns : char * to the descriptive string - * - *********************************************************************/ -const char *pcrs_strerror(const int error) -{ - if (error < 0) - { - switch (error) - { - /* Passed-through PCRE error: */ - case PCRE_ERROR_NOMEMORY: return "(pcre:) No memory"; - - /* Shouldn't happen unless PCRE or PCRS bug, or user messed with compiled job: */ - case PCRE_ERROR_NULL: return "(pcre:) NULL code or subject or ovector"; - case PCRE_ERROR_BADOPTION: return "(pcre:) Unrecognized option bit"; - case PCRE_ERROR_BADMAGIC: return "(pcre:) Bad magic number in code"; - case PCRE_ERROR_UNKNOWN_NODE: return "(pcre:) Bad node in pattern"; - - /* Can't happen / not passed: */ - case PCRE_ERROR_NOSUBSTRING: return "(pcre:) Fire in power supply"; - case PCRE_ERROR_NOMATCH: return "(pcre:) Water in power supply"; - - /* PCRS errors: */ - case PCRS_ERR_NOMEM: return "(pcrs:) No memory"; - case PCRS_ERR_CMDSYNTAX: return "(pcrs:) Syntax error while parsing command"; - case PCRS_ERR_STUDY: return "(pcrs:) PCRE error while studying the pattern"; - case PCRS_ERR_BADJOB: return "(pcrs:) Bad job - NULL job, pattern or substitute"; - case PCRS_WARN_BADREF: return "(pcrs:) Backreference out of range"; - - /* What's that? */ - default: return "Unknown error"; - } - } - /* error >= 0: No error */ - return "(pcrs:) Everything's just fine. Thanks for asking."; - -} - /********************************************************************* * - * Function : pcrs_parse_perl_options + * Function : pcrs_compile_perl_options * * Description : This function parses a string containing the options to * Perl's s/// operator. It returns an integer that is the @@ -209,19 +171,16 @@ const char *pcrs_strerror(const int error) * Returns : option integer suitable for pcre * *********************************************************************/ -static int pcrs_parse_perl_options(const char *optstring, int *flags) +int pcrs_compile_perl_options(char *optstring, int *flags) { size_t i; int rc = 0; *flags = 0; - - if (NULL == optstring) return 0; - - for (i = 0; i < strlen(optstring); i++) + for (i=0; i < strlen(optstring); i++) { switch(optstring[i]) { - case 'e': break; /* ToDo ;-) */ + case 'e': break; case 'g': *flags |= PCRS_GLOBAL; break; case 'i': rc |= PCRE_CASELESS; break; case 'm': rc |= PCRE_MULTILINE; break; @@ -229,8 +188,8 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags) case 's': rc |= PCRE_DOTALL; break; case 'x': rc |= PCRE_EXTENDED; break; case 'U': rc |= PCRE_UNGREEDY; break; - case 'T': *flags |= PCRS_TRIVIAL; break; - default: break; + case 'T': *flags |= PCRS_TRIVIAL; break; + default: break; } } return rc; @@ -250,11 +209,7 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags) * Parameters : * 1 : replacement = replacement part of s/// operator * in perl syntax - * 2 : trivialflag = Flag that causes backreferences to be - * ignored. - * 3 : capturecount = Number of capturing subpatterns in - * the pattern. Needed for $+ handling. - * 4 : errptr = pointer to an integer in which error + * 2 : errptr = pointer to an integer in which error * conditions can be returned. * * Returns : pcrs_substitute data structure, or NULL if an @@ -262,178 +217,89 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags) * the reason. * *********************************************************************/ -static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, int capturecount, int *errptr) +pcrs_substitute *pcrs_compile_replacement(char *replacement, int trivialflag, int *errptr) { - int i, k, l, quoted; - size_t length; - char *text; + int length, i, k = 0, l = 0, quoted = 0, idx; + char *text, *num_ptr, *numbers = "0123456789"; pcrs_substitute *r; - i = k = l = quoted = 0; - - /* - * Sanity check - */ - if (NULL == replacement) - { - replacement = ""; - } + r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute)); + if (r == NULL) return NULL; + memset(r, '\0', sizeof(pcrs_substitute)); - /* - * Get memory or fail - */ - if (NULL == (r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute)))) + text = strdup(replacement); /* must be free()d by caller */ + if (text == NULL) { *errptr = PCRS_ERR_NOMEM; + free(r); return NULL; } - memset(r, '\0', sizeof(pcrs_substitute)); length = strlen(replacement); - if (NULL == (text = (char *)malloc(length + 1))) - { - free(r); - *errptr = PCRS_ERR_NOMEM; - return NULL; - } - memset(text, '\0', length + 1); - - - /* - * In trivial mode, just copy the substitute text - */ if (trivialflag) { - text = strncpy(text, replacement, length + 1); - k = length; + k = length; } - - /* - * Else, parse, cut out and record all backreferences - */ else { - while (i < (int)length) + for (i=0; i < length; i++) { - /* Quoting */ + /* Backslash treatment */ if (replacement[i] == '\\') { if (quoted) { - text[k++] = replacement[i++]; + text[k++] = replacement[i]; quoted = 0; } else { - if (replacement[i+1] && strchr("tnrfae0", replacement[i+1])) - { - switch (replacement[++i]) - { - case 't': - text[k++] = '\t'; - break; - case 'n': - text[k++] = '\n'; - break; - case 'r': - text[k++] = '\r'; - break; - case 'f': - text[k++] = '\f'; - break; - case 'a': - text[k++] = 7; - break; - case 'e': - text[k++] = 27; - break; - case '0': - text[k++] = '\0'; - break; - } - i++; - } - else - { - quoted = 1; - i++; - } + quoted = 1; } continue; } - /* Backreferences */ - if (replacement[i] == '$' && !quoted && i < (int)(length - 1)) + /* Dollar treatment */ + if (replacement[i] == '$' && !quoted && i < length - 1) { - char *symbol, symbols[] = "'`+&"; - r->block_length[l] = k - r->block_offset[l]; - - /* Numerical backreferences */ - if (isdigit((int)replacement[i + 1])) + if (strchr("0123456789&", replacement[i + 1]) == NULL) { - while (i < (int)length && isdigit((int)replacement[++i])) - { - r->backref[l] = r->backref[l] * 10 + replacement[i] - 48; - } - if (r->backref[l] > capturecount) - { - *errptr = PCRS_WARN_BADREF; - } + text[k++] = replacement[i]; } - - /* Symbolic backreferences: */ - else if (NULL != (symbol = strchr(symbols, replacement[i + 1]))) + else { - - if (symbol - symbols == 2) /* $+ */ - { - r->backref[l] = capturecount; - } - else if (symbol - symbols == 3) /* $& */ - { - r->backref[l] = 0; - } - else /* $' or $` */ + r->block_length[l] = k - r->block_offset[l]; + r->backref[l] = 0; + if (replacement[i + 1] != '&') { - r->backref[l] = PCRS_MAX_SUBMATCHES + 1 - (symbol - symbols); + while ((num_ptr = strchr(numbers, replacement[++i])) != NULL && i < length) + { + idx = num_ptr - numbers; + r->backref[l] = r->backref[l] * 10 + idx; + } + i--; } - i += 2; - } - - /* Invalid backref -> plain '$' */ - else - { - goto plainchar; - } - - /* Valid and in range? -> record */ - if (r->backref[l] < PCRS_MAX_SUBMATCHES + 2) - { - r->backref_count[r->backref[l]] += 1; - r->block_offset[++l] = k; + else + i++; + if (r->backref[l] < PCRS_MAX_SUBMATCHES) + r->backref_count[r->backref[l]] += 1; + l++; + r->block_offset[l] = k; } - else - { - *errptr = PCRS_WARN_BADREF; - } continue; } - -plainchar: - /* Plain chars are copied */ - text[k++] = replacement[i++]; + + /* Plain char treatment */ + text[k++] = replacement[i]; quoted = 0; } } /* -END- if (!trivialflag) */ - /* - * Finish & return - */ + text[k] = '\0'; r->text = text; r->backrefs = l; r->block_length[l] = k - r->block_offset[l]; - return r; } @@ -444,7 +310,8 @@ plainchar: * Function : pcrs_free_job * * Description : Frees the memory used by a pcrs_job struct and its - * dependant structures. + * dependant structures. Returns a pointer to the next + * job, if there was any, or NULL otherwise. * * Parameters : * 1 : job = pointer to the pcrs_job structure to be freed @@ -477,7 +344,6 @@ pcrs_job *pcrs_free_job(pcrs_job *job) } - /********************************************************************* * * Function : pcrs_free_joblist @@ -520,16 +386,15 @@ void pcrs_free_joblist(pcrs_job *joblist) * has the reason. * *********************************************************************/ -pcrs_job *pcrs_compile_command(const char *command, int *errptr) +pcrs_job *pcrs_compile_command(char *command, int *errptr) { - int i, k, l, quoted = FALSE; - size_t limit; + int i, k, l, limit, quoted = FALSE; char delimiter; char *tokens[4]; pcrs_job *newjob; - + i = k = l = 0; - + /* * Tokenize the perl command */ @@ -541,38 +406,36 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr) } else { - delimiter = command[1]; + delimiter = command[1]; } tokens[l] = (char *) malloc(limit + 1); - for (i = 0; i <= (int)limit; i++) + for (i=0; i <= limit; i++) { - + if (command[i] == delimiter && !quoted) { - if (l == 3) - { - l = -1; + if (l == 3) + { + l = -1; break; } - tokens[0][k++] = '\0'; + tokens[0][k++] = '\0'; tokens[++l] = tokens[0] + k; continue; } - - else if (command[i] == '\\' && !quoted) + + else if (command[i] == '\\' && !quoted && i+1 < limit && command[i+1] == delimiter) { quoted = TRUE; - if (command[i+1] == delimiter) continue; - } - else - { - quoted = FALSE; + continue; } tokens[0][k++] = command[i]; + quoted = FALSE; } + /* * Syntax error ? */ @@ -582,11 +445,11 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr) free(tokens[0]); return NULL; } - + newjob = pcrs_compile(tokens[1], tokens[2], tokens[3], errptr); free(tokens[0]); return newjob; - + } @@ -609,20 +472,19 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr) * has the reason. * *********************************************************************/ -pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr) +pcrs_job *pcrs_compile(char *pattern, char *substitute, char *options, int *errptr) { pcrs_job *newjob; int flags; - int capturecount; const char *error; - *errptr = 0; /* * Handle NULL arguments */ if (pattern == NULL) pattern = ""; if (substitute == NULL) substitute = ""; + if (options == NULL) options = ""; /* @@ -639,7 +501,7 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char * /* * Evaluate the options */ - newjob->options = pcrs_parse_perl_options(options, &flags); + newjob->options = pcrs_compile_perl_options(options, &flags); newjob->flags = flags; @@ -667,21 +529,10 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char * } - /* - * Determine the number of capturing subpatterns. - * This is needed for handling $+ in the substitute. - */ - if (0 > (*errptr = pcre_fullinfo(newjob->pattern, newjob->hints, PCRE_INFO_CAPTURECOUNT, &capturecount))) - { - pcrs_free_job(newjob); - return NULL; - } - - /* * Compile the substitute */ - if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, capturecount, errptr))) + if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, errptr))) { pcrs_free_job(newjob); return NULL; @@ -692,73 +543,16 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char * } -/********************************************************************* - * - * Function : pcrs_execute_list - * - * Description : This is a multiple job wrapper for pcrs_execute(). - * Apply the regular substitutions defined by the jobs in - * the joblist to the subject. - * The subject itself is left untouched, memory for the result - * is malloc()ed and it is the caller's responsibility to free - * the result when it's no longer needed. - * - * Parameters : - * 1 : joblist = the chained list of pcrs_jobs to be executed - * 2 : subject = the subject string - * 3 : subject_length = the subject's length - * INCLUDING the terminating zero, if string! - * 4 : result = char** for returning the result - * 5 : result_length = size_t* for returning the result's length - * - * Returns : On success, the number of substitutions that were made. - * May be > 1 if job->flags contained PCRS_GLOBAL - * On failiure, the (negative) pcre error code describing the - * failiure, which may be translated to text using pcrs_strerror(). - * - *********************************************************************/ -int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, char **result, size_t *result_length) -{ - pcrs_job *job; - char *old, *new; - int hits, total_hits; - - old = subject; - *result_length = subject_length; - hits = total_hits = 0; - - for (job = joblist; job != NULL; job = job->next) - { - hits = pcrs_execute(job, old, *result_length, &new, result_length); - - if (old != subject) free(old); - - if (hits < 0) - { - return(hits); - } - else - { - total_hits += hits; - old = new; - } - } - - *result = new; - return(total_hits); - -} - - /********************************************************************* * * Function : pcrs_execute * - * Description : Apply the regular substitution defined by the job to the - * subject. - * The subject itself is left untouched, memory for the result - * is malloc()ed and it is the caller's responsibility to free - * the result when it's no longer needed. + * Description : Modify the subject by executing the regular substitution + * defined by the job. Since the result may be longer than + * the subject, its space requirements are precalculated in + * the matching phase and new memory is allocated accordingly. + * It is the caller's responsibility to free the result when + * it's no longer needed. * * Parameters : * 1 : job = the pcrs_job to be executed @@ -766,30 +560,26 @@ int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c * 3 : subject_length = the subject's length * INCLUDING the terminating zero, if string! * 4 : result = char** for returning the result - * 5 : result_length = size_t* for returning the result's length + * 5 : result_length = int* for returning the result's length * - * Returns : On success, the number of substitutions that were made. - * May be > 1 if job->flags contained PCRS_GLOBAL - * On failiure, the (negative) pcre error code describing the - * failiure, which may be translated to text using pcrs_strerror(). + * Returns : the number of substitutions that were made. May be > 1 + * if job->flags contained PCRS_GLOBAL * *********************************************************************/ -int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length) +int pcrs_execute(pcrs_job *job, char *subject, int subject_length, char **result, int *result_length) { int offsets[3 * PCRS_MAX_SUBMATCHES], - offset, - i, k, + offset, i, k, matches_found, - submatches, - max_matches = PCRS_MAX_MATCH_INIT; - size_t newsize; - pcrs_match *matches, *dummy; + newsize, + submatches; + pcrs_match matches[PCRS_MAX_MATCHES]; char *result_offset; offset = i = k = 0; /* - * Sanity check & memory allocation + * Sanity check */ if (job == NULL || job->pattern == NULL || job->substitute == NULL) { @@ -797,26 +587,18 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res return(PCRS_ERR_BADJOB); } - if (NULL == (matches = (pcrs_match *)malloc(max_matches * sizeof(pcrs_match)))) - { - *result = NULL; - return(PCRS_ERR_NOMEM); - } - memset(matches, '\0', max_matches * sizeof(pcrs_match)); - - + /* * Find the pattern and calculate the space - * requirements for the result + * requirements for the result (newsize) */ - newsize = subject_length; + newsize=subject_length; - while ((submatches = pcre_exec(job->pattern, job->hints, subject, (int)subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0) + while ((submatches = pcre_exec(job->pattern, job->hints, subject, subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0) { job->flags |= PCRS_SUCCESS; matches[i].submatches = submatches; - - for (k = 0; k < submatches; k++) + for (k=0; k < submatches; k++) { matches[i].submatch_offset[k] = offsets[2 * k]; @@ -829,35 +611,12 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res /* plus replacement text size minus match text size */ newsize += strlen(job->substitute->text) - matches[i].submatch_length[0]; - /* chunk before match */ - matches[i].submatch_offset[PCRS_MAX_SUBMATCHES] = 0; - matches[i].submatch_length[PCRS_MAX_SUBMATCHES] = offsets[0]; - newsize += offsets[0] * job->substitute->backref_count[PCRS_MAX_SUBMATCHES]; - - /* chunk after match */ - matches[i].submatch_offset[PCRS_MAX_SUBMATCHES + 1] = offsets[1]; - matches[i].submatch_length[PCRS_MAX_SUBMATCHES + 1] = subject_length - offsets[1] - 1; - newsize += (subject_length - offsets[1]) * job->substitute->backref_count[PCRS_MAX_SUBMATCHES + 1]; - - /* Storage for matches exhausted? -> Extend! */ - if (++i >= max_matches) - { - max_matches = (int)(max_matches * PCRS_MAX_MATCH_GROW); - if (NULL == (dummy = (pcrs_match *)realloc(matches, max_matches * sizeof(pcrs_match)))) - { - free(matches); - *result = NULL; - return(PCRS_ERR_NOMEM); - } - matches = dummy; - } - /* Non-global search or limit reached? */ - if (!(job->flags & PCRS_GLOBAL)) break; + if (++i >= PCRS_MAX_MATCHES || !(job->flags & PCRS_GLOBAL) ) break; /* Don't loop on empty matches */ if (offsets[1] == offset) - if ((size_t)offset < subject_length) + if (offset < subject_length) offset++; else break; @@ -865,12 +624,8 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res else offset = offsets[1]; } - /* Pass pcre error through if (bad) failiure */ - if (submatches < PCRE_ERROR_NOMATCH) - { - free(matches); - return submatches; - } + /* Pass pcre error through if failiure */ + if (submatches < -1) return submatches; matches_found = i; @@ -879,7 +634,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res */ if ((*result = (char *)malloc(newsize)) == NULL) /* must be free()d by caller */ { - free(matches); return PCRS_ERR_NOMEM; } @@ -890,14 +644,14 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res offset = 0; result_offset = *result; - for (i = 0; i < matches_found; i++) + for (i=0; i < matches_found; i++) { /* copy the chunk preceding the match */ - memcpy(result_offset, subject + offset, (size_t)matches[i].submatch_offset[0] - offset); + memcpy(result_offset, subject + offset, matches[i].submatch_offset[0] - offset); result_offset += matches[i].submatch_offset[0] - offset; /* For every segment of the substitute.. */ - for (k = 0; k <= job->substitute->backrefs; k++) + for (k=0; k <= job->substitute->backrefs; k++) { /* ...copy its text.. */ memcpy(result_offset, job->substitute->text + job->substitute->block_offset[k], job->substitute->block_length[k]); @@ -906,7 +660,7 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res /* ..plus, if it's not the last chunk, i.e.: There *is* a backref.. */ if (k != job->substitute->backrefs /* ..in legal range.. */ - && job->substitute->backref[k] < PCRS_MAX_SUBMATCHES + 2 + && job->substitute->backref[k] <= PCRS_MAX_SUBMATCHES /* ..and referencing a nonempty match.. */ && matches[i].submatch_length[job->substitute->backref[k]] > 0) { @@ -926,7 +680,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res memcpy(result_offset, subject + offset, subject_length - offset); *result_length = newsize; - free(matches); return matches_found; } diff --git a/pcrs.h b/pcrs.h index a14b8165..23e99e92 100644 --- a/pcrs.h +++ b/pcrs.h @@ -1,36 +1,31 @@ -#ifndef PCRS_H_INCLUDED -#define PCRS_H_INCLUDED +#ifndef _PCRS_H +#define _PCRS_H /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/pcrs.h,v $ * - * Purpose : Header file for pcrs.c + * Purpose : This is the pre-pre-alpha realease of libpcrs. It is only + * published at this (ugly) stage of development, because it is + * needed for a new feature in JunkBuster. * - * Copyright : see pcrs.c + * Apart from the code being quite a mess, no inconsistencies, + * memory leaks or functional bugs **should** be present. * - * Revisions : - * $Log: pcrs.h,v $ - * Revision 1.10 2002/03/08 13:44:48 oes - * Hiding internal functions, preventing double inclusion of pcre.h - * - * Revision 1.9 2001/08/18 11:35:29 oes - * - Introduced pcrs_strerror() - * - added pcrs_execute_list() + * While you ROTFL at the code, you could just as well mail me + * (oes@paradis.rhein.de) with advice for improvement. * - * Revision 1.8 2001/08/15 15:32:50 oes - * Replaced the hard limit for the maximum number of matches - * by dynamic reallocation + * pcrs is a supplement to the brilliant pcre library by Philip + * Hazel (ph10@cam.ac.uk) and adds Perl-style substitution. That + * is, it mimics Perl's 's' operator. * - * Revision 1.7 2001/08/05 13:13:11 jongfoster - * Making parameters "const" where possible. + * Currently, there's no documentation besides comments and the + * source itself ;-) * - * Revision 1.6 2001/07/29 18:52:06 jongfoster - * Renaming _PCRS_H, and adding "extern C {}" - * - * Revision 1.5 2001/07/18 17:27:00 oes - * Changed interface; Cosmetics + * Copyright : Written and copyright 2001 by Sourceforge IJBSWA team. * + * Revisions : + * $Log: pcrs.h,v $ * Revision 1.4 2001/06/29 13:33:19 oes * - Cleaned up, commented and adapted to reflect the * changes in pcrs.c @@ -59,16 +54,10 @@ * *********************************************************************/ -#define PCRS_H_VERSION "$Id: pcrs.h,v 1.10 2002/03/08 13:44:48 oes Exp $" +#define PCRS_H_VERSION "$Id: pcrs.h,v 1.4 2001/06/29 13:33:19 oes Exp $" -#ifndef _PCRE_H #include -#endif - -#ifdef __cplusplus -extern "C" { -#endif /* * Constants: @@ -78,88 +67,68 @@ extern "C" { #define TRUE 1 /* Capacity */ -#define PCRS_MAX_SUBMATCHES 33 /* Maximum number of capturing subpatterns allowed. MUST be <= 99! FIXME: Should be dynamic */ -#define PCRS_MAX_MATCH_INIT 40 /* Initial amount of matches that can be stored in global searches */ -#define PCRS_MAX_MATCH_GROW 1.6 /* Factor by which storage for matches is extended if exhausted */ +#define PCRS_MAX_MATCHES 300 +#define PCRS_MAX_SUBMATCHES 33 /* Error codes */ #define PCRS_ERR_NOMEM -10 /* Failed to acquire memory. */ #define PCRS_ERR_CMDSYNTAX -11 /* Syntax of s///-command */ #define PCRS_ERR_STUDY -12 /* pcre error while studying the pattern */ #define PCRS_ERR_BADJOB -13 /* NULL job pointer, pattern or substitute */ -#define PCRS_WARN_BADREF -14 /* Backreference out of range */ /* Flags */ #define PCRS_GLOBAL 1 /* Job should be applied globally, as with perl's g option */ -#define PCRS_TRIVIAL 2 /* Backreferences in the substitute are ignored */ -#define PCRS_SUCCESS 4 /* Job did previously match */ - +#define PCRS_SUCCESS 2 /* Job did previously match */ +#define PCRS_TRIVIAL 4 /* Backreferences in the substitute are ignored */ /* * Data types: */ /* A compiled substitute */ - -typedef struct { - char *text; /* The plaintext part of the substitute, with all backreferences stripped */ - int backrefs; /* The number of backreferences */ - int block_offset[PCRS_MAX_SUBMATCHES]; /* Array with the offsets of all plaintext blocks in text */ - size_t block_length[PCRS_MAX_SUBMATCHES]; /* Array with the lengths of all plaintext blocks in text */ - int backref[PCRS_MAX_SUBMATCHES]; /* Array with the backref number for all plaintext block borders */ - int backref_count[PCRS_MAX_SUBMATCHES + 2]; /* Array with the number of references to each backref index */ +typedef struct PCRS_SUBSTITUTE { + char *text; /* The plaintext part of the substitute, with all backreferences stripped */ + int backrefs; /* The number of backreferences */ + int block_offset[PCRS_MAX_SUBMATCHES]; /* Array with the offsets of all plaintext blocks in text */ + int block_length[PCRS_MAX_SUBMATCHES]; /* Array with the lengths of all plaintext blocks in text */ + int backref[PCRS_MAX_SUBMATCHES]; /* Array with the backref number for all plaintext block borders */ + int backref_count[PCRS_MAX_SUBMATCHES]; /* Array with the number of reference to each backref index */ } pcrs_substitute; - -/* - * A match, including all captured subpatterns (submatches) - * Note: The zeroth is the whole match, the PCRS_MAX_SUBMATCHES + 0th - * is the range before the match, the PCRS_MAX_SUBMATCHES + 1th is the - * range after the match. - */ - -typedef struct { - int submatches; /* Number of captured subpatterns */ - int submatch_offset[PCRS_MAX_SUBMATCHES + 2]; /* Offset for each submatch in the subject */ - size_t submatch_length[PCRS_MAX_SUBMATCHES + 2]; /* Length of each submatch in the subject */ +typedef struct PCRS_MATCH { + /* char *buffer; */ + int submatches; /* Number of submatches. Note: The zeroth is the whole match */ + int submatch_offset[PCRS_MAX_SUBMATCHES]; /* Offset for each submatch in the subject */ + int submatch_length[PCRS_MAX_SUBMATCHES]; /* Length of each submatch in the subject */ } pcrs_match; - -/* A PCRS job */ - typedef struct PCRS_JOB { pcre *pattern; /* The compiled pcre pattern */ pcre_extra *hints; /* The pcre hints for the pattern */ int options; /* The pcre options (numeric) */ int flags; /* The pcrs and user flags (see "Flags" above) */ - pcrs_substitute *substitute; /* The compiled pcrs substitute */ + pcrs_substitute *substitute; /* The compiles pcrs substitute */ struct PCRS_JOB *next; /* Pointer for chaining jobs to joblists */ } pcrs_job; - /* * Prototypes: */ /* Main usage */ -extern pcrs_job *pcrs_compile_command(const char *command, int *errptr); -extern pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr); -extern int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length); -extern int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, char **result, size_t *result_length); +extern pcrs_job *pcrs_compile_command(char *command, int *errptr); +extern pcrs_job *pcrs_compile(char *pattern, char *substitute, char *options, int *errptr); +extern int pcrs_execute(pcrs_job *job, char *subject, int subject_length, char **result, int *result_length); /* Freeing jobs */ extern pcrs_job *pcrs_free_job(pcrs_job *job); extern void pcrs_free_joblist(pcrs_job *joblist); -/* Info on errors: */ -extern const char *pcrs_strerror(const int error); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif +/* Expert usage */ +extern int pcrs_compile_perl_options(char *optstring, int *flags); +extern pcrs_substitute *pcrs_compile_replacement(char *replacement, int trivialflag, int *errptr); -#endif /* ndef PCRS_H_INCLUDED */ +#endif /* ndef _PCRS_H */ /* Local Variables: diff --git a/privoxy-rh.spec b/privoxy-rh.spec deleted file mode 100644 index 87c0810f..00000000 --- a/privoxy-rh.spec +++ /dev/null @@ -1,778 +0,0 @@ -# $Id: privoxy-rh.spec,v 1.16 2002/03/26 22:29:55 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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. -# - -# Defines should happen in the begining of the file -%define veryoldname junkbust -%define oldname junkbuster -%define privoxyconf %{_sysconfdir}/%{name} - -Name: privoxy -# ATTENTION -# Version and release should be updated acordingly on configure.in and -# configure. Otherwise, the package can be build with the wrong value -Version: 2.9.13 -Release: 3 -Summary: Privoxy - privacy enhancing proxy -License: GPL -Vendor: http://www.privoxy.org -Source0: http://www.waldherr.org/%{name}/%{name}-%{version}.tar.gz -BuildRoot: %{_tmppath}/%{name}-%{version}-root -Group: Networking/Utilities -URL: http://www.privoxy.org/ -Obsoletes: junkbuster-raw junkbuster-blank junkbuster -# Prereq: /usr/sbin/useradd , /sbin/chkconfig , /sbin/service -Prereq: shadow-utils, chkconfig, initscripts, sh-utils -BuildRequires: perl gzip sed docbook-utils libtool autoconf -Conflicts: junkbuster-raw junkbuster-blank junkbuster - -%description -Privoxy is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other -obnoxious Internet junk. Privoxy has a very flexible configuration and -can be customized to suit individual needs and tastes. Privoxy has application -for both stand-alone systems and multi-user networks. - -Privoxy is based on the code of the Internet Junkbuster. Junkbuster -was originally written by JunkBusters Corporation, and was released as -free open-source software under the GNU GPL. Stefan Waldherr made many -improvements, and started the SourceForge project to continue -development. Several other developers are now contributing. - -%prep -%setup -q -c - -%build -autoheader -autoconf -%configure -make -make redhat-dok - -## Explicitily stripping is not recomended. -## This is handled altomaticaly by RPM, and can couse troubles if -## anyone wants to build an unstriped version - morcego -#strip %{name} - -%install -[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} -mkdir -p %{buildroot}%{_sbindir} \ - %{buildroot}%{_mandir}/man1 \ - %{buildroot}%{_localstatedir}/log/%{name} \ - %{buildroot}%{privoxyconf}/templates \ - %{buildroot}%{_sysconfdir}/logrotate.d \ - %{buildroot}%{_sysconfdir}/rc.d/init.d - -## Manual gziping of manpages should not be done, once it can -## break the building on some distributions. Anyway, rpm does it -## automagicaly these days -## Gziping the documentation files is not recomended - morcego -#gzip README AUTHORS ChangeLog %{name}.1 || /bin/true - -install -s -m 744 %{name} %{buildroot}%{_sbindir}/%{name} - -cp -f %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 -cp -f *.action %{buildroot}%{privoxyconf}/ -cp -f default.filter %{buildroot}%{privoxyconf}/default.filter -cp -f trust %{buildroot}%{privoxyconf}/trust -cp -f templates/* %{buildroot}%{privoxyconf}/templates/ -cp -f %{name}.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name} -install -m 755 %{name}.init %{buildroot}%{_sysconfdir}/rc.d/init.d/%{name} -install -m 711 -d %{buildroot}%{_localstatedir}/log/%{name} - -# verify all file locations, etc. in the config file -# don't start with ^ or commented lines are not replaced -## Changing the sed paramter delimiter to @, so we don't have to -## escape the slashes -cat config | \ - sed 's@^confdir.*@confdir %{privoxyconf}@g' | \ -# sed 's/^permissionsfile.*/permissionsfile \/etc\/%{name}\/permissionsfile/g' | \ -# sed 's/^filterfile.*/default.filter \/etc\/%{name}\/default.filter/g' | \ -# sed 's/^logfile.*/logfile \%{_localstatedir}\/log\/%{name}\/logfile/g' | \ -# sed 's/^jarfile.*/jarfile \%{_localstatedir}\/log\/%{name}\/jarfile/g' | \ -# sed 's/^forward.*/forward \/etc\/%{name}\/forward/g' | \ -# sed 's/^aclfile.*/aclfile \/etc\/%{name}\/aclfile/g' > \ - sed 's@^logdir.*@logdir %{_localstatedir}/log/%{name}@g' > \ - %{buildroot}%{privoxyconf}/config -perl -pe 's/{-no-cookies}/{-no-cookies}\n\.redhat.com/' default.action >\ - %{buildroot}%{privoxyconf}/default.action - - -# Creating ghost init files -mkdir -p %{buildroot}/%{_sysconfdir}/rc.d/rc{0,1,2,3,4,5,6}.d -for i in 0 1 4 6 -do -ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/K09%{name} -done -for i in 2 3 5 -do -ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/S84%{name} -done - -## Macros are expanded even on commentaries. So, we have to use %% -## -- morcego -#%%makeinstall - -%pre -# This is where we handle old usernames (junkbust and junkbuster) -# I'm not sure we should do that, but this is the way we have been -# doing it for some time now -- morcego -# We should do it for the group as well -- morcego -# Doing it by brute force. Much cleaner (no more Mr. Nice Guy) -- morcego - -# Change the group name. Remove anything left behind. -groupmod -n %{name} %{oldname} > /dev/null 2>&1 ||: -groupmod -n %{name} %{veryoldname} > /dev/null 2>&1 ||: -groupdel %{oldname} > /dev/null 2>&1 ||: -groupdel %{veryoldname} > /dev/null 2>&1 ||: - -# Same for username -usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{oldname} > /dev/null 2>&1 || : -usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{veryoldname} > /dev/null 2>&1 || : -userdel %{oldname} > /dev/null 2>&1 ||: -userdel %{veryoldname} > /dev/null 2>&1 ||: - -# Check to see if everything is okey. Create user if it still does not -# exist -id %{name} > /dev/null 2>&1 -if [ $? -eq 1 ]; then - /usr/sbin/useradd -d %{_sysconfdir}/%{name} -r -s "" %{name} > /dev/null 2>&1 -fi - -%post -# for upgrade from 2.0.x -[ -f %{_localstatedir}/log/%{oldname}/logfile ] &&\ - mv -f %{_localstatedir}/log/%{oldname}/logfile %{_localstatedir}/log/%{name}/logfile || /bin/true -[ -f %{_localstatedir}/log/%{name}/%{name} ] &&\ - mv -f %{_localstatedir}/log/%{name}/%{name} %{_localstatedir}/log/%{name}/logfile || /bin/true -chown -R %{name}:%{name} %{_localstatedir}/log/%{name} 2>/dev/null -chown -R %{name}:%{name} /etc/%{name} 2>/dev/null -if [ "$1" = "1" ]; then - /sbin/service %{name} condrestart > /dev/null 2>&1 -fi - -%preun -/sbin/service %{veryoldname} stop > /dev/null 2>&1 ||: -/sbin/service %{oldname} stop > /dev/null 2>&1 ||: - -if [ "$1" = "0" ]; then - /sbin/service %{name} stop > /dev/null 2>&1 ||: - # No need to use chkconfig. The %%ghost files will handle it -fi - -%postun -#if [ "$1" -ge "1" ]; then -# /sbin/service %{name} condrestart > /dev/null 2>&1 -#fi -# We only remove it we this is not an upgrade -if [ "$1" = "0" ]; then - id privoxy > /dev/null 2>&1 && /usr/sbin/userdel privoxy || /bin/true -fi - -%clean -[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} - -%files -%defattr(0644,root,root,0755) -%doc README AUTHORS ChangeLog -%doc doc/text/developer-manual.txt doc/text/user-manual.txt -%doc doc/webserver/developer-manual -%doc doc/webserver/user-manual -%doc doc/webserver/faq -%doc doc/webserver/ijb_docs.css - -%dir %{privoxyconf} -%dir %{privoxyconf}/templates -%attr(0744,%{name},%{name}) %dir %{_localstatedir}/log/%{name} - -%attr(0744,%{name},%{name})%{_sbindir}/%{name} - -# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! -# We should not use wildchars here. This could mask missing files problems -# -- morcego -# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! -%config %{privoxyconf}/config -%config %{privoxyconf}/advanced.action -%config %{privoxyconf}/basic.action -%config %{privoxyconf}/intermediate.action -%config %{privoxyconf}/default.action -%config %{privoxyconf}/default.filter -%config %{privoxyconf}/trust - -%config %{privoxyconf}/templates/blocked -%config %{privoxyconf}/templates/blocked-compact -%config %{privoxyconf}/templates/cgi-error-404 -%config %{privoxyconf}/templates/cgi-error-bad-param -%config %{privoxyconf}/templates/cgi-error-disabled -%config %{privoxyconf}/templates/cgi-error-file -%config %{privoxyconf}/templates/cgi-error-modified -%config %{privoxyconf}/templates/cgi-error-parse -%config %{privoxyconf}/templates/connect-failed -%config %{privoxyconf}/templates/default -%config %{privoxyconf}/templates/edit-actions-add-url-form -%config %{privoxyconf}/templates/edit-actions-for-url -%config %{privoxyconf}/templates/edit-actions-list -%config %{privoxyconf}/templates/edit-actions-list-section -%config %{privoxyconf}/templates/edit-actions-list-url -%config %{privoxyconf}/templates/edit-actions-remove-url-form -%config %{privoxyconf}/templates/edit-actions-url-form -%config %{privoxyconf}/templates/no-such-domain -%config %{privoxyconf}/templates/show-request -%config %{privoxyconf}/templates/show-status -%config %{privoxyconf}/templates/show-status-file -%config %{privoxyconf}/templates/show-url-info -%config %{privoxyconf}/templates/show-version -%config %{privoxyconf}/templates/toggle -%config %{privoxyconf}/templates/toggle-mini -%config %{privoxyconf}/templates/untrusted -%config %{privoxyconf}/templates/edit-actions-for-url-filter -%config %{_sysconfdir}/logrotate.d/%{name} -%config %attr(0744,root,root) %{_sysconfdir}/rc.d/init.d/%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc0.d/K09%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc1.d/K09%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc2.d/S84%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc3.d/S84%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc4.d/K09%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc5.d/S84%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc6.d/K09%{name} - -%{_mandir}/man1/%{name}.* - -%changelog -* Tue Mar 25 2002 Hal Burgiss -+ privoxy-2.9.13-3 -- Fix typo in Description. - -* Tue Mar 26 2002 Rodrigo Barbosa -+ privoxy-2.9.13-3 -- Added commentary asking to update the release value on the configure - script - -* Tue Mar 25 2002 Hal Burgiss -+ privoxy-2.9.13-3 -- Added the missing edit-actions-for-url-filter to templates. - -* Mon Mar 25 2002 Rodrigo Barbosa -+ privoxy-2.9.13-2 -- Fixing Release number - -* Sun Mar 24 2002 Hal Burgiss -+ privoxy-2.9.13-2 -- Added faq to docs. - -* Sun Mar 24 2002 Rodrigo Barbosa -+ privoxy-2.9.13-2 -- Fixed the init files entries. Now we use %%ghost -- improved username (and groupname) handling on the %%pre section. By improved - I mean: we do it by brute force now. Much easier to maintain. Yeah, you - got it right. No more Mr. Nice Guy. -- Removed the userdel call on %%post. No need, once it's complety handled on - the %%pre section - -* Sun Mar 24 2002 Hal Burgiss -+ junkbusterng-2.9.13-1 - Added autoheader. Added autoconf to buildrequires. - -* Sun Mar 24 2002 Hal Burgiss -+ junkbusterng-2.9.13-1 -- Fixed build problems re: name conflicts with man page and logrotate. -- Commented out rc?d/* configs for time being, which are causing a build -- failure. /etc/junkbuster is now /etc/privoxy. Stefan did other name -- changes. Fixed typo ';' should be ':' causing 'rpm -e' to fail. - -* Fri Mar 22 2002 Rodrigo Barbosa -+ junkbusterng-2.9.13-1 -- References to the expression ijb where changed where possible -- New package name: junkbusterng (all in lower case, acording to - the LSB recomendation) -- Version changed to: 2.9.13 -- Release: 1 -- Added: junkbuster to obsoletes and conflicts (Not sure this is - right. If it obsoletes, why conflict ? Have to check it later) -- Summary changed: Stefan, please check and aprove it -- Changes description to use the new name -- Sed string was NOT changed. Have to wait to the manpage to - change first -- Keeping the user junkbuster for now. It will require some aditional - changes on the script (scheduled for the next specfile release) -- Added post entry to move the old logfile to the new log directory -- Removing "chkconfig --add" entry (not good to have it automaticaly - added to the startup list). -- Added preun section to stop the service with the old name, as well - as remove it from the startup list -- Removed the chkconfig --del entry from the conditional block on - the preun scriptlet (now handled on the %files section) - -* Thu Mar 21 2002 Hal Burgiss -- added ijb_docs.css to docs. - -* Mon Mar 11 2002 Hal Burgiss -+ junkbuster-2.9.11-8 -- Take out --enable-no-gifs, breaks some browsers. - -* Sun Mar 10 2002 Hal Burgiss -+ junkbuster-2.9.11-8 -- Add --enable-no-gifs to configure. - -* Fri Mar 08 2002 Rodrigo Barbosa -+ junkbuster-2.9.11-7 -- Added BuildRequires to libtool. - -* Tue Mar 06 2002 Rodrigo Barbosa -+ junkbuster-2.9.11-6 -- Changed the routined that handle the junkbust and junkbuster users on - %%pre and %%post to work in a smoother manner -- %%files now uses hardcoded usernames, to avoid problems with package - name changes in the future - -* Tue Mar 05 2002 Rodrigo Barbosa -+ junkbuster-2.9.11-5 -- Added "make redhat-dok" to the build process -- Added docbook-utils to BuildRequires - -* Tue Mar 05 2002 Rodrigo Barbosa -+ junkbuster-2.9.11-4 -- Changing man section in the manpage from 1 to 8 -- We now require packages, not files, to avoid issues with apt - -* Mon Mar 04 2002 Rodrigo Barbosa -+ junkbuster-2.9.11-3 -- Fixing permissions of the init script - -* Mon Mar 04 2002 Rodrigo Barbosa -+ junkbuster-2.9.11-2 -- General specfile fixup, using the best recomended practices, including: - - Adding -q to %%setup - - Using macros whereever possible - - Not using wildchars on %%files section - - Doubling the percentage char on changelog and comments, to - avoid rpm expanding them - -* Sun Mar 03 2002 Hal Burgiss -- /bin/false for shell causes init script to fail. Reverting. - -* Wed Jan 09 2002 Hal Burgiss -- Removed UID 73. Included user-manual and developer-manual in docs. - Include other actions files. Default shell is now /bin/false. - Userdel user=junkbust. ChangeLog was not zipped. Removed - RPM_OPT_FLAGS kludge. - -* Fri Dec 28 2001 Thomas Steudten -- add paranoia check for 'rm -rf %%{buildroot}' -- add gzip to 'BuildRequires' - -* Sat Dec 1 2001 Hal Burgiss -- actionsfile is now ijb.action. - -* Tue Nov 6 2001 Thomas Steudten -- Compress manpage -- Add more documents for installation -- Add version string to name and source - -* Wed Oct 24 2001 Hal Burigss -- Back to user 'junkbuster' and fix configure macro. - -* Wed Oct 10 2001 Hal Burigss -- More changes for user 'junkbust'. Init script had 'junkbuster'. - -* Sun Sep 23 2001 Hal Burgiss -- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files. -- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise. - -* Thu Sep 13 2001 Hal Burgiss -- Added $RPM_OPT_FLAGS support, renaming of old logfile, and -- made sure no default shell exists for user junkbust. - -* Sun Jun 3 2001 Stefan Waldherr -- rework of RPM - -* Mon Sep 25 2000 Stefan Waldherr -- CLF Logging patch by davep@cyw.uklinux.net -- Hal DeVore fix akamaitech in blocklist - -* Sun Sep 17 2000 Stefan Waldherr -- Steve Kemp skx@tardis.ed.ac.uk's javascript popup patch. -- Markus Breitenbach breitenb@rbg.informatik.tu-darmstadt.de supplied - numerous fixes and enhancements for Steve's patch. -- adamlock@netscape.com (Adam Lock) in the windows version: - - Taskbar activity spinner always spins even when logging is - turned off (which is the default) - people who don't - like the spinner can turn it off from a menu option. - - Taskbar popup menu has a options submenu - people can now - open the settings files for cookies, blockers etc. - without opening the JB window. - - Logging functionality works again - - Buffer overflow is fixed - new code uses a bigger buffer - and snprintf so it shouldn't overflow anymore. -- Fixed userid swa, group learning problem while installing. - root must build RPM. -- Added patch by Benjamin Low that prevents JB to - core dump when there is no log file. -- Tweaked SuSE startup with the help of mohataj@gmx.net and Doc.B@gmx.de. -- Fixed man page to include imagefile and popupfile. -- Sanity check for the statistics function added. -- "Patrick D'Cruze" : It seems Microsoft - are transitioning Hotmail from FreeBSD/Apache to Windows 2000/IIS. - With IIS/5, it appears to omit the trailing \r\n from http header - only messages. eg, when I visit http://www.hotmail.com, IIS/5 - responds with a HTTP 302 redirect header. However, this header - message is missing the trailing \r\n. IIS/5 then closes the - connection. Junkbuster, unfortunately, discards the header becomes - it thinks it is incomplete - and it is. MS have transmitted an - incomplete header! -- Added bug reports and patch submission forms in the docs. - -* Mon Mar 20 2000 Stefan Waldherr - Andrew extended the JB: - Display of statistics of the total number of requests and the number - of requests filtered by junkbuster, also the percentage of requests - filtered. Suppression of the listing of files on the proxy-args page. - All stuff optional and configurable. - -* Sun Sep 12 1999 Stefan Waldherr - Jan Willamowius (jan@janhh.shnet.org) fixed a bug in the - code which prevented the JB from handling URLs of the form - user:password@www.foo.com. Fixed. - -* Mon Aug 2 1999 Stefan Waldherr - Blank images are no longer cached, thanks to a hint from Markus - Breitenbach . The user - agent is NO longer set by the Junkbuster. Sadly, many sites depend - on the correct browser version nowadays. Incorporated many - suggestions from Jan "Yenya" Kasprzak for the - spec file. Fixed logging problem and since runlevel 2 does not - use networking, I replaced /etc/rc.d/rc2.d/S84junkbuster with - /etc/rc.d/rc2.d/K09junkbuster thanks to Shaw Walker - . You should now be able to build this RPM as - a non-root user (mathias@weidner.sem.lipsia.de). - -* Sun Jan 31 1999 Stefan Waldherr - %%{_localstatedir}/log/junkbuster set to nobody. Added /etc/junkbuster/imagelist - to allow more sophisticated matching of blocked images. Logrotate - logfile. Added files for auto-updating the blocklist et al. - -* Wed Dec 16 1998 Stefan Waldherr - Configure blank version via config file. No separate blank - version anymore. Added Roland's - patch to show a logo instead of a blank area. Added a suggestion - from Alex : %%{_localstatedir}/lock/subsys/junkbuster. - More regexps in the blocklist. Prepared the forwardfile for - squid. Extended image regexp with help from gabriel - . - -* Thu Nov 19 1998 Stefan Waldherr - All RPMs now identify themselves in the show-proxy-args page. - Released Windoze version. Run junkbuster as nobody instead of - root. - -* Fri Oct 30 1998 Stefan Waldherr - Newest version. First release (hence the little version number - mixture -- 2.0.2-0 instead of 2.0-7). This version tightens - security over 2.0.1; some multi-user sites will need to change - the listen-address in the configuration file. The blank version of - the Internet Junkbuster has a more sophisticated way of replacing - images. All RPMs identify themselves in the show-proxy-args page. - -* Thu Sep 23 1998 Stefan Waldherr - Modified the blocking feature, so that only GIFs and JPEGs are - blocked and replaced but not HTML pages. Thanks to - "Gerd Flender" for this nice - idea. Added numerous stuff to the blocklist. Keep patches in - seperate files and no longer in diffs (easier to maintain). - -* Tue Jun 16 1998 Stefan Waldherr - Moved config files to /etc/junkbuster directory, moved man page, - added BuildRoot directive (Thanks to Alexey Nogin ) - Made new version junkbuster-raw (which is only a stripped version of - the junkuster rpm, i.e. without my blocklist, etc.) - -* Tue Jun 16 1998 (2.0-1) - Uhm, not that much. Just a new junkbuster version that - fixes a couple of bugs ... and of course a bigger - blocklist with the unique Now-less-ads-than-ever(SM) - feature. - Oh, one thing: I changed the default user agent to Linux -- no - need anymore to support Apple. - -* Tue Jun 16 1998 (2.0-0) - Now-less-ads-than-ever (SM) - compiled with gcc instead of cc - compiled with -O3, thus it should be a little faster - show-proxy-args now works - /etc/junkbuster.init wasn't necessary - -* Tue Jun 16 1998 (1.4) - some more config files were put into /etc - The junkbuster-blank rpm returns a 1x1 pixel image, that gets - displayed by Netscape instead of the blocked image. - Read http://www.waldherr.org/junkbuster/ for - further info. - -* Tue Jun 16 1998 (1.3) - The program has been moved to /usr/sbin (from /usr/local/bin) - Init- and stopscripts (/etc/rc.d/rc*) have been added so - that the junkbuster starts automatically during bootup. - The /etc/blocklist file is much more sophisticated. Theoretically - one should e.g. browse all major US and German newspapers without - seeing one annoying ad. - junkbuster.init was modified. It now starts junkbuster with an - additional "-r @" flag. - -# $Log: privoxy-rh.spec,v $ -# Revision 1.16 2002/03/26 22:29:55 swa -# we have a new homepage! -# -# Revision 1.15 2002/03/26 17:39:54 morcego -# Adding comment on the specfile to remember the packager to update -# the release number on the configure script -# -# Revision 1.14 2002/03/26 14:25:15 hal9 -# Added edit-actions-for-url-filter to templates in %%config -# -# Revision 1.13 2002/03/25 13:31:04 morcego -# Bumping Release tag. -# -# Revision 1.12 2002/03/25 03:11:40 hal9 -# Do it right way this time :/ -# -# Revision 1.11 2002/03/25 03:09:51 hal9 -# Added faq to docs. -# -# Revision 1.10 2002/03/24 22:16:14 morcego -# Just removing some old commentaries. -# -# Revision 1.9 2002/03/24 22:03:22 morcego -# Should be working now. See %changelog for details -# -# Revision 1.8 2002/03/24 21:13:01 morcego -# Tis broken. -# -# Revision 1.7 2002/03/24 21:07:18 hal9 -# Add autoheader, etc. -# -# Revision 1.6 2002/03/24 19:56:40 hal9 -# /etc/junkbuster is now /etc/privoxy. Fixed ';' typo. -# -# Revision 1.4 2002/03/24 13:32:42 swa -# name change related issues -# -# Revision 1.3 2002/03/24 12:56:21 swa -# name change related issues. -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.1 2002/03/22 20:53:03 morcego -# - Ongoing process to change name to JunkbusterNG -# - configure/configure.in: no change needed -# - GNUmakefile.in: -# - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz -# - PROGRAM = jbng@EXEEXT@ -# - rh-spec now references as junkbusterng-rh.spec -# - redhat-upload: references changed to junkbusterng-* (package names) -# - tarball-dist: references changed to JunkbusterNG-distribution-* -# - tarball-src: now JunkbusterNG-* -# - install: initscript now junkbusterng.init and junkbusterng (when -# installed) -# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec -# - junkbusterng.spec: -# - References to the expression ijb where changed where possible -# - New package name: junkbusterng (all in lower case, acording to -# the LSB recomendation) -# - Version changed to: 2.9.13 -# - Release: 1 -# - Added: junkbuster to obsoletes and conflicts (Not sure this is -# right. If it obsoletes, why conflict ? Have to check it later) -# - Summary changed: Stefan, please check and aprove it -# - Changes description to use the new name -# - Sed string was NOT changed. Have to wait to the manpage to -# change first -# - Keeping the user junkbuster for now. It will require some aditional -# changes on the script (scheduled for the next specfile release) -# - Added post entry to move the old logfile to the new log directory -# - Removing "chkconfig --add" entry (not good to have it automaticaly -# added to the startup list). -# - Added preun section to stop the service with the old name, as well -# as remove it from the startup list -# - Removed the chkconfig --del entry from the conditional block on -# the preun scriptlet (now handled on the %files section) -# - junkbuster.init: renamed to junkbusterng.init -# - junkbusterng.init: -# - Changed JB_BIN to jbng -# - Created JB_OBIN with the old value of JB_BIN (junkbuster), to -# be used where necessary (config dir) -# -# Aditional notes: -# - The config directory is /etc/junkbuster yet. Have to change it on the -# specfile, after it is changes on the code -# - The only files that got renamed on the cvs tree were the rh specfile and -# the init file. Some file references got changes on the makefile and on the -# rh-spec (as listed above) -# -# Revision 1.43 2002/03/21 16:04:10 hal9 -# added ijb_docs.css to %doc -# -# Revision 1.42 2002/03/12 13:41:18 sarantis -# remove hard-coded "ijbswa" string in build phase -# -# Revision 1.41 2002/03/11 22:58:32 hal9 -# Remove --enable-no-gifs -# -# Revision 1.39 2002/03/08 18:57:29 swa -# remove user junkbuster after de-installation. -# -# Revision 1.38 2002/03/08 13:45:27 morcego -# Adding libtool to Buildrequires -# -# Revision 1.37 2002/03/07 19:23:49 swa -# i hate to scroll. suse: wrong configdir. -# -# Revision 1.36 2002/03/07 05:06:54 morcego -# Fixed %pre scriptlet. And, as a bonus, you can even understand it now. :-) -# -# Revision 1.34 2002/03/07 00:11:57 morcego -# Few changes on the %pre and %post sections of the rh specfile to handle -# usernames more cleanly -# -# Revision 1.33 2002/03/05 13:13:57 morcego -# - Added "make redhat-dok" to the build phase -# - Added docbook-utils to BuildRequires -# -# Revision 1.32 2002/03/05 12:34:24 morcego -# - Changing section internaly on the manpage from 1 to 8 -# - We now require packages, not files, to avoid issues with apt -# -# Revision 1.31 2002/03/04 18:06:09 morcego -# SPECFILE: fixing permissing of the init script (broken by the last change) -# -# Revision 1.30 2002/03/04 16:18:03 morcego -# General cleanup of the rh specfile. -# -# %changelog -# * Mon Mar 04 2002 Rodrigo Barbosa -# + junkbuster-2.9.11-2 -# - General specfile fixup, using the best recomended practices, including: -# - Adding -q to %%setup -# - Using macros whereever possible -# - Not using wildchars on %%files section -# - Doubling the percentage char on changelog and comments, to -# avoid rpm expanding them -# -# Revision 1.29 2002/03/03 19:21:22 hal9 -# Init script fails if shell is /bin/false. -# -# Revision 1.28 2002/01/09 18:34:03 hal9 -# nit. -# -# Revision 1.27 2002/01/09 18:32:02 hal9 -# Removed RPM_OPT_FLAGS kludge. -# -# Revision 1.26 2002/01/09 18:21:10 hal9 -# A few minor updates. -# -# Revision 1.25 2001/12/28 01:45:36 steudten -# Add paranoia check and BuildReq: gzip -# -# Revision 1.24 2001/12/01 21:43:14 hal9 -# Allowed for new ijb.action file. -# -# Revision 1.23 2001/11/06 12:09:03 steudten -# Compress doc files. Install README and AUTHORS at last as document. -# -# Revision 1.22 2001/11/05 21:37:34 steudten -# Fix to include the actual version for name. -# Let the 'real' packager be included - sorry stefan. -# -# Revision 1.21 2001/10/31 19:27:27 swa -# consistent description. new name for suse since -# we had troubles with rpms of identical names -# on the webserver. -# -# Revision 1.20 2001/10/24 15:45:49 hal9 -# To keep Thomas happy (aka correcting my mistakes) -# -# Revision 1.19 2001/10/15 03:23:59 hal9 -# Nits. -# -# Revision 1.17 2001/10/10 18:59:28 hal9 -# Minor change for init script. -# -# Revision 1.16 2001/09/24 20:56:23 hal9 -# Minor changes. -# -# Revision 1.13 2001/09/10 17:44:43 swa -# integrate three pieces of documentation. needs work. -# will not build cleanly under redhat. -# -# Revision 1.12 2001/09/10 16:25:04 swa -# copy all templates. version updated. -# -# Revision 1.11 2001/07/03 11:00:25 sarantis -# replaced permissionsfile with actionsfile -# -# Revision 1.10 2001/07/03 09:34:44 sarantis -# bumped up version number. -# -# Revision 1.9 2001/06/12 18:15:29 swa -# the %% in front of configure (see tag below) confused -# the rpm build process on 7.1. -# -# Revision 1.8 2001/06/12 17:15:56 swa -# fixes, because a clean build on rh6.1 was impossible. -# GZIP confuses make, %% configure confuses rpm, etc. -# -# Revision 1.7 2001/06/11 12:17:26 sarantis -# fix typo in %%post -# -# Revision 1.6 2001/06/11 11:28:25 sarantis -# Further optimizations and adaptations in the spec file. -# -# Revision 1.5 2001/06/09 09:14:11 swa -# shamelessly adapted RPM stuff from the newest rpm that -# RedHat provided for the JB. -# -# Revision 1.4 2001/06/08 20:54:18 swa -# type with status file. remove forward et. al from file list. -# -# Revision 1.3 2001/06/07 17:28:10 swa -# cosmetics -# -# Revision 1.2 2001/06/04 18:31:58 swa -# files are now prefixed with either `confdir' or `logdir'. -# `make redhat-dist' replaces both entries confdir and logdir -# with redhat values -# -# Revision 1.1 2001/06/04 10:44:57 swa -# `make redhatr-dist' now works. Except for the paths -# in the config file. -# -# -# diff --git a/privoxy-suse.spec b/privoxy-suse.spec deleted file mode 100644 index 39aa6e0f..00000000 --- a/privoxy-suse.spec +++ /dev/null @@ -1,382 +0,0 @@ -# $Id: privoxy-suse.spec,v 1.6 2002/03/26 22:29:55 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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. -# - -# do not set to %{name} -%define ijbconf %{_sysconfdir}/privoxy - -Summary: Privoxy - privacy enhancing proxy -Vendor: http://www.privoxy.org -Name: privoxy-suse -Distribution: defineme -Version: 2.9.13 -Release: 1 -Source: http://www.waldherr.org/%{name}/privoxy-%{version}.tar.gz -# not sure if this works -BuildRoot: %{_tmppath}/%{name}-%{version}-root -Packager: Stefan Waldherr -Copyright: GPL -Group: Networking/Utilities -URL: http://www.privoxy.org/ -Provides: privoxy -Obsoletes: privoxy -Autoreqprov: on -BuildRequires: perl gzip docbktls libtool -Conflicts: junkbuster-raw junkbuster-blank junkbuster - -# -# ----------------------------------------------------------------------------- -# -%description -Privoxy is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other -obnoxious Internet junk. Privoxy has a very flexible configuration and -can be customized to suit individual needs and tastes. Privoxy has -application for both stand-alone systems and multi-user networks. - -Privoxy is based on the code of the Internet Junkbuster. Junkbuster -was originally written by JunkBusters Corporation, and was released as -free open-source software under the GNU GPL. Stefan Waldherr made many -improvements, and started the SourceForge project to continue -development. Several other developers are now contributing. - -Authors: --------- - http://www.privoxy.org/ - -SuSE series: n - -# -# ----------------------------------------------------------------------------- -# -%prep -%setup -c - -# -# ----------------------------------------------------------------------------- -# -%build -autoheader -autoconf -./configure -make -make dok - -## Explicitily stripping is not recomended. -## This is handled altomaticaly by RPM, and can couse troubles if -## anyone wants to build an unstriped version - morcego -#strip privoxy - -# -# ----------------------------------------------------------------------------- -# -%install -[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT -mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} \ - ${RPM_BUILD_ROOT}%{_mandir}/man8 \ - ${RPM_BUILD_ROOT}/var/log/privoxy \ - ${RPM_BUILD_ROOT}%{ijbconf}/templates \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/init.d -gzip README AUTHORS ChangeLog privoxy.1 || /bin/true -install -s -m 744 privoxy $RPM_BUILD_ROOT%{_sbindir}/privoxy -cp -f privoxy.1.gz $RPM_BUILD_ROOT%{_mandir}/man8/privoxy.8.gz -cp -f *.action $RPM_BUILD_ROOT%{ijbconf}/ -cp -f default.filter $RPM_BUILD_ROOT%{ijbconf}/default.filter -cp -f trust $RPM_BUILD_ROOT%{ijbconf}/trust -cp -f templates/* $RPM_BUILD_ROOT%{ijbconf}/templates/ -cp -f privoxy.logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/privoxy -install -m 755 privoxy.init.suse $RPM_BUILD_ROOT%{_sysconfdir}/init.d/privoxy -install -m 711 -d $RPM_BUILD_ROOT/var/log/privoxy -ln -sf /etc/init.d/privoxy $RPM_BUILD_ROOT/usr/sbin/rcprivoxy - -# verify all file locations, etc. in the config file -# don't start with ^ or commented lines are not replaced -cat config | \ - sed 's/^confdir.*/confdir \/etc\/privoxy/g' | \ -# sed 's/^permissionsfile.*/permissionsfile \/etc\/privoxy\/permissionsfile/g' | \ -# sed 's/^filterfile.*/default.filter \/etc\/privoxy\/default.filter/g' | \ -# sed 's/^logfile.*/logfile \/var\/log\/privoxy\/logfile/g' | \ -# sed 's/^jarfile.*/jarfile \/var\/log\/privoxy\/jarfile/g' | \ -# sed 's/^forward.*/forward \/etc\/privoxy\/forward/g' | \ -# sed 's/^aclfile.*/aclfile \/etc\/privoxy\/aclfile/g' > \ - sed 's/^logdir.*/logdir \/var\/log\/privoxy/g' > \ - $RPM_BUILD_ROOT%{ijbconf}/config - -# -# ----------------------------------------------------------------------------- -# -%pre -# We check to see if the user privoxy exists. -# If it does, we do nothing -# If we don't, we check to see if the user junkbust exist and, in case it -# does, we change it do privoxy. If it also does not exist, we create the -# privoxy user -- morcego -id privoxy > /dev/null 2>&1 -if [ $? -eq 1 ]; then - id junkbust > /dev/null 2>&1 - if [ $? -eq 0 ]; then - /usr/sbin/usermod -l privoxy -d %{_sysconfdir}/privoxy -s "" junkbust > /dev/null 2>&1 - else -# -r does not work on suse. - /usr/sbin/groupadd privoxy - /usr/sbin/useradd -d %{_sysconfdir}/privoxy -g privoxy -s "" privoxy > /dev/null 2>&1 - fi -fi - -# -# ----------------------------------------------------------------------------- -# -%post -[ -f /var/log/privoxy/privoxy ] &&\ - mv -f /var/log/privoxy/privoxy /var/log/privoxy/logfile || /bin/true -chown -R privoxy:privoxy /var/log/privoxy 2>/dev/null -chown -R privoxy:privoxy /etc/privoxy 2>/dev/null -# not available on suse -#if [ "$1" = "1" ]; then -# /sbin/chkconfig --add privoxy -# /sbin/service privoxy condrestart > /dev/null 2>&1 -#fi -# 01/09/02 HB, getting rid of any user=junkbust -# Changed by morcego to use the id command. -id junkbust > /dev/null 2>&1 && /usr/sbin/userdel junkbust || /bin/true -sbin/insserv etc/init.d/privoxy - -# -# ----------------------------------------------------------------------------- -# -%preun -# need to stop the service on suse. swa. -#if [ "$1" = "0" ]; then -# /sbin/service privoxy stop > /dev/null 2>&1 ||: -#fi - -# -# ----------------------------------------------------------------------------- -# -%postun -sbin/insserv etc/init.d/ -# dont forget to remove user and group privoxy -id privoxy > /dev/null 2>&1 && /usr/sbin/userdel privoxy || /bin/true - -# -# ----------------------------------------------------------------------------- -# -%clean -[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT - -# -# ----------------------------------------------------------------------------- -# -%files -%defattr(-,root,root) -%doc README.gz AUTHORS.gz ChangeLog.gz -%doc doc/webserver/developer-manual doc/webserver/user-manual -%doc doc/webserver/user-manual -%doc doc/webserver/faq -%doc doc/webserver/ijb_docs.css -#%doc privoxy.weekly privoxy.monthly AUTHORS -%dir %{ijbconf} -%config %{ijbconf}/* -%attr(0744,privoxy,privoxy) %dir /var/log/privoxy -%config %{_sysconfdir}/logrotate.d/privoxy -%attr(0755,root,root)/usr/sbin/privoxy -%{_mandir}/man8/* -%config %{_sysconfdir}/init.d/privoxy -/usr/sbin/rcprivoxy - -# -# ----------------------------------------------------------------------------- -# -%changelog -* Tue Mar 25 2002 Hal Burgiss -+ privoxy-2.9.13-3 -- Minor fix to description. - -* Sun Mar 24 2002 Hal Burgiss -- added faq to docs. - -* Thu Mar 21 2002 Hal Burgiss -- added ijb_docs.css to docs. - -* Mon Mar 11 2002 Hal Burgiss -- Remove --enable-no-gifs from configure. - -* Sun Mar 03 2002 Hal Burgiss -- /bin/false for shell causes init script to fail. Reverting. - -* Wed Jan 09 2002 Hal Burgiss -- Removed UID 73. Included user-manual and developer-manual in docs. - Include other actions files. Default shell is now /bin/false. - Userdel user=junkbust. ChangeLog was not zipped. Removed - RPM_OPT_FLAGS kludge. - -* Fri Dec 28 2001 Thomas Steudten -- add paranoia check for 'rm -rf $RPM_BUILD_ROOT' -- add gzip to 'BuildRequires' - -* Sat Dec 1 2001 Hal Burgiss -- actionsfile is now ijb.action. - -* Tue Nov 6 2001 Thomas Steudten -- Compress manpage -- Add more documents for installation -- Add version string to name and source - -* Wed Oct 24 2001 Hal Burigss -- Back to user 'junkbuster' and fix configure macro. - -* Wed Oct 10 2001 Hal Burigss -- More changes for user 'junkbust'. Init script had 'junkbuster'. - -* Sun Sep 23 2001 Hal Burgiss -- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files. -- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise. - -* Thu Sep 13 2001 Hal Burgiss -- Added $RPM_OPT_FLAGS support, renaming of old logfile, and -- made sure no default shell exists for user junkbust. - -* Sun Jun 3 2001 Stefan Waldherr -- rework of RPM -* Wed Feb 14 2001 - uli@suse.de -- fixed init script -* Wed Dec 06 2000 - bjacke@suse.de -- renamed package to junkbuster -- fixed copyright tag -* Thu Nov 30 2000 - uli@suse.de -- moved init script to /etc/init.d -* Wed Feb 16 2000 - kukuk@suse.de -- Move /usr/man -> /usr/share/man -- Mark /etc/ijb as "config(noreplace)" -* Mon Sep 20 1999 - uli@suse.de -- fixed init script -* Mon Sep 13 1999 - bs@suse.de -- ran old prepare_spec on spec file to switch to new prepare_spec. -* Thu Apr 01 1999 - daniel@suse.de -- do not start ijb as root (security) -* Tue Mar 30 1999 - daniel@suse.de -- don´t use saclfile.ini -* Tue Mar 30 1999 - daniel@suse.de -- small fix to whitelist-configuration, - version is and was 2.0.2 WITHOUT Stefan Waldherr's patches - (http://www.waldherr.org/junkbuster/) -* Mon Mar 01 1999 - daniel@suse.de -- new package: version 2.0 - -# $Log: privoxy-suse.spec,v $ -# Revision 1.6 2002/03/26 22:29:55 swa -# we have a new homepage! -# -# Revision 1.5 2002/03/25 03:10:50 hal9 -# Added faq to docs. -# -# Revision 1.4 2002/03/24 12:56:21 swa -# name change related issues. -# -# Revision 1.3 2002/03/24 12:44:31 swa -# new version string -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.21 2002/03/21 16:04:33 hal9 -# added ijb_docs.css to %%doc -# -# Revision 1.20 2002/03/12 13:42:14 sarantis -# remove hardcoded "ijbswa" from build phase -# -# Revision 1.19 2002/03/11 22:59:05 hal9 -# Remove --enable-no-gifs -# -# Revision 1.18 2002/03/11 12:30:31 swa -# be consistent with rh spec file -# -# Revision 1.17 2002/03/08 19:30:23 swa -# remove user junkbuster after de-installation. -# synced suse with rh-specfile. installation -# and de-installation seem to work. -# -# Revision 1.16 2002/03/08 18:40:44 swa -# build requires tools. useradd and del works -# now. -# -# Revision 1.15 2002/03/07 19:23:50 swa -# i hate to scroll. suse: wrong configdir. -# -# Revision 1.14 2002/03/07 19:10:21 swa -# builds cleanly. thanks to kukuk@suse.de -# not yet tested. -# -# Revision 1.13 2002/03/07 18:25:56 swa -# synced redhat and suse build process -# -# Revision 1.12 2002/03/02 15:50:04 swa -# 2.9.11 version. more input for docs. -# -# Revision 1.11 2001/12/02 10:29:26 swa -# New version made these changes necessary. -# -# Revision 1.10 2001/10/31 19:27:27 swa -# consistent description. new name for suse since -# we had troubles with rpms of identical names -# on the webserver. -# -# Revision 1.9 2001/10/26 18:17:23 swa -# new version string -# -# Revision 1.8 2001/09/13 16:22:42 swa -# man page is legacy. suse rpm now contains html -# documentation. -# -# Revision 1.7 2001/09/10 17:44:22 swa -# integrate three pieces of documentation. -# -# Revision 1.6 2001/09/10 16:29:23 swa -# binary contained debug info. -# buildroot definition fucks up the build process under suse. -# program needs to write in varlogjunkbuster -# install all templates -# create varlogjunkbuster -# -# Revision 1.5 2001/06/09 09:13:29 swa -# description shorter -# -# Revision 1.4 2001/06/08 20:53:36 swa -# use buildroot, export init to separate file (better manageability) -# -# Revision 1.3 2001/06/07 17:28:10 swa -# cosmetics -# -# Revision 1.2 2001/06/07 17:18:44 swa -# header fixed -# -# diff --git a/privoxy.1 b/privoxy.1 deleted file mode 100644 index 0afd8922..00000000 --- a/privoxy.1 +++ /dev/null @@ -1,334 +0,0 @@ -.\" Revised man page 10/13/01, for development version. -.\" Hal Burgiss -.\" for Privoxy developers: ijbswa-developers@lists.sourceforge.net -.\" -.TH PRIVOXY 1 "v2.9.13 (beta) Date: 2002/03/24" - -.SH NAME -\fBprivoxy\fP -- Privacy enhancing -Proxy -.\"\s-2(TM)\s+2 -.SH SYNOPSIS -\fBprivoxy\fP -[--help] [--version] [--no-daemon] [--pidfile \fIpidfile\fP] [--user \fIuser\fP[.\fIgroup\fP]] -\fI\&[configfile]\fP (Unix) -.TP -\fBprivoxy.exe\fP \fI[configfile]\fP (Windows) -.br - -.SH OPTIONS -\fBPrivoxy\fP may be invoked with the following command-line options: -.TP -.BR --version " (unix only)" -Print version info and exit. -.TP -.BR --help " (unix only)" -Print a short usage info and exit. -.TP -.BR --no-daemon " (unix only)" -Don't become a daemon, i.e. don't fork and become process group -leader, don't detach from controlling tty, and do all logging -there. -.TP -\fB --pidfile\fP \fIpidfile\fP (unix only) -On startup, write the process ID to \fIpidfile\fP. Delete the -\fIpidfile\fP on exit. Failiure to create or delete the -\fIpidfile\fP is non-fatal. If no \fB--pidfile\fP option -is given, no PID file will be used. -.TP -\fB --user\fP \fIuser\fP[.\fIgroup\fP] (unix only) -After (optionally) writing the PID file, assume the user ID -of \fIuser\fP and the GID of \fIgroup\fP, or, if the optional -\fIgroup\fP was not given, the default group of \fIuser\fP. -Exit if the privileges are not sufficient to do so. - -.PP -If the \fIconfigfile\fP is not specified on the command line, -\fBPrivoxy\fP will look for a file named \fBconfig\fP in the -current directory (except on Win32 where it will try \fBconfig.txt\fP). - - -.SH DESCRIPTION -\fBPrivoxy\fP is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other -obnoxious Internet junk. \fBPrivoxy\fP has a very flexible configuration and -can be customized to suit individual needs and tastes. \fBPrivoxy\fP has -application for both stand-alone systems and multi-user networks. -.PP -\fBPrivoxy\fP is based on code of the \fBInternet Junkbuster (tm)\fP -\fBJunkbuster\fP was originally written by JunkBusters Corporation, and was -released as free open-source software under the GNU GPL. Stefan Waldherr made -many improvements, and started the SourceForge project to continue -development. - -.SH INSTALLATION AND USE -Browsers must be individually configured to use -\fBPrivoxy\fP as a HTTP proxy. -The default setting is for localhost, -on port 8118 (configurable in the main config file). -To set the -\s-2HTTP\s0 -proxy in Netscape and Mozilla, -go through: -\fB\&Edit\fP; -\fB\&Preferences\fP; -\fB\&Advanced\fP; -\fB\&Proxies\fP; -\fB\&Manual Proxy Configuration\fP; -\fB\&View\fP. -.PP -For Internet Explorer, -go through: -\fB\&Tools\fP; -\fB\&Internet Properties\fP; -\fB\&Connections\fP; -\fB\&LAN Settings\fP. -.PP -The -Secure (SSL) Proxy \" ijbfaq.html#security -should also be set to the same values, -otherwise -\fB\&https:\fP -\s-2URL\s0s -will not be proxied. -.PP -For other browsers, check the documentation. - -.SH CONFIGURATION -\fBPrivoxy\fP can be configured with the various configuration -files. The default configuration files are: \fIconfig\fP, -\fIdefault.action\fP, and \fIdefault.filter\fP. These are well commented. -On Unix and Unix-like systems, these are located in \fI/etc/privoxy/\fP -by default. On Windows, OS/2 and AmigaOS, these files are in the same directory -as the \fBPrivoxy\fP executable. -.PP -The name and number of configuration files has changed from previous versions, -and is subject to change as development progresses. In fact, the configuration -itself is changed and much more sophisticated. See the user-manual for a brief -explanation of all configuration options. -.PP -The actions list (ad blocks, etc) can also be configured with your -web browser at \fIhttp://www.privoxy.org/config\fP. -\fBPrivoxy's\fP configuration parameters can also be viewed -at the same page. In addition, \fBPrivoxy\fP can be toggled on/off. -This is an internal page. - -.SH "SAMPLE CONFIGURATION" -.PP -A brief example of what a \fIdefault.action\fP configuration might look like: -.PP -.nf - -# Define a few useful custom aliases for later use -{{alias}} - -# Don't accept cookies -+no-cookies = +no-cookies-set +no-cookies-read - -# Do accept cookies --no-cookies = -no-cookies-set -no-cookies-read - -# Treat these blocked URLs as images. -+imageblock = +block +image - -# Define page filters we want to use. -myfilters = +filter{html-annoyances} +filter{js-annoyances}\\ - +filter{no-popups} +filter{webbugs} - -## Default Policies (actions) ############################ -{ \\ - -block \\ - -downgrade \\ - +fast-redirects \\ - myfilters \\ - +no-compression \\ - +hide-forwarded \\ - +hide-from{block} \\ - +hide-referer{forge} \\ - -hide-user-agent \\ - -image \\ - +image-blocker{blank} \\ - +no-cookies-keep \\ - -no-cookies-read \\ - -no-cookies-set \\ - +no-popups \\ - -vanilla-wafer \\ - -wafer \\ -} -/ - -# Now set exceptions to the above defined policies ####### - -# Sites where we want persistant cookies -{-no-cookies -no-cookies-keep} - .redhat.com - .sun.com - .yahoo.com - .msdn.microsoft.com - -# This site requires cookies AND 'fast-redirects' on -{-no-cookies -no-cookies-keep -fast-redirects} - .nytimes.com - -# Add custom headers, and turn off filtering of page source -{+add-header{X-Privacy: Yes please} #-add-header{*} \\ - +add-header{X-User-Tracking: No thanks!} -filter} - privacy.net - -# Block, and treat these URLs as 'images'. -{+imageblock} - .adforce.imgis.com - .ad.preferences.com/image.* - .ads.web.aol.com - .ad-adex3.flycast.com - .ad.doubleclick.net - .ln.doubleclick.net - .ad.de.doubleclick.net - /.*/count\\.cgi\\?.*df= - 194.221.183.22[1-7] - a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/ - -# Block any URLs that match these patterns -{+block} - /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\\.(gif|jpe?g)) - /.*/(plain|live|rotate)[-_.]?ads?/ - /.*/(sponsor)s?[0-9]?/ - /.*/ad(server|stream|juggler)\\.(cgi|pl|dll|exe) - /.*/adbanners/ - /.*/adv((er)?ts?|ertis(ing|ements?))?/ - /.*/banners?/ - /.*/popupads/ - /.*/advert[0-9]+\\.jpg - /ad_images/ - /.*/ads/ - /images/.*/.*_anim\\.gif - /rotations/ - /.*(ms)?backoff(ice)?.*\\.(gif|jpe?g) - 195.63.104.*/(inbox|log|meld|folderlu|folderru|log(in|out)[lmr]u|) - .images.nytimes.com - .images.yahoo.com/adv/ - /.*cnnstore\\.gif - -.fi -.sp -.PP -See the comments in the configuration files themselves, or the user-manual -for explanations of the above syntax, and other \fBPrivoxy\fP configuration -options. - -.SH "FILES" -\fI/usr/sbin/privoxy\fP -.br -\fI/etc/privoxy/config\fP -.br -\fI/etc/privoxy/default.action\fP -.br -\fI/etc/privoxy/advanced.action\fP -.br -\fI/etc/privoxy/basic.action\fP -.br -\fI/etc/privoxy/intermediate.action\fP -.br -\fI/etc/privoxy/default.filter\fP -.br -\fI/etc/privoxy/trust\fP -.br -\fI/etc/privoxy/templates/*\fP -.br -\fI/var/log/privoxy/logfile\fP - -.PP -Various other files should be included, but may vary depending on platform -and build configuration. More documentation should be included in the local -documentation directory, though is not complete at this time. - -.SH SIGNALS -\fBPrivoxy\fP terminates on the \fBSIGINT\fP, \fBSIGTERM\fP and \fBSIGABRT\fP -signals. Log rotation scripts may cause a re-opening of the logfile by sending -a \fBSIGHUP\fP to \fBPrivoxy\fP. Note that unlike other daemons, \fBPrivoxy\fP -does not need to be made aware of config file changes by \fBSIGHUP\fP -- it will -detect them automatically. - -.SH NOTES -This is a \fBBETA\fP version of \fBPrivoxy\fP. Not all features are -complete or well tested. -.PP -Please see the user-maual on how to contact the developers for -feature requests, reporting problems, and other questions. - -.SH BUGS -Probably. Please see the user-manual for how and where to report bugs. - -.SH SEE ALSO -.br -http://www.privoxy.org/config -.br -http://www.privoxy.org/ -.br -http://sourceforge.net/projects/ijbswa -.br -http://www.waldherr.org/junkbuster/\" waldherr.org# -.br -http://www.junkbusters.com/ht/en/cookies.html\" cookies.html# -.br -http://privacy.net/analyze/ -.br -http://www.squid-cache.org/ -.br -http://linuxalpha.ch/packages/ - -.SH DEVELOPMENT TEAM -.br - Stefan Waldherr -.br - Andreas Oesterhelt -.br - Jon Foster -.br - Markus Breitenbach -.br - Thomas Steudten -.br - David Schmidt -.br - Haroon Rafique -.br - Joerg Strohmayer -.br - Shamim Mohamed -.br - Sarantis Paskalis -.br - Gabriel L. Somlo -.br - John Venvertloh -.br - Hal Burgiss -.br - Rodrigo Barbosa - -.SH COPYRIGHT AND LICENSE -\"Orginally written by, and copyrighted by, the Anonymous Coders and Junkbusters -\"Corporation. -\".PP -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. -.PP -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. -.PP -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -.PP -Internet Junkbuster -Proxy -is a -trademark \" legal.html#marks -of Junkbusters Corporation. diff --git a/privoxy.init b/privoxy.init deleted file mode 100644 index a835405c..00000000 --- a/privoxy.init +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/privoxy.init,v $ -# -# Purpose : This shell script takes care of starting and stopping -# privoxy. -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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: privoxy.init,v $ -# Revision 1.5 2002/03/25 06:14:18 morcego -# Removing the OPRG definition (no longer needed) -# -# Revision 1.4 2002/03/25 04:16:48 hal9 -# Fix proper config file location. -# -# Revision 1.3 2002/03/24 19:12:15 hal9 -# Fixed some naming conflicts. -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.1 2002/03/22 20:53:03 morcego -# - Ongoing process to change name to JunkbusterNG -# - configure/configure.in: no change needed -# - GNUmakefile.in: -# - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz -# - PROGRAM = jbng@EXEEXT@ -# - rh-spec now references as junkbusterng-rh.spec -# - redhat-upload: references changed to junkbusterng-* (package names) -# - tarball-dist: references changed to JunkbusterNG-distribution-* -# - tarball-src: now JunkbusterNG-* -# - install: initscript now junkbusterng.init and junkbusterng (when -# installed) -# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec -# - junkbusterng.spec: -# - References to the expression ijb where changed where possible -# - New package name: junkbusterng (all in lower case, acording to -# the LSB recomendation) -# - Version changed to: 2.9.13 -# - Release: 1 -# - Added: junkbuster to obsoletes and conflicts (Not sure this is -# right. If it obsoletes, why conflict ? Have to check it later) -# - Summary changed: Stefan, please check and aprove it -# - Changes description to use the new name -# - Sed string was NOT changed. Have to wait to the manpage to -# change first -# - Keeping the user junkbuster for now. It will require some aditional -# changes on the script (scheduled for the next specfile release) -# - Added post entry to move the old logfile to the new log directory -# - Removing "chkconfig --add" entry (not good to have it automaticaly -# added to the startup list). -# - Added preun section to stop the service with the old name, as well -# as remove it from the startup list -# - Removed the chkconfig --del entry from the conditional block on -# the preun scriptlet (now handled on the %files section) -# - junkbuster.init: renamed to junkbusterng.init -# - junkbusterng.init: -# - Changed JB_BIN to jbng -# - Created JB_OBIN with the old value of JB_BIN (junkbuster), to -# be used where necessary (config dir) -# -# Aditional notes: -# - The config directory is /etc/junkbuster yet. Have to change it on the -# specfile, after it is changes on the code -# - The only files that got renamed on the cvs tree were the rh specfile and -# the init file. Some file references got changes on the makefile and on the -# rh-spec (as listed above) -# -# Revision 1.15 2002/03/09 15:05:58 swa -# wrong user.group -# -# Revision 1.14 2002/03/06 06:13:40 hal9 -# Adapted for Andreas' changes for --user and --pidfile. -# -# Revision 1.13 2002/03/05 05:10:10 oes -# Changed pidfile path to conform with FHS -# -# Revision 1.12 2002/03/04 20:44:36 oes -# Changed to new cmdline syntax -# -# Revision 1.11 2001/12/30 14:07:32 steudten -# - Add signal handling (unix) -# - Add SIGHUP handler (unix) -# - Add creation of pidfile (unix) -# - Add action 'top' in rc file (RH) -# - Add entry 'SIGNALS' to manpage -# - Add exit message to logfile (unix) -# -# Revision 1.10 2001/11/05 21:30:23 steudten -# Make JB startup without & due to be a 'real' daemon right now. -# Make the script easy to change. -# -# Revision 1.9 2001/09/15 01:53:12 steudten -# -# Remove test for subsys flag in start. Some minor changes. -# -# Revision 1.8 2001/06/28 13:50:36 sarantis -# swap ?$ with $?; remove bogus ";;" -# -# Revision 1.7 2001/06/28 13:40:26 sarantis -# remove single quotes from $JB; it was not expanded. -# -# Revision 1.6 2001/06/28 13:38:42 sarantis -# formatting changes; individual return values are returned from the init script. -# -# Revision 1.5 2001/06/11 11:37:40 sarantis -# Minor editing changes. -# -# Revision 1.4 2001/06/09 09:14:11 swa -# shamelessly adapted RPM stuff from the newest rpm that -# RedHat provided for the JB. -# -# Revision 1.3 2001/05/25 10:12:44 oes -# Fixed default case in switch statement (# -> *) -# -# Revision 1.2 2001/05/24 07:52:24 swa -# added header. removed ^M. -# -# -# ********************************************************************/ - -# This is file /etc/rc.d/init.d/privoxy and was put here -# by the privoxy rpm -# -# chkconfig: 235 84 09 -# -# description: This shell script takes care of starting and stopping \ -# privoxy. -# - - -# Source function library. -. /etc/rc.d/init.d/functions - -. /etc/sysconfig/network - -# Check that networking is up. -[ ${NETWORKING} = "no" ] && exit 0 - -JB_PRG="privoxy" -JB_BIN="/usr/sbin/$JB_PRG" -JB_CONF="/etc/$JB_PRG/config" -JB_USER="privoxy" -JB_PID=/var/run/$JB_PRG.pid -JB_LOCK=/var/lock/subsys/$JB_PRG -JB="$JB_BIN --user $JB_USER.$JB_USER --pidfile $JB_PID $JB_CONF" - -# some checks for us -! [ -x $JB_BIN ] && echo "Can't find $JB_BIN, exit." && exit 0 -! [ -f $JB_CONF ] && echo "Can't find $JB_CONF, exit." && exit 0 - -# See how we were called. - -start () { - # start daemon - echo -n $"Starting $JB_PRG: " - if [ -f $JB_PID ]; then - killproc $JB_PRG && rm -f $JB_LOCK $JB_PID - RETVAL=$? - [ $RETVAL != 0 ] && return $RETVAL - fi - daemon $JB - RETVAL=$? - echo - [ $RETVAL = 0 ] && touch $JB_LOCK - return $RETVAL -} - -stop () { - # stop daemon - echo -n $"Stopping $JB_PRG: " - killproc $JB_PRG && rm -f $JB_LOCK $JB_PID - RETVAL=$? - echo - return $RETVAL -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - reload) - if [ -f $JB_PID ] ; then - kill -HUP `cat $JB_PID` - RETVAL=$? - fi - ;; - restart) - stop - start - RETVAL=$? - ;; - condrestart) - # restart only if already running - if [ -f $JB_PID ] ; then - stop - start - RETVAL=$? - fi - ;; - status) - status $JB_PRG - RETVAL=$? - ;; - top) - if [ -f $JB_PID ]; then - a="" - for i in `pidof $JB_PRG` ; do - a="$a -p $i" - done - top $a - fi - ;; - *) - echo $"Usage: $JB_PRG {start|stop|reload|restart|condrestart|status|top}" - exit 1 -esac - -exit $RETVAL diff --git a/privoxy.init.suse b/privoxy.init.suse deleted file mode 100644 index 7bab6def..00000000 --- a/privoxy.init.suse +++ /dev/null @@ -1,117 +0,0 @@ -#! /bin/sh -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/privoxy.init.suse,v $ -# -# Purpose : This shell script takes care of starting and stopping -# privoxy. -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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: privoxy.init.suse,v $ -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.7 2002/03/11 11:44:46 oes -# Working in suggestions by Thorsten Kukuk -# -# Revision 1.6 2002/03/09 14:56:34 swa -# wrong user.group -# -# Revision 1.5 2002/03/08 21:39:59 oes -# setgid to nogroup -# -# Revision 1.4 2002/03/05 19:54:37 oes -# Preliminary version of SuSE 8.0-certified init script ,-) -# -# Revision 1.3 2002/03/05 05:28:05 oes -# Added pidfile creation -# -# Revision 1.2 2001/09/10 16:25:46 swa -# jb did not start. none of the arguments worked. fixed. -# -# Revision 1.1 2001/06/08 20:53:36 swa -# use buildroot, export init to separate file (better manageability) -# -# -# -# ********************************************************************/ -### BEGIN INIT INFO -# Provides: privoxy -# Required-Start: $network $syslog $remote_fs -# Required-Stop: -# Default-Start: 3 5 -# Default-Stop: 0 1 2 6 -# Description: Starts Privoxy -### END INIT INFO - -. /etc/rc.config -rc_reset - -case "$1" in - start) - echo -n "Starting Privoxy" - if [ ! -f /var/run/privoxy.pid ] || ! kill -0 `cat /var/run/privoxy.pid` 2> /dev/null; then - /usr/sbin/privoxy --user privoxy.privoxy --pidfile /var/run/privoxy.pid /etc/privoxy/config 2> /dev/null - else - false - fi - rc_status -v - ;; - stop) - echo -n "Shutting down Privoxy" - killproc -TERM /usr/sbin/privoxy && rm -f /var/run/privoxy.pid - rc_status -v - ;; - reload) - echo -n "Reloading Privoxy" - kill -HUP `cat /var/run/privoxy.pid` - rc_status -v - ;; - try-restart) - $0 stop && $0 start - rc_status - ;; - restart) - $0 stop - $0 start - rc_status - ;; - status) - echo -n "Checking for Privoxy" - checkproc /usr/sbin/privoxy - rc_status -v - ;; - *) - echo "Usage: $0 {start|restart|reload|status|stop}" - exit 1 -esac - -rc_exit diff --git a/project.h b/project.h index 6ba5c578..50a79590 100644 --- a/project.h +++ b/project.h @@ -1,6 +1,6 @@ -#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED -#define PROJECT_H_VERSION "$Id: project.h,v 1.61 2002/03/26 22:29:55 swa Exp $" +#ifndef _PROJECT_H +#define _PROJECT_H +#define PROJECT_H_VERSION "$Id: project.h,v 1.23 2001/07/18 12:32:23 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/project.h,v $ @@ -10,13 +10,13 @@ * (though it does declare some macros). * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * 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 @@ -36,189 +36,6 @@ * * Revisions : * $Log: project.h,v $ - * Revision 1.61 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * Revision 1.60 2002/03/24 15:52:17 jongfoster - * Changing CGI URL prefixes for new name - * - * Revision 1.59 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.58 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.57 2002/03/16 20:28:34 oes - * Added descriptions to the filters so users will know what they select in the cgi editor - * - * Revision 1.56 2002/03/13 20:27:30 oes - * Fixing bug with CT_TABOO - * - * Revision 1.55 2002/03/12 01:42:50 oes - * Introduced modular filters - * - * Revision 1.54 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.53 2002/03/08 16:48:55 oes - * Added FEATURE_NO_GIFS and BUILTIN_IMAGE_MIMETYPE - * - * Revision 1.52 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.51 2002/03/05 04:52:42 oes - * Deleted non-errlog debugging code - * - * Revision 1.50 2002/03/04 19:32:07 oes - * Changed default port to 8118 - * - * Revision 1.49 2002/03/04 18:28:55 oes - * Deleted PID_FILE_NAME - * - * Revision 1.48 2002/03/03 14:50:40 oes - * Fixed CLF logging: Added ocmd member for client's request to struct http_request - * - * Revision 1.47 2002/02/20 23:15:13 jongfoster - * Parsing functions now handle out-of-memory gracefully by returning - * an error code. - * - * Revision 1.46 2002/01/17 21:06:09 jongfoster - * Now #defining the URLs of the config interface - * - * Minor changes to struct http_request and struct url_spec due to - * standardizing that struct http_request is used to represent a URL, and - * struct url_spec is used to represent a URL pattern. (Before, URLs were - * represented as seperate variables and a partially-filled-in url_spec). - * - * Revision 1.45 2002/01/09 14:33:27 oes - * Added HOSTENT_BUFFER_SIZE - * - * Revision 1.44 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.43 2001/11/22 21:57:51 jongfoster - * Making action_spec->flags into an unsigned long rather than just an - * unsigned int. - * Adding ACTION_NO_COOKIE_KEEP - * - * Revision 1.42 2001/11/05 21:42:41 steudten - * Include DBG() macro. - * - * Revision 1.41 2001/10/28 19:12:06 jongfoster - * Adding ijb_toupper() - * - * Revision 1.40 2001/10/26 17:40:47 oes - * Moved ijb_isspace and ijb_tolower to project.h - * Removed http->user_agent, csp->referrer and csp->accept_types - * - * Revision 1.39 2001/10/25 03:45:02 david__schmidt - * Adding a (void*) cast to freez() because Visual Age C++ won't expand the - * macro when called with a cast; so moving the cast to the macro def'n - * seems to both eliminate compiler warnings (on darwin and OS/2, anyway) and - * doesn't make macro expansion complain. Hope this works for everyone else - * too... - * - * Revision 1.38 2001/10/23 21:19:04 jongfoster - * New error-handling support: jb_err type and JB_ERR_xxx constants - * CGI functions now return a jb_err, and their parameters map is const. - * Support for RUNTIME_FEATUREs to enable/disable config editor - * Adding a few comments - * - * Revision 1.37 2001/10/14 22:14:01 jongfoster - * Removing name_length field from struct cgi_dispatcher, as this is - * now calculated at runtime from the "name" field. - * - * Revision 1.36 2001/10/10 16:45:15 oes - * Added LIMIT_CONNECT action and string - * Fixed HTTP message line termination - * Added CFORBIDDEN HTTP message - * - * Revision 1.35 2001/10/07 18:06:43 oes - * Added status member to struct http_request - * - * Revision 1.34 2001/10/07 15:45:25 oes - * Added url member to struct http_request and commented all - * members - * - * Added CT_TABOO - * - * Added ACTION_DOWNGRADE and ACTION_NO_COMPRESSION - * - * Replaced struct client_state members rejected, - * force, active and toggled_on with "flags" bitmap. - * - * Added CSP_FLAG_MODIFIED and CSP_FLAG_CHUNKED - * - * Added buffer_limit to struct configuration_spec - * - * Revision 1.33 2001/09/20 13:30:08 steudten - * - * Make freez() more secure in case of: if (exp) { free(z) ; a=*z } - * Last case will set z to NULL in free(z) and thats bad.. - * - * Revision 1.32 2001/09/16 23:02:51 jongfoster - * Fixing warning - * - * Revision 1.31 2001/09/16 13:20:29 jongfoster - * Rewrite of list library. Now has seperate header and list_entry - * structures. Also added a large sprinking of assert()s to the list - * code. - * - * Revision 1.30 2001/09/13 23:52:00 jongfoster - * Support for both static and dynamically generated CGI pages - * - * Revision 1.29 2001/09/13 23:29:43 jongfoster - * Defining FORWARD_SPEC_INITIALIZER - * - * Revision 1.28 2001/09/13 23:05:50 jongfoster - * Changing the string paramater to the header parsers a "const". - * - * Revision 1.27 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.26 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.25 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.24 2001/07/25 17:20:27 oes - * Introduced http->user_agent - * * Revision 1.23 2001/07/18 12:32:23 oes * - Added ACTION_STRING_DEANIMATE * - moved #define freez from jcc.h to project.h @@ -428,9 +245,9 @@ #endif #ifdef STATIC_PCRS -# include "pcrs.h" +# include "pcrs.h" #else -# include +# include #endif #if defined(REGEX_PCRE) @@ -445,167 +262,66 @@ # include "gnu_regex.h" #endif -#ifdef AMIGA -#include "amiga.h" +#ifdef AMIGA +#include "amiga.h" #endif /* def AMIGA */ -#ifdef _WIN32 -/* - * I don't want to have to #include all this just for the declaration - * of SOCKET. However, it looks like we have to... - */ -#include -#endif - - #ifdef __cplusplus extern "C" { #endif -/* - * The type used by sockets. On UNIX it's an int. Microsoft decided to - * make it an unsigned. - */ -#ifdef _WIN32 -typedef SOCKET jb_socket; -#define JB_INVALID_SOCKET INVALID_SOCKET -#else /* ndef _WIN32 */ -typedef int jb_socket; -#define JB_INVALID_SOCKET (-1) -#endif /* ndef _WIN32 */ +#define freez(X) if(X) free(X); X = NULL - -/* - * Error codes. Functions returning these should return a jb_err - */ -#define JB_ERR_OK 0 /* Success, no error */ -#define JB_ERR_MEMORY 1 /* Out of memory */ -#define JB_ERR_CGI_PARAMS 2 /* Missing or corrupt CGI parameters */ -#define JB_ERR_FILE 3 /* Error opening, reading or writing a file */ -#define JB_ERR_PARSE 4 /* Error parsing file */ -#define JB_ERR_MODIFIED 5 /* File has been modified outside of the */ - /* CGI actions editor. */ -typedef int jb_err; - - -/* - * This macro is used to free a pointer that may be NULL - */ -#define freez(X) { if(X) { free((void*)X); X = NULL ; } } - - -/* Fix a problem with Solaris. There should be no effect on other - * platforms. - * Solaris's isspace() is a macro which uses it's argument directly - * as an array index. Therefore we need to make sure that high-bit - * characters generate +ve values, and ideally we also want to make - * the argument match the declared parameter type of "int". - * - * Note: Remember to #include if you use these macros. - */ -#define ijb_toupper(__X) toupper((int)(unsigned char)(__X)) -#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) -#define ijb_isspace(__X) isspace((int)(unsigned char)(__X)) - -/* - * Use for statically allocated buffers if you have no other choice. - * Remember to check the length of what you write into the buffer - * - we don't want any buffer overflows! - */ #define BUFFER_SIZE 5000 -/* - * Buffer size for capturing struct hostent data in the - * gethostby(name|addr)_r library calls. Since we don't - * loop over gethostbyname_r, the buffer must be sufficient - * to accomodate multiple IN A RRs, as used in DNS round robin - * load balancing. W3C's wwwlib uses 1K, so that should be - * good enough for us, too. - */ -#define HOSTENT_BUFFER_SIZE 1024 - -/* - * So you can say "while (FOREVER) { ...do something... }" - */ #define FOREVER 1 /* Default IP and port to listen on */ #define HADDR_DEFAULT "127.0.0.1" -#define HADDR_PORT 8118 +#define HADDR_PORT 8000 -/* Forward defs for various structures */ /* Need this for struct client_state */ struct configuration_spec; - /* Generic linked list of strings */ - -struct list_entry -{ - const char *str; - struct list_entry *next; -}; - -struct list +struct list /* FIXME: Why not separate entries and header? */ { - struct list_entry *first; - struct list_entry *last; -}; - - -/* A map from a string to another string */ - -struct map_entry -{ - const char *name; - const char *value; - struct map_entry *next; + char * str; /* valid in an entry */ + struct list *last; /* valid in header */ + struct list *next; }; struct map { - struct map_entry *first; - struct map_entry *last; + char *name; + char *value; + struct map *next; }; - struct http_request { - char *cmd; /* Whole command line: method, URL, Version */ - char *ocmd; /* Backup of original cmd for CLF logging */ - char *gpc; /* HTTP method: GET, POST, .. */ - char *url; /* The URL */ - char *ver; /* Protocol version */ - int status; /* HTTP Status */ - - char *host; /* Host part of URL */ - int port; /* Port of URL or 80 (default) */ - char *path; /* Path of URL */ - char *hostport; /* host[:port] */ - int ssl; /* Flag if protocol is https */ - - char *host_ip_addr_str; /* String with dotted decimal representation - * of host's IP. NULL before connect_to() */ - - char *dbuffer; /* Buffer with '\0'-delimited domain name. */ - char **dvec; /* List of pointers to the strings in dbuffer. */ - int dcount; /* How many parts to this domain? (length of dvec) */ + char *cmd; + char *gpc; + char *host; + char *host_ip_addr_str; /* NULL before connect_to() */ + int port; + char *path; + char *ver; + char *hostport; /* "host[:port]" */ + int ssl; + char *user_agent; /* Client's User-Agent: header value */ }; -/* - * Response generated by CGI, blocker, or error handler - */ +/* Response generated by CGI, blocker, or error handler */ struct http_response { - char *status; /* HTTP status (string) */ + char *status; /* HTTP status (string)*/ struct list headers[1]; /* List of header lines */ - char *head; /* Formatted http response head */ - size_t head_length; /* Length of http response head */ - char *body; /* HTTP document body */ - size_t content_length; /* Length of body, REQUIRED if binary body */ - int is_static; /* Nonzero if the content will never change and - * should be cached by the brwoser (e.g. images) */ + char *head; /* Formatted http response head */ + int head_length; /* Length of http response head */ + char *body; /* HTTP document body */ + int content_length; /* Length of body, REQUIRED if binary body*/ }; /* A URL pattern */ @@ -614,11 +330,13 @@ struct url_spec char *spec; /* The string which was parsed to produce this */ /* url_spec. Used for debugging or display only. */ - /* Hostname matching, or dbuffer == NULL to match all hosts */ - char *dbuffer; /* Buffer with '\0'-delimited domain name. */ - char **dvec; /* List of pointers to the strings in dbuffer. */ - int dcount; /* How many parts to this domain? (length of dvec) */ - int unanchored; /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT. */ + /* Hostname matching: */ + char *domain; /* Fully qalified domain name (FQDN) pattern. */ + /* May contain "*". */ + char *dbuf; /* Buffer with '\0'-delimited fqdn */ + char **dvec; /* Domain ptr vector into dbuf */ + int dcnt; /* How many domains in fqdn? */ + int unanchored; /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT */ /* Port matching: */ int port; /* The port number, or 0 to match all ports. */ @@ -631,11 +349,6 @@ struct url_spec regex_t *preg; /* Regex for matching path part */ #endif }; -#ifdef REGEX -#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL } -#else /* ifndef REGEX */ -#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0 } -#endif /* ndef REGEX */ /* Constants for host part matching in URLs */ #define ANCHOR_LEFT 1 @@ -654,46 +367,40 @@ struct iob #define IOB_PEEK(CSP) ((CSP->iob->cur > CSP->iob->eod) ? (CSP->iob->eod - CSP->iob->cur) : 0) #define IOB_RESET(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob)); -/* Bits for csp->content_type */ -#define CT_TEXT 1 /* Suitable for pcrs filtering */ -#define CT_GIF 2 /* Suitable for GIF filtering */ -#define CT_TABOO 4 /* DONT filter */ +/* Keys for csp->content_type */ +#define CT_TEXT 0x01U +#define CT_GIF 0x02U #define ACTION_MASK_ALL (~0U) -#define ACTION_MOST_COMPATIBLE 0x00000000UL - -#define ACTION_BLOCK 0x00000001UL -#define ACTION_DEANIMATE 0x00000002UL -#define ACTION_DOWNGRADE 0x00000004UL -#define ACTION_FAST_REDIRECTS 0x00000008UL -#define ACTION_HIDE_FORWARDED 0x00000010UL -#define ACTION_HIDE_FROM 0x00000020UL -#define ACTION_HIDE_REFERER 0x00000040UL /* sic - follow HTTP, not English */ -#define ACTION_HIDE_USER_AGENT 0x00000080UL -#define ACTION_IMAGE 0x00000100UL -#define ACTION_IMAGE_BLOCKER 0x00000200UL -#define ACTION_NO_COMPRESSION 0x00000400UL -#define ACTION_NO_COOKIE_KEEP 0x00000800UL -#define ACTION_NO_COOKIE_READ 0x00001000UL -#define ACTION_NO_COOKIE_SET 0x00002000UL -#define ACTION_NO_POPUPS 0x00004000UL -#define ACTION_VANILLA_WAFER 0x00008000UL -#define ACTION_LIMIT_CONNECT 0x00010000UL +#define ACTION_MOST_COMPATIBLE 0x0000U + +#define ACTION_BLOCK 0x0001U +#define ACTION_DEANIMATE 0x2000U +#define ACTION_FAST_REDIRECTS 0x0002U +#define ACTION_FILTER 0x0004U +#define ACTION_HIDE_FORWARDED 0x0008U +#define ACTION_HIDE_FROM 0x0010U +#define ACTION_HIDE_REFERER 0x0020U /* sic - follow HTTP, not English */ +#define ACTION_HIDE_USER_AGENT 0x0040U +#define ACTION_IMAGE 0x0080U +#define ACTION_IMAGE_BLOCKER 0x0100U +#define ACTION_NO_COOKIE_READ 0x0200U +#define ACTION_NO_COOKIE_SET 0x0400U +#define ACTION_NO_POPUPS 0x0800U +#define ACTION_VANILLA_WAFER 0x1000U #define ACTION_STRING_DEANIMATE 0 #define ACTION_STRING_FROM 1 #define ACTION_STRING_IMAGE_BLOCKER 2 #define ACTION_STRING_REFERER 3 #define ACTION_STRING_USER_AGENT 4 -#define ACTION_STRING_LIMIT_CONNECT 5 -#define ACTION_STRING_COUNT 6 +#define ACTION_STRING_COUNT 5 + #define ACTION_MULTI_ADD_HEADER 0 #define ACTION_MULTI_WAFER 1 -#define ACTION_MULTI_FILTER 2 -#define ACTION_MULTI_COUNT 3 - +#define ACTION_MULTI_COUNT 2 /* * This structure contains a list of actions to apply to a URL. @@ -703,7 +410,7 @@ struct iob */ struct current_action_spec { - unsigned long flags; /* a bit set to "1" = add action */ + unsigned flags; /* a bit set to "1" = add action */ /* For those actions that require parameters: */ @@ -722,8 +429,8 @@ struct current_action_spec */ struct action_spec { - unsigned long mask; /* a bit set to "0" = remove action */ - unsigned long add; /* a bit set to "1" = add action */ + unsigned mask; /* a bit set to "0" = remove action */ + unsigned add; /* a bit set to "1" = add action */ /* For those actions that require parameters: */ @@ -756,23 +463,29 @@ struct url_actions }; +/* Constants defining bitmask for csp->accept_types */ + +#ifdef DETECT_MSIE_IMAGES + +/* MSIE detected by user-agent string */ +#define ACCEPT_TYPE_IS_MSIE 0x0001 + /* - * Flags for use in csp->flags + * *If* this is MSIE, it wants an image. (Or this is a shift-reload, or + * it's got an image from this URL before... yuck!) + * Only meaningful if ACCEPT_TYPE_IS_MSIE set */ -#define CSP_FLAG_ACTIVE 0x01 /* Set if this client is processing data. - * Cleared when the thread associated with - * this structure dies. */ -#define CSP_FLAG_CHUNKED 0x02 /* Set if the server's reply is in "chunked" - * transfer encoding */ -#define CSP_FLAG_FORCED 0x04 /* Set if this request was enforced, although - * it would normally have been blocked. */ -#define CSP_FLAG_MODIFIED 0x08 /* Set if any modification to the body was done */ -#define CSP_FLAG_REJECTED 0x10 /* Set if request was blocked. */ -#define CSP_FLAG_TOGGLED_ON 0x20 /* Set if we are toggled on (FEATURE_TOGGLE) */ +#define ACCEPT_TYPE_MSIE_IMAGE 0x0002 /* - * The state of a Privoxy processing thread. + * *If* this is MSIE, it wants a HTML document. + * Only meaningful if ACCEPT_TYPE_IS_MSIE set */ +#define ACCEPT_TYPE_MSIE_HTML 0x0004 + +#endif /* def DETECT_MSIE_IMAGES */ + + struct client_state { /* The proxy's configuration */ @@ -782,13 +495,26 @@ struct client_state struct current_action_spec action[1]; /* socket to talk to client (web browser) */ - jb_socket cfd; + int cfd; /* socket to talk to server (web server or proxy) */ - jb_socket sfd; + int sfd; - /* Multi-purpose flag container, see CSP_FLAG_* above */ - unsigned short int flags; + +#ifdef STATISTICS + /* 1 if this URL was rejected, 0 otherwise. Allows actual stats inc to + * occur in main thread only for thread-safety. + */ + int rejected; +#endif /* def STATISTICS */ + +#ifdef FORCE_LOAD + int force; +#endif /* def FORCE_LOAD */ + +#ifdef TOGGLE + int toggled_on; +#endif /* def TOGGLE */ /* * Client PC's IP address, as reported by the accept()_ function. @@ -805,6 +531,18 @@ struct client_state char *my_ip_addr_str; char *my_hostname; +#ifdef TRUST_FILES + /* The referer in this request, if one was specified. */ + char *referrer; +#endif /* def TRUST_FILES */ + +#if defined(DETECT_MSIE_IMAGES) + /* Types the client will accept. + * Bitmask - see ACCEPT_TYPE_XXX constants. + */ + int accept_types; +#endif /* defined(DETECT_MSIE_IMAGES) */ + /* The URL that was requested */ struct http_request http[1]; @@ -817,61 +555,47 @@ struct client_state /* List of all cookies for this request */ struct list cookie_list[1]; - /* MIME-Type key, see CT_* above */ - unsigned short int content_type; + /* MIME-Type bitmap, see CT_* above */ + unsigned char content_type; /* The "X-Forwarded-For:" header sent by the client */ char *x_forwarded; + /* + * Nonzero if this client is processing data. + * Set to zero when the thread associated with this structure dies. + */ + int active; + /* files associated with this client */ struct file_list *actions_list; struct file_list *rlist; /* pcrs job file */ - size_t content_length; /* Length after content modification */ + size_t content_length; /* Length after content modification */ -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES struct file_list *tlist; /* trustfile */ -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ struct client_state *next; }; -/* - * A function to add a header - */ -typedef jb_err (*add_header_func_ptr)(struct client_state *); - -/* - * A function to process a header - */ -typedef jb_err (*parser_func_ptr )(struct client_state *, char **); - -/* - * List of functions to run on a list of headers - */ struct parsers { - char *str; - size_t len; - parser_func_ptr parser; + char *str; + char len; + char *(*parser)(const struct parsers *, char *, struct client_state *); }; - -/* - * List of available CGI functions. - */ struct cgi_dispatcher { - const char * const name; - jb_err (* const handler)(struct client_state *csp, struct http_response *rsp, const struct map *parameters); - const char * const description; + const char *name; + int name_length; + int (*handler)(struct client_state *csp, struct http_response *rsp, struct map *parameters); + const char *description; }; - -/* - * A data file used by Privoxy. Kept in a linked list. - */ struct file_list { /* @@ -879,11 +603,11 @@ struct file_list * Read-only once the structure has been created. */ void *f; - + /* Normally NULL. When we are finished with file (i.e. when we have * loaded a new one), set to a pointer to an unloader function. * Unloader will be called by sweep() (called from main loop) when - * all clients using this file are done. This prevents threading + * all clients using this file are done. This prevents threading * problems. */ void (*unloader)(void *); @@ -891,6 +615,13 @@ struct file_list /* Used internally by sweep(). Do not access from elsewhere. */ int active; +#ifndef SPLIT_PROXY_ARGS + /* String to be displayed as part of show-proxy-args display. + * Read-only once the structure has been created. + */ + char *proxy_args; +#endif /* ndef SPLIT_PROXY_ARGS */ + /* Following variables allow us to check if file has been changed. * Read-only once the structure has been created. */ @@ -907,14 +638,14 @@ struct file_list }; -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES struct block_spec { struct url_spec url[1]; int reject; struct block_spec *next; }; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ #define SOCKS_NONE 0 /* Don't use a SOCKS server */ @@ -939,25 +670,16 @@ struct forward_spec /* For the linked list */ struct forward_spec *next; }; -#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL } - -/* - * This struct represents one filter (one block) from - * the re_filterfile. If there is more than one filter - * in the file, the file will be represented by a - * chained list of re_filterfile specs. - */ struct re_filterfile_spec { - char *name; /* Name from FILTER: statement in re_filterfile */ - char *description; /* Description from FILTER: statement in re_filterfile */ - struct list patterns[1]; /* The patterns from the re_filterfile */ - pcrs_job *joblist; /* The resulting compiled pcrs_jobs */ - struct re_filterfile_spec *next; /* The pointer for chaining */ + char *username; + char *filtername; + struct list patterns[1]; + pcrs_job *joblist; }; -#ifdef FEATURE_ACL +#ifdef ACL_FILES #define ACL_PERMIT 1 /* accept connection request */ #define ACL_DENY 2 /* reject connection request */ @@ -976,17 +698,12 @@ struct access_control_list short action; struct access_control_list *next; }; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ /* Maximum number of loaders (actions, re_filter, ...) */ #define NLOADERS 8 - -#define RUNTIME_FEATURE_CGI_EDIT_ACTIONS 1 -#define RUNTIME_FEATURE_CGI_TOGGLE 2 - - /* * Data loaded from the configuration file. * @@ -997,9 +714,6 @@ struct configuration_spec int debug; int multi_threaded; - /* Features that can be enabled/disabled throuigh the config file */ - unsigned feature_flags; - const char *logfile; const char *confdir; @@ -1014,31 +728,37 @@ struct configuration_spec const char *re_filterfile; -#ifdef FEATURE_COOKIE_JAR +#ifdef JAR_FILES const char * jarfile; FILE * jar; -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ /* * Port and IP to bind to. - * Defaults to HADDR_DEFAULT:HADDR_PORT == 127.0.0.1:8118 + * Defaults to HADDR_DEFAULT:HADDR_PORT == 127.0.0.1:8000 */ const char *haddr; int hport; - /* Size limit for IOB */ - size_t buffer_limit; +#ifndef SPLIT_PROXY_ARGS + const char *suppress_message; +#endif /* ndef SPLIT_PROXY_ARGS */ -#ifdef FEATURE_TRUST +#ifndef SPLIT_PROXY_ARGS + /* suppress listing config files */ + int suppress_blocklists; +#endif /* ndef SPLIT_PROXY_ARGS */ + +#ifdef TRUST_FILES const char * trustfile; struct list trust_info[1]; struct url_spec *trust_list[64]; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ -#ifdef FEATURE_ACL +#ifdef ACL_FILES struct access_control_list *acl; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ struct forward_spec *forward; @@ -1058,57 +778,28 @@ struct configuration_spec #define SZ(X) (sizeof(X) / sizeof(*X)) -#ifdef FEATURE_FORCE_LOAD -#define FORCE_PREFIX "/PRIVOXY-FORCE" -#endif /* def FEATURE_FORCE_LOAD */ - -#ifdef FEATURE_NO_GIFS -#define BUILTIN_IMAGE_MIMETYPE "image/png" -#else -#define BUILTIN_IMAGE_MIMETYPE "image/gif" -#endif /* def FEATURE_NO_GIFS */ - +#ifdef FORCE_LOAD +#define FORCE_PREFIX "/IJB-FORCE-LOAD" +#endif /* def FORCE_LOAD */ /* Hardwired URLs */ -#define HOME_PAGE_URL "http://www.privoxy.org" -#define REDIRECT_URL HOME_PAGE_URL "/redirect.php?v=" VERSION "&to=" - -/* - * The "hosts" to intercept and display CGI pages. - * First one is a hostname only, second one can specify host and path. - * - * Notes: - * 1) Do not specify the http: prefix - * 2) CGI_SITE_2_PATH must not end with /, one will be added automatically. - * 3) CGI_SITE_2_PATH must start with /, unless it is the empty string. - */ -#define CGI_SITE_1_HOST "p.p" -#define CGI_SITE_2_HOST "config.privoxy.org" -#define CGI_SITE_2_PATH "" - -/* - * The prefix for CGI pages. Written out in generated HTML. - * INCLUDES the trailing slash. - */ -#define CGI_PREFIX "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/" - +#define HOME_PAGE_URL "http://ijbswa.sourceforge.net" +#define REDIRECT_URL HOME_PAGE_URL "/redirect.php?v=" VERSION "&to=" +#define CGI_PREFIX_HOST "i.j.b" /* HTTP snipplets */ static const char CSUCCEED[] = "HTTP/1.0 200 Connection established\n" - "Proxy-Agent: Privoxy/" VERSION "\r\n\r\n"; + "Proxy-Agent: IJ/" VERSION "\n\n"; static const char CHEADER[] = - "HTTP/1.0 400 Invalid header received from browser\r\n\r\n"; - -static const char CFORBIDDEN[] = - "HTTP/1.0 403 Connection not allowable\r\nX-Hint: If you read this message interactively, then you know why this happens ,-)\r\n\r\n"; + "HTTP/1.0 400 Invalid header received from browser\n\n"; #ifdef __cplusplus } /* extern "C" */ #endif -#endif /* ndef PROJECT_H_INCLUDED */ +#endif /* ndef _PROJECT_H */ /* Local Variables: diff --git a/re_filterfile b/re_filterfile new file mode 100644 index 00000000..a9097e9d --- /dev/null +++ b/re_filterfile @@ -0,0 +1,175 @@ +# ******************************************************************** +# +# File : $Source: /cvsroot/ijbswa/current/re_filterfile,v $ +# +# Purpose : Rules to process the content of web pages +# +# Copyright : Written by and Copyright (C) 2001 the SourceForge +# IJBSWA team. http://ijbswa.sourceforge.net +# +# 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: re_filterfile,v $ +# Revision 1.9 2001/07/13 14:03:48 oes +# Elimiated yet another bug in the banner-by-size jobs. Shame on me! +# +# Revision 1.8 2001/06/29 13:34:00 oes +# - Added explanation for U and T options +# - Added hint on image replacement by CGI call +# - Fixed bug in banner-by-size jobs +# +# Revision 1.7 2001/06/19 14:21:56 oes +# Fixed microsuck line +# +# Revision 1.6 2001/06/09 14:01:57 swa +# header. cosmetics. default: no messing ala microsuck. +# +# +# +# ********************************************************************/ +# +# Syntax: One Perl-Style substitution per line. +# For Details see the perlre, perlop and pcre manpages. +# Note that you are free to choose the delimter as you see fit. +# +# Note: In addidion to the Perl options egimosx, the following nonstandard +# options are supported: +# +# 'U' turns the default to ungreedy matching. Add ? to quantifiers to +# switch back to greedy. +# 'T' (trivial) prevents parsing for backreferences in the substitute. +# Use if you want to include text like '$&' in your substitute without +# quoting. +# + +# ********************************************************************/ +# +# Kill OnUnload popups. Yummy. +# check it out on http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html +# +# ********************************************************************/ +s/()/$1never$2/i + +# ********************************************************************/ +# +# Kill refresh tags. I like to refresh myself. Manually. +# check it out on http://www.airport-cgn.de/ and go to the arrivals page. +# +# ********************************************************************/ +s/]*http-equiv[^>]*refresh.*URL=([^>]*?)"?>//i +s/]*http-equiv="?page-enter"?[^>]*content=[^>]*>//i + +# ********************************************************************/ +# +# If I allow popups, I want them to be resizeable and have a location +# and status bar: check it out on http://www.airport-cgn.de/ and go to +# the arrivals page. +# +# ********************************************************************/ +# s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig +# s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig +# s/scrolling="?(no|0|Auto)"?/scrolling=1/ig +# s/menubar="?(no|0)"?/menubar=1/ig #s/framespacing="?(no|0)"?//ig +# #s/margin(height|width)=[0-9]*//gi + +# ********************************************************************/ +# +# Remove frameborder=0 and border=0 from framesets +# +# ********************************************************************/ +s/(]+?)border=['"]?(no|0)['"]?/$1/ig +s/(]+?)frameborder=['"]?(no|0)['"]?/$1/ig + +# ********************************************************************/ +# +# The status bar is for displaying link targets, not pointless buzzwords. +# Again, check it out on http://www.airport-cgn.de/ +# +# ********************************************************************/ +s/status='.*?';*//ig + +# ********************************************************************/ +# +# Get rid of Javascript cookies, like found on privacy.net: +# +# ********************************************************************/ + +#s|document.cookie|c\?\?kie_what\?|sig + +# ********************************************************************/ +# +# Kill *all* popups a la popup.c. (But for *all* sites, so I wouldn't do that.) +# +# JavaScript: s/window\.open\(/who_wants_this_to.open(/ig +# HTML : s/target=['"]?_blank['"]?/target_who/g +# +# Kill banners by size: +# (Sizes from http://www.iab.net/iab_banner_standards/bannersizes.html) +# Note: Use http://i.j.b/send-banner?type=trans for a transparent 1x1 gif +# ********************************************************************/ +s|]*?(width=['"]?468\D)[^>]*(height=['"]?60[^>]*?)>||sig +s|]*?(width=['"]?234\D)[^>]*(height=['"]?60[^>]*?)>||sig +s|]*?(width=['"]?88\D)[^>]*(height=['"]?31[^>]*?)>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?90[^>]*?)>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?600[^>]*?)>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?60[^>]*?)>||sig +s|]*?(width=['"]?160\D)[^>]*(height=['"]?600[^>]*?)>||sig +s|]*?(width=['"]?125\D)[^>]*(height=['"]?125[^>]*?)>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?240[^>]*?)>||sig +s|]*?(width=['"]?180\D)[^>]*(height=['"]?150[^>]*?)>||sig +s|]*?(width=['"]?300\D)[^>]*(height=['"]?250[^>]*?)>||sig +s|]*?(width=['"]?250\D)[^>]*(height=['"]?250[^>]*?)>||sig +s|]*?(width=['"]?240\D)[^>]*(height=['"]?400[^>]*?)>||sig +s|]*?(width=['"]?336\D)[^>]*(height=['"]?280[^>]*?)>||sig + +# Where is that from? +s|]*?(width=['"]?200\D)[^>]*(height=['"]?50[^>]*?)>||sig + +# ********************************************************************/ +# +# Squish WebBugs: +# +# ********************************************************************/ +s/]*?(width|height)\s+=\s+['"]?1\D[^>]*?(width|height)\s+=\s+['"]?1\D[^>]*?>//sig + +# ********************************************************************/ +# +# Fun stuff +# +# ********************************************************************/ +s/microsoft(?!.com)/MicroSuck/ig + +# ********************************************************************/ +# +# Crude parental filtering? (Use along with a suitable blocklist). +# Shows how to deny access to whole page based on a keyword. +# +# (Note: Middlesex, Sussex and Essex are counties in the UK, not rude words) +# (Note #2: Is 'sex' a rude word?!) +# +#s%^.*(?Blocked

    Blocked due to possible adult content. Please see this site.

    %is +#s+^.*warez.*$+No Warez

    You're not searching for illegal stuff, are you?

    +is + +# ********************************************************************/ +# +# http://www.farscapezone.com/wwwboard/messages/1451.html +# +# ********************************************************************/ +s/(\w+) was tired/$1 needed more coffee<\/b>/ig diff --git a/showargs.c b/showargs.c new file mode 100644 index 00000000..ea83855b --- /dev/null +++ b/showargs.c @@ -0,0 +1,486 @@ +const char showargs_rcs[] = "$Id: showargs.c,v 1.19 2001/07/13 14:11:36 oes Exp $"; +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/showargs.c,v $ + * + * Purpose : Contains various utility routines needed to + * generate the show-proxy-args page. + * FIXME: Is this really stuff for a separate file? + * + * 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: showargs.c,v $ + * Revision 1.19 2001/07/13 14:11:36 oes + * - Included SHOW_RCS for deanimate.* + * - Removed all #ifdef PCRS + * + * + * Revision 1.18 2001/07/02 02:55:16 iwanttokeepanon + * Apended " on some sites" to the HTML generating function `show_defines' (@ line + * 392); since "DENY_GZIP" is not *really* necessary for all PCRS functionallity. + * + * Revision 1.17 2001/06/29 21:45:41 oes + * Indentation, CRLF->LF, Tab-> Space + * + * Revision 1.16 2001/06/29 13:35:07 oes + * - Adapted + * - Improved comments + * - Removed init_proxy_args + * - Renamed end_proxy_args(csp) to show_rcs(void) + * - Removed logentry from cancelled commit + * - Destroyed support for ndef SPLIT_PROXY_ARGS (Ooops) + * - Separated the #define list into show_defines() + * + * Revision 1.15 2001/06/09 10:55:28 jongfoster + * Changing BUFSIZ ==> BUFFER_SIZE + * + * Revision 1.14 2001/06/07 23:15:40 jongfoster + * Removing config->proxy_args_gateways + * Missing return statement added to end_proxy_args(). + * + * Revision 1.13 2001/06/06 09:37:59 sarantis + * Fix misplaced comment start. + * + * Revision 1.12 2001/06/04 10:41:52 swa + * show version string of cgi.h and cgi.c + * + * Revision 1.11 2001/06/03 11:03:48 oes + * moved stuff to cgi.c + * + * Revision 1.10 2001/05/31 21:36:07 jongfoster + * Added RCS for actions.[ch] and list.[ch] + * + * Revision 1.9 2001/05/29 23:11:38 oes + * + * - Moved strsav() from showargs to miscutil + * + * Revision 1.8 2001/05/29 09:50:24 jongfoster + * Unified blocklist/imagelist/permissionslist. + * File format is still under discussion, but the internal changes + * are (mostly) done. + * + * Also modified interceptor behaviour: + * - We now intercept all URLs beginning with one of the following + * prefixes (and *only* these prefixes): + * * http://i.j.b/ + * * http://ijbswa.sf.net/config/ + * * http://ijbswa.sourceforge.net/config/ + * - New interceptors "home page" - go to http://i.j.b/ to see it. + * - Internal changes so that intercepted and fast redirect pages + * are not replaced with an image. + * - Interceptors now have the option to send a binary page direct + * to the client. (i.e. ijb-send-banner uses this) + * - Implemented show-url-info interceptor. (Which is why I needed + * the above interceptors changes - a typical URL is + * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". + * The previous mechanism would not have intercepted that, and + * if it had been intercepted then it then it would have replaced + * it with an image.) + * + * Revision 1.7 2001/05/26 00:28:36 jongfoster + * Automatic reloading of config file. + * Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32). + * Most of the global variables have been moved to a new + * struct configuration_spec, accessed through csp->config->globalname + * Most of the globals remaining are used by the Win32 GUI. + * + * Revision 1.6 2001/05/25 22:32:56 jongfoster + * CRLF->LF + * + * Revision 1.5 2001/05/22 18:54:49 oes + * + * - Enabled filtering banners by size rather than URL + * by adding patterns that replace all standard banner + * sizes with the "Junkbuster" gif to the re_filterfile + * + * - Enabled filtering WebBugs by providing a pattern + * which kills all 1x1 images + * + * - Added support for PCRE_UNGREEDY behaviour to pcrs, + * which is selected by the (nonstandard and therefore + * capital) letter 'U' in the option string. + * It causes the quantifiers to be ungreedy by default. + * Appending a ? turns back to greedy (!). + * + * - Added a new interceptor ijb-send-banner, which + * sends back the "Junkbuster" gif. Without imagelist or + * MSIE detection support, or if tinygif = 1, or the + * URL isn't recognized as an imageurl, a lame HTML + * explanation is sent instead. + * + * - Added new feature, which permits blocking remote + * script redirects and firing back a local redirect + * to the browser. + * The feature is conditionally compiled, i.e. it + * can be disabled with --disable-fast-redirects, + * plus it must be activated by a "fast-redirects" + * line in the config file, has its own log level + * and of course wants to be displayed by show-proxy-args + * Note: Boy, all the #ifdefs in 1001 locations and + * all the fumbling with configure.in and acconfig.h + * were *way* more work than the feature itself :-( + * + * - Because a generic redirect template was needed for + * this, tinygif = 3 now uses the same. + * + * - Moved GIFs, and other static HTTP response templates + * to project.h + * + * - Some minor fixes + * + * - Removed some >400 CRs again (Jon, you really worked + * a lot! ;-) + * + * Revision 1.4 2001/05/20 16:44:47 jongfoster + * Removing last hardcoded JunkBusters.com URLs. + * + * Revision 1.3 2001/05/20 01:21:20 jongfoster + * Version 2.9.4 checkin. + * - Merged popupfile and cookiefile, and added control over PCRS + * filtering, in new "permissionsfile". + * - Implemented LOG_LEVEL_FATAL, so that if there is a configuration + * file error you now get a message box (in the Win32 GUI) rather + * than the program exiting with no explanation. + * - Made killpopup use the PCRS MIME-type checking and HTTP-header + * skipping. + * - Removed tabs from "config" + * - Moved duplicated url parsing code in "loaders.c" to a new funcition. + * - Bumped up version number. + * + * Revision 1.2 2001/05/17 23:01:01 oes + * - Cleaned CRLF's from the sources and related files + * + * Revision 1.1.1.1 2001/05/15 13:59:03 oes + * Initial import of version 2.9.3 source tree + * + * + *********************************************************************/ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "project.h" +#include "showargs.h" +#include "jcc.h" +#include "encode.h" +#include "parsers.h" +#include "errlog.h" +#include "miscutil.h" +#include "gateway.h" + +const char showargs_h_rcs[] = SHOWARGS_H_VERSION; + + +/********************************************************************* + * + * Function : savearg + * + * Description : Called from `load_config'. It saves each non-empty + * and non-comment line from config into a list. This + * list is used to create the show-proxy-args page. + * + * Parameters : + * 1 : c = config setting that was found + * 2 : o = the setting's argument (if any) + * + * Returns : N/A + * + *********************************************************************/ +void savearg(char *c, char *o, struct configuration_spec * config) +{ + char buf[BUFFER_SIZE]; + + *buf = '\0'; + + if ( ( NULL != c ) && ( '\0' != *c ) ) + { + if ((c = html_encode(c))) + { + sprintf(buf, "%s ", c, c); + } + freez(c); + } + if ( ( NULL != o ) && ( '\0' != *o ) ) + { + if ((o = html_encode(o))) + { + if (strncmpic(o, "http://", 7) == 0) + { + strcat(buf, ""); + strcat(buf, o); + strcat(buf, ""); + } + else + { + strcat(buf, o); + } + } + freez(o); + } + + strcat(buf, "
    \n"); + + config->proxy_args = strsav(config->proxy_args, buf); + +} + + +/********************************************************************* + * + * Function : show_rcs + * + * Description : Create a string with the rcs info for all sourcefiles + * + * Parameters : None + * + * Returns : string + * + *********************************************************************/ +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 __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 KILLPOPUPS + SHOW_RCS(killpopup_h_rcs) + SHOW_RCS(killpopup_rcs) +#endif /* def KILLPOPUPS */ + 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(showargs_h_rcs) + SHOW_RCS(showargs_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(w32rulesdlg_h_rcs) + SHOW_RCS(w32rulesdlg_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); +} + +/********************************************************************* + * + * Function : show_defines + * + * Description : Create a string with all conditional #defines used + * when building + * + * Parameters : None + * + * Returns : string + * + *********************************************************************/ +char *show_defines(void) +{ + char *b = NULL; + +#ifdef FEATURE_PTHREAD + b = strsav(b, "
  • #define FEATURE_PTHREAD - Support POSIX threads.
  • \n"); +#else + b = strsav(b, "
  • #undef FEATURE_PTHREAD - No support POSIX threads.
  • \n"); +#endif + +#ifdef REGEX_GNU + b = strsav(b, "
  • #define REGEX_GNU - Support for GNU style regular expressions in the path specs.
  • \n"); +#endif /* def REGEX_GNU */ + +#ifdef REGEX_PCRE + b = strsav(b, "
  • #define REGEX_PCRE - Support for pcre style regular expressions in the path specs.
  • \n"); +#endif /* def REGEX_PCRE */ + +#ifndef REGEX + b = strsav(b, "
  • #undef REGEX - No support for regular expressions in the path specs.
  • \n"); +#endif /* ndef REGEX */ + +#ifdef STATIC_PCRE + b = strsav(b, "
  • #define STATIC_PCRE - Using static built-in pcre rather than libpcre.
  • \n"); +#else /* ifndef STATIC_PCRE */ + b = strsav(b, "
  • #undef STATIC_PCRE - Using libpcre rather than static built-in pcre.
  • \n"); +#endif /* ndef STATIC_PCRE */ + +#ifdef STATIC_PCRS + b = strsav(b, "
  • #define STATIC_PCRS - Using static built-in pcrs rather than libpcrs.
  • \n"); +#else /* ifndef STATIC_PCRS */ + b = strsav(b, "
  • #undef STATIC_PCRS - Using libpcrs rather than static built-in pcrs.
  • \n"); +#endif /* ndef STATIC_PCRS */ + +#ifdef TOGGLE + b = strsav(b, "
  • #define TOGGLE - Allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.
  • \n"); +#else /* ifndef TOGGLE */ + b = strsav(b, "
  • #undef TOGGLE - Do not allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.
  • \n"); +#endif /* ndef TOGGLE */ + +#ifdef FORCE_LOAD + b = strsav(b, "
  • #define FORCE_LOAD - Enables bypassing filtering for a single page using the prefix \"" FORCE_PREFIX "\".
  • \n"); +#else /* ifndef FORCE_LOAD */ + b = strsav(b, "
  • #undef FORCE_LOAD - Disables bypassing filtering for a single page.
  • \n"); +#endif /* ndef FORCE_LOAD */ + +#ifdef DENY_GZIP + b = strsav(b, "
  • #define DENY_GZIP - Prevents requests from being compressed - required for PCRS on some sites.
  • \n"); +#else /* ifndef DENY_GZIP */ + b = strsav(b, "
  • #undef DENY_GZIP - Allows requests to be compressed if the browser and server support it.
  • \n"); +#endif /* ndef DENY_GZIP */ + +#ifdef STATISTICS + b = strsav(b, "
  • #define STATISTICS - Enables statistics function.
  • \n"); +#else /* ifndef STATISTICS */ + b = strsav(b, "
  • #undef STATISTICS - Disables statistics function.
  • \n"); +#endif /* ndef STATISTICS */ + +#ifdef SPLIT_PROXY_ARGS + b = strsav(b, "
  • #define SPLIT_PROXY_ARGS - Split this page up by placing the configuration files on separate pages.
  • \n"); +#else /* ifndef SPLIT_PROXY_ARGS */ + b = strsav(b, "
  • #undef SPLIT_PROXY_ARGS - This page contains the text of the configuration files, they are not split onto separate pages.
  • \n"); +#endif /* ndef SPLIT_PROXY_ARGS */ + +#ifdef KILLPOPUPS + b = strsav(b, "
  • #define KILLPOPUPS - Enables killing JavaScript popups.
  • \n"); +#else /* ifndef KILLPOPUPS */ + b = strsav(b, "
  • #undef KILLPOPUPS - Disables killing JavaScript popups.
  • \n"); +#endif /* ndef KILLPOPUPS */ + +#ifdef WEBDAV + b = strsav(b, "
  • #define WEBDAV - Enables support for webDAV - e.g. stops Microsoft Outlook from accessing HotMail e-mail.
  • \n"); +#else /* ifndef WEBDAV */ + b = strsav(b, "
  • #undef WEBDAV - Disables support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail.
  • \n"); +#endif /* ndef WEBDAV */ + +#ifdef DETECT_MSIE_IMAGES + b = strsav(b, "
  • #define DETECT_MSIE_IMAGES - Enables detecting image requests automatically for MSIE.
  • \n"); +#else /* ifndef DETECT_MSIE_IMAGES */ + b = strsav(b, "
  • #undef DETECT_MSIE_IMAGES - Disables detecting image requests automatically for MSIE.
  • \n"); +#endif /* ndef DETECT_MSIE_IMAGES */ + +#ifdef IMAGE_BLOCKING + b = strsav(b, "
  • #define IMAGE_BLOCKING - Enables sending \"blocked\" images instead of HTML.
  • \n"); +#else /* ifndef IMAGE_BLOCKING */ + b = strsav(b, "
  • #undef IMAGE_BLOCKING - Disables sending \"blocked\" images instead of HTML.
  • \n"); +#endif /* ndef IMAGE_BLOCKING */ + +#ifdef ACL_FILES + b = strsav(b, "
  • #define ACL_FILES - Enables the use of ACL files to control access to the proxy by IP address.
  • \n"); +#else /* ifndef ACL_FILES */ + b = strsav(b, "
  • #undef ACL_FILES - Disables the use of ACL files to control access to the proxy by IP address.
  • \n"); +#endif /* ndef ACL_FILES */ + +#ifdef TRUST_FILES + b = strsav(b, "
  • #define TRUST_FILES - Enables the use of trust files.
  • \n"); +#else /* ifndef TRUST_FILES */ + b = strsav(b, "
  • #undef TRUST_FILES - Disables the use of trust files.
  • \n"); +#endif /* ndef TRUST_FILES */ + +#ifdef JAR_FILES + b = strsav(b, "
  • #define JAR_FILES - Enables the use of jar files to capture cookies.
  • \n"); +#else /* ifndef JAR_FILES */ + b = strsav(b, "
  • #undef JAR_FILES - Disables the use of jar files to capture cookies.
  • \n"); +#endif /* ndef JAR_FILES */ + +#ifdef FAST_REDIRECTS + b = strsav(b, "
  • #define FAST_REDIRECTS - Enables intercepting remote script redirects.
  • \n"); +#else /* ifndef FAST_REDIRECTS */ + b = strsav(b, "
  • #undef FAST_REDIRECTS - Disables intercepting remote script redirects.
  • \n"); +#endif /* ndef FAST_REDIRECTS */ + + return b; +} + + +/* + Local Variables: + tab-width: 3 + end: +*/ diff --git a/showargs.h b/showargs.h new file mode 100644 index 00000000..48df8317 --- /dev/null +++ b/showargs.h @@ -0,0 +1,75 @@ +#ifndef _SHOWARGS_H +#define _SHOWARGS_H +#define SHOWARGS_H_VERSION "$Id: showargs.h,v 1.4 2001/06/03 19:13:05 oes Exp $" +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/showargs.h,v $ + * + * Purpose : Contains various utility routines needed to + * generate the show-proxy-args page. + * + * 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: showargs.h,v $ + * Revision 1.4 2001/06/03 19:13:05 oes + * moved stuff to cgi.c + * + * Revision 1.3 2001/05/29 23:11:38 oes + * + * - Moved strsav() from showargs to miscutil + * + * Revision 1.2 2001/05/26 00:28:36 jongfoster + * Automatic reloading of config file. + * Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32). + * Most of the global variables have been moved to a new + * struct configuration_spec, accessed through csp->config->globalname + * Most of the globals remaining are used by the Win32 GUI. + * + * Revision 1.1.1.1 2001/05/15 13:59:03 oes + * Initial import of version 2.9.3 source tree + * + * + *********************************************************************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +extern void savearg(char *c, char *o, struct configuration_spec * config); +extern char *show_rcs(void); +extern char *show_defines(void); + +/* Revision control strings from this header and associated .c file */ +extern const char showargs_rcs[]; +extern const char showargs_h_rcs[]; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ndef _SHOWARGS_H */ diff --git a/ssplit.c b/ssplit.c index ff362568..c0315bcf 100644 --- a/ssplit.c +++ b/ssplit.c @@ -1,4 +1,4 @@ -const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; +const char ssplit_rcs[] = "$Id: ssplit.c,v 1.2 2001/05/17 23:01:01 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/ssplit.c,v $ @@ -6,7 +6,7 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; * Purpose : A function to split a string at specified deliminters. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -32,18 +32,6 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; * * Revisions : * $Log: ssplit.c,v $ - * Revision 1.5 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.4 2001/11/13 00:16:38 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.3 2001/05/29 08:54:25 jongfoster - * Rewrote the innards of ssplit() to be easier to understand, - * faster, and to use less memory. Didn't change the interface - * except to give the parameters meaningful names. - * * Revision 1.2 2001/05/17 23:01:01 oes * - Cleaned CRLF's from the sources and related files * @@ -59,6 +47,10 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; #include #include +#ifdef _WIN32 +#include +#endif + #include "ssplit.h" #include "miscutil.h" diff --git a/ssplit.h b/ssplit.h index 397dda2a..757a98e2 100644 --- a/ssplit.h +++ b/ssplit.h @@ -1,6 +1,6 @@ -#ifndef SSPLIT_H_INCLUDED -#define SSPLIT_H_INCLUDED -#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.4 2002/03/24 13:25:43 swa Exp $" +#ifndef _SSPLIT_H +#define _SSPLIT_H +#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.1.1.1 2001/05/15 13:59:04 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/ssplit.h,v $ @@ -8,7 +8,7 @@ * Purpose : A function to split a string at specified deliminters. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -34,18 +34,6 @@ * * Revisions : * $Log: ssplit.h,v $ - * Revision 1.4 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.3 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.2 2001/05/29 08:54:25 jongfoster - * Rewrote the innards of ssplit() to be easier to understand, - * faster, and to use less memory. Didn't change the interface - * except to give the parameters meaningful names. - * * Revision 1.1.1.1 2001/05/15 13:59:04 oes * Initial import of version 2.9.3 source tree * @@ -68,7 +56,7 @@ extern const char ssplit_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef SSPLIT_H_INCLUDED */ +#endif /* ndef _SSPLIT_H */ /* Local Variables: diff --git a/templates/blocked b/templates/blocked index 9097b522..4d0d77e7 100644 --- a/templates/blocked +++ b/templates/blocked @@ -1,12 +1,12 @@ ########################################################## # -# "Blocked" Error Output template for Privoxy. +# "Blocked" Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: # --------------------- # -# Template files are written in plain HTML, with a few +# Template files are written win plain HTML, with a few # additions: # # - Lines that start with a '#' character like this one @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -49,8 +49,12 @@ # # hostport: # The host and port part of the request that lead to this problem +# hostport-html: +# The host and port part of the request that lead to this problem, HTML-encoded # path: # The path part of the request that lead to this problem +# path-html: +# The path part of the request that lead to this problem, HTML-encoded # # # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: @@ -58,27 +62,19 @@ # # unstable: # This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # force-support: -# Privoxy has been compiled with support for forced loading +# Junkbuster has been compiled with support for forced loading # of blocked content. In that case, the symbol "force-prefix" is # avaiable, which translates to the FORCE_PREFIX # - Request blocked (Privoxy@@my-hostname@) + Request blocked (Junkbuster@@my-hostname@) @@ -92,16 +88,33 @@

    BLOCKED

    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + + + + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Request for blocked URL

    -

    Your request for @hostport@@path@ was blocked. -
    See why +

    Your request for @hostport-html@@path-html@ was blocked. +
    See why or go there anyway. @@ -112,60 +125,24 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - diff --git a/templates/blocked-compact b/templates/blocked-compact index f0ff59fa..6b9871d0 100644 --- a/templates/blocked-compact +++ b/templates/blocked-compact @@ -1,6 +1,6 @@ ########################################################## # -# "Blocked" Error Output template for Privoxy. +# "Blocked" Error Output template for junkbuster 2.9.x. # Compact variant. # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -49,8 +49,12 @@ # # hostport: # The host and port part of the request that lead to this problem +# hostport-html: +# The host and port part of the request that lead to this problem, HTML-encoded # path: # The path part of the request that lead to this problem +# path-html: +# The path part of the request that lead to this problem, HTML-encoded # # # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: @@ -58,15 +62,19 @@ # # unstable: # This is an alpha or beta release of the proxy software +# have-proxy-info: +# A URL for online documentation about this proxy has been +# specified and is available through the "proxy-info-url" +# symbol # force-support: -# Privoxy has been compiled with support for forced loading +# Junkbuster has been compiled with support for forced loading # of blocked content. In that case, the symbol "force-prefix" is # avaiable, which translates to the FORCE_PREFIX # - Request blocked (Privoxy@@my-hostname@) + Request blocked (Junkbuster@@my-hostname@) @@ -74,8 +82,8 @@ -

    Your request for @hostport@@path@ was blocked. -
    See why +

    Your request for @hostport-html@@path-html@ was blocked. +
    See why or go there anyway. diff --git a/templates/cgi-error-404 b/templates/cgi-error-404 deleted file mode 100644 index c7e51da0..00000000 --- a/templates/cgi-error-404 +++ /dev/null @@ -1,166 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of

  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# - - - - 404 - Privoxy Configuration Page not found - - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    404

    -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Privoxy Configuration page not found

    -
    -

    You typed in what looks like a URL used to configure - Privoxy, but it cannot be recognised. Maybe it's - for a different Privoxy version, or you typed it - in wrong? Or maybe the Privoxy administrator - has decided to disable the feature.

    -

    If you got here by clicking a link in the - configuration interface, please file a bug report!

    -

    You can use the menu below to select from the available - configuration options

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-bad-param b/templates/cgi-error-bad-param deleted file mode 100644 index 699b7042..00000000 --- a/templates/cgi-error-bad-param +++ /dev/null @@ -1,173 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# - - - - Privoxy: Bad parameter - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Bad parameter to Privoxy configuration page

    -
    -

    You've found a page used to configure Privoxy, but the - parameters (the part of the web page address after the - "?" mark) are wrong or missing.

    -

    Possible causes:

    -
      -
    • If you just typed a URL pattern into a form, then you got - something wrong. Press the "back" button on your browser - once and correct what you typed.
    • -
    • If you tried to type in the URL, then you've found a - page where you can't do that. You can only view this - page by following links from elsewhere in the configuration - interface.
    • -
    • If you got here using your browser's "back" button, then - that is deliberately disabled for this page.
    • -
    • If you got here by clicking a link in the - configuration interface, please file a bug report!
    • -
    -

    You can use the menu below to select from the available - configuration options

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-disabled b/templates/cgi-error-disabled deleted file mode 100644 index bfe67158..00000000 --- a/templates/cgi-error-disabled +++ /dev/null @@ -1,160 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# - - - - Configuration Page Disabled - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Privoxy Configuration page diasabled

    -
    -

    The Privoxy administrator has decided to disable this - feature. If you want to use it, you must ask them to - enable it.

    -

    If you are the Privoxy administrator, you can enable - this feature by changing the appropriate line in your - configuration file.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-file b/templates/cgi-error-file deleted file mode 100644 index d9d0d6a0..00000000 --- a/templates/cgi-error-file +++ /dev/null @@ -1,156 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# - - - - Privoxy: Actions file not found - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Actions file not found

    -
    -

    The actions file you are trying to edit (@f@.action) - does not exist, or cannot be read.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-modified b/templates/cgi-error-modified deleted file mode 100644 index af5e5af9..00000000 --- a/templates/cgi-error-modified +++ /dev/null @@ -1,175 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# - - - - Privoxy: URL out of date - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    URL out of date - file has changed since it was generated

    -
    -

    The URL you're viewing is out of date. To prevent possible - damage to your configuration file, this action has been ignored. -

    -

    Possible causes:

    -
      -
    • If you got here using your browser's "back" button, then - that is deliberately disabled for this page. Please - navigate around the configuration editor using the - links provided.
    • -
    • Perhaps you've got more than one browser window open, and - you're trying to change the same file in both? You can - only have one editor window open at a time. Your other edit - window should continue to function.
    • -
    • You may have modified the file some other way - perhaps by - editing it with a text editor. Simply go back in to the - configuration interface using the links below.
    • -
    -

    You can go back into the edit interface using the menu below, - or by clicking here.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-parse b/templates/cgi-error-parse deleted file mode 100644 index f96bc9c6..00000000 --- a/templates/cgi-error-parse +++ /dev/null @@ -1,192 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# - - - - Privoxy: Parse error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Parse error

    -
    -

    The file you're trying to edit is not valid. You need to fix - it using a text editor before you can edit it using the - web-based editor.

    -

    This error should only occur if you edited the file using a text - editor. If you managed to take a valid file and break it this - badly using the web-based editor, please file a bug report!

    -

    When you've fixed the problem, you can go back into the edit - interface using the menu below, or by clicking here.

    -
    -
    -

    Problem description:

    -

    @parse-error@

    -
    -

    The line which caused the problem:

    -
    @line-raw@
    -
    -

    The line which caused the problem, with comments removed

    -

    @line-data@

    -
    -

    Note

    -

    Only the first error is reported - the file may contain other - errors, as well as the one reported above.

    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/connect-failed b/templates/connect-failed index 56468915..d60b1bb3 100644 --- a/templates/connect-failed +++ b/templates/connect-failed @@ -1,6 +1,6 @@ ########################################################## # -# No-Such-Domain Error Output template for Privoxy. +# No-Such-Domain Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -51,8 +51,12 @@ # The IP address of the host that could not be reached # hostport: # The host and port part of the request that lead to this problem +# hostport-html: +# The host and port part of the request that lead to this problem, HTML-encoded # path: # The path part of the request that lead to this problem +# path-html: +# The path part of the request that lead to this problem, HTML-encoded # # # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: @@ -60,23 +64,15 @@ # # unstable: # this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # - 503 - Connect failed (Privoxy@@my-hostname@) + 503 - Connect failed (Junkbuster@@my-hostname@) @@ -90,16 +86,33 @@

    503

    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + + + + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Connect failed

    -

    Your request for http://@hostport@@path@ could not be fulfilled, because the connection - to @host@ (@host-ip@) could not be established.

    +

    Your request for http://@hostport-html@@path-html@ could not be fulfilled, because the connection + to @host-html@ (@host-ip@) could not be established.

    This is often a temporary failiure, so you might just try again.

    @@ -108,61 +121,24 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - - diff --git a/templates/default b/templates/default index 263a1c5b..b4e4b7bc 100644 --- a/templates/default +++ b/templates/default @@ -1,6 +1,6 @@ ########################################################## # -# Default-CGI Output template for Privoxy. +# Default-CGI Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -52,23 +52,15 @@ # # unstable: # this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # - Privoxy@@my-hostname@ + Junkbuster@@my-hostname@ @@ -79,15 +71,8 @@ - - - - @@ -95,52 +80,39 @@ # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - + + + + - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Thank you for using Privoxy!

    -

    Please choose from the following options:

    -
      @menu@
    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems!
    Use at your own risk. See the license for details.

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Thank you for using the SourceForge edition of Internet Junkbuster!

    +

    Please choose from the following options:

    +
      @menu@
    +
    -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    diff --git a/templates/edit-actions-add-url-form b/templates/edit-actions-add-url-form deleted file mode 100644 index d690c865..00000000 --- a/templates/edit-actions-add-url-form +++ /dev/null @@ -1,169 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-add-url-form,v $ -# -# Purpose : Template used to add a URL pattern to the actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# 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: edit-actions-add-url-form,v $ -# Revision 1.9 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.8 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.7 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.6 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.5 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.4 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.3 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.2 2002/01/17 21:21:03 jongfoster -# DOS->Unix line endings -# -# Revision 1.1 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# section -# -############################################################################# - - - - - - - - - -Privoxy: Edit URL Pattern - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Add URL Pattern

    -
    -

    - - - -
    -   -   - Cancel -

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - - diff --git a/templates/edit-actions-for-url b/templates/edit-actions-for-url deleted file mode 100644 index 93cc322a..00000000 --- a/templates/edit-actions-for-url +++ /dev/null @@ -1,815 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-for-url,v $ -# -# Purpose : Template used to edit the actions associated with a -# particular section in an actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# 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: edit-actions-for-url,v $ -# Revision 1.18 2002/03/24 16:32:08 jongfoster -# Removing logo option -# -# Revision 1.17 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.16 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.15 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.14 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.13 2002/03/16 14:28:38 jongfoster -# First version of modular filters support -# -# Revision 1.12 2002/03/12 01:42:50 oes -# Introduced modular filters -# -# Revision 1.11 2002/03/08 18:19:14 jongfoster -# Adding +image-blocker{pattern} option to edit interface -# -# Revision 1.10 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.9 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.8 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.7 2002/01/17 21:21:03 jongfoster -# DOS->Unix line endings -# -# Revision 1.6 2001/11/22 21:58:41 jongfoster -# Adding action +no-cookies-keep -# -# Revision 1.5 2001/11/13 21:12:17 jongfoster -# Added support for the following actions: -# +downgrade, +limit-connect, +no-compression -# -# Revision 1.4 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Browser support for the JavaScript on this page: -# MS Internet Explorer 5.5 - Tested, Yes -# Netscape 6.0 - Tested, Yes -# Netscape 4.75 - Tested, NO -# Opera 5.12 - Tested, NO -# MS Internet Explorer 4+ - Untested, Yes -# MS IE 3.x, NS3.x - Untested, NO -# Mozilla >=0.6 - Untested, Yes -# -# All browsers should work, you just might not get the pretty DHTML effects. -# -# The effects that only work under the browsers marked "Yes" above are: -# - Text edit boxes that won't have any effect are disabled. -# - Table rows containing additional settings are hidden if the feature in -# question is disabled. -# -# There are major kludges to get around these problems with NS4, but they -# screw up the HTML too much for other browsers. If anyone wants to try, -# here's some descriptions of the kludges: -# http://www.webreference.com/js/tips/991114.html -# http://www.webreference.com/dhtml/column12/outDisplay.html -# -# If you're favorite browser isn't listed, please test and add it. -# -# -############################################################################# -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# action-name-y -# action-name-n -# action-name-x -# -# deanimate-gifs-param-first -# deanimate-gifs-param-last -# hide-from-param-block -# hide-from-param-custom -# hide-from-param -# hide-referer-param-forge -# hide-referer-param-block -# hide-referer-param-custom -# hide-referer-param -# hide-user-agent-param -# image-blocker-param-pattern -# image-blocker-param-blank -# image-blocker-param-custom -# -# -############################################################################# - - - - - - - - - -Privoxy: Edit actions - - - - - - - - -
    - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Edit Actions - - - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@filter-params@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EnableDisableNo ChangeActionDescription
    +add-headerAdds HTTP headers.
        Editing the settings for this option, or turning - it on if it was off, is not yet supported using this web-based - editor.
    +blockBlock the request
    +deanimate-gifsReplace animated GIFs with their (first/last) frame.
        Use the   
    +fast-redirectsBypass some tracking URLs.
    +downgradeChange HTTP/1.1 requests to HTTP/1.0. Only change if you know - what you're doing!
       +filterFilter the website through regular expression filters. - You can enable or disable the filters individually.
       All filters applied by previous rules
    +hide-forwardedBlock any existing X-Forwarded-for header, and do not add a new one.
    +hide-fromStop old web browsers from sending the user's e-mail address with - every request.
        
    -
    -
    +hide-refererHelps prevent tracking by not sending the URL of the previous web - page. 
         (breaks images - on some free web hosts).
    - (fools checks for in-site links.)
    -
    -
    +hide-user-agentPretend to be using a different web browser.  (Breaks many web - sites).
        User Agent string to send:
    -
    +imageRequest is for an image (only useful in conjunction with the +block - and +image-blocker options).
    +image-blockerSpecifies how to block images.  Disable to always send a HTML - "blocked" page.
        
    -
    -
    -
    +limit-connectSpecify which ports are allowed for SSL (HTTP CONNECT) access. - Note that this allows arbitrary tunnelling, so opening all - ports would be a security hole.
        Legal SSL ports (comma separated, ranges allowed):
    -
    +no-compressionDisables compression. Compressed web pages are faster to - download, but cannot be filtered with +filter or +no-popups. - This setting only affects the few web sites which support - compression.
    +no-cookies-keepAny cookies set by the website are changed to temporary - ("per-session") ones, which only last until you close your web - browser. This will allow you to use sites that require cookies, but - sites will not be able to track you across sessions. For this to - be useful, you should disable no-cookies-read and - no-cookies-set.
    +no-cookies-readPrevent the website from reading cookies.
    +no-cookies-setPrevent the website from setting cookies.
    +no-popupsFilter the website through a built-in filter to disable JavaScript - pop-up windows.
    +vanilla-waferIf you use a jarfile, automatically adds a special wafer.
    +waferAdds user-specified cookies.
        Editing the settings for this option, or turning - it on if it was off, is not yet supported using this web-based - editor.
    - - - - - - - - - - - - - - - - - -
    -

    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    -
    - - - - - diff --git a/templates/edit-actions-for-url-filter b/templates/edit-actions-for-url-filter deleted file mode 100644 index 06020cba..00000000 --- a/templates/edit-actions-for-url-filter +++ /dev/null @@ -1,6 +0,0 @@ - - - - -   @description@ (@name@) - diff --git a/templates/edit-actions-list b/templates/edit-actions-list deleted file mode 100644 index 24d62957..00000000 --- a/templates/edit-actions-list +++ /dev/null @@ -1,260 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-list,v $ -# -# Purpose : Template used to edit the actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# 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: edit-actions-list,v $ -# Revision 1.13 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.12 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.11 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.10 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.9 2002/03/05 00:24:51 jongfoster -# Patch to always edit the current actions file. -# -# Revision 1.8 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.7 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.6 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.5 2002/01/17 21:21:05 jongfoster -# DOS->Unix line endings -# -# Revision 1.4 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Browser support for the CSS on this page: -# MS Internet Explorer 5.5 - Yes - everything works. -# Netscape 6.2 - Yes - everything works. -# Netscape 4.75 - No - CSS buttons look really bad, but they are -# usable. Everything else works. -# Opera 5.12 - Yes - everything works. -# MS Internet Explorer 4+ - Untested -# MS IE 3.x, NS3.x - Untested (Don't support CSS, so everything -# should work, but will look ugly). -# Mozilla >=0.6 - Untested -# -# All browsers should work, you just might not get the pretty CSS buttons. -# -# If you're favorite browser isn't listed/tested, please test and add it. -# -# -############################################################################# -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# -# -############################################################################# - - - - - - - - - -Privoxy: Edit actions file - - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    - -
    - - - - - -
    -

    Editing Actions File

    -

    Insert new section at top

    -
    - -@sections@ - -
    - - - - - - - - - - -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - diff --git a/templates/edit-actions-list-section b/templates/edit-actions-list-section deleted file mode 100644 index 2de8ce24..00000000 --- a/templates/edit-actions-list-section +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-section,v $ -# -# Purpose : Template which forms part of edit-actions-list -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# 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: edit-actions-list-section,v $ -# Revision 1.6 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.5 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.4 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.3 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# sectionid -# urls -# -############################################################################# -# -# ** Important note: ** -# -# It is important to keep this file small. That's why all the -# identifiers in the HTML are short and cryptic. Currently, the main -# edit-actions page is ~300k. Before it was optimized, it was ~550k. -# -############################################################################# - - - - - - - - - - - - - - -@urls@ - - - - - - - -
    Actions:Edit@actions@
    ----
    URLs:Add 
    -
    Advanced: - - - - - - - - - -
      @if-s-prev-exists-start@Move section up   @if-s-prev-exists-end@   Insert new section below  
      @if-s-next-exists-start@Move section down   @if-s-next-exists-end@   @if-empty-section-start@Delete whole section  @if-empty-section-end@
    -
    -

     

    - diff --git a/templates/edit-actions-list-url b/templates/edit-actions-list-url deleted file mode 100644 index fcaa7c4d..00000000 --- a/templates/edit-actions-list-url +++ /dev/null @@ -1,73 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-url,v $ -# -# Purpose : Template which forms part of edit-actions-list -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# 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: edit-actions-list-url,v $ -# Revision 1.6 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.5 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.4 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.3 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# sectionid -# urls -# -############################################################################# -# -# ** Important note: ** -# -# It is *extremely* important to keep this file small. That's why all the -# identifiers in the HTML are short and cryptic. Currently, the main -# edit-actions page is ~300k. Before it was optimized, it was ~550k. -# -############################################################################# -  -Remove   Edit  -@url-html@ - diff --git a/templates/edit-actions-remove-url-form b/templates/edit-actions-remove-url-form deleted file mode 100644 index 596391e9..00000000 --- a/templates/edit-actions-remove-url-form +++ /dev/null @@ -1,153 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-remove-url-form,v $ -# -# Purpose : Template used to confirm removal of a particular URL -# pattern from an actions file. Only used on browsers that -# don't support JavaScript. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# 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: edit-actions-remove-url-form,v $ -# Revision 1.9 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.8 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.7 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.6 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.5 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.4 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.3 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.2 2002/01/17 21:21:05 jongfoster -# DOS->Unix line endings -# -# Revision 1.1 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# section -# pattern -# oldval -# -############################################################################# - - - - - - - - - -Privoxy: Remove URL Pattern - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Remove URL Pattern

    -

    Are you sure you want to delete this URL pattern? The pattern is:

    -

    @u@

    -

    - OK -   - Cancel -

    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - - diff --git a/templates/edit-actions-url-form b/templates/edit-actions-url-form deleted file mode 100644 index f3766b43..00000000 --- a/templates/edit-actions-url-form +++ /dev/null @@ -1,171 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-url-form,v $ -# -# Purpose : Template used to edit a URL pattern in an actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# 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: edit-actions-url-form,v $ -# Revision 1.9 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.8 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.7 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.6 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.5 2002/03/03 10:29:13 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.4 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.3 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.2 2002/01/17 21:21:05 jongfoster -# DOS->Unix line endings -# -# Revision 1.1 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# f - filename -# v - version -# s - section -# p - pattern -# u - old value of URL -# -############################################################################# - - - - - - - - - -Privoxy: Edit URL Pattern - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Edit URL Pattern

    -
    -

    - - - -
    -   -   - Cancel -

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - - diff --git a/templates/no-such-domain b/templates/no-such-domain index e119f759..a8c02024 100644 --- a/templates/no-such-domain +++ b/templates/no-such-domain @@ -1,6 +1,6 @@ ########################################################## # -# No-Such-Domain Error Output template for Privoxy. +# No-Such-Domain Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -32,8 +32,8 @@ # my-hostname: # The hostname associated with my-ip-addr # admin-address: -# The email address of the proxy's administrator, as configured -# in the 'config' file +# The email address of the pxoxy's administrator, as configured +# in the config file # default-cgi: # The URL for the "main menu" builtin CGI of this proxy # menu: @@ -47,38 +47,32 @@ # The URL of the SourceForge ijbswa project, who maintains this # software. # -# host: -# The host part of the request that lead to this problem +# host-html: +# The host part of the request that lead to this problem, HTML-encoded # hostport: # The host and port part of the request that lead to this problem +# hostport-html: +# The host and port part of the request that lead to this problem, HTML-encoded # path: # The path part of the request that lead to this problem -# proxy-info-url: -# The URL to local online Privoxy documentation, if define in the -# 'config' file +# path-html: +# The path part of the request that lead to this problem, HTML-encoded +# # # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: # ------------------------------------------------------------------ # # unstable: # this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # - 404 - No such Domain (Privoxy@@my-hostname@) + 404 - No such Domain (Junkbuster@@my-hostname@) @@ -92,16 +86,33 @@

    404

    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    + + + +

    No such domain

    -

    Your request for http://@hostport@@path@ could not be fulfilled, because - the domain name @host@ could not be resolved.

    +

    Your request for http://@hostport-html@@path-html@ could not be fulfilled, because + the domain name @host-html@ could not be resolved.

    This is often a temporary failiure, so you might just try again.

    @@ -110,61 +121,24 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - - diff --git a/templates/show-request b/templates/show-request deleted file mode 100644 index c1badf40..00000000 --- a/templates/show-request +++ /dev/null @@ -1,172 +0,0 @@ -########################################################## -# -# Show-Request-CGI Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# client-request: -# The request and headers that the client sent. -# processed-request: -# What we would have rewritten this request to, if this had not -# been intercepted. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# - - - - Privoxy@@my-hostname@ - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Show-Request

    -
    - Here you see the original headers that your client sent when requesting this page, along with - the headers that Privoxy would have sent to the remote server if this request hadn't been - intercepted. -
    - -

    Original Client Request:

    -
    -
    @client-request@
    -
    - -

    Processed Request:

    -
    -
    @processed-request@
    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/show-status b/templates/show-status index 6d9ccfca..e3f8e258 100644 --- a/templates/show-status +++ b/templates/show-status @@ -1,6 +1,6 @@ ########################################################## # -# Show-Status-CGI Output template for Privoxy. +# Show-Status-CGI Output template for junkbuster 2.9.x # # USING HTML TEMPLATES: # --------------------- @@ -14,7 +14,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -47,10 +47,10 @@ # software. # # redirect-url: -# The URL to a script that will redirect to the Privoxy +# The URL to a script that will redirect to the junkbuster # documentation for a given item # invocation: -# The command line with whitch Privoxy was invoked +# The command line with whitch junkbuster was invoked # options: # The options read from the configfile, linked to their # explanations, plus warnings if parsing acl or forward @@ -59,7 +59,7 @@ # A HTML-formatted list of the individual source file cvs versions # defines: # A HTML-formatted list of all conditional #defines used when -# Privoxy was compiled +# junkbuster was compiled # # # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: @@ -67,20 +67,12 @@ # # unstable: # This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # statistics: -# Privoxy was compiled with statistics support +# Junkbuster was compiled with statistics support # have-stats: # There have been previous requests and statistics have # been collected. In this case, the following symbols @@ -94,21 +86,36 @@ # have-no-stats: # There haven't any statistics been collected yet # pcrs-support: -# Privoxy was compiled with pcrs support +# Junkbuster was compiled with pcrs support # trust-support: -# Privoxy was compiled with trust support -# actions-filename: -# The path to the actions file. -# re-filter-filename: -# The path to the re_filter file. Only available if -# pcrs-support is set -# trust-filename: -# The path to the trust file.Only available if -# trust-support is set +# Junkbuster was compiled with trust support +# split-args: +# Junkbuster was compiled with #define SPLIT_PROXY_ARGS +# In this case, the following symbols are available: +# actions-filename: +# The path to the actions file. +# re-filter-filename: +# The path to the re_filter file. Only available if +# pcrs-support is set +# trust-filename: +# The path to the trust file.Only available if +# trust-support is set +# no-split-args: +# Junkbuster was not compiled with #define SPLIT_PROXY_ARGS +# In this case, the following symbols are available: +# alist: +# The contents of the actionsfile +# rlist: +# The contents of the re_filterfile. Only available if +# pcrs-support is set +# tlist: +# The contents of the trustfile. Only available if +# trust-support is set +# - Privoxy@@my-hostname@: Proxy Status + Junkbuster@@my-hostname@: Proxy Status @@ -119,9 +126,26 @@ + + + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + + + + + + - + - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + - + + + + + + + + + + - - + + + + -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    +
    +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    @@ -144,7 +168,7 @@
    @requests-blocked@ out of @requests-received@ requests have been blocked, - which equals a block rate of @percent-blocked@%. + which equals a block rate of @percent-blocked@. There haven't been any requests so far. @@ -153,6 +177,7 @@

    The following files are in use:

    @@ -168,167 +193,71 @@
    -

    Conditional #defines:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #define Enabled? Effects when enabled
    FEATURE_ACL@if-FEATURE_ACL-then@ Yes @else-not-FEATURE_ACL@ No @endif-FEATURE_ACL@Allows the use of an ACL to control access to the proxy by IP address.
    FEATURE_CGI_EDIT_ACTIONS@if-FEATURE_CGI_EDIT_ACTIONS-then@ Yes @else-not-FEATURE_CGI_EDIT_ACTIONS@ No @endif-FEATURE_CGI_EDIT_ACTIONS@Allows the use of the web-based actions file - editor@if-FEATURE_CGI_EDIT_ACTIONS-then@, which is here@else-not-FEATURE_CGI_EDIT_ACTIONS@@endif-FEATURE_CGI_EDIT_ACTIONS@.
    FEATURE_COOKIE_JAR@if-FEATURE_COOKIE_JAR-then@ Yes @else-not-FEATURE_COOKIE_JAR@ No @endif-FEATURE_COOKIE_JAR@Allows the use of a "cookie jar" file to capture cookies.
    FEATURE_FAST_REDIRECTS@if-FEATURE_FAST_REDIRECTS-then@ Yes @else-not-FEATURE_FAST_REDIRECTS@ No @endif-FEATURE_FAST_REDIRECTS@Allows the +fast-redirects action, to bypass redirect and logging scripts.
    FEATURE_FORCE_LOAD@if-FEATURE_FORCE_LOAD-then@ Yes @else-not-FEATURE_FORCE_LOAD@ No @endif-FEATURE_FORCE_LOAD@Allows bypassing all filtering for a single page using the prefix "@FORCE_PREFIX@".
    FEATURE_IMAGE_BLOCKING@if-FEATURE_IMAGE_BLOCKING-then@ Yes @else-not-FEATURE_IMAGE_BLOCKING@ No @endif-FEATURE_IMAGE_BLOCKING@Allows the +image ation, to send "blocked" images instead of HTML.
    FEATURE_IMAGE_DETECT_MSIE@if-FEATURE_IMAGE_DETECT_MSIE-then@ Yes @else-not-FEATURE_IMAGE_DETECT_MSIE@ No @endif-FEATURE_IMAGE_DETECT_MSIE@Enables automatic detection of image and HTML requests from - Microsoft Internet Explorer users, overriding the setting of - +image in the actions file.
    FEATURE_KILL_POPUPS@if-FEATURE_KILL_POPUPS-then@ Yes @else-not-FEATURE_KILL_POPUPS@ No @endif-FEATURE_KILL_POPUPS@Allows the +no-popups action, to block JavaScript popups.
    FEATURE_NO_GIFS@if-FEATURE_NO_GIFS-then@ Yes @else-not-FEATURE_NO_GIFS@ No @endif-FEATURE_NO_GIFS@Use PNG instead of GIF for the built-in images.
    FEATURE_PTHREAD@if-FEATURE_PTHREAD-then@ Yes @else-not-FEATURE_PTHREAD@ No @endif-FEATURE_PTHREAD@Use POSIX threads rather than native threads
    FEATURE_STATISTICS@if-FEATURE_STATISTICS-then@ Yes @else-not-FEATURE_STATISTICS@ No @endif-FEATURE_STATISTICS@Enables the statistics function.
    FEATURE_TOGGLE@if-FEATURE_TOGGLE-then@ Yes @else-not-FEATURE_TOGGLE@ No @endif-FEATURE_TOGGLE@Allow Privoxy to be "disabled" so it is just a normal non-blocking non-anonymizing proxy.
    FEATURE_TRUST@if-FEATURE_TRUST-then@ Yes @else-not-FEATURE_TRUST@ No @endif-FEATURE_TRUST@Allows the use of trust files.
    REGEX_GNU@if-REGEX_GNU-then@ Yes @else-not-REGEX_GNU@ No @endif-REGEX_GNU@Changes the type of pattern matching done on URL paths. PCRE is by far the best. - The old GNU style will slow down Privoxy and increase the executable's size. If both of - these are disabled, simple prefix matching is done, but this is very inflexible.
    REGEX_PCRE@if-REGEX_PCRE-then@ Yes @else-not-REGEX_PCRE@ No @endif-REGEX_PCRE@
    STATIC_PCRE@if-STATIC_PCRE-then@ Yes @else-not-STATIC_PCRE@ No @endif-STATIC_PCRE@Use the supplied statically-linked PCRE library. This is set automatically - by ./configure if you do not have the libpcre installed.
    STATIC_PCRS@if-STATIC_PCRS-then@ Yes @else-not-STATIC_PCRS@ No @endif-STATIC_PCRS@Use the supplied statically-linked PCRS library. This is set automatically - by ./configure if you do not have the libpcrs installed.
    +

    Actions List:

    +
    @alist@
    -

    More Privoxy:

    -
      @menu@
    +
    +

    Regex Filter List:

    +
    @rlist@
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    +
    +

    Trust List:

    +
    @tlist@
    +
    +

    Source code versions:

    +
    @sourceversions@
    +
    +

    Conditional #defines:

    +
      @defines@
    -

    Local Privoxy support:

    +

    More Junkbuster:

    +
      @menu@
    +
    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - + \ No newline at end of file diff --git a/templates/show-status-file b/templates/show-status-file index e8a2b7e6..659cf0d3 100644 --- a/templates/show-status-file +++ b/templates/show-status-file @@ -1,6 +1,6 @@ ########################################################## # -# Show-Status-CGI Output template for Privoxy. +# Show-Status-CGI Output template for junkbuster 2.9.x # (Variant for the show-file mode) # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -60,23 +60,15 @@ # # unstable: # This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # - Privoxy@@my-hostname@: Contents of @file-description@ + Junkbuster@@my-hostname@: Contents of @file-description@ @@ -87,68 +79,50 @@ - - - - # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - + + + + -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    -

    Contents of @file-description@ (@filepath@)

    -
    @contents@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems!
    Use at your own risk. See the license for details.

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Contents of @file-description@ (@filepath@)

    +
    @contents@
    +
    -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    +

    Back to the main page.

    - + \ No newline at end of file diff --git a/templates/show-url-info b/templates/show-url-info index 76fc5f04..56c3373c 100644 --- a/templates/show-url-info +++ b/templates/show-url-info @@ -1,6 +1,6 @@ ########################################################## # -# Show-Url-Info-CGI Output template for Privoxy. +# Show-Url-Info-CGI Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -52,23 +52,17 @@ # # unstable: # this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # url-given: # The CGI was called with a url parameter. In that case, the # following symbols are available: # url: # The given URL +# url-html: +# The given URL, HTML-encoded # default: # The system default for actions # matches: @@ -82,7 +76,7 @@ - Privoxy@@my-hostname@ URL Info + Junkbuster@@my-hostname@ URL Info @@ -93,22 +87,38 @@ + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + + + + + + + + @@ -116,7 +126,7 @@ @@ -126,7 +136,7 @@

    Look up the actions for a new URL:

    - + @@ -135,61 +145,24 @@ - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    +
    - -

    NOTE:

    -

    This is a secure (https:) URL, so the part after the "/" is ignored. - This is a feature of the HTTPS protocol - the exact address of the - page you're visiting is hidden. Privoxy can only detect the host - part of the URL.

    -

     

    - -

    Matches for @url@:

    +

    System default actions:

    +

    {@default@}

    +
    +

    Matches for http://@url-html@:

    @matches@

    Final results:

    -

    @final@

    +

    @final@

    -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    diff --git a/templates/show-version b/templates/show-version deleted file mode 100644 index debd5d71..00000000 --- a/templates/show-version +++ /dev/null @@ -1,174 +0,0 @@ -########################################################## -# -# Show-Status-CGI Output template for Privoxy. -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# redirect-url: -# The URL to a script that will redirect to the Privoxy -# documentation for a given item -# invocation: -# The command line with whitch Privoxy was invoked -# options: -# The options read from the configfile, linked to their -# explanations, plus warnings if parsing acl or forward -# statements produced errors. -# sourceversions: -# A HTML-formatted list of the individual source file cvs versions -# defines: -# A HTML-formatted list of all conditional #defines used when -# Privoxy was compiled -# -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# sourceversions -# The versions. - - - - Privoxy@@my-hostname@: Detailed proxy version information - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Source code versions:

    -

    (Note: This information is only relevant if you checked out Privoxy from CVS - and compiled it yourself. If you downloaded a binary, .exe, RPM, or a .tgz file, - then when you ask for support just mention the version number @version@ - and the type of download you got.)

    -

     

    -
    @sourceversions@
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/toggle b/templates/toggle deleted file mode 100644 index 6dc0f009..00000000 --- a/templates/toggle +++ /dev/null @@ -1,199 +0,0 @@ -########################################################## -# -# Toggle Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@ -# - - - - - @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@ - - - - - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    Privoxy is @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    When enabled, Privoxy performs its magic - blocking - adverts, filtering cookies, regex-filtering, etc.

    -

    When disabled, Privoxy behaves as a normal HTTP proxy, - and will not affect your web browsing.

    -

    Click - here to @if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@ Privoxy.

    -
    -
    -

    Bookmarklets

    -
    -

    Here are some bookmarklets to allow you to easily access a - "mini" version of this page. They are designed for MS - Internet Explorer, but should work equally well in - Netscape, Mozilla, and other browsers which support - JavaScript. They are designed to run directly from - your bookmarks - not by clicking the links - below (although that will work for testing).

    - -

    To save them, right-click the link and choose - "Add to Favorites" (IE) or "Add Bookmark" (Netscape). You - will get a warning that the bookmark "may not be safe" - just - click OK. Then you can run the Bookmarklet directly from your - favourites/bookmarks. For even faster access, you can put - them on the "Links" bar (IE) or the "Personal Toolbar" - (Netscape), and run them with a single click.

    - - - -

    Credit: The site which gave me the general idea for these - bookmarklets is - www.bookmarklets.com. - They have more information - about bookmarklets.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/toggle-mini b/templates/toggle-mini deleted file mode 100644 index 68f87f5a..00000000 --- a/templates/toggle-mini +++ /dev/null @@ -1,90 +0,0 @@ -########################################################## -# -# Toggle Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--end@. The strings -# should be placed in HTML comments (), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of
  • elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@ -# - - - - - @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@ - - - - -
    -Privoxy is -@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@. -@if-enabled-display-then@[Disable]@else-not-enabled-display@[Enable]@endif-enabled-display@ -
    -[Close] -
    - - diff --git a/templates/untrusted b/templates/untrusted index 9db1aa02..2bf22284 100644 --- a/templates/untrusted +++ b/templates/untrusted @@ -1,6 +1,6 @@ ########################################################## # -# "Untrusted" Error Output template for Privoxy. +# "Untrusted" Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -49,10 +49,16 @@ # # hostport: # The host and port part of the request that lead to this problem +# hostport-html: +# The host and port part of the request that lead to this problem, HTML-encoded # path: # The path part of the request that lead to this problem +# path-html: +# The path part of the request that lead to this problem, HTML-encoded # referrer: # The referrer of the request that lead to this problem +# referrer-html: +# The referrer of the request that lead to this problem, HTML-encoded # trusted-referrers: # An HTML-formatted list of referrers that are marked as trusted in # the trustfile @@ -63,20 +69,12 @@ # # unstable: # This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # force-support: -# Privoxy has been compiled with support for forced loading +# Junkbuster has been compiled with support for forced loading # of blocked content. In that case, the symbol "force-prefix" is # avaiable, which translates to the FORCE_PREFIX # have-trust-info: @@ -88,7 +86,7 @@ - Untrusted request (Privoxy@@my-hostname@) + Untrusted request (Junkbuster@@my-hostname@) @@ -103,17 +101,35 @@

    UNTRUSTED

    -

    This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    + + + + +

    Request for untrusted URL

    -

    Your request for @hostport@@path@ was blocked, +

    Your request for @hostport-html@@path-html@ was blocked, because neither the request URL itself, nor its referrer - (@referrer@) were trusted. + (@referrer-html@) were trusted.

    (You can go there anyway.)

    @@ -148,62 +164,26 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - - + \ No newline at end of file diff --git a/testdrive.status b/testdrive.status deleted file mode 100644 index 36275484..00000000 --- a/testdrive.status +++ /dev/null @@ -1,31 +0,0 @@ -CHUNK: ASSIGNED TO: RUN1: RUN2: ---------------------------------------------------------------------- -testdrive-intl-aa -testdrive-intl-ab -testdrive-intl-ac -testdrive-intl-ad -testdrive-intl-ae -testdrive-intl-af -testdrive-intl-ag -testdrive-intl-ah -testdrive-intl-ai swa x -testdrive-intl-aj -testdrive-intl-ak -testdrive-unstable -testdrive-us-aa -testdrive-us-ab -testdrive-us-ac -testdrive-us-ad Hal x -testdrive-us-ae -testdrive-us-af -testdrive-us-ag -testdrive-us-ah -testdrive-us-ai -testdrive-us-aj -testdrive-us-ak -testdrive-us-al -testdrive-us-am -testdrive-us-an -testdrive-us-ao -testdrive-us-ap - diff --git a/urlmatch.c b/urlmatch.c deleted file mode 100644 index 772261de..00000000 --- a/urlmatch.c +++ /dev/null @@ -1,824 +0,0 @@ -const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.6 2002/03/24 13:25:43 swa Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/urlmatch.c,v $ - * - * Purpose : Declares functions to match URLs against URL - * patterns. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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: urlmatch.c,v $ - * Revision 1.6 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.5 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.4 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.3 2002/03/03 14:51:11 oes - * Fixed CLF logging: Added ocmd member for client's request to struct http_request - * - * Revision 1.2 2002/01/21 00:14:09 jongfoster - * Correcting comment style - * Fixing an uninitialized memory bug in create_url_spec() - * - * Revision 1.1 2002/01/17 20:53:46 jongfoster - * Moving all our URL and URL pattern parsing code to the same file - it - * was scattered around in filters.c, loaders.c and parsers.c. - * - * Providing a single, simple url_match(pattern,url) function - rather than - * the 3-line match routine which was repeated all over the place. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Providing parse_http_url() so that URLs can be parsed without faking a - * HTTP request line for parse_http_request() or repeating the parsing - * code (both of which were techniques that were actually in use). - * - * Standardizing that struct http_request is used to represent a URL, and - * struct url_spec is used to represent a URL pattern. (Before, URLs were - * represented as seperate variables and a partially-filled-in url_spec). - * - * - *********************************************************************/ - - -#include "config.h" - -#ifndef _WIN32 -#include -#include -#endif - -#include -#include -#include -#include - -#if !defined(_WIN32) && !defined(__OS2__) -#include -#endif - -#include "project.h" -#include "urlmatch.h" -#include "ssplit.h" -#include "miscutil.h" -#include "errlog.h" - -const char urlmatch_h_rcs[] = URLMATCH_H_VERSION; - -/* Fix a problem with Solaris. There should be no effect on other - * platforms. - * Solaris's isspace() is a macro which uses it's argument directly - * as an array index. Therefore we need to make sure that high-bit - * characters generate +ve values, and ideally we also want to make - * the argument match the declared parameter type of "int". - * - * Why did they write a character function that can't take a simple - * "char" argument? Doh! - */ -#define ijb_isupper(__X) isupper((int)(unsigned char)(__X)) -#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) - - -/********************************************************************* - * - * Function : free_http_request - * - * Description : Freez a http_request structure - * - * Parameters : - * 1 : http = points to a http_request structure to free - * - * Returns : N/A - * - *********************************************************************/ -void free_http_request(struct http_request *http) -{ - assert(http); - - freez(http->cmd); - freez(http->ocmd); - freez(http->gpc); - freez(http->host); - freez(http->url); - freez(http->hostport); - freez(http->path); - freez(http->ver); - freez(http->host_ip_addr_str); - freez(http->dbuffer); - freez(http->dvec); - http->dcount = 0; -} - - -/********************************************************************* - * - * Function : parse_http_url - * - * Description : Parse out the host and port from the URL. Find the - * hostname & path, port (if ':'), and/or password (if '@') - * - * Parameters : - * 1 : url = URL (or is it URI?) to break down - * 2 : http = pointer to the http structure to hold elements. - * Will be zeroed before use. Note that this - * function sets the http->gpc and http->ver - * members to NULL. - * 3 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out of memory - * JB_ERR_CGI_PARAMS on malformed command/URL - * or >100 domains deep. - * - *********************************************************************/ -jb_err parse_http_url(const char * url, - struct http_request *http, - struct client_state *csp) -{ - /* - * Zero out the results structure - */ - memset(http, '\0', sizeof(*http)); - - - /* - * Save our initial URL - */ - http->url = strdup(url); - if (http->url == NULL) - { - return JB_ERR_MEMORY; - } - - - /* - * Split URL into protocol,hostport,path. - */ - { - char *buf; - char *url_noproto; - char *url_path; - - buf = strdup(url); - if (buf == NULL) - { - return JB_ERR_MEMORY; - } - - /* Find the start of the URL in our scratch space */ - url_noproto = buf; - if (strncmpic(url_noproto, "http://", 7) == 0) - { - url_noproto += 7; - http->ssl = 0; - } - else if (strncmpic(url_noproto, "https://", 8) == 0) - { - url_noproto += 8; - http->ssl = 1; - } - else - { - http->ssl = 0; - } - - url_path = strchr(url_noproto, '/'); - if (url_path != NULL) - { - /* - * Got a path. - * - * NOTE: The following line ignores the path for HTTPS URLS. - * This means that you get consistent behaviour if you type a - * https URL in and it's parsed by the function. (When the - * URL is actually retrieved, SSL hides the path part). - */ - http->path = strdup(http->ssl ? "/" : url_path); - *url_path = '\0'; - http->hostport = strdup(url_noproto); - } - else - { - /* - * Repair broken HTTP requests that don't contain a path, - * or CONNECT requests - */ - http->path = strdup("/"); - http->hostport = strdup(url_noproto); - } - - free(buf); - - if ( (http->path == NULL) - || (http->hostport == NULL)) - { - free(buf); - free_http_request(http); - return JB_ERR_MEMORY; - } - } - - - /* - * Split hostport into user/password (ignored), host, port. - */ - { - char *buf; - char *host; - char *port; - - buf = strdup(http->hostport); - if (buf == NULL) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - - /* check if url contains username and/or password */ - host = strchr(buf, '@'); - if (host != NULL) - { - /* Contains username/password, skip it and the @ sign. */ - host++; - } - else - { - /* No username or password. */ - host = buf; - } - - /* check if url contains port */ - port = strchr(host, ':'); - if (port != NULL) - { - /* Contains port */ - /* Terminate hostname and point to start of port string */ - *port++ = '\0'; - http->port = atoi(port); - } - else - { - /* No port specified. */ - http->port = (http->ssl ? 143 : 80); - } - - http->host = strdup(host); - - free(buf); - - if (http->host == NULL) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - } - - - /* - * Split domain name so we can compare it against wildcards - */ - { - char *vec[BUFFER_SIZE]; - size_t size; - char *p; - - http->dbuffer = strdup(http->host); - if (NULL == http->dbuffer) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - - /* map to lower case */ - for (p = http->dbuffer; *p ; p++) - { - *p = tolower((int)(unsigned char)*p); - } - - /* split the domain name into components */ - http->dcount = ssplit(http->dbuffer, ".", vec, SZ(vec), 1, 1); - - if (http->dcount <= 0) - { - /* - * Error: More than SZ(vec) components in domain - * or: no components in domain - */ - free_http_request(http); - return JB_ERR_PARSE; - } - - /* save a copy of the pointers in dvec */ - size = http->dcount * sizeof(*http->dvec); - - http->dvec = (char **)malloc(size); - if (NULL == http->dvec) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - - memcpy(http->dvec, vec, size); - } - - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : parse_http_request - * - * Description : Parse out the host and port from the URL. Find the - * hostname & path, port (if ':'), and/or password (if '@') - * - * Parameters : - * 1 : req = HTTP request line to break down - * 2 : http = pointer to the http structure to hold elements - * 3 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out of memory - * JB_ERR_CGI_PARAMS on malformed command/URL - * or >100 domains deep. - * - *********************************************************************/ -jb_err parse_http_request(const char *req, - struct http_request *http, - struct client_state *csp) -{ - char *buf; - char *v[10]; - int n; - jb_err err; - int is_connect = 0; - - memset(http, '\0', sizeof(*http)); - - buf = strdup(req); - if (buf == NULL) - { - return JB_ERR_MEMORY; - } - - n = ssplit(buf, " \r\n", v, SZ(v), 1, 1); - if (n != 3) - { - free(buf); - return JB_ERR_PARSE; - } - - /* this could be a CONNECT request */ - if (strcmpic(v[0], "connect") == 0) - { - /* Secure */ - is_connect = 1; - } - /* or it could be any other basic HTTP request type */ - else if ((0 == strcmpic(v[0], "get")) - || (0 == strcmpic(v[0], "head")) - || (0 == strcmpic(v[0], "post")) - || (0 == strcmpic(v[0], "put")) - || (0 == strcmpic(v[0], "delete")) - - /* or a webDAV extension (RFC2518) */ - || (0 == strcmpic(v[0], "propfind")) - || (0 == strcmpic(v[0], "proppatch")) - || (0 == strcmpic(v[0], "move")) - || (0 == strcmpic(v[0], "copy")) - || (0 == strcmpic(v[0], "mkcol")) - || (0 == strcmpic(v[0], "lock")) - || (0 == strcmpic(v[0], "unlock")) - ) - { - /* Normal */ - is_connect = 0; - } - else - { - /* Unknown HTTP method */ - free(buf); - return JB_ERR_PARSE; - } - - err = parse_http_url(v[1], http, csp); - if (err) - { - free(buf); - return err; - } - - /* - * Copy the details into the structure - */ - http->ssl = is_connect; - http->cmd = strdup(req); - http->gpc = strdup(v[0]); - http->ver = strdup(v[2]); - - if ( (http->cmd == NULL) - || (http->gpc == NULL) - || (http->ver == NULL) ) - { - free(buf); - free_http_request(http); - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : simple_domaincmp - * - * Description : Domain-wise Compare fqdn's. The comparison is - * both left- and right-anchored. The individual - * domain names are compared with simplematch(). - * This is only used by domain_match. - * - * Parameters : - * 1 : pv = array of patterns to compare - * 2 : fv = array of domain components to compare - * 3 : len = length of the arrays (both arrays are the - * same length - if they weren't, it couldn't - * possibly be a match). - * - * Returns : 0 => domains are equivalent, else no match. - * - *********************************************************************/ -static int simple_domaincmp(char **pv, char **fv, int len) -{ - int n; - - for (n = 0; n < len; n++) - { - if (simplematch(pv[n], fv[n])) - { - return 1; - } - } - - return 0; - -} - - -/********************************************************************* - * - * Function : domain_match - * - * Description : Domain-wise Compare fqdn's. Governed by the bimap in - * pattern->unachored, the comparison is un-, left-, - * right-anchored, or both. - * The individual domain names are compared with - * simplematch(). - * - * Parameters : - * 1 : pattern = a domain that may contain a '*' as a wildcard. - * 2 : fqdn = domain name against which the patterns are compared. - * - * Returns : 0 => domains are equivalent, else no match. - * - *********************************************************************/ -static int domain_match(const struct url_spec *pattern, const struct http_request *fqdn) -{ - char **pv, **fv; /* vectors */ - int plen, flen; - int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT); - - plen = pattern->dcount; - flen = fqdn->dcount; - - if (flen < plen) - { - /* fqdn is too short to match this pattern */ - return 1; - } - - pv = pattern->dvec; - fv = fqdn->dvec; - - if (unanchored == ANCHOR_LEFT) - { - /* - * Right anchored. - * - * Convert this into a fully anchored pattern with - * the fqdn and pattern the same length - */ - fv += (flen - plen); /* flen - plen >= 0 due to check above */ - return simple_domaincmp(pv, fv, plen); - } - else if (unanchored == 0) - { - /* Fully anchored, check length */ - if (flen != plen) - { - return 1; - } - return simple_domaincmp(pv, fv, plen); - } - else if (unanchored == ANCHOR_RIGHT) - { - /* Left anchored, ignore all extra in fqdn */ - return simple_domaincmp(pv, fv, plen); - } - else - { - /* Unanchored */ - int n; - int maxn = flen - plen; - for (n = 0; n <= maxn; n++) - { - if (!simple_domaincmp(pv, fv, plen)) - { - return 0; - } - /* - * Doesn't match from start of fqdn - * Try skipping first part of fqdn - */ - fv++; - } - return 1; - } - -} - - -/********************************************************************* - * - * Function : create_url_spec - * - * Description : Creates a "url_spec" structure from a string. - * When finished, free with unload_url(). - * - * Parameters : - * 1 : url = Target url_spec to be filled in. Will be - * zeroed before use. - * 2 : buf = Source pattern, null terminated. NOTE: The - * contents of this buffer are destroyed by this - * function. If this function succeeds, the - * buffer is copied to url->spec. If this - * function fails, the contents of the buffer - * are lost forever. - * - * Returns : JB_ERR_OK - Success - * JB_ERR_MEMORY - Out of memory - * JB_ERR_PARSE - Cannot parse regex (Detailed message - * written to system log) - * - *********************************************************************/ -jb_err create_url_spec(struct url_spec * url, const char * buf) -{ - char *p; - - assert(url); - assert(buf); - - /* Zero memory */ - memset(url, '\0', sizeof(*url)); - - /* save a copy of the orignal specification */ - if ((url->spec = strdup(buf)) == NULL) - { - return JB_ERR_MEMORY; - } - - if ((p = strchr(buf, '/')) != NULL) - { - if (NULL == (url->path = strdup(p))) - { - freez(url->spec); - return JB_ERR_MEMORY; - } - url->pathlen = strlen(url->path); - *p = '\0'; - } - else - { - url->path = NULL; - url->pathlen = 0; - } -#ifdef REGEX - if (url->path) - { - int errcode; - char rebuf[BUFFER_SIZE]; - - if (NULL == (url->preg = zalloc(sizeof(*url->preg)))) - { - freez(url->spec); - freez(url->path); - return JB_ERR_MEMORY; - } - - sprintf(rebuf, "^(%s)", url->path); - - errcode = regcomp(url->preg, rebuf, - (REG_EXTENDED|REG_NOSUB|REG_ICASE)); - if (errcode) - { - size_t errlen = regerror(errcode, - url->preg, rebuf, sizeof(rebuf)); - - if (errlen > (sizeof(rebuf) - (size_t)1)) - { - errlen = sizeof(rebuf) - (size_t)1; - } - rebuf[errlen] = '\0'; - - log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", - url->spec, rebuf); - - freez(url->spec); - freez(url->path); - freez(url->preg); - - return JB_ERR_PARSE; - } - } -#endif - if ((p = strchr(buf, ':')) == NULL) - { - url->port = 0; - } - else - { - *p++ = '\0'; - url->port = atoi(p); - } - - if (buf[0] != '\0') - { - char *v[150]; - size_t size; - - /* Parse domain part */ - if (buf[strlen(buf) - 1] == '.') - { - url->unanchored |= ANCHOR_RIGHT; - } - if (buf[0] == '.') - { - url->unanchored |= ANCHOR_LEFT; - } - - /* split domain into components */ - - url->dbuffer = strdup(buf); - if (NULL == url->dbuffer) - { - freez(url->spec); - freez(url->path); -#ifdef REGEX - freez(url->preg); -#endif /* def REGEX */ - return JB_ERR_MEMORY; - } - - /* map to lower case */ - for (p = url->dbuffer; *p ; p++) - { - *p = tolower((int)(unsigned char)*p); - } - - /* split the domain name into components */ - url->dcount = ssplit(url->dbuffer, ".", v, SZ(v), 1, 1); - - if (url->dcount < 0) - { - freez(url->spec); - freez(url->path); -#ifdef REGEX - freez(url->preg); -#endif /* def REGEX */ - freez(url->dbuffer); - url->dcount = 0; - return JB_ERR_MEMORY; - } - else if (url->dcount != 0) - { - - /* save a copy of the pointers in dvec */ - size = url->dcount * sizeof(*url->dvec); - - url->dvec = (char **)malloc(size); - if (NULL == url->dvec) - { - freez(url->spec); - freez(url->path); -#ifdef REGEX - freez(url->preg); -#endif /* def REGEX */ - freez(url->dbuffer); - url->dcount = 0; - return JB_ERR_MEMORY; - } - - memcpy(url->dvec, v, size); - } - } - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : free_url_spec - * - * Description : Called from the "unloaders". Freez the url - * structure elements. - * - * Parameters : - * 1 : url = pointer to a url_spec structure. - * - * Returns : N/A - * - *********************************************************************/ -void free_url_spec(struct url_spec *url) -{ - if (url == NULL) return; - - freez(url->spec); - freez(url->dbuffer); - freez(url->dvec); - freez(url->path); -#ifdef REGEX - if (url->preg) - { - regfree(url->preg); - freez(url->preg); - } -#endif - -} - - -/********************************************************************* - * - * Function : url_match - * - * Description : Compare a URL against a URL pattern. - * - * Parameters : - * 1 : pattern = a URL pattern - * 2 : url = URL to match - * - * Returns : 0 iff the URL matches the pattern, else nonzero. - * - *********************************************************************/ -int url_match(const struct url_spec *pattern, - const struct http_request *url) -{ - return ((pattern->port == 0) || (pattern->port == url->port)) - && ((pattern->dbuffer == NULL) || (domain_match(pattern, url) == 0)) - && ((pattern->path == NULL) || -#ifdef REGEX - (regexec(pattern->preg, url->path, 0, NULL, 0) == 0) -#else - (strncmp(pattern->path, url->path, pattern->pathlen) == 0) -#endif - ); -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/urlmatch.h b/urlmatch.h deleted file mode 100644 index 09fa6396..00000000 --- a/urlmatch.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef URLMATCH_H_INCLUDED -#define URLMATCH_H_INCLUDED -#define URLMATCH_H_VERSION "$Id: urlmatch.h,v 1.2 2002/03/24 13:25:43 swa Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/urlmatch.h,v $ - * - * Purpose : Declares functions to match URLs against URL - * patterns. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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: urlmatch.h,v $ - * Revision 1.2 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.1 2002/01/17 20:53:46 jongfoster - * Moving all our URL and URL pattern parsing code to the same file - it - * was scattered around in filters.c, loaders.c and parsers.c. - * - * Providing a single, simple url_match(pattern,url) function - rather than - * the 3-line match routine which was repeated all over the place. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Providing parse_http_url() so that URLs can be parsed without faking a - * HTTP request line for parse_http_request() or repeating the parsing - * code (both of which were techniques that were actually in use). - * - * Standardizing that struct http_request is used to represent a URL, and - * struct url_spec is used to represent a URL pattern. (Before, URLs were - * represented as seperate variables and a partially-filled-in url_spec). - * - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern void free_http_request(struct http_request *http); -extern jb_err parse_http_request(const char *req, - struct http_request *http, - struct client_state *csp); -extern jb_err parse_http_url(const char * url, - struct http_request *http, - struct client_state *csp); - -extern int url_match(const struct url_spec *pattern, - const struct http_request *url); - -extern jb_err create_url_spec(struct url_spec * url, const char * buf); -extern void free_url_spec(struct url_spec *url); - - -/* Revision control strings from this header and associated .c file */ -extern const char urlmatch_rcs[]; -extern const char urlmatch_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef URLMATCH_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/vc_privoxy.dsp b/vc_junkbuster.dsp similarity index 81% rename from vc_privoxy.dsp rename to vc_junkbuster.dsp index 1baff50e..e9c7503e 100644 --- a/vc_privoxy.dsp +++ b/vc_junkbuster.dsp @@ -1,28 +1,28 @@ -# Microsoft Developer Studio Project File - Name="vc_privoxy" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="vc_junkbuster" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 -CFG=vc_privoxy - Win32 Debug with Win32 threads +CFG=vc_junkbuster - Win32 Debug with Win32 threads !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "vc_privoxy.mak". +!MESSAGE NMAKE /f "vc_junkbuster.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "vc_privoxy.mak"\ - CFG="vc_privoxy - Win32 Debug with Win32 threads" +!MESSAGE NMAKE /f "vc_junkbuster.mak"\ + CFG="vc_junkbuster - Win32 Debug with Win32 threads" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "vc_privoxy - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "vc_privoxy - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE "vc_privoxy - Win32 Release with Win32 threads" (based on\ +!MESSAGE "vc_junkbuster - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "vc_junkbuster - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE "vc_junkbuster - Win32 Release with Win32 threads" (based on\ "Win32 (x86) Application") -!MESSAGE "vc_privoxy - Win32 Debug with Win32 threads" (based on\ +!MESSAGE "vc_junkbuster - Win32 Debug with Win32 threads" (based on\ "Win32 (x86) Application") !MESSAGE @@ -33,7 +33,7 @@ CPP=cl.exe MTL=midl.exe RSC=rc.exe -!IF "$(CFG)" == "vc_privoxy - Win32 Release" +!IF "$(CFG)" == "vc_junkbuster - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -59,7 +59,7 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /machine:I386 -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug" +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -73,7 +73,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x809 /d "_DEBUG" @@ -83,9 +83,9 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads" +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Release with Win32 threads" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -112,7 +112,7 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:windows /machine:I386 -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads" +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Debug with Win32 threads" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -127,7 +127,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c -# ADD CPP /nologo /MTd /W4 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x809 /d "_DEBUG" @@ -136,17 +136,17 @@ BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target -# Name "vc_privoxy - Win32 Release" -# Name "vc_privoxy - Win32 Debug" -# Name "vc_privoxy - Win32 Release with Win32 threads" -# Name "vc_privoxy - Win32 Debug with Win32 threads" +# Name "vc_junkbuster - Win32 Release" +# Name "vc_junkbuster - Win32 Debug" +# Name "vc_junkbuster - Win32 Release with Win32 threads" +# Name "vc_junkbuster - Win32 Debug with Win32 threads" # Begin Group "JunkBuster" # PROP Default_Filter "" @@ -180,22 +180,6 @@ SOURCE=.\cgi.h # End Source File # Begin Source File -SOURCE=.\cgiedit.c -# End Source File -# Begin Source File - -SOURCE=.\cgiedit.h -# End Source File -# Begin Source File - -SOURCE=.\cgisimple.c -# End Source File -# Begin Source File - -SOURCE=.\cgisimple.h -# End Source File -# Begin Source File - SOURCE=.\config.h # End Source File # Begin Source File @@ -268,11 +252,11 @@ SOURCE=.\project.h # End Source File # Begin Source File -SOURCE=.\urlmatch.c +SOURCE=.\showargs.c # End Source File # Begin Source File -SOURCE=.\urlmatch.h +SOURCE=.\showargs.h # End Source File # End Group # Begin Group "Win32" @@ -296,6 +280,14 @@ SOURCE=.\w32res.h # End Source File # Begin Source File +SOURCE=.\w32rulesdlg.c +# End Source File +# Begin Source File + +SOURCE=.\w32rulesdlg.h +# End Source File +# Begin Source File + SOURCE=.\w32taskbar.c # End Source File # Begin Source File @@ -316,6 +308,10 @@ SOURCE=.\win32.h # PROP Default_Filter "rc,ico,bmp" # Begin Source File +SOURCE=.\icons\denyrule.ico +# End Source File +# Begin Source File + SOURCE=.\icons\ico00001.ico # End Source File # Begin Source File @@ -348,11 +344,15 @@ SOURCE=.\icons\ico00008.ico # End Source File # Begin Source File +SOURCE=.\icons\icon1.ico +# End Source File +# Begin Source File + SOURCE=.\icons\idle.ico # End Source File # Begin Source File -SOURCE=.\icons\privoxy.ico +SOURCE=.\icons\junkbust.ico # End Source File # Begin Source File @@ -366,20 +366,20 @@ SOURCE=.\w32.rc SOURCE=.\pcre\chartables.c -!IF "$(CFG)" == "vc_privoxy - Win32 Release" +!IF "$(CFG)" == "vc_junkbuster - Win32 Release" # PROP Exclude_From_Build 1 -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug" +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Debug" # PROP Exclude_From_Build 1 -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads" +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Release with Win32 threads" # PROP BASE Exclude_From_Build 1 # PROP Exclude_From_Build 1 -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads" +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Debug with Win32 threads" # PROP BASE Exclude_From_Build 1 # PROP Exclude_From_Build 1 diff --git a/vc_privoxy.dsw b/vc_junkbuster.dsw similarity index 82% rename from vc_privoxy.dsw rename to vc_junkbuster.dsw index 3bee9279..f44f2c79 100644 --- a/vc_privoxy.dsw +++ b/vc_junkbuster.dsw @@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 5.00 ############################################################################### -Project: "vc_console"=".\vc_console.dsp" - Package Owner=<4> +Project: "console_junkbuster"=".\console_junkbuster.dsp" - Package Owner=<4> Package=<5> {{{ @@ -30,7 +30,7 @@ Package=<4> ############################################################################### -Project: "vc_privoxy"=".\vc_privoxy.dsp" - Package Owner=<4> +Project: "vc_junkbuster"=".\vc_junkbuster.dsp" - Package Owner=<4> Package=<5> {{{ diff --git a/w32.rc b/w32.rc index c8c09af7..03525f04 100644 --- a/w32.rc +++ b/w32.rc @@ -4,8 +4,8 @@ * * Purpose : Windows GUI resource script. * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * 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 @@ -31,24 +31,6 @@ * * Revisions : * $Log: w32.rc,v $ - * Revision 1.15 2002/03/24 14:29:25 jongfoster - * Renaming icon file - * - * Revision 1.14 2002/03/24 12:07:36 jongfoster - * Consistern name for filters file - * - * Revision 1.13 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.12 2001/07/30 22:16:07 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.11 2001/07/21 17:53:41 jongfoster - * Adding version information block. - * * Revision 1.10 2001/07/19 19:14:19 haroon * - Removed all #ifdef PCRS. The .rc file extension had eluded Andreas. * @@ -144,15 +126,15 @@ * Icon with lowest ID value placed first to ensure application icon * remains consistent on all systems. */ -IDI_MAINICON ICON DISCARDABLE "icons/privoxy.ico" -IDI_ANIMATED1 ICON DISCARDABLE "icons/ico00001.ico" -IDI_ANIMATED2 ICON DISCARDABLE "icons/ico00002.ico" -IDI_ANIMATED3 ICON DISCARDABLE "icons/ico00003.ico" -IDI_ANIMATED4 ICON DISCARDABLE "icons/ico00004.ico" -IDI_ANIMATED5 ICON DISCARDABLE "icons/ico00005.ico" -IDI_ANIMATED6 ICON DISCARDABLE "icons/ico00006.ico" -IDI_ANIMATED7 ICON DISCARDABLE "icons/ico00007.ico" -IDI_ANIMATED8 ICON DISCARDABLE "icons/ico00008.ico" +IDI_JUNKBUSTER ICON DISCARDABLE "icons/junkbust.ico" +IDI_JUNKBUSTER1 ICON DISCARDABLE "icons/ico00001.ico" +IDI_JUNKBUSTER2 ICON DISCARDABLE "icons/ico00002.ico" +IDI_JUNKBUSTER3 ICON DISCARDABLE "icons/ico00003.ico" +IDI_JUNKBUSTER4 ICON DISCARDABLE "icons/ico00004.ico" +IDI_JUNKBUSTER5 ICON DISCARDABLE "icons/ico00005.ico" +IDI_JUNKBUSTER6 ICON DISCARDABLE "icons/ico00006.ico" +IDI_JUNKBUSTER7 ICON DISCARDABLE "icons/ico00007.ico" +IDI_JUNKBUSTER8 ICON DISCARDABLE "icons/ico00008.ico" IDI_IDLE ICON DISCARDABLE "icons/idle.ico" #endif /* Neutral resources */ @@ -190,13 +172,13 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN - VALUE "CompanyName", "The Privoxy team - www.privoxy.org\0" - VALUE "FileDescription", "Privoxy\0" + VALUE "CompanyName", "The ijbswa team - ijbswa.sourceforge.net\0" + VALUE "FileDescription", "JunkBuster\0" VALUE "FileVersion", VERSION "\0" - VALUE "InternalName", "Privoxy\0" + VALUE "InternalName", "JunkBuster\0" VALUE "LegalCopyright", "Distributed under the GNU GPL\0" - VALUE "OriginalFilename", "privoxy.exe\0" - VALUE "ProductName", "Privoxy\0" + VALUE "OriginalFilename", "junkbuster.exe\0" + VALUE "ProductName", "JunkBuster\0" VALUE "ProductVersion", VERSION "\0" END END @@ -217,23 +199,23 @@ IDR_TRAYMENU MENU DISCARDABLE BEGIN POPUP "Popup" BEGIN - MENUITEM "E&xit Privoxy", ID_FILE_EXIT + MENUITEM "E&xit JunkBuster", ID_FILE_EXIT MENUITEM SEPARATOR POPUP "&Options" BEGIN - MENUITEM "&Configuration...", ID_TOOLS_EDITCONFIG + MENUITEM "&Configuration...", ID_TOOLS_EDITJUNKBUSTER MENUITEM SEPARATOR MENUITEM "&Actions...", ID_TOOLS_EDITACTIONS - MENUITEM "&Filters...", ID_TOOLS_EDITFILTERS -#ifdef FEATURE_TRUST + MENUITEM "Perl &Regexps...", ID_TOOLS_EDITPERLRE +#ifdef TRUST_FILES MENUITEM "&Trust...", ID_TOOLS_EDITTRUST -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ END MENUITEM SEPARATOR -#ifdef FEATURE_TOGGLE - MENUITEM "&Enable", ID_TOGGLE_ENABLED, CHECKED -#endif /* def FEATURE_TOGGLE */ - MENUITEM "Show Privoxy &Window", ID_SHOWWINDOW +#ifdef TOGGLE + MENUITEM "&Enable", ID_TOGGLE_IJB, CHECKED +#endif + MENUITEM "Show &JunkBuster Window", ID_SHOWWINDOW END END @@ -258,27 +240,27 @@ BEGIN END POPUP "&Options" BEGIN -#ifdef FEATURE_TOGGLE - MENUITEM "&Enable", ID_TOGGLE_ENABLED, CHECKED +#ifdef TOGGLE + MENUITEM "&Enable", ID_TOGGLE_IJB, CHECKED MENUITEM SEPARATOR -#endif /* def FEATURE_TOGGLE */ - MENUITEM "&Configuration...", ID_TOOLS_EDITCONFIG +#endif + MENUITEM "&Configuration...", ID_TOOLS_EDITJUNKBUSTER MENUITEM SEPARATOR MENUITEM "&Actions...", ID_TOOLS_EDITACTIONS - MENUITEM "&Filters...", ID_TOOLS_EDITFILTERS -#ifdef FEATURE_TRUST + MENUITEM "Perl &Regexps...", ID_TOOLS_EDITPERLRE +#ifdef TRUST_FILES MENUITEM "&Trust...", ID_TOOLS_EDITTRUST -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ END POPUP "&Help" BEGIN - MENUITEM "Privoxy &FAQ", ID_HELP_FAQ - MENUITEM "Privoxy &Manual", ID_HELP_MANUAL + MENUITEM "Junkbuster &FAQ", ID_HELP_FAQ + MENUITEM "Junkbuster &Manual", ID_HELP_MANUAL MENUITEM "GNU &General Public Licence", ID_HELP_GPL MENUITEM SEPARATOR - MENUITEM "Privoxy Status...", ID_HELP_STATUS + MENUITEM "Junkbuster Status...", ID_HELP_STATUS MENUITEM SEPARATOR - MENUITEM "About Privoxy...", ID_HELP_ABOUT + MENUITEM "About Junkbuster...", ID_HELP_ABOUTJUNKBUSTER END END @@ -300,4 +282,72 @@ BEGIN "C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT END +#ifdef WIN_GUI_EDIT + +/* + * Icons + * + * Icon with lowest ID value placed first to ensure application icon + * remains consistent on all systems. + */ +IDI_DENYRULE ICON DISCARDABLE "icons/denyrule.ico" +IDI_ALLOWRULE ICON DISCARDABLE "icons/icon1.ico" + +/* + * Dialog + */ + +IDD_RULES DIALOG DISCARDABLE 0, 0, 239, 225 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Blockers" +FONT 8, "MS Sans Serif" +BEGIN + GROUPBOX "New Rule",IDC_STATIC,5,5,230,55 + LTEXT "For:",IDC_STATIC,10,15,13,8 + EDITTEXT IDC_NEW,10,25,220,12,ES_AUTOHSCROLL + COMBOBOX IDC_ACTION,10,40,75,37,CBS_DROPDOWNLIST | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "C&reate!",IDC_CREATE,90,40,50,14 + GROUPBOX "Rules",IDC_STATIC,5,65,230,135 + CONTROL "List1",IDC_RULES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_EDITLABELS | WS_BORDER | + WS_TABSTOP,10,75,220,100 + PUSHBUTTON "Move &Up",IDC_MOVEUP,10,180,50,14,WS_DISABLED + PUSHBUTTON "Move &Down",IDC_MOVEDOWN,65,180,50,14,WS_DISABLED + PUSHBUTTON "&Delete",IDC_DELETE,120,180,50,14,WS_DISABLED + PUSHBUTTON "&Save",IDC_SAVE,130,205,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,185,205,50,14 +END + + +/* + * DESIGNINFO + */ + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_RULES, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 232 + TOPMARGIN, 7 + BOTTOMMARGIN, 218 + END +END +#endif /* def APSTUDIO_INVOKED */ + + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NEW_BLOCKER "Create rule for ""%s""..." +END + + +#endif /* def WIN_GUI_EDIT */ + #endif /* English (U.S.) resources */ diff --git a/w32log.c b/w32log.c index 0948e4b0..3b7835a5 100644 --- a/w32log.c +++ b/w32log.c @@ -1,4 +1,4 @@ -const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster Exp $"; +const char w32log_rcs[] = "$Id: w32log.c,v 1.12 2001/07/13 14:04:59 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32log.c,v $ @@ -6,8 +6,8 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E * Purpose : Functions for creating and destroying the log window, * ouputting strings, processing messages and so on. * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -32,42 +32,6 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E * * Revisions : * $Log: w32log.c,v $ - * Revision 1.22 2002/03/24 12:48:23 jongfoster - * Fixing doc links - * - * Revision 1.21 2002/03/24 12:07:35 jongfoster - * Consistern name for filters file - * - * Revision 1.20 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.19 2002/01/17 21:04:17 jongfoster - * Replacing hard references to the URL of the config interface - * with #defines from project.h - * - * Revision 1.18 2001/11/30 23:37:24 jongfoster - * Renaming the Win32 config file to config.txt - this is almost the - * same as the corresponding UNIX name "config" - * - * Revision 1.17 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.16 2001/08/01 19:58:12 jongfoster - * Fixing documentation filenames in help menu, and making status - * option work without needing the "Junkbuster Status.URL" file. - * - * Revision 1.15 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.14 2001/07/29 18:47:05 jongfoster - * Adding missing #include "loadcfg.h" - * - * Revision 1.13 2001/07/19 19:15:14 haroon - * - Added a FIXME for EditFile but didn't fix :-) - * * Revision 1.12 2001/07/13 14:04:59 oes * Removed all #ifdef PCRS * @@ -156,12 +120,12 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E #include "project.h" #include "w32log.h" #include "w32taskbar.h" +#include "w32rulesdlg.h" #include "win32.h" #include "w32res.h" #include "jcc.h" #include "miscutil.h" #include "errlog.h" -#include "loadcfg.h" const char w32res_h_rcs[] = W32RES_H_VERSION; @@ -241,9 +205,9 @@ int g_nFontSize = DEFAULT_LOG_FONT_SIZE; const char * g_actions_file = NULL; const char * g_re_filterfile = NULL; -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES const char * g_trustfile = NULL; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ /* FIXME: end kludge */ @@ -350,14 +314,14 @@ BOOL InitLogWindow(void) g_hiconIdle = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IDLE)); for (i = 0; i < ANIM_FRAMES; i++) { - g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ANIMATED1 + i)); + g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER1 + i)); } - g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAINICON)); + g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER)); /* Create the user interface */ g_hwndLogFrame = CreateLogWindow(g_hInstance, g_nCmdShow); g_hwndTray = CreateTrayWindow(g_hInstance); - TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Privoxy"); + TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Junkbuster"); /* Create pattern matching buffers (for highlighting */ LogCreatePatternMatchingBuffers(); @@ -778,7 +742,7 @@ void LogClipBuffer(void) *********************************************************************/ HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance) { - static const char *szWndName = "PrivoxyLogOwner"; + static const char *szWndName = "JunkbusterLogLogOwner"; WNDCLASS wc; HWND hwnd; @@ -841,11 +805,12 @@ LRESULT CALLBACK LogOwnerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM *********************************************************************/ HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow) { - static const char *szWndName = "PrivoxyLogWindow"; - static const char *szWndTitle = "Privoxy"; + static const char *szWndName = "JunkbusterLogWindow"; + static const char *szWndTitle = "Junkbuster"; HWND hwnd = NULL; HWND hwndOwner = (g_bShowOnTaskBar) ? NULL : CreateHiddenLogOwnerWindow(hInstance); + HWND hwndChild = NULL; RECT rcClient; WNDCLASSEX wc; @@ -982,7 +947,7 @@ void ShowLogWindow(BOOL bShow) * from ShellExecute?? * * Parameters : - * 1 : filename = filename from the config (aka config.txt) file. + * 1 : filename = filename from the config (aka junkbstr.txt) file. * * Returns : N/A * @@ -1022,6 +987,9 @@ void OnLogRButtonUp(int nModifier, int x, int y) if (hMenu != NULL) { HMENU hMenuPopup = GetSubMenu(hMenu, 0); +#ifdef WIN_GUI_EDIT + char *szURL; +#endif /* def WIN_GUI_EDIT */ /* Check if there is a selection */ CHARRANGE range; @@ -1035,6 +1003,40 @@ void OnLogRButtonUp(int nModifier, int x, int y) EnableMenuItem(hMenuPopup, ID_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED); } +#ifdef WIN_GUI_EDIT + /* Check if cursor is over a link */ + szURL = LogGetURLUnderCursor(); + if (szURL) + { + MENUITEMINFO item; + TCHAR szMenuItemTemplate[1000]; + char *szMenuItem; + + memset(&item, 0, sizeof(item)); + item.cbSize = sizeof(item); + item.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; + item.fType = MFT_STRING; + item.fState = MFS_ENABLED; + item.wID = ID_NEW_BLOCKER; + + /* Put the item into the menu */ + memset(szMenuItemTemplate, 0, sizeof(szMenuItemTemplate)); + LoadString(g_hInstance, IDS_NEW_BLOCKER, szMenuItemTemplate, sizeof(szMenuItemTemplate) / sizeof(szMenuItemTemplate[0])); + + szMenuItem = (char *)malloc(strlen(szMenuItemTemplate) + strlen(szURL) + 1); + sprintf(szMenuItem, szMenuItemTemplate, szURL); + + item.dwTypeData = szMenuItem; + item.cch = strlen(szMenuItem); + + InsertMenuItem(hMenuPopup, 1, TRUE, &item); + + SetDefaultRule(szURL); + + free(szURL); + } +#endif /* def WIN_GUI_EDIT */ + /* Display the popup */ TrackPopupMenu(hMenuPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, x, y, 0, g_hwndLogFrame, NULL); DestroyMenu(hMenu); @@ -1095,9 +1097,9 @@ void OnLogCommand(int nCommand) /* SaveLogSettings(); */ break; -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE /* by haroon - change toggle to its opposite value */ - case ID_TOGGLE_ENABLED: + case ID_TOGGLE_IJB: g_bToggleIJB = !g_bToggleIJB; if (g_bToggleIJB) { @@ -1108,9 +1110,9 @@ void OnLogCommand(int nCommand) log_error(LOG_LEVEL_INFO, "Now toggled OFF."); } break; -#endif /* def FEATURE_TOGGLE */ +#endif - case ID_TOOLS_EDITCONFIG: + case ID_TOOLS_EDITJUNKBUSTER: EditFile(configfile); break; @@ -1118,34 +1120,40 @@ void OnLogCommand(int nCommand) EditFile(g_actions_file); break; - case ID_TOOLS_EDITFILTERS: + case ID_TOOLS_EDITPERLRE: EditFile(g_re_filterfile); break; -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES case ID_TOOLS_EDITTRUST: EditFile(g_trustfile); break; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ + +#ifdef WIN_GUI_EDIT + case ID_NEW_BLOCKER: + ShowRulesDialog(g_hwndLogFrame); + break; +#endif /* def WIN_GUI_EDIT */ case ID_HELP_GPL: - ShellExecute(g_hwndLogFrame, "open", "LICENSE.txt", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(g_hwndLogFrame, "open", "gpl.html", NULL, NULL, SW_SHOWNORMAL); break; case ID_HELP_FAQ: - ShellExecute(g_hwndLogFrame, "open", "doc\\faq\\index.html", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(g_hwndLogFrame, "open", "ijbfaq.html", NULL, NULL, SW_SHOWNORMAL); break; case ID_HELP_MANUAL: - ShellExecute(g_hwndLogFrame, "open", "doc\\user-manual\\index.html", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(g_hwndLogFrame, "open", "ijbman.html", NULL, NULL, SW_SHOWNORMAL); break; case ID_HELP_STATUS: - ShellExecute(g_hwndLogFrame, "open", CGI_PREFIX "show-status", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(g_hwndLogFrame, "open", "Junkbuster Status.URL", NULL, NULL, SW_SHOWNORMAL); break; - case ID_HELP_ABOUT: - MessageBox(g_hwndLogFrame, win32_blurb, "About Privoxy", MB_OK); + case ID_HELP_ABOUTJUNKBUSTER: + MessageBox(g_hwndLogFrame, win32_blurb, "Junkbuster Information", MB_OK); break; default: @@ -1173,20 +1181,20 @@ void OnLogInitMenu(HMENU hmenu) { /* Only enable editors if there is a file to edit */ EnableMenuItem(hmenu, ID_TOOLS_EDITACTIONS, MF_BYCOMMAND | (g_actions_file ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(hmenu, ID_TOOLS_EDITFILTERS, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED)); -#ifdef FEATURE_TRUST + EnableMenuItem(hmenu, ID_TOOLS_EDITPERLRE, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED)); +#ifdef TRUST_FILES EnableMenuItem(hmenu, ID_TOOLS_EDITTRUST, MF_BYCOMMAND | (g_trustfile ? MF_ENABLED : MF_GRAYED)); -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ /* Check/uncheck options */ CheckMenuItem(hmenu, ID_VIEW_LOGMESSAGES, MF_BYCOMMAND | (g_bLogMessages ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hmenu, ID_VIEW_MESSAGEHIGHLIGHTING, MF_BYCOMMAND | (g_bHighlightMessages ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hmenu, ID_VIEW_LIMITBUFFERSIZE, MF_BYCOMMAND | (g_bLimitBufferSize ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hmenu, ID_VIEW_ACTIVITYANIMATION, MF_BYCOMMAND | (g_bShowActivityAnimation ? MF_CHECKED : MF_UNCHECKED)); -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE /* by haroon - menu item for Enable toggle on/off */ - CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED)); -#endif /* def FEATURE_TOGGLE */ + CheckMenuItem(hmenu, ID_TOGGLE_IJB, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED)); +#endif } diff --git a/w32log.h b/w32log.h index 2634a95c..3c40c481 100644 --- a/w32log.h +++ b/w32log.h @@ -1,6 +1,6 @@ -#ifndef W32LOG_H_INCLUDED -#define W32LOG_H_INCLUDED -#define W32LOG_H_VERSION "$Id: w32log.h,v 1.9 2002/03/24 12:03:47 jongfoster Exp $" +#ifndef _W32LOG_H +#define _W32LOG_H +#define W32LOG_H_VERSION "$Id: w32log.h,v 1.5 2001/06/07 23:08:12 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32log.h,v $ @@ -8,8 +8,8 @@ * Purpose : Functions for creating and destroying the log window, * ouputting strings, processing messages and so on. * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -34,22 +34,6 @@ * * Revisions : * $Log: w32log.h,v $ - * Revision 1.9 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.8 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.7 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.6 2001/07/13 14:04:59 oes - * Removed all #ifdef PCRS - * * Revision 1.5 2001/06/07 23:08:12 jongfoster * Forward and ACL edit options removed. * @@ -131,9 +115,9 @@ extern int g_nFontSize; extern const char * g_actions_file; extern const char * g_re_filterfile; -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES extern const char * g_trustfile; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ /* FIXME: end kludge */ @@ -151,7 +135,7 @@ extern const char w32log_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef W32LOG_H_INCLUDED */ +#endif /* ndef _W32LOG_H */ /* diff --git a/w32res.h b/w32res.h index 62308cf2..33a37200 100644 --- a/w32res.h +++ b/w32res.h @@ -1,14 +1,14 @@ -#ifndef W32RES_H_INCLUDED -#define W32RES_H_INCLUDED -#define W32RES_H_VERSION "$Id: w32res.h,v 1.12 2002/03/24 12:07:36 jongfoster Exp $" +#ifndef _W32RES_H +#define _W32RES_H +#define W32RES_H_VERSION "$Id: w32res.h,v 1.7 2001/06/07 23:08:12 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32res.h,v $ * * Purpose : Identifiers for Windows GUI resources. * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * 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 @@ -34,25 +34,6 @@ * * Revisions : * $Log: w32res.h,v $ - * Revision 1.12 2002/03/24 12:07:36 jongfoster - * Consistern name for filters file - * - * Revision 1.11 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.10 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.9 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.8 2001/07/13 14:04:59 oes - * Removed all #ifdef PCRS - * * Revision 1.7 2001/06/07 23:08:12 jongfoster * Forward and ACL edit options removed. * @@ -113,25 +94,49 @@ * *********************************************************************/ +#ifdef WIN_GUI_EDIT +#define IDS_NEW_BLOCKER 1 + +#define ID_NEW_BLOCKER 100 +#endif /* def WIN_GUI_EDIT */ + #define IDR_TRAYMENU 101 #define IDI_IDLE 102 #define IDR_LOGVIEW 103 #define IDR_ACCELERATOR 104 #define IDR_POPUP_SELECTION 105 +#ifdef WIN_GUI_EDIT +#define IDD_RULES 106 +#endif /* def WIN_GUI_EDIT */ + + +#define IDI_JUNKBUSTER 200 +#define IDI_JUNKBUSTER1 201 +#define IDI_JUNKBUSTER2 202 +#define IDI_JUNKBUSTER3 203 +#define IDI_JUNKBUSTER4 204 +#define IDI_JUNKBUSTER5 205 +#define IDI_JUNKBUSTER6 206 +#define IDI_JUNKBUSTER7 207 +#define IDI_JUNKBUSTER8 208 + +#ifdef WIN_GUI_EDIT +#define IDI_DENYRULE 209 +#define IDI_ALLOWRULE 210 -#define IDI_MAINICON 200 -#define IDI_ANIMATED1 201 -#define IDI_ANIMATED2 202 -#define IDI_ANIMATED3 203 -#define IDI_ANIMATED4 204 -#define IDI_ANIMATED5 205 -#define IDI_ANIMATED6 206 -#define IDI_ANIMATED7 207 -#define IDI_ANIMATED8 208 +#define IDC_NEW 300 +#define IDC_ACTION 301 +#define IDC_RULES 302 +#define IDC_CREATE 303 +#define IDC_MOVEUP 304 +#define IDC_MOVEDOWN 305 +#define IDC_DELETE 306 +#define IDC_SAVE 307 +#endif /* def WIN_GUI_EDIT */ #define ID_SHOWWINDOW 4000 -#define ID_HELP_ABOUT 4001 +#define ID_HELP_ABOUTJUNKBUSTER 4001 #define ID_FILE_EXIT 4002 #define ID_VIEW_CLEARLOG 4003 #define ID_VIEW_LOGMESSAGES 4004 @@ -142,18 +147,18 @@ #define ID_HELP_MANUAL 4009 #define ID_HELP_GPL 4010 #define ID_HELP_STATUS 4011 -#ifdef FEATURE_TOGGLE -#define ID_TOGGLE_ENABLED 4012 -#endif /* def FEATURE_TOGGLE */ +#ifdef TOGGLE +#define ID_TOGGLE_IJB 4012 +#endif /* Break these out so they are easier to extend, but keep consecutive */ -#define ID_TOOLS_EDITCONFIG 5000 +#define ID_TOOLS_EDITJUNKBUSTER 5000 #define ID_TOOLS_EDITACTIONS 5001 -#define ID_TOOLS_EDITFILTERS 5002 +#define ID_TOOLS_EDITPERLRE 5002 -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES #define ID_TOOLS_EDITTRUST 5003 -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ /* * The following symbols are declared in in VC++. @@ -165,7 +170,7 @@ #define ID_EDIT_COPY 30000 -#endif /* ndef W32RES_H_INCLUDED */ +#endif /* ndef _W32RES_H */ /* Local Variables: diff --git a/w32rulesdlg.c b/w32rulesdlg.c new file mode 100644 index 00000000..75168620 --- /dev/null +++ b/w32rulesdlg.c @@ -0,0 +1,548 @@ +const char w32rulesdlg_rcs[] = "$Id: w32rulesdlg.c,v 1.3 2001/05/22 18:56:28 oes Exp $"; +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/w32rulesdlg.c,v $ + * + * Purpose : A dialog to allow GUI editing of the rules. + * Unfinished. + * + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net + * + * Written by and Copyright (C) 1999 Adam Lock + * + * + * 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: w32rulesdlg.c,v $ + * Revision 1.3 2001/05/22 18:56:28 oes + * CRLF -> LF + * + * Revision 1.2 2001/05/20 15:07:54 jongfoster + * File is now ignored if _WIN_CONSOLE is defined. + * + * Revision 1.1.1.1 2001/05/15 13:59:08 oes + * Initial import of version 2.9.3 source tree + * + * + *********************************************************************/ + +#include "config.h" + +#include + +#include +#include + +#include "w32res.h" +#include "w32rulesdlg.h" +#include "win32.h" + +#ifdef __MINGW32__ +#include "cygwin.h" +#endif + +const char w32rulesdlg_h_rcs[] = W32RULESDLG_H_VERSION; + + +#ifndef _WIN_CONSOLE /* entire file */ +#ifdef WIN_GUI_EDIT /* entire file */ + + +const int nSmallIconWidth = 16; +const int nSmallIconHeight = 16; + +static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +static HIMAGELIST g_hImageList = NULL; +static char *g_pszDefaultRule; +static BOOL g_bDirty = FALSE; + + + +/********************************************************************* + * + * Function : ShowRulesDialog + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndParent = (what?) + * + * Returns : (Please fill me in!) + * + *********************************************************************/ +int ShowRulesDialog(HWND hwndParent) +{ + DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_RULES), hwndParent, DialogProc); + return TRUE; + +} + + +/********************************************************************* + * + * Function : SetDefaultRule + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : pszRule = (what?) + * + * Returns : N/A + * + *********************************************************************/ +void SetDefaultRule(const char *pszRule) +{ + if (pszRule == NULL) + { + if (g_pszDefaultRule) + { + free(g_pszDefaultRule); + g_pszDefaultRule = NULL; + } + } + else + { + g_pszDefaultRule = strdup(pszRule); + } + +} + + +#define IMAGE_ALLOW 0 +#define IMAGE_DENY 1 + +/********************************************************************* + * + * Function : InsertRule + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndListView = (what?) + * 2 : pszRule = (what?) + * 3 : bAllow = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void InsertRule(HWND hwndListView, const char *pszRule, BOOL bAllow) +{ + LVITEM item; + item.mask = LVIF_TEXT | LVIF_IMAGE; + item.pszText = (char *)pszRule; + item.iItem = ListView_GetItemCount(hwndListView) + 1; + item.iSubItem = 0; + item.iImage = bAllow ? IMAGE_ALLOW : IMAGE_DENY; + ListView_InsertItem(hwndListView, &item); + /* TODO add subitem for whether the rule is always or never */ + +} + + +/********************************************************************* + * + * Function : SetDirty + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : bDirty = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void SetDirty(BOOL bDirty) +{ + g_bDirty = bDirty; + /* TODO Change some values */ + +} + + +/********************************************************************* + * + * Function : OnInitDialog + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnInitDialog(HWND hwndDlg) +{ + LVCOLUMN aCols[2]; + HWND hwndListView; + RECT rcListView; + int cx; + + if (g_hImageList == NULL) + { + /* Create image list and add icons */ + HICON hIconDeny = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_DENYRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0); + HICON hIconAllow = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ALLOWRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0); + g_hImageList = ImageList_Create(nSmallIconWidth, nSmallIconHeight, ILC_COLOR | ILC_MASK, 0, 10); + ImageList_AddIcon(g_hImageList, hIconAllow); + ImageList_AddIcon(g_hImageList, hIconDeny); + } + + /* Set the default rule value if there is one */ + if (g_pszDefaultRule) + { + SetDlgItemText(hwndDlg, IDC_NEW, g_pszDefaultRule); + SetDefaultRule(NULL); + } + + /* Initialise the list view */ + hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + ListView_SetImageList(hwndListView, g_hImageList, LVSIL_SMALL); + GetClientRect(hwndListView, &rcListView); + cx = rcListView.right - rcListView.left; + aCols[0].mask = LVCF_TEXT | LVCF_WIDTH; + aCols[0].pszText = "Rule"; + aCols[0].cx = (70 * cx) / 100; + aCols[1].mask = LVCF_TEXT | LVCF_WIDTH; + aCols[1].pszText = "Applies when"; + aCols[1].cx = cx - aCols[0].cx; + ListView_InsertColumn(hwndListView, 0, &aCols[0]); + ListView_InsertColumn(hwndListView, 1, &aCols[1]); + + /* Read and add rules to the list */ + /* TODO */ + InsertRule(hwndListView, "Test rule 1", TRUE); + InsertRule(hwndListView, "Test rule 2", TRUE); + InsertRule(hwndListView, "Test rule 3", FALSE); + InsertRule(hwndListView, "Test rule 4", FALSE); + +} + + +/********************************************************************* + * + * Function : GetFirstSelectedItem + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : (Please fill me in!) + * + *********************************************************************/ +static int GetFirstSelectedItem(HWND hwndDlg) +{ + /* Check for selected items */ + HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + int nItem = -1; + do + { + nItem = ListView_GetNextItem(hwndListView, nItem, LVNI_SELECTED); + if (nItem >= 0) + { + return nItem; + } + } while (nItem >= 0); + return -1; + +} + + +/********************************************************************* + * + * Function : OnRulesItemChanged + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnRulesItemChanged(HWND hwndDlg) +{ + int nItem = GetFirstSelectedItem(hwndDlg); + HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + int nItems = ListView_GetItemCount(hwndListView); + BOOL bHaveSelection = (nItem >= 0) ? TRUE : FALSE; + BOOL bMoveUp = (bHaveSelection && nItem > 0) ? TRUE : FALSE; + BOOL bMoveDown = (bHaveSelection && nItem < nItems - 1) ? TRUE : FALSE; + + /* Enable/disable buttons */ + EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), bHaveSelection); + EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEUP), bMoveUp); + EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEDOWN), bMoveDown); + +} + + +/********************************************************************* + * + * Function : MoveRules + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : bMoveUp = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void MoveRules(HWND hwndDlg, BOOL bMoveUp) +{ +} + + +/********************************************************************* + * + * Function : OnMoveRuleUpClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnMoveRuleUpClick(HWND hwndDlg) +{ +} + + +/********************************************************************* + * + * Function : OnMoveRuleDownClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnMoveRuleDownClick(HWND hwndDlg) +{ +} + + +/********************************************************************* + * + * Function : OnCreateRuleClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnCreateRuleClick(HWND hwndDlg) +{ +} + + +/********************************************************************* + * + * Function : OnDeleteRuleClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnDeleteRuleClick(HWND hwndDlg) +{ + /* Get selection and remove it */ + int nItem = GetFirstSelectedItem(hwndDlg); + if (nItem >= 0) + { + LVITEM item; + HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + item.mask = LVIF_PARAM; + item.iItem = nItem; + item.iSubItem = 0; + ListView_GetItem(hwndListView, &item); + /* TODO erase data stored with item */ + ListView_DeleteItem(hwndListView, nItem); + } + +} + + +/********************************************************************* + * + * Function : OnCommand + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : nCommand = (what?) + * 3 : nNotifyCode = (what?) + * 4 : hwndItem = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnCommand(HWND hwndDlg, int nCommand, int nNotifyCode, HWND hwndItem) +{ + switch (nCommand) + { + case IDCANCEL: + case IDC_SAVE: + EndDialog(hwndDlg, IDOK); + break; + case IDC_CREATE: + if (nNotifyCode == BN_CLICKED) + { + OnCreateRuleClick(hwndDlg); + } + break; + case IDC_DELETE: + if (nNotifyCode == BN_CLICKED) + { + OnDeleteRuleClick(hwndDlg); + } + break; + case IDC_MOVEUP: + if (nNotifyCode == BN_CLICKED) + { + OnMoveRuleUpClick(hwndDlg); + } + break; + case IDC_MOVEDOWN: + if (nNotifyCode == BN_CLICKED) + { + OnMoveRuleDownClick(hwndDlg); + } + break; + } + +} + + +/********************************************************************* + * + * Function : OnNotify + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : nIdCtrl = (what?) + * 3 : pnmh = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnNotify(HWND hwndDlg, int nIdCtrl, LPNMHDR pnmh) +{ + switch (nIdCtrl) + { + case IDC_RULES: + switch (pnmh->code) + { + case LVN_ITEMCHANGED: + OnRulesItemChanged(hwndDlg); + break; + } + break; + } + +} + + +/********************************************************************* + * + * Function : OnDestroy + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnDestroy(HWND hwndDlg) +{ + /* TODO any destruction cleanup */ + +} + + +/********************************************************************* + * + * Function : DialogProc + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : uMsg = (what?) + * 3 : wParam = (what?) + * 4 : lParam = (what?) + * + * Returns : (Please fill me in!) + * + *********************************************************************/ +static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + OnInitDialog(hwndDlg); + return TRUE; + + case WM_DESTROY: + OnDestroy(hwndDlg); + return TRUE; + + case WM_COMMAND: + OnCommand(hwndDlg, LOWORD(wParam), HIWORD(wParam), (HWND) lParam); + break; + + case WM_NOTIFY: + OnNotify(hwndDlg, (int) wParam, (LPNMHDR) lParam); + break; + } + return FALSE; + +} + +#endif /* def WIN_GUI_EDIT - entire file */ +#endif /* ndef _WIN_CONSOLE - entire file */ + +/* + Local Variables: + tab-width: 3 + end: +*/ diff --git a/w32rulesdlg.h b/w32rulesdlg.h new file mode 100644 index 00000000..9fe945de --- /dev/null +++ b/w32rulesdlg.h @@ -0,0 +1,72 @@ +#ifndef _W32RULESDLG_H +#define _W32RULESDLG_H +#define W32RULESDLG_H_VERSION "$Id: w32rulesdlg.h,v 1.1.1.1 2001/05/15 13:59:08 oes Exp $" +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/w32rulesdlg.h,v $ + * + * Purpose : A dialog to allow GUI editing of the rules. + * Unfinished. + * + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net + * + * Written by and Copyright (C) 1999 Adam Lock + * + * + * 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: w32rulesdlg.h,v $ + * Revision 1.1.1.1 2001/05/15 13:59:08 oes + * Initial import of version 2.9.3 source tree + * + * + *********************************************************************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _WIN_CONSOLE /* entire file */ +#ifdef WIN_GUI_EDIT /* entire file */ + +extern int ShowRulesDialog(HWND hwndParent); +extern void SetDefaultRule(const char *pszRule); + +#endif /* def WIN_GUI_EDIT - entire file */ +#endif /* ndef _WIN_CONSOLE - entire file */ + +/* Revision control strings from this header and associated .c file */ +extern const char w32rulesdlg_rcs[]; +extern const char w32rulesdlg_h_rcs[]; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ndef _W32RULESDLG_H */ + + +/* + Local Variables: + tab-width: 3 + end: +*/ diff --git a/w32taskbar.c b/w32taskbar.c index b4ff9241..63ac0d35 100644 --- a/w32taskbar.c +++ b/w32taskbar.c @@ -1,4 +1,4 @@ -const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongfoster Exp $"; +const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.2 2001/05/20 15:07:54 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32taskbar.c,v $ @@ -6,8 +6,8 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf * Purpose : Functions for creating, setting and destroying the * workspace tray icon * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -32,15 +32,6 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf * * Revisions : * $Log: w32taskbar.c,v $ - * Revision 1.5 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.4 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.3 2001/05/22 18:56:28 oes - * CRLF -> LF - * * Revision 1.2 2001/05/20 15:07:54 jongfoster * File is now ignored if _WIN_CONSOLE is defined. * @@ -77,8 +68,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar * * Function : CreateTrayWindow * - * Description : Creates and returns the invisible window responsible - * for processing tray messages. + * Description : Creates and returns the invisible window responsible for processing tray messages. * * Parameters : * 1 : hInstance = instance handle of this application @@ -89,7 +79,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar HWND CreateTrayWindow(HINSTANCE hInstance) { WNDCLASS wc; - static const char *szWndName = "PrivoxyTrayWindow"; + static const char *szWndName = "JunkbusterTrayWindow"; wc.style = 0; wc.lpfnWndProc = TrayProc; @@ -244,7 +234,7 @@ LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_TRAYMSG: { - /* UINT uID = (UINT) wParam; */ + UINT uID = (UINT) wParam; UINT uMouseMsg = (UINT) lParam; if (uMouseMsg == WM_RBUTTONDOWN) diff --git a/w32taskbar.h b/w32taskbar.h index 19450614..9ba21fbd 100644 --- a/w32taskbar.h +++ b/w32taskbar.h @@ -1,15 +1,15 @@ -#ifndef W32TASKBAR_H_INCLUDED -#define W32TASKBAR_H_INCLUDED -#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.3 2002/03/24 12:03:47 jongfoster Exp $" +#ifndef _W32TASKBAR_H +#define _W32TASKBAR_H +#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.1 2001/05/13 21:57:07 administrator Exp $" /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/w32taskbar.h,v $ + * File : $Source: /home/administrator/cvs/ijb/w32taskbar.h,v $ * * Purpose : Functions for creating, setting and destroying the * workspace tray icon * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -34,16 +34,6 @@ * * Revisions : * $Log: w32taskbar.h,v $ - * Revision 1.3 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.2 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.1.1.1 2001/05/15 13:59:08 oes - * Initial import of version 2.9.3 source tree - * * *********************************************************************/ @@ -65,7 +55,7 @@ extern const char w32taskbar_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef W32TASKBAR_H_INCLUDED */ +#endif /* ndef _W32TASKBAR_H */ /* diff --git a/win32.c b/win32.c index d9fcec3f..2252dc1f 100644 --- a/win32.c +++ b/win32.c @@ -1,12 +1,12 @@ -const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp $"; +const char win32_rcs[] = "$Id: win32.c,v 1.1 2001/05/13 21:57:07 administrator Exp $"; /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/win32.c,v $ + * File : $Source: /home/administrator/cvs/ijb/win32.c,v $ * * Purpose : Win32 User Interface initialization and message loop * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -31,28 +31,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp * * Revisions : * $Log: win32.c,v $ - * Revision 1.7 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.6 2002/03/16 21:53:28 jongfoster - * VC++ Heap debug option - * - * Revision 1.5 2002/03/04 23:47:30 jongfoster - * - Rewritten, simpler command-line pre-parser - * - not using raise(SIGINT) any more - * - * Revision 1.4 2001/11/30 21:29:33 jongfoster - * Fixing a warning - * - * Revision 1.3 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.2 2001/07/29 19:32:00 jongfoster - * Renaming _main() [mingw32 only] to real_main(), for ANSI compliance. - * - * Revision 1.1.1.1 2001/05/15 13:59:08 oes - * Initial import of version 2.9.3 source tree - * * *********************************************************************/ @@ -65,7 +43,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp #include "project.h" #include "jcc.h" -#include "miscutil.h" /* Uncomment this if you want to build Win32 as a console app */ /* #define _WIN_CONSOLE */ @@ -75,26 +52,21 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp #include #include -#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) -/* Visual C++ Heap debugging */ -#include -#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */ - #include "win32.h" const char win32_h_rcs[] = WIN32_H_VERSION; const char win32_blurb[] = -"Privoxy version " VERSION " for Windows\n" -"Copyright (C) 2000-2002 by members of the Privoxy Team\n" -"Copyright (C) 1997-8 by Junkbusters Corp.\n" -"This is free software; it may be used and copied under the\n" -"GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n" +"Internet Junkbuster Proxy(TM) Version " VERSION " for Windows is Copyright (C) 1997-8\n" +"by Junkbusters Corp. This is free software; it may be used and copied under\n" +"the GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n" "This program comes with ABSOLUTELY NO WARRANTY OF ANY KIND.\n" "\n" "For information about how to to configure the proxy and your browser, see\n" -" " HOME_PAGE_URL "\n" -"\n"; +" " REDIRECT_URL "win\n" +"\n" +"The Internet Junkbuster Proxy(TM) is running and ready to serve!\n" +""; #ifdef _WIN_CONSOLE @@ -117,12 +89,12 @@ static void __cdecl UserInterfaceThread(void *); * Description : M$ Windows "main" routine: * parse the `lpCmdLine' param into main's argc and argv variables, * start the user interface thread (for the systray window), and - * call main (i.e. patch execution into normal startup). + * call main (i.e. patch execution into normal IJB startup). * * Parameters : - * 1 : hInstance = instance handle of this execution - * 2 : hPrevInstance = instance handle of previous execution - * 3 : lpCmdLine = command line string which started us + * 1 : hInstance = instance handle of this IJB execution + * 2 : hPrevInstance = instance handle of previous IJB execution + * 3 : lpCmdLine = command line string which started IJB * 4 : nCmdShow = window show value (MIN, MAX, NORMAL, etc...) * * Returns : `main' never returns, so WinMain will also never return. @@ -130,64 +102,56 @@ static void __cdecl UserInterfaceThread(void *); *********************************************************************/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + int argc = 0; int i; int res; - int argc = 1; - const char *argv[3]; + char **argv = NULL; + char *pszArgs = NULL; + char *pszLastTok; char szModule[MAX_PATH+1]; #ifndef _WIN_CONSOLE HANDLE hInitCompleteEvent = NULL; #endif + /* Split command line into arguments */ + pszArgs = (char *)malloc(strlen(lpCmdLine) + 1); + strcpy(pszArgs, lpCmdLine); -#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) -#if 0 - /* Visual C++ Heap debugging */ - - /* Get current flag*/ - int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); - - /* Turn on leak-checking bit */ - tmpFlag |= _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF; - - /* Turn off CRT block checking bit */ - tmpFlag &= ~(_CRTDBG_CHECK_CRT_DF | _CRTDBG_DELAY_FREE_MEM_DF); - - /* Set flag to the new value */ - _CrtSetDbgFlag( tmpFlag ); -#endif -#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */ - - /* - * Cheat in parsing the command line. We only ever have at most one - * paramater, which may optionally be specified inside double quotes. - */ + GetModuleFileName(hInstance, szModule, MAX_PATH); - if (lpCmdLine != NULL) - { - /* Make writable copy */ - lpCmdLine = strdup(lpCmdLine); - } - if (lpCmdLine != NULL) + /* Count number of spaces */ + argc = 1; + if (strlen(pszArgs) > 0) { - chomp(lpCmdLine); - i = strlen(lpCmdLine); - if ((i >= 2) && (lpCmdLine[0] == '\"') && (lpCmdLine[i - 1] == '\"')) + pszLastTok = pszArgs; + do { - lpCmdLine[i - 1] = '\0'; - lpCmdLine++; - } - if (lpCmdLine[0] == '\0') - { - lpCmdLine = NULL; - } + argc++; + pszLastTok = strchr(pszLastTok+1, ' '); + } while (pszLastTok); } - GetModuleFileName(hInstance, szModule, MAX_PATH); + /* Allocate array of strings */ + argv = (char **)malloc(sizeof(char *) * argc); + + /* step through command line replacing spaces with zeros, initialise array */ argv[0] = szModule; - argv[1] = lpCmdLine; - argv[2] = NULL; - argc = ((lpCmdLine != NULL) ? 2 : 1); + i = 1; + pszLastTok = pszArgs; + do + { + argv[i] = pszLastTok; + pszLastTok = strchr(pszLastTok+1, ' '); + if (pszLastTok) + { + while (*pszLastTok != '\0' && *pszLastTok == ' ') + { + *pszLastTok = '\0'; + pszLastTok++; + } + } + i++; + } while (pszLastTok && *pszLastTok != '\0'); #ifndef _WIN_CONSOLE /* Create a user-interface thread and wait for it to initialise */ @@ -200,11 +164,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine #endif #ifdef __MINGW32__ - res = real_main( argc, argv ); + res = _main( argc, argv ); #else res = main( argc, argv ); #endif + /* Cleanup */ + free(argv); + free(pszArgs); + return res; } @@ -238,7 +206,7 @@ void InitWin32(void) if (WSAStartup(wVersionRequested, &wsaData) != 0) { #ifndef _WIN_CONSOLE - MessageBox(NULL, "Cannot initialize WinSock library", "Privoxy Error", + MessageBox(NULL, "Cannot initialize WinSock library", "Internet JunkBuster Error", MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); #endif exit(1); @@ -262,7 +230,7 @@ void InitWin32(void) * Description : User interface thread. WinMain will wait for us to set * the hInitCompleteEvent before patching over to `main'. * This ensures the systray window is active before beginning - * operations. + * IJB operations. * * Parameters : * 1 : pData = pointer to `hInitCompleteEvent'. @@ -290,7 +258,7 @@ static void __cdecl UserInterfaceThread(void *pData) TermLogWindow(); /* Time to die... */ - exit(0); + raise(SIGINT); } diff --git a/win32.h b/win32.h index 7c699dc3..3011f478 100644 --- a/win32.h +++ b/win32.h @@ -1,14 +1,14 @@ -#ifndef WIN32_H_INCLUDED -#define WIN32_H_INCLUDED -#define WIN32_H_VERSION "$Id: win32.h,v 1.4 2002/03/24 12:03:47 jongfoster Exp $" +#ifndef _WIN32_H +#define _WIN32_H +#define WIN32_H_VERSION "$Id: win32.h,v 1.1 2001/05/13 21:57:07 administrator Exp $" /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/win32.h,v $ + * File : $Source: /home/administrator/cvs/ijb/win32.h,v $ * * Purpose : Win32 User Interface initialization and message loop * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -33,22 +33,6 @@ * * Revisions : * $Log: win32.h,v $ - * Revision 1.4 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.3 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.2 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.1.1.1 2001/05/15 13:59:08 oes - * Initial import of version 2.9.3 source tree - * * *********************************************************************/ @@ -78,8 +62,8 @@ extern const char win32_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef WIN32_H_INCLUDED */ - +#endif /* ndef _WIN32_H */ + /* Local Variables: tab-width: 3 -- 2.49.0