ports/51464: [Patch Port] devel/viewcvs (unforbidden)
Lapo Luchini
lapo at lapo.it
Sun Apr 27 15:00:31 UTC 2003
>Number: 51464
>Category: ports
>Synopsis: [Patch Port] devel/viewcvs (unforbidden)
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Sun Apr 27 08:00:29 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator: Lapo Luchini
>Release: FreeBSD 4.8-RC i386
>Organization:
>Environment:
System: FreeBSD lapo.m4d.sm 4.8-RC FreeBSD 4.8-RC #8: Fri Mar 21
16:04:11 CET 2003 lapo at lapo.m4d.sm:/usr/obj/usr/src/sys/CYBERX i386
>Description:
This patch solves two problems of the actual ViewCVs port:
1. it is forbidden as it is CSS-vulnerable, ViewCVS's CVS contains a
patch but a new release was still not created by the authors
2. it overwrites the configuration files on installation
To solve problem 1 I "back-ported" the patch 1.117 to lib/viewcvs.py
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/viewcvs/viewcvs/lib/viewcvs.py#rev1.117
as the author itself says, it solves the problem:
http://mailman.lyra.org/pipermail/viewcvs-dev/2002-July/000776.html
To solve problem 2 I changed the install script to install
viewcvs.conf.dist directly instead of renaming it to viewcvs.conf,
leaving it up to the user and specifying it in the pkg-message.
>How-To-Repeat:
>Fix:
The patch applies from /usr/ports/devel with -p0
--- viewcvs-0.9.2.diff begins here ---
diff -ruN viewcvs.orig/Makefile viewcvs/Makefile
--- viewcvs.orig/Makefile Fri Apr 25 19:23:05 2003
+++ viewcvs/Makefile Fri Apr 25 19:49:11 2003
@@ -7,6 +7,7 @@
PORTNAME= viewcvs
PORTVERSION= 0.9.2
+PORTREVISION= 1
CATEGORIES= devel python
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}
@@ -19,17 +20,12 @@
PKGMESSAGE= ${WRKDIR}/pkg-message
INSTDIR?= ${PORTNAME}-${PORTVERSION}
PLIST_SUB= INSTDIR=${INSTDIR}
-FORBIDDEN= "due to cross-site scripting vulnerabilities"
do-install:
@ cd ${WRKSRC} && INSTDIR=${PREFIX}/${INSTDIR} ${PYTHON_CMD} viewcvs-install
post-install:
@ ${SED} -e "s:%%INSTDIR%%:${PREFIX}/${INSTDIR}:g" pkg-message >${PKGMESSAGE}
-.if !defined(BATCH)
- @ ${ECHO}
@ ${CAT} ${PKGMESSAGE}
- @ ${ECHO}
-.endif
.include <bsd.port.mk>
diff -ruN viewcvs.orig/files/patch-aa viewcvs/files/patch-aa
--- viewcvs.orig/files/patch-aa Fri Apr 25 19:23:05 2003
+++ viewcvs/files/patch-aa Thu Jan 1 01:00:00 1970
@@ -1,35 +0,0 @@
---- viewcvs-install.orig Fri Dec 21 20:59:45 2001
-+++ viewcvs-install Mon Dec 24 02:16:56 2001
-@@ -51,7 +51,7 @@
- """ % version
-
- ## installer defaults
--ROOT_DIR = "/usr/local/viewcvs-" + version
-+ROOT_DIR = os.environ['INSTDIR']
-
-
- ## list of files for installation
-@@ -192,7 +192,7 @@
- if type(prompt_replace) == type(""):
- print prompt_replace
- while 1:
-- temp = raw_input("\n File %s\n exists and is different from source file.\n DO YOU WANT TO,\n overwrite [o]\n do not overwrite [d]\n view differences [v]: " % (dest_path))
-+ temp = 'o'
- print
-
- temp = string.lower(temp[0])
-@@ -245,10 +245,10 @@
- print INFO_TEXT
-
- ## get the install path
-- temp = raw_input("Installation Path [%s]: " % ROOT_DIR)
-- temp = string.strip(temp)
-- if len(temp):
-- ROOT_DIR = temp
-+ #temp = raw_input("Installation Path [%s]: " % ROOT_DIR)
-+ #temp = string.strip(temp)
-+ #if len(temp):
-+ # ROOT_DIR = temp
-
- ## install the files
- print
diff -ruN viewcvs.orig/files/patch-lib::viewcvs.py viewcvs/files/patch-lib::viewcvs.py
--- viewcvs.orig/files/patch-lib::viewcvs.py Thu Jan 1 01:00:00 1970
+++ viewcvs/files/patch-lib::viewcvs.py Fri Apr 25 19:24:19 2003
@@ -0,0 +1,91 @@
+--- lib/viewcvs.py.orig Tue Jan 15 10:35:55 2002
++++ lib/viewcvs.py Fri Apr 25 19:18:22 2003
+@@ -174,6 +174,10 @@
+ # parse the query params into a dictionary (and use defaults)
+ query_dict = default_settings.copy()
+ for name, values in cgi.parse().items():
++ # validate the parameter
++ _validate_param(name, values[0])
++
++ # if we're here, then the parameter is okay
+ query_dict[name] = values[0]
+
+ # set up query strings, prefixed by question marks and ampersands
+@@ -228,6 +232,77 @@
+ self.branch = branch
+ self.taginfo = taginfo
+
++
++def _validate_param(name, value):
++ """Validate whether the given value is acceptable for the param name.
++
++ If the value is not allowed, then an error response is generated, and
++ this function throws an exception. Otherwise, it simply returns None.
++ """
++
++ try:
++ validator = _legal_params[name]
++ except KeyError:
++ error('An illegal parameter name ("%s") was passed.' % cgi.escape(name))
++
++ # is the validator a regex?
++ if hasattr(validator, 'match'):
++ if not validator.match(value):
++ error('An illegal value ("%s") was passed as a parameter.' %
++ cgi.escape(value))
++ return
++
++ # the validator must be a function
++ validator(value)
++
++def _validate_cvsroot(value):
++ if not cfg.general.cvs_roots.has_key(value):
++ error('The CVS root "%s" is unknown.' % cgi.escape(value))
++
++def _validate_regex(value):
++ # hmm. there isn't anything that we can do here.
++
++ ### we need to watch the flow of these parameters through the system
++ ### to ensure they don't hit the page unescaped. otherwise, these
++ ### parameters could constitute a CSS attack.
++ pass
++
++# obvious things here. note that we don't need uppercase for alpha.
++_re_validate_alpha = re.compile('^[a-z]+$')
++_re_validate_number = re.compile('^[0-9]+$')
++
++# when comparing two revs, we sometimes construct REV:SYMBOL, so ':' is needed
++_re_validate_revnum = re.compile('^[-_.a-zA-Z0-9:]+$')
++
++# it appears that RFC 2045 also says these chars are legal: !#$%&'*+^{|}~`
++# but woah... I'll just leave them out for now
++_re_validate_mimetype = re.compile('^[-_.a-zA-Z0-9/]+$')
++
++# the legal query parameters and their validation functions
++_legal_params = {
++ 'cvsroot' : _validate_cvsroot,
++ 'search' : _validate_regex,
++
++ 'hideattic' : _re_validate_number,
++ 'sortby' : _re_validate_alpha,
++ 'sortdir' : _re_validate_alpha,
++ 'logsort' : _re_validate_alpha,
++ 'diff_format' : _re_validate_alpha,
++ 'only_with_tag' : _re_validate_revnum,
++ 'dir_pagestart' : _re_validate_number,
++ 'log_pagestart' : _re_validate_number,
++ 'hidecvsroot' : _re_validate_number,
++ 'annotate' : _re_validate_revnum,
++ 'graph' : _re_validate_revnum,
++ 'makeimage' : _re_validate_number,
++ 'tarball' : _re_validate_number,
++ 'r1' : _re_validate_revnum,
++ 'tr1' : _re_validate_revnum,
++ 'r2' : _re_validate_revnum,
++ 'tr2' : _re_validate_revnum,
++ 'rev' : _re_validate_revnum,
++ 'content-type' : _re_validate_mimetype,
++ }
+
+ class LogEntry:
+ "Hold state for each revision entry in an 'rlog' output."
diff -ruN viewcvs.orig/files/patch-viewcvs-install viewcvs/files/patch-viewcvs-install
--- viewcvs.orig/files/patch-viewcvs-install Thu Jan 1 01:00:00 1970
+++ viewcvs/files/patch-viewcvs-install Fri Apr 25 19:47:57 2003
@@ -0,0 +1,49 @@
+--- viewcvs-install.orig Fri Dec 21 12:59:45 2001
++++ viewcvs-install Fri Apr 25 19:47:28 2003
+@@ -51,7 +51,7 @@
+ """ % version
+
+ ## installer defaults
+-ROOT_DIR = "/usr/local/viewcvs-" + version
++ROOT_DIR = os.environ['INSTDIR']
+
+
+ ## list of files for installation
+@@ -65,11 +65,11 @@
+ ("cgi/query.cgi", "cgi/query.cgi", 0755, 1, 0, 0),
+ ("standalone.py", "standalone.py", 0755, 1, 0, 0),
+
+- ("cgi/viewcvs.conf.dist", "viewcvs.conf", 0644, 1,
++ ("cgi/viewcvs.conf.dist", "viewcvs.conf.dist", 0644, 1,
+ """Note: If you are upgrading from viewcvs-0.7 or earlier:
+ The section [text] has been removed from viewcvs.conf. The functionality
+ went into the new files in subdirectory templates.""", 0),
+- ("cgi/cvsgraph.conf.dist", "cvsgraph.conf", 0644, 0, 1, 0),
++ ("cgi/cvsgraph.conf.dist", "cvsgraph.conf.dist", 0644, 0, 1, 0),
+
+ ("lib/PyFontify.py", "lib/PyFontify.py", 0644, 0, 0, 1),
+ ("lib/blame.py", "lib/blame.py", 0644, 0, 0, 1),
+@@ -192,7 +192,7 @@
+ if type(prompt_replace) == type(""):
+ print prompt_replace
+ while 1:
+- temp = raw_input("\n File %s\n exists and is different from source file.\n DO YOU WANT TO,\n overwrite [o]\n do not overwrite [d]\n view differences [v]: " % (dest_path))
++ temp = 'o'
+ print
+
+ temp = string.lower(temp[0])
+@@ -245,10 +245,10 @@
+ print INFO_TEXT
+
+ ## get the install path
+- temp = raw_input("Installation Path [%s]: " % ROOT_DIR)
+- temp = string.strip(temp)
+- if len(temp):
+- ROOT_DIR = temp
++ #temp = raw_input("Installation Path [%s]: " % ROOT_DIR)
++ #temp = string.strip(temp)
++ #if len(temp):
++ # ROOT_DIR = temp
+
+ ## install the files
+ print
diff -ruN viewcvs.orig/pkg-message viewcvs/pkg-message
--- viewcvs.orig/pkg-message Fri Apr 25 19:23:05 2003
+++ viewcvs/pkg-message Fri Apr 25 19:55:08 2003
@@ -3,3 +3,10 @@
%%INSTDIR%%/viewcvs.conf, to note where your
CVSROOT is, and then copy the actual CGI (located at
%%INSTDIR%%/cgi/viewcvs.cgi) to your cgi-bin.
+Please notice that configuration files are installed as
+".dist" and must be copied to their actual names prior to
+be edited, e.g.:
+$ cd %%INSTDIR%%
+$ cp viewcvs.conf.dist viewcvs.conf
+$ cp cvsgraph.conf.dist cvsgraph.conf
+It's up to yo to check the ".dist" files after upgrades.
diff -ruN viewcvs.orig/pkg-plist viewcvs/pkg-plist
--- viewcvs.orig/pkg-plist Fri Apr 25 19:23:05 2003
+++ viewcvs/pkg-plist Fri Apr 25 19:59:18 2003
@@ -1,7 +1,7 @@
%%INSTDIR%%/cgi/query.cgi
%%INSTDIR%%/cgi/viewcvs.cgi
%%INSTDIR%%/cvsdbadmin
-%%INSTDIR%%/cvsgraph.conf
+%%INSTDIR%%/cvsgraph.conf.dist
%%INSTDIR%%/doc/help_dirview.html
%%INSTDIR%%/doc/help_log.html
%%INSTDIR%%/doc/help_logtable.html
@@ -57,7 +57,7 @@
%%INSTDIR%%/templates/log_table.ezt
%%INSTDIR%%/templates/markup.ezt
%%INSTDIR%%/templates/query.ezt
-%%INSTDIR%%/viewcvs.conf
+%%INSTDIR%%/viewcvs.conf.dist
@dirrm %%INSTDIR%%/templates
@dirrm %%INSTDIR%%/lib
@dirrm %%INSTDIR%%/doc/images
--- viewcvs-0.9.2.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list