From: Fabian Keil Date: Wed, 27 Mar 2002 15:30:26 +0000 (+0000) Subject: Synthetic commit for tag v_2_9_7 X-Git-Tag: v_2_9_7 X-Git-Url: http://www.privoxy.org/gitweb/?a=commitdiff_plain;h=refs%2Ftags%2Fv_2_9_7;p=privoxy.git Synthetic commit for tag v_2_9_7 --- diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 9ea1fd22..00000000 --- a/.gitignore +++ /dev/null @@ -1,55 +0,0 @@ -# CVS default ignores begin -tags -TAGS -.make.state -.nse_depinfo -*~ -#* -.#* -,* -_$* -*$ -*.old -*.bak -*.BAK -*.orig -*.rej -.del-* -*.a -*.olb -*.o -*.obj -*.so -*.exe -*.Z -*.elc -*.ln -core -# CVS default ignores end -*.txt -GNUmakefile -Makefile -configure -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 00000000..6c95de6d Binary files /dev/null and b/Junkbuster Status.URL differ 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..cc06229d 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.21 2001/07/13 13:59:53 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,158 +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. - * - * Revision 1.22 2001/07/18 12:29:34 oes - * - Made gif_deanimate_response respect - * csp->action->string[ACTION_STRING_DEANIMATE] - * - Logging cosmetics - * * Revision 1.21 2001/07/13 13:59:53 oes * - Introduced gif_deanimate_response which shares the * generic content modification interface of pcrs_filter_response @@ -386,26 +234,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 +258,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 +275,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 +340,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 +357,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 +373,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 +388,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 +409,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 +426,90 @@ 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; - - /* - * 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. */ - { - 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(); - } - - 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); + 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 */ - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } + 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); - err = template_fill_for_cgi(csp, "blocked", exports, rsp); - if (err) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = fill_template(csp, "blocked", exports); + free_map(exports); + + rsp->status = strdup("403 Request for blocked URL"); } - 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 +526,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 +538,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"); - } - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); + exports = map_block_killer(exports, "have-trust-info"); } - + /* * 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 +639,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 +692,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; + } + 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 /* def FEATURE_IMAGE_DETECT_MSIE */ +#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 +735,205 @@ 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) - { - 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, "re_filtering %s%s (size %d) ...", + csp->http->hostport, csp->http->path, size); - /* - * 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) + /* Apply all jobs from the joblist */ + for (job = b->joblist; NULL != job; job = job->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; - - 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; - } - } + hits += pcrs_execute(job, old, size, &new, &size); + if (old != csp->iob->cur) free(old); + old=new; } - /* - * If there were no hits, destroy our copy and let - * chat() use the original in csp->iob - */ - if (!hits) - { - free(new); - return(NULL); - } + log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size); - csp->flags |= CSP_FLAG_MODIFIED; csp->content_length = size; - IOB_RESET(csp); + /* fwiw, reset the iob */ + IOB_RESET(csp); return(new); } @@ -1339,37 +943,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 +979,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 +1003,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 +1035,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 +1096,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..13273f6c 100644 --- a/gateway.c +++ b/gateway.c @@ -1,4 +1,4 @@ -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.2 2001/06/07 23:11:38 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/gateway.c,v $ @@ -8,13 +8,13 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" * 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,68 +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 - * * Revision 1.2 2001/06/07 23:11:38 jongfoster * Removing gateways[] list - no longer used. * Replacing function pointer in struct gateway with a directly @@ -118,27 +56,12 @@ 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 #endif /* def _WIN32 */ -#ifdef __BEOS__ -#include -#endif /* def __BEOS__ */ - -#ifdef __OS2__ -#include -#endif /* def __OS2__ */ - -#include "project.h" #include "jcc.h" #include "errlog.h" #include "jbsockets.h" @@ -146,10 +69,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 +116,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 +151,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 +174,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 +205,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 +218,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 +225,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 +249,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 +289,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 +298,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 00000000..e5aa2506 Binary files /dev/null and b/icons/denyrule.ico differ diff --git a/icons/icon1.ico b/icons/icon1.ico new file mode 100644 index 00000000..b96fe7c2 Binary files /dev/null and b/icons/icon1.ico differ diff --git a/icons/idle.ico b/icons/idle.ico index 5ef20fc1..99470b54 100644 Binary files a/icons/idle.ico and b/icons/idle.ico differ diff --git a/icons/junkbust.ico b/icons/junkbust.ico new file mode 100644 index 00000000..41aafd0a Binary files /dev/null and b/icons/junkbust.ico differ diff --git a/icons/os2.ico b/icons/os2.ico deleted file mode 100644 index b5fd21fc..00000000 Binary files a/icons/os2.ico and /dev/null differ diff --git a/icons/os20.ico b/icons/os20.ico deleted file mode 100644 index ef5995b1..00000000 Binary files a/icons/os20.ico and /dev/null differ diff --git a/icons/os21.ico b/icons/os21.ico deleted file mode 100644 index cc61b61d..00000000 Binary files a/icons/os21.ico and /dev/null differ diff --git a/icons/os22.ico b/icons/os22.ico deleted file mode 100644 index d357dfba..00000000 Binary files a/icons/os22.ico and /dev/null differ diff --git a/icons/os23.ico b/icons/os23.ico deleted file mode 100644 index 8ac037f0..00000000 Binary files a/icons/os23.ico and /dev/null differ diff --git a/icons/os24.ico b/icons/os24.ico deleted file mode 100644 index f2b87f71..00000000 Binary files a/icons/os24.ico and /dev/null differ diff --git a/icons/os25.ico b/icons/os25.ico deleted file mode 100644 index 5bc68b5e..00000000 Binary files a/icons/os25.ico and /dev/null differ diff --git a/icons/os26.ico b/icons/os26.ico deleted file mode 100644 index 408d89ef..00000000 Binary files a/icons/os26.ico and /dev/null differ diff --git a/icons/os27.ico b/icons/os27.ico deleted file mode 100644 index 00a88148..00000000 Binary files a/icons/os27.ico and /dev/null differ diff --git a/icons/os28.ico b/icons/os28.ico deleted file mode 100644 index 91536360..00000000 Binary files a/icons/os28.ico and /dev/null differ diff --git a/icons/privoxy.ico b/icons/privoxy.ico deleted file mode 100644 index 4c96d0b1..00000000 Binary files a/icons/privoxy.ico and /dev/null differ diff --git a/install-sh b/install-sh deleted file mode 100755 index e9de2384..00000000 --- a/install-sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/intermediate.action b/intermediate.action deleted file mode 100644 index ab6689e5..00000000 --- a/intermediate.action +++ /dev/null @@ -1,90 +0,0 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/intermediate.action,v $ -# -# $Id: intermediate.action,v 1.3 2002/03/26 22:29:54 swa Exp $ -# -# Purpose : More 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/jbsockets.c b/jbsockets.c index 8a407e26..3f54271a 100644 --- a/jbsockets.c +++ b/jbsockets.c @@ -1,4 +1,4 @@ -const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Exp $"; +const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.13 2001/07/15 13:56:57 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jbsockets.c,v $ @@ -9,7 +9,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex * 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 @@ -35,86 +35,6 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex * * Revisions : * $Log: jbsockets.c,v $ - * Revision 1.29 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.28 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.27 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.26 2002/03/11 22:07:02 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.25 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.24 2002/03/07 03:51:36 oes - * - Improved handling of failed DNS lookups - * - Fixed compiler warnings etc - * - * Revision 1.23 2002/03/05 00:36:01 jongfoster - * Fixing bug 514988 - unable to restart JunkBuster - * - * Revision 1.22 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.21 2002/01/09 14:32:33 oes - * Added support for gethostbyname_r and gethostbyaddr_r. - * - * Revision 1.20 2001/11/16 00:48:48 jongfoster - * Enabling duplicate-socket detection for all platforms, not - * just Win32. - * - * Revision 1.19 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.18 2001/09/21 23:02:02 david__schmidt - * Cleaning up 2 compiler warnings on OS/2. - * - * Revision 1.17 2001/09/13 20:11:46 jongfoster - * Fixing 2 compiler warnings under Win32 - * - * 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:40:43 jongfoster - * Fixed compiler warning by adding a cast - * - * Revision 1.14 2001/07/18 13:47:59 oes - * Eliminated dirty hack for getsockbyname() - * * Revision 1.13 2001/07/15 13:56:57 jongfoster * Removing unused local variable. * @@ -179,9 +99,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex #else -#ifndef __OS2__ #include -#endif #include #include #include @@ -190,20 +108,11 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex #ifndef __BEOS__ #include -#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..9f3083da 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.26 2001/07/18 12:31:36 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,280 +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 - * - * Revision 1.27 2001/07/19 19:09:47 haroon - * - Added code to take care of the situation where while processing the first - * server response (which includes the server header), after finding the end - * of the headers we were not looking past the end of the headers for - * content modification. I enabled it for filter_popups. - * Someone else should look to see if other similar operations should be - * done to the discarded portion of the buffer. - * - * Note 2001/07/20: No, the other content modification mechanisms will process - * the whole iob later anyway. --oes - * * Revision 1.26 2001/07/18 12:31:36 oes * cosmetics * @@ -538,23 +264,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 +275,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 +286,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 +295,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 +324,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 +336,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 +360,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 +407,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 +426,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 +436,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 +471,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. + * HTTP request that has only the path component + * without the http://domainspec + * pass = pass the original HTTP request unchanged * - * connect = Open a socket to the host:port of the server - * and short-circuit server and client socket. - * - * 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 +571,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 +643,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 +720,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 +742,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 +763,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 +788,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 +815,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 +843,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 +866,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 +906,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 +927,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 +976,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 */ @@ -1474,13 +992,14 @@ static void chat(struct client_state *csp) { block_popups_now = 1; /* - * Filter the part of the body that came in the same read - * as the last headers: - */ - filter_popups(csp->iob->cur, csp); + * even though the header has been found, don't forget about the + * left over portion of the buffer which will usually contain body text + */ + n = strlen(csp->iob->cur); + filter_popups(csp->iob->cur, n); } -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ /* Buffer and pcrs filter this if appropriate. */ @@ -1500,32 +1019,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"); + 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; - } - - 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 +1059,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 +1086,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 +1118,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 +1137,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)) + { + 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)) { - char *abs_file; + 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 +1190,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]); - } - } +#ifndef _WIN32 + signal(SIGPIPE, SIG_IGN); + signal(SIGCHLD, SIG_IGN); - 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]); - } - } - -} #else /* ifdef _WIN32 */ # ifdef _WIN_CONSOLE /* @@ -1808,96 +1206,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 +1214,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 +1228,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) + { + 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) && !defined(__OS2__) +#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 +1293,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 +1321,7 @@ static void listen_loop(void) #ifdef AMIGA if(!childs) { - exit(1); + exit(1); } #endif freez(csp); @@ -2096,12 +1332,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 +1343,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 +1351,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 +1372,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 +1381,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 +1410,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 +1445,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 +1462,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 +1472,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..11b511e6 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.17 2001/06/29 21:45:41 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,186 +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 '/'. - * - Removed all #ifdef PCRS - * - content_type now always inspected and classified as - * text, gif or other. - * - formatting / comments - * * Revision 1.17 2001/06/29 21:45:41 oes * Indentation, CRLF->LF, Tab-> Space * @@ -245,7 +66,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 +192,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 +206,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 +224,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 +239,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 +294,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 +322,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 +366,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 +378,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 +415,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 +432,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 +450,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 +471,310 @@ 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); + } /********************************************************************* * - * 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; + } - sprintf(*header, "Content-Length: %d", (int) csp->content_length); + if (n == 2) + { + http->host = strdup(v[0]); + http->port = atoi(v[1]); + } - log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", (int) csp->content_length); + freez(buf); + + 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 +783,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); } @@ -1111,43 +880,49 @@ jb_err client_referrer(struct client_state *csp, char **header) * * Function : client_uagent * - * Description : Handle the "user-agent" config setting properly - * and remember its original value to enable browser - * bug workarounds. Called from `sed'. + * Description : Handle the "user-agent" config setting 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 : 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; +#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 +933,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 +962,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 +1008,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 +1027,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 +1043,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 +1120,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; - } + struct list *lst; + char *tmp = NULL; + char *e; - tmp = strdup("Cookie: "); - - 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; - } - - log_error(LOG_LEVEL_HEADER, "addh: %s", tmp); - err = enlist(csp->headers, tmp); - free(tmp); - return err; -} + char *ret; - -/********************************************************************* - * - * 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 +1176,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 +1201,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 +1314,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 +1328,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..2f14079c 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.22 2001/07/15 17:51:41 jongfoster 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,193 +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 - * * Revision 1.22 2001/07/15 17:51:41 jongfoster * Renaming #define STATIC to STATIC_PCRE * @@ -428,9 +241,9 @@ #endif #ifdef STATIC_PCRS -# include "pcrs.h" +# include "pcrs.h" #else -# include +# include #endif #if defined(REGEX_PCRE) @@ -445,167 +258,65 @@ # 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; }; -/* - * 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 +325,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,17 +344,12 @@ 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 #define ANCHOR_RIGHT 2 + /* An I/O buffer */ struct iob { @@ -654,46 +362,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 +405,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 +424,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 +458,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 +490,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 +526,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 +550,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 +598,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 +610,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 +633,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 +665,14 @@ 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 */ + 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 +691,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 +707,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 +721,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 +771,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