--- versionner-server-0.2.0.orig/debian/README.Debian +++ versionner-server-0.2.0/debian/README.Debian @@ -0,0 +1,6 @@ +versionner-server for Debian +---------------------------- + +This package should be used together with the versionner-client package + + -- Leo Eraly , Thu, 3 Nov 2005 16:38:55 +0100 --- versionner-server-0.2.0.orig/debian/changelog +++ versionner-server-0.2.0/debian/changelog @@ -0,0 +1,13 @@ +versionner-server (0.2.0-2) unstable; urgency=low + + * Added dependency on postgresql + * Added debconf screens for db configuration + + -- Leo Eraly Sat, 5 Nov 2005 12:10:55 +0100 + +versionner-server (0.2.0-1) unstable; urgency=low + + * Initial release + + -- Leo Eraly Thu, 3 Nov 2005 16:38:55 +0100 + --- versionner-server-0.2.0.orig/debian/compat +++ versionner-server-0.2.0/debian/compat @@ -0,0 +1 @@ +4 --- versionner-server-0.2.0.orig/debian/postinst +++ versionner-server-0.2.0/debian/postinst @@ -0,0 +1,121 @@ +#! /bin/sh +# postinst script for versionner-server +# +# see: dh_installdeb(1) +test -f /usr/share/debconf/confmodule || exit 0 + +. /usr/share/debconf/confmodule + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package +# + +case "$1" in + configure) + db_input high versionner-server/askcreatedb || true + + db_input high versionner-server/dbhost || true + + db_input high versionner-server/dbuser || true + + db_input high versionner-server/dbpass || true + + db_input high versionner-server/dbname || true + + db_go + + db_get versionner-server/dbhost + dbhost=$RET; + + db_get versionner-server/dbuser + dbuser=$RET; + + db_get versionner-server/dbpass + dbpass=$RET; + + db_get versionner-server/dbname + dbname=$RET; + + db_get versionner-server/askcreatedb + + if [ "$RET" = 'false' ] + then + createdb=no + db_input high versionner-server/nocreate || true + else + createdb=yes + db_input high versionner-server/createyes || true + fi + + db_go + + if [ ! -z $dbhost ] + then + sed -e "s/#DBHOST#/$dbhost/" /usr/share/versionner-server/include/db.php.orig > /usr/share/versionner-server/include/db.php.tmp + fi + + if [ ! -z $dbuser ] + then + sed -e "s/#DBUSER#/$dbuser/" /usr/share/versionner-server/include/db.php.tmp > /usr/share/versionner-server/include/db.php.orig + fi + + if [ ! -z $dbpass ] + then + sed -e "s/#DBPASS#/$dbpass/" /usr/share/versionner-server/include/db.php.orig > /usr/share/versionner-server/include/db.php.tmp + fi + + if [ ! -z $dbname ] + then + sed -e "s/#DBNAME#/$dbname/" /usr/share/versionner-server/include/db.php.tmp > /usr/share/versionner-server/include/db.php + fi + + if [ -e /usr/share/versionner-server/include/db.php.orig ] + then + rm /usr/share/versionner-server/include/db.php.orig + fi + + if [ "$createdb" = 'yes' ] + then + su postgres -c "/usr/bin/createdb -q $dbname" + su postgres -c "/usr/bin/createuser -D -A -q $dbuser" + su postgres -c "/usr/bin/psql -c \"update pg_shadow set passwd='$dbpass' where usename='$dbuser'\" -d template1" + su postgres -c "/usr/bin/psql -c 'grant all on database $dbname to $dbuser' -d template1" + psql -U $dbuser -d $dbname < /usr/share/versionner-server/sql/versionner-server.sql > /dev/null 2>&1 + fi + + chown -R www-data /usr/share/versionner-server/templates_c + + /usr/bin/pear install HTML_Common + /usr/bin/pear install HTML_Menu + /usr/bin/pear install HTML_Table + /usr/bin/pear install HTML_QuickForm + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + --- versionner-server-0.2.0.orig/debian/postrm +++ versionner-server-0.2.0/debian/postrm @@ -0,0 +1,38 @@ +#! /bin/sh +# postrm script for versionner-server +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' overwrit>r> +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + #drop the database maybe? + + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 --- versionner-server-0.2.0.orig/debian/dirs +++ versionner-server-0.2.0/debian/dirs @@ -0,0 +1,3 @@ +usr/bin +usr/sbin +usr/share --- versionner-server-0.2.0.orig/debian/templates +++ versionner-server-0.2.0/debian/templates @@ -0,0 +1,36 @@ +Template: versionner-server/dbhost +Type: string +Default: localhost +Description: Enter the host of the PostgreSQL database + This database is used to hold all the information about + the different machines + +Template: versionner-server/dbuser +Type: string +Default: versionner +Description: Enter the database user + +Template: versionner-server/dbpass +Type: password +Default: versionnerpass +Description: Enter the password for the database user + +Template: versionner-server/dbname +Type: string +Default: versionner +Description: Enter the name of the database + +Template: versionner-server/askcreatedb +Type: boolean +Default: true +Description: Would you like the database to be created? + If you answer No you should create the database and tables yourself + and you should create the initial tables with the file /usr/share/versionner-server/sql/versionner-server.sql + +Template: versionner-server/nocreate +Type: text +Description: No database/tables will be created , the given values will be saved in /usr/share/versionner-server/include/db.php + +Template: versionner-server/createyes +Type: text +Description: This script will create the database with the given username and password --- versionner-server-0.2.0.orig/debian/copyright +++ versionner-server-0.2.0/debian/copyright @@ -0,0 +1,25 @@ +This package was debianized by Leo Eraly on +Thu, 3 Nov 2005 16:38:55 +0100. + +It was downloaded from http://leo.unstable.be/projects/versionner-server + +Copyright Holder: Leo Eraly + +License: + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +On Debian GNU/Linux systems, the complete text of the GNU General Public +License can be found in the `/usr/share/common-licenses' directory. --- versionner-server-0.2.0.orig/debian/preinst +++ versionner-server-0.2.0/debian/preinst @@ -0,0 +1,39 @@ +#! /bin/sh +# preinst script for versionner-server +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) + #maybe we should backup the old database here + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + --- versionner-server-0.2.0.orig/debian/rules +++ versionner-server-0.2.0/debian/rules @@ -0,0 +1,122 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + + + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + + +clean: + dh_testdir + dh_testroot + + # Add here commands to clean up after the build process. + #-$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/versionner-server. + install --owner=www-data -d cache/ $(CURDIR)/debian/versionner-server/usr/share/versionner-server/cache + install --owner=www-data -d configs/ $(CURDIR)/debian/versionner-server/usr/share/versionner-server/configs + install --owner=www-data -d images/ $(CURDIR)/debian/versionner-server/usr/share/versionner-server/images + install --owner=www-data images/banner.gif $(CURDIR)/debian/versionner-server/usr/share/versionner-server/images/banner.gif + install --owner=www-data -d src $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src + install --owner=www-data -d include/ $(CURDIR)/debian/versionner-server/usr/share/versionner-server/include + install --owner=www-data include/xmlrpc.inc $(CURDIR)/debian/versionner-server/usr/share/versionner-server/include/xmlrpc.inc + install --owner=www-data include/xmlrpcs.inc $(CURDIR)/debian/versionner-server/usr/share/versionner-server/include/xmlrpcs.inc + install --owner=www-data -d scripts/ $(CURDIR)/debian/versionner-server/usr/share/versionner-server/scripts + install --owner=www-data scripts/download-sdo-packages $(CURDIR)/debian/versionner-server/usr/share/versionner-server/scripts/download-sdo-packages + install --owner=www-data -d sdo/sarge $(CURDIR)/debian/versionner-server/usr/share/versionner-server/sdo/sarge + install --owner=www-data -d sdo/woody $(CURDIR)/debian/versionner-server/usr/share/versionner-server/sdo/woody + install --owner=www-data -d sql $(CURDIR)/debian/versionner-server/usr/share/versionner-server/sql + install --owner=www-data sql/versionner-server.sql $(CURDIR)/debian/versionner-server/usr/share/versionner-server/sql/versionner-server.sql + install --owner=www-data src/debian.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src/debian.php + install --owner=www-data src/dsa-rss.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src/dsa-rss.php + install --owner=www-data src/index.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src/index.php + install --owner=www-data include/lib.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/include/lib.php + install --owner=www-data include/db.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/include/db.php.orig + install --owner=www-data src/machines.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src/machines.php + install --owner=www-data include/main.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/include/main.php + install --owner=www-data src/packages.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src/packages.php + install --owner=www-data src/updatelist.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src/updatelist.php + install --owner=www-data src/users.php $(CURDIR)/debian/versionner-server/usr/share/versionner-server/src/users.php + install --owner=www-data -d style $(CURDIR)/debian/versionner-server/usr/share/versionner-server/style + install --owner=www-data style/style.css $(CURDIR)/debian/versionner-server/usr/share/versionner-server/style/style.css + install --owner=www-data -d templates $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates + install --owner=www-data -d templates_c $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates_c + install --owner=www-data templates/customer_header.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates + install --owner=www-data templates/customer_list.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/customer_list.tpl + install --owner=www-data templates/customer_machine_changes.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/customer_machine_changes.tpl + install --owner=www-data templates/customer_main.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/customer_main.tpl + install --owner=www-data templates/footer.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/footer.tpl + install --owner=www-data templates/header.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/header.tpl + install --owner=www-data templates/machine_changes.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/machine_changes.tpl + install --owner=www-data templates/machine_list.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/machine_list.tpl + install --owner=www-data templates/machine_release.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/machine_release.tpl + install --owner=www-data templates/main.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/main.tpl + install --owner=www-data templates/package_list.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/package_list.tpl + install --owner=www-data templates/pkg_hold.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/pkg_hold.tpl + install --owner=www-data templates/pkg_installed.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/pkg_installed.tpl + install --owner=www-data templates/pkg_not_installed.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/pkg_not_installed.tpl + install --owner=www-data templates/user_list.tpl $(CURDIR)/debian/versionner-server/usr/share/versionner-server/templates/user_list.tpl + + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu + dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure --- versionner-server-0.2.0.orig/debian/control +++ versionner-server-0.2.0/debian/control @@ -0,0 +1,17 @@ +Source: versionner-server +Section: admin +Priority: optional +Maintainer: Leo Eraly +Build-Depends: debhelper (>= 4.0.0) +Standards-Version: 3.6.2 + +Package: versionner-server +Architecture: any +Depends: postgresql , debconf , libapache-mod-php4 , php4-pear +Description: Central package versionner server + This package contains the necessary files to setup + a central server which can be used by different versionner clients + All the clients submit their information to this server + . + The server stores all the information in a postgreSQL database + --- versionner-server-0.2.0.orig/debian/cron.d +++ versionner-server-0.2.0/debian/cron.d @@ -0,0 +1,4 @@ +# +# Regular cron jobs for the versionner-server package +# +0/5 * * * * root /usr/share/versionner-server/scripts/download-sdo-packages --- versionner-server-0.2.0.orig/src/debian.php +++ versionner-server-0.2.0/src/debian.php @@ -0,0 +1,267 @@ +'; + + $parse_ver1 = parseVersion($ver1); + $parse_ver2 = parseVersion($ver2); + + if($parse_ver1['epoch'] > $parse_ver2['epoch']) + return true; + if($parse_ver1['epoch'] < $parse_ver2['epoch']) + return false; + + if(DEBUG) { + echo 'Version string for ver1: ' . print_r($parse_ver1) . '
'; + echo 'Version string for ver2: ' . print_r($parse_ver2) . '
'; + } + + $res = compare($parse_ver1['version'] , $parse_ver2['version']); + + if($res) { + # print("DEBUG: Returning $res
"); + return $res; + } + + return(compare($parse_ver1['revision'] , $parse_ver2['revision'])); + + +# if($final_res < 0) +# return false; + +# if($final_res > 0) +# return true; + +# print("Final result is $final_res "); +} + + + +function compare($ver1 , $ver2) +{ + if(DEBUG) + print("Comparing $ver1 and $ver2
"); + + //epoch's are checked now we hav to check the version + $p1 = 0 ; $p2 = 0; + $p1_len = strlen($ver1); $p2_len = strlen($ver2); + $p1_row = $ver1; $p2_row = $ver2; + + while($p1 < $p1_len || $p2 < $p2_len ) + { + $diff = 0; + $p1_el = $p1_row{$p1}; + $p2_el = $p2_row{$p2}; + + if(DEBUG) { + print("> DEBUG: p1 counter is $p1 and p2 counter is $p2 DEBUG: processing element p1_el: $p1_el and p2_el: $p2_el
"); + } + + while( (($p1_el) && !is_digit($p1_el)) || (($p2_el) && !is_digit($p2_el))) + { + if(DEBUG) + print(">> DEBUG: processing non digits: p1_el: $p1_el and p2_el: $p2_el
"); + + $rc = move($p1_el); $rv = move($p2_el); + + if(DEBUG) + print(">> DEBUG: result from compare: p1_el: $rc and p2_el: $rv
"); + + if($rc != $rv) { + if(DEBUG) + print(">> rc $rc differs from $rv"); + return $rc - $rv; + } + $p1++; + $p2++; + $p1_el = $p1_row{$p1}; + $p2_el = $p2_row{$p2}; + } + + // zero's are useless + while($p1_el == '0') { ++$p1; $p1_el = $p1_row{$p1}; } + while($p2_el == '0') { ++$p2; $p2_el = $p2_row{$p2}; } + + while( (is_digit($p1_el)) && (is_digit($p2_el)) ) { + + if(!$diff) { + $diff = $p1_el - $p2_el; + + if(DEBUG) + print(">>> DEBUG: both are digits [ $p1_el ] [ $p2_el ] , calculating diff $diff
"); + } + + $p1++; $p2++; + $p1_el = $p1_row{$p1}; + $p2_el = $p2_row{$p2}; + } + + if(DEBUG) + print("DEBUG: next element is $p1_el and p2_el $p2_el
"); + + if(is_digit($p1_row{$p1})) { return 1; } + if(is_digit($p2_row{$p2})) { return -1; } + if($diff != 0) { return $diff; } + } + + return 0; +} + +function move($char) +{ + if($char == '~') + return -1; + elseif(is_digit($char)) + return 0; + elseif(!$char) + return 0; + elseif(is_alpha($char)) + return $char; + else + return $char+256; +} + +function is_digit($i) +{ + return($i >= '0') && ($i <= '9'); +} + +function is_alpha($i) +{ + return (($i>='a') && ($i<='z')) || (($i>='A') && ($i<='Z')); +} + +function parseVersion($version) +{ + if(strlen($version) > 0) + { + $t_ver = trim($version); + + + // looking for epoch 2:1.34 => epoch is 2 here + if(ereg(':' , $t_ver)) + { + $t = split(':' , $t_ver); + $ep = $t[0]; + if( (is_numeric($ep)) && ($ep > 0)) { /* we found an epoch! so safe the number before the : */ + $epoch = $ep; + $rest = $t[1]; /* the rest of the string should we keep for the rest of the version check */ + } + else + { + $epoch = 0; /* no epoch */ + $rest = $t_ver; + } + } + else + { + $epoch = 0; + $rest = $t_ver; + } + + /* look for a rc , alpha , pre marked with a ~ sign ( X.1.0 < X.1.0~cvs2004 ) */ + if(ereg('~' , $rest)) + { + $t = split('~' , $rest); + $rc = $t[1]; /* everything behind the ~ refers to this build */ + if(strlen($rc) > 0) { + $rc_ver = $rc; + $rest = $t[0]; + } + else + { + $rc_ver = 0; + } + } + else + { + $rc_ver = 0; + } + + /* look for a revision 1.01-woody6 - wood6 is our revision */ + if(ereg('-' , $rest)) + { + $t = split('-' , $rest); + $rv = $t[1]; + if(strlen($rv) > 0) { + $rev = $rv; + $rest = $t[0]; + } + else + { + $rev = 0; + } + + } + else + { + $rev = 0; + } + + + return(array('epoch' => $epoch , 'rc' => $rc_ver , 'revision' => $rev , 'version' => $rest)); + } + else + { + print('No version supplied
'); + } + +} + +?> --- versionner-server-0.2.0.orig/src/dsa-rss.php +++ versionner-server-0.2.0/src/dsa-rss.php @@ -0,0 +1,75 @@ + +

+debian security +

+
+ +", + trim($link),htmlspecialchars(trim($title))); + printf("",htmlspecialchars(trim($description))); + $title = ""; + $description = ""; + $link = ""; + $insideitem = false; + } +} + +function characterData($parser, $data) { + global $insideitem, $tag, $title, $description, $link; + if ($insideitem) { + switch ($tag) { + case "TITLE": + $title .= $data; + break; + case "DESCRIPTION": + $description .= $data; + + break; + case "LINK": + $link .= $data; + break; + } + } +} + +$xml_parser = xml_parser_create(); +xml_set_element_handler($xml_parser, "startElement", "endElement"); +xml_set_character_data_handler($xml_parser, "characterData"); +$fp = fopen(DSA_SOURCE,"r") + or die("Error reading RSS data."); +while ($data = fread($fp, 4096)) + xml_parse($xml_parser, $data, feof($fp)) + or die(sprintf("XML error: %s at line %d", + xml_error_string(xml_get_error_code($xml_parser)), + xml_get_current_line_number($xml_parser))); +fclose($fp); +xml_parser_free($xml_parser); + +?> +
%s%s
--- versionner-server-0.2.0.orig/src/index.php +++ versionner-server-0.2.0/src/index.php @@ -0,0 +1,15 @@ +display('header.tpl'); + +$smarty->assign('crums' , 'home'); +$smarty->display('main.tpl'); + +echo $intro; + +$smarty->display('footer.tpl'); +?> --- versionner-server-0.2.0.orig/src/machines.php +++ versionner-server-0.2.0/src/machines.php @@ -0,0 +1,479 @@ + array('tag' => 'show unsupported' , 'link' => 'action=unsup'), + 1 => array('tag' => 'show old stable' , 'link' => 'action=showoldstable'), + 2 => array('tag' => 'show stable' , 'link' => 'action=showstable'), + 3 => array('tag' => 'show testing' , 'link' => 'action=showtesting'), + 4 => array('tag' => 'show not up2date' , 'link' => 'action=notupdate'), + 5 => array('tag' => 'add machine' , 'link' => 'action=add'), + 6 => array('tag' => 'show on hold' , 'link' => 'action=onhold'), + ); + +$smarty->display('header.tpl'); + +$smarty->assign('crums' , 'home » machines'); +$smarty->assign('submenu' , $menu); + +$smarty->display('main.tpl'); + +if(isSet($_GET['action'])) +{ + if(strcmp($_GET['action'] , "add") == 0) + { + + $form->addElement('text' , 'name' , 'Name' , array('size' => 40 , 'maxlength' => 100 , 'class' => 'inputfield')); + $form->addElement('password' , 'pass' , 'Password' , array('size' => 40 , 'maxlength' => 100 , 'class' => 'inputfield')); + $form->addElement('select' , 'cust_id' , 'Customer' , customerList('index')); + $form->addElement('select' , 'distro' , 'Distro' , $distro); + $form->addElement('select' , 'release' , 'Release' , $release); + $form->addElement('select' , 'supported' , 'Supported' , $choice); + $form->addElement('submit' , null , 'Add'); + + $form->addRule('cust_id' , 'You need to supply a customer' , 'required' , null); + $form->addRule('name' , 'You need to supply a machine name' , 'required' , null); + $form->addRule('pass' , 'You need to supply a machine password' , 'required' , null); + $form->addRule('distro' , 'You need to supply a distro' , 'required' , null); + $form->addRule('release' , 'You need to supply a release' , 'required' , null); + + $form->applyFilter('__ALL__' , trim); + $form->applyFilter('name' , strtolower); + + if(!$form->validate()) { + $form->display(); + } + else + { + $new_machine = $form->getSubmitValues(); + $name = $new_machine['name']; + $pass = $new_machine['pass']; + $distro = $new_machine['distro']; + $release = $new_machine['release']; + $cust_id = $new_machine['cust_id']; + $supported = $new_machine['supported']; + $id = $new_machine['id']; + + $res =& $db->query("insert into machines (name , pass , distro , release , cust_id , supported , on_hold) VALUES ('$name' , '$pass' , '$distro' , '$release' ,'$cust_id' , '$supported' , 'n' )"); + + if(DB::isError($res)) + echo 'Could not add machine'; + else + echo 'Machine added!'; + } + + + } + + if(strcmp($_GET['action'] , 'edit') == 0) + { + if(isSet($_GET['id'])) + { + $m_info =& $db->getRow('select * from machines where id = ' . $_GET['id'] . '' , DB_FETCHMODE_ASSOC); + + $form->setDefaults($m_info); + $form->addElement('header' , null , 'Edit machine'); + $form->addElement('hidden' , 'id'); + $form->addElement('text' , 'name' , 'Name' , array('size' => 40 , 'maxlength' => 100 , 'class' => 'inputfield')); + $form->addElement('password' , 'pass' , 'Password' , array('size' => 40 , 'maxlength' => 100 , 'class' => 'inputfield')); + $form->addElement('select' , 'cust_id' , 'Customer' , customerList('index')); + $form->addElement('select' , 'distro' , 'Distro' , $distro); + $form->addElement('select' , 'release' , 'Release' , $release); + $form->addElement('select' , 'supported' , 'Supported' , $choice); + $form->addElement('select' , 'on_hold' , 'On hold' , $choice); + $form->addElement('checkbox' , 'delete' , 'Delete'); + $form->addElement('submit' , null , 'Add'); + + $form->addRule('cust_id' , 'You need to supply a customer' , 'required' , null); + $form->addRule('name' , 'You need to supply a machine name' , 'required' , null); + $form->addRule('pass' , 'You need to supply a machine password' , 'required' , null); + $form->addRule('distro' , 'You need to supply a distro' , 'required' , null); + $form->addRule('release' , 'You need to supply a release' , 'required' , null); + + $form->applyFilter('__ALL__' , trim); + $form->applyFilter('name' , strtolower); + + if(!$form->validate()) { + $form->display(); + } + else + { + + $edit_machine = $form->getSubmitValues(); + $id = $edit_machine['id']; + if($edit_machine['delete']) + { + $res =& $db->query("delete from installed_packages where machine_id='$id'"); + if(DB::isError($res)) + echo 'Could not delete installed_packages list
'; + else + echo 'Installed packages list deleted
'; + + $res =& $db->query("delete from changed_packages where machine_id='$id'"); + if(DB::isError($res)) + echo 'Could not delete changed_packages list
'; + else + echo 'Changed packages list deleted
'; + + $res =& $db->query("delete from machines_changelog where machine_id='$id'"); + if(DB::isError($res)) + echo 'Could not delete machines_changelog list
'; + else + echo 'Changelog deleted
'; + + $res =& $db->query("delete from machines_uptime where machine_id='$id'"); + if(DB::isError($res)) + echo 'Could not delete machine uptime
'; + else + echo 'Uptime deleted
'; + + $res =& $db->query("delete from installed_kernels where machine_id='$id'"); + if(DB::isError($res)) + echo 'Could not delete machine kernel
'; + else + echo 'Kernel deleted
'; + + $res =& $db->query("delete from machines where id='$id'"); + if(DB::isError($res)) + echo 'Could not delete machine
'; + else + echo 'Machine deleted
'; + + } + else + { + $name = $edit_machine['name']; + $pass = $edit_machine['pass']; + $distro = $edit_machine['distro']; + $release = $edit_machine['release']; + $cust_id = $edit_machine['cust_id']; + $id = $edit_machine['id']; + $supported = $edit_machine['supported']; + $hold = $edit_machine['on_hold']; + + $res =& $db->query("update machines set name='$name' , pass='$pass' , distro='$distro' , release='$release' , cust_id='$cust_id' , on_hold='$hold' , supported='$supported' where id ='$id'"); + + if(DB::isError($res)) + echo 'Could not update machine'; + else + echo 'Machine updated'; + } + } + + } + + } + if(strcmp($_GET['action'] , 'editchange') == 0) + { + $form->addElement('header' , null , 'Edit changelog'); + + if(isset($_GET['changeid']) && is_numeric($_GET['changeid'])) + { + $machine_info =& $db->getAll("select machine_id,change,engineer,machines.name as machine_name from machines_changelog,machines where machines_changelog.id='".$_GET['changeid']."' and machines.id=machines_changelog.machine_id" , DB_FETCHMODE_ASSOC); + + $machine_info[0]['change'] = strip_tags($machine_info[0]['change']); + $form->setDefaults($machine_info[0]); + $form->addElement('hidden' , 'changeid' , $_GET['changeid']); + $form->addElement('static' , 'machine_name' , 'Machine' , $machine); + $form->addElement('static' , 'engineer' , 'Engineer'); + $form->addElement('textarea' , 'change' , 'Changes' , array('rows' => 10 , 'cols' => 30)); + $form->addElement('submit' , null , 'Add'); + $form->addRule('machine' , 'You must select a machine' , 'required' , null); + $form->addRule('engineer' , 'You must select an engineer' , 'required' , null); + + $form->applyFilter('change' , trim); + + if(!$form->validate()) { + $form->display(); + } + else + { + $new_change = $form->getSubmitValues(); + $changeid = $new_change['changeid']; + $change = addslashes(nl2br($new_change['change'])); + + $res =& $db->query("update machines_changelog set change='$change' where id='$changeid'"); + if(DB::isError($res)) + echo 'Changelog could not be modified'; + else + echo 'Changelog modified'; + + + } + + } + } + if(strcmp($_GET['action'] , 'changelog') == 0) + { + + $form->addElement('header' , null , 'Add machine change'); + + if(isset($_GET['id']) && is_numeric($_GET['id'])) + { + $machine =& $db->getOne("SELECT name from machines where id='".$_GET['id']."'"); + + + $form->addElement('static' , 'machine_name' , 'Machine' , $machine); + $form->addElement('hidden' , 'machine' , $_GET['id']); + } + else + { + $mlist =& $db->getAll("SELECT distinct(name),id from machines order by name" , DB_FETCHMODE_ASSOC); + + foreach($mlist as $mac) + { + $name = $mac['name']; $id = $mac['id']; + $machines[$id] = $name; + } + + $form->addElement('select' , 'machine' , 'Machine' , $machines); + + } + + $form->addElement('select' , 'engineer' , 'Engineer' , $engineers); + $form->addElement('textarea' , 'change' , 'Changes' , array('rows' => 10 , 'cols' => 30)); + $form->addElement('submit' , null , 'Add'); + $form->addRule('machine' , 'You must select a machine' , 'required' , null); + $form->addRule('engineer' , 'You must select an engineer' , 'required' , null); + + $form->applyFilter('change' , trim); + + if(!$form->validate()) { + $form->display(); + } + else + { + $new_change = $form->getSubmitValues(); + $machine_id = $new_change['machine']; + $engineer = $new_change['engineer']; + $change = addslashes(nl2br($new_change['change'])); + + $res =& $db->query("insert into machines_changelog ( machine_id , change , engineer ) VALUES ('$machine_id' , '$change' , '$engineer')"); + + if(DB::isError($res)) + echo 'Changelog could not be added'; + else + echo 'Changelog added'; + + } + + + } + if(strcmp($_GET['action'] , 'delchange') == 0) + { + if(isSet($_GET['id'])) + { + $res =& $db->query("delete from machines_changelog where id ='" . $_GET['id'] . "'"); + + if(DB::isError($res)) + echo 'Could not remove event'; + else + echo 'Event removed from changelog'; + + } + } + + if(strcmp($_GET['action'] , 'showchanges') == 0) + { + if(isset($_GET['id'])) + { + $smarty->assign('id' , $_GET['id']); + $machine_name =& $db->getOne("select name from machines where id='" . $_GET['id'] . "'"); + $smarty->assign('name' , $machine_name); + + $uptime =& $db->getOne("select uptime from machines_uptime where machine_id='" . $_GET['id'] . "'"); + $smarty->assign('uptime' , $uptime); + + $changes =& $db->getAll("select id,change,engineer,date_trunc('minute' , date) from machines_changelog where machine_id='" . $_GET['id'] . "' order by date" , DB_FETCHMODE_ASSOC); + + if(count($changes) > 0) + { + $smarty->assign('changes' , $changes); + } + + $changed_packages =& $db->getAll("select name,date_trunc('minute' , date),new_version from changed_packages where machine_id='" . $_GET['id'] . "' order by date desc limit 20" , DB_FETCHMODE_ASSOC); + + if(count($changed_packages) > 0) + { + $smarty->assign('packages' , $changed_packages); + } + + $kernel =& $db->getOne("select version from installed_kernels where machine_id='" . $_GET['id'] . "'"); + $smarty->assign('kernel' , $kernel); + + $smarty->display('machine_changes.tpl'); + } + else + { + echo 'No machine supplied'; + } + + } + if(strcmp($_GET['action'] , 'notupdate') == 0) + { + $conflict_found = 0; + //currently only for stable and oldstable + + //oldstable + $installed_list =& $db->getAll('select distinct version,installed_packages.name,release,machines.name as mn from installed_packages,machines where installed_packages.machine_id=machines.id and machines.release=\'' . OLDSTABLE . '\' and machines.supported=\'y\' and machines.on_hold=\'n\' order by installed_packages.name' , DB_FETCHMODE_ASSOC); + $security_list = securityList('woody'); + + if(count($installed_list) > 0) { + echo '' . OLDSTABLE . ''; + echo ''; + echo ''; + foreach($installed_list as $pkg) + { + $name = $pkg['name']; + if(array_key_exists($name , $security_list)) + { +# echo 'Checking for ' . $name . '
'; + if(compareVersionsGt($security_list[$name] , $pkg['version']) > 0) { + $conflict_found = 1; + echo ''; + } + } + } + echo '
PackageSDOInstalledMachine
' . $pkg['name'] . '' . $security_list[$name] . '' . $pkg['version'] . '' . $pkg['mn'] . '

'; + + if(!$conflict_found) + { + echo '
All ' . OLDSTABLE . ' machines are up2date!

'; + $conflict_found = 0; + } + + } + else + { + echo '
No ' . OLDSTABLE . ' machines found that are supported and not on hold!

'; + } + + + $installed_list =& $db->getAll('select distinct version,installed_packages.name,release,machines.name as mn from installed_packages,machines where installed_packages.machine_id=machines.id and machines.release=\'' . STABLE . '\' and machines.supported=\'y\' and machines.on_hold=\'n\' order by installed_packages.name' , DB_FETCHMODE_ASSOC); + $security_list = securityList('sarge'); + + if(count($installed_list) > 0) { + echo '' . STABLE . ''; + echo ''; + echo ''; + foreach($installed_list as $pkg) + { + $name = $pkg['name']; + if(array_key_exists($name , $security_list)) + { +# echo 'Checking for ' . $name . '
'; + if(compareVersionsGt($security_list[$name] , $pkg['version']) > 0) { + $conflict_found = 1; + echo ''; + } + } + } + echo '
PackageSDOInstalledMachine
' . $pkg['name'] . '' . $security_list[$name] . '' . $pkg['version'] . '' . $pkg['mn'] . '

'; + + if(!$conflict_found) + { + echo 'All ' . STABLE . ' machines are up2date!
'; + $conflict_found = 0; + } + } + else + { + echo '
No ' . STABLE . ' machines found that are supported and not on hold!

'; + } + } + + + if(strcmp($_GET['action'] , 'showstable') == 0) + { + $machine_list =& $db->getAll('select name from machines where machines.release=\'' . STABLE . '\' order by name' , DB_FETCHMODE_ASSOC); + + if(count($machine_list) > 0) + { + $smarty->assign('machines' , $machine_list); + $smarty->assign('version' , STABLE); + $smarty->display('machine_release.tpl'); + } + + } + + if(strcmp($_GET['action'] , 'showoldstable') == 0) + { + $machine_list =& $db->getAll('select name from machines where machines.release=\'' . OLDSTABLE . '\' order by name' , DB_FETCHMODE_ASSOC); + + if(count($machine_list) > 0) + { + $smarty->assign('machines' , $machine_list); + $smarty->assign('version' , OLDSTABLE); + $smarty->display('machine_release.tpl'); + } + + } + + if(strcmp($_GET['action'] , 'showtesting') == 0) + { + $machine_list =& $db->getAll('select name from machines where machines.release=\'' . TESTING . '\' order by name' , DB_FETCHMODE_ASSOC); + + if(count($machine_list) > 0) + { + $smarty->assign('machines' , $machine_list); + $smarty->assign('version' , TESTING); + $smarty->display('machine_release.tpl'); + } + } + + if(strcmp($_GET['action'] , 'notsup') == 0) + { + $machine_list =& $db->getAll('select name from machines where supported=\'n\'' , DB_FETCHMODE_ASSOC); + + if(count($machine_list) > 0) + { + $smarty->assign('machines' , $machine_list); + $smarty->assign('version' , 'unsupported'); + $smarty->display('machine_release.tpl'); + } + } + + if(strcmp($_GET['action'] , 'onhold') == 0) + { + $machine_list =& $db->getAll('select name from machines where on_hold=\'y\'' , DB_FETCHMODE_ASSOC); + + if(count($machine_list) > 0) + { + $smarty->assign('machines' , $machine_list); + $smarty->assign('version' , 'on hold'); + $smarty->display('machine_release.tpl'); + } + else + { + echo("No machines on hold"); + } + + } + +} +else +{ + $res =& $db->getAll('select * from machines order by machines.name' , DB_FETCHMODE_ASSOC); + + if(DB::isError($res)) + die('Could not fetch list of machines'); + + $machines = array(); + + foreach($res as $res_row) + { + $res_row['cust_name'] = getCustomerByID($res_row['cust_id']); + array_push($machines , $res_row); + } + + $smarty->assign('machines' , $machines); + $smarty->display('machine_list.tpl'); +} + +$smarty->display('footer.tpl'); +?> --- versionner-server-0.2.0.orig/src/packages.php +++ versionner-server-0.2.0/src/packages.php @@ -0,0 +1,151 @@ + array('tag' => 'show all packages' , 'link' => 'action=showall'), + 1 => array('tag' => 'show packages on hold' , 'link' => 'action=onhold'), + 2 => array('tag' => 'set package on hold' , 'link' => 'action=puthold'), + 3 => array('tag' => 'show dsa' , 'link' => 'action=dsa') + ); + +$smarty->display('header.tpl'); + +$smarty->assign('crums' , 'home » packages'); + +$smarty->assign('submenu' , $menu); + +$smarty->display('main.tpl'); + +if(isSet($_GET['action'])) +{ + if(strcmp($_GET['action'] , 'showall') == 0) + { + $pkg_list =& $db->getAll('SELECT distinct(name) from installed_packages' , DB_FETCHMODE_ASSOC); + + $smarty->assign('pkg_list' , $pkg_list); + $smarty->display('package_list.tpl'); + + } + + if(strcmp($_GET['action'] , 'dsa') == 0) + { + include_once('dsa-rss.php'); + } + + if(strcmp($_GET['action'] , 'inst_machine') == 0) + { + $pkg_list =& $db->getAll("SELECT * from installed_packages where installed_packages.machine_id='". $_GET['id'] ."' order by name" , DB_FETCHMODE_ASSOC); + + $smarty->assign('pkg_list' , $pkg_list); + $smarty->display('package_list.tpl'); + } + + if(strcmp($_GET['action'] , 'onhold') == 0) + { + $pkg_list =& $db->getAll('select * from installed_packages where on_hold=\'y\'' , DB_FETCHMODE_ASSOC); + + if(count($pkg_list) > 0) + { + $packages = array(); + foreach($pkg_list as $pkg) + { + $machine = getMachineByID($pkg['machine_id']); + array_push($packages , array('name' => $pkg['name'] , 'machine' => $machine)); + + } + +# var_dump($packages); + $smarty->assign('pkg_list' , $packages); + $smarty->display('pkg_hold.tpl'); + } + } + + if(strcmp($_GET['action'] , 'installed') == 0) + { + if($_GET['name']) + { + $versions =& $db->getAll("select distinct version from installed_packages where name='" . urldecode($_GET['name']) . "'", DB_FETCHMODE_ASSOC); + + foreach($versions as $ver) + { + $m_list =& $db->getAll("select machines.name from machines,installed_packages where installed_packages.name='" . urldecode($_GET['name']) . "' and installed_packages.version='" . $ver['version'] . "' and installed_packages.machine_id=machines.id"); + + $smarty->assign('pkg' , urldecode($_GET['name'])); + $smarty->assign('version' , $ver['version']); + $smarty->assign('list' , $m_list); + $smarty->display('pkg_installed.tpl'); + } + + $not_installed =& $db->getAll("select name from machines where id not in (select machine_id from installed_packages where name='" . urldecode($_GET['name']) . "')"); + + if(count($not_installed) > 0) + { + $smarty->assign('machines' , $not_installed); + $smarty->assign('pkg' , urldecode($_GET['name'])); + $smarty->display('pkg_not_installed.tpl'); + } + + } + } + + if(strcmp($_GET['action'] , 'puthold') == 0) + { + $pkglist =& $db->getAll("select distinct name from installed_packages order by name" , DB_FETCHMODE_ASSOC); + $mlist =& $db->getAll("SELECT distinct(name),id from machines order by name" , DB_FETCHMODE_ASSOC); + + $packages = array(); $machines = array(); + foreach($pkglist as $pkg) + { + $name = $pkg['name']; + $packages[$name] = $name; + } + + $machines['all'] = 'all'; + foreach($mlist as $mac) + { + $name = $mac['name']; $id = $mac['id']; + $machines[$id] = $name; + } + + $form->addElement('header' , null , 'Set package on hold'); + $form->addElement('select' , 'package' , 'Package' , $packages); + $form->addElement('select' , 'machine' , 'Machine' , $machines); + + $form->addRule('machine' , 'You need to supply a distro' , 'required' , null); + $form->addRule('package' , 'You need to supply a distro' , 'required' , null); + + $form->addElement('submit' , null , 'Add'); + + if(!$form->validate()) { + $form->display(); + } + else + { + $pkg = $form->exportValue('package'); + $machine = $form->exportValue('machine'); + + if(strcmp($machine , 'all') == 0) + $query = "update installed_packages set on_hold='y' where name='" . $pkg . "'"; + else + $query = "update installed_packages set on_hold='y' where name='" . $pkg . "' and machine_id='" . $machine . "'"; + + $res =& $db->query($query); + + if(DB::isError($res)) + echo 'Could not set package on hold'; + else + echo 'Package set on hold'; + + } + + } + +} + +$smarty->display('footer.tpl'); --- versionner-server-0.2.0.orig/src/updatelist.php +++ versionner-server-0.2.0/src/updatelist.php @@ -0,0 +1,42 @@ +getAll('select distinct version,installed_packages.name,release,machines.name as mn from installed_packages,machines where installed_packages.machine_id=machines.id and machines.release=\'' . STABLE . '\' and machines.supported=\'y\' and machines.on_hold=\'n\' order by installed_packages.name' , DB_FETCHMODE_ASSOC); + $security_list = securityList('sarge'); + + if(count($installed_list) > 0) { + foreach($installed_list as $pkg) + { + $name = $pkg['name']; + if(array_key_exists($name , $security_list)) + { + if(compareVersionsGt($security_list[$name] , $pkg['version']) > 0) { + $conflict_found = 1; + if(!in_array($pkg['mn'] , $not_machines)) + array_push($not_machines , $pkg['mn']); + } + } + } + + } + + if(count($not_machines) > 0) + { + foreach($not_machines as $machine) + { + echo $machine . '
'; + } + } + +?> --- versionner-server-0.2.0.orig/src/users.php +++ versionner-server-0.2.0/src/users.php @@ -0,0 +1,247 @@ + array('tag' => 'show contacts' , 'link' => 'action=contacts'), + 1 => array('tag' => 'add contacts' , 'link' => 'action=addcontact'), + 2 => array('tag' => 'add customer' , 'link' => 'action=addcustomer'), + 3 => array('tag' => 'show customers' , 'link' => 'action=customers') + ); + + +$smarty->display('header.tpl'); + +$smarty->assign('crums' , 'home » users'); +$smarty->assign('submenu' , $menu); + +$smarty->display('main.tpl'); + +if(isSet($_GET['action'])) +{ + if(strcmp($_GET['action'] , 'addcustomer') == 0) + { + $form->addElement('header' , null , 'Add Customer'); + $form->addElement('text' , 'customername' , 'Customer' , array('size' => 40 , 'maxlength' => 100 , 'class' => 'inputfield')); + $form->addElement('text' , 'customernr' , 'Customer No' , array('size' => 40 , 'maxlenght' => 100 , 'class' => 'inputfield')); + $form->addElement('password' , 'password' , 'Password' , array('size' => 40 , 'maxlenght' => 20 , 'class' => 'inputfield')); + $form->addElement('submit' , null , 'Add'); + + $form->addRule('customername' , 'You need to supply a customer' , 'required' , null); + $form->applyFilter('__ALL__' , trim); + $form->applyFilter('customername' , strtolower); + + if(!$form->validate()) { + $form->display(); + } + else + { + $new_cust = $form->getSubmitValues(); + $name = $new_cust['customername']; + if($new_cust['customernr']) + $id = $new_cust['customernr']; + else + $id = 0; + + $md_pass = crypt($new_cust['password'], CRYPT_MD5); + +// print("insert into customers (name , customer_id , password ) VALUES ('$name' , $id , '$md_pass')"); + $res = $db->query("insert into customers (name , customer_id , password ) VALUES ('$name' , $id , '$md_pass')"); + + + if(DB::isError($res)) + echo 'Could not add customer'; + else + echo 'Customer added!'; + + + } + + } + if(strcmp($_GET['action'] , 'addcontact') == 0) + { + $form->addElement('header' , null , 'Add Person'); + $form->addElement('text' , 'firstname' , 'Firstname' , array('size' => 40 , 'maxlength' => 60 , 'class' => 'inputfield')); + $form->addElement('text' , 'lastname' , 'Lastname' , array('size' => 40 , 'maxlength' => 80 , 'class' => 'inputfield')); + $form->addElement('text' , 'email' , 'Email' , array('size' => 40 , 'maxlength' => 70 , 'class' => 'inputfield')); + $form->addElement('text' , 'telephone' , 'Telephone' , array('size' => 20 , 'maxlength' => 25 , 'class' => 'inputfield')); + $form->addElement('select' , 'customer_id' , 'Customer' , customerList('index') ); + $form->addElement('submit' , null , 'Add'); + + $form->addRule('lastname' , 'You need to supply a name' , 'required' , null); + $form->addRule('email' , 'You need to supply a email' , 'required' , null); + $form->addRule('email' , 'Not a valid email' , 'email' , null); + $form->addRule('customer_id' , 'You need to select a customer' , 'required' , null); + + $form->applyFilter('__ALL__' , trim); + $form->applyFilter('__ALL__' , strtolower); + + if(!$form->validate()) + { + $form->display(); + } + else + { + $new_contact = $form->getSubmitValues(); + if($new_contact['firstname']) + $fname = $new_contact['firstname']; + else + $fname = ''; + + $lname = $new_contact['lastname']; + $email = $new_contact['email']; + + if($new_contact['telephone']) + $tel = $new_contact['telephone']; + else + $tel = ''; + + $customer_id = $new_contact['customer_id']; + + $res =& $db->query("insert into users (lastname , firstname , email , telephone , customer_id) VALUES ('$lname' , '$fname' , '$email' , '$tel' , '$customer_id')"); + + if(DB::isError($res)) + echo 'Could not add user'; + else + echo 'User added'; + + + } + } + if(strcmp($_GET['action'] , 'contacts') == 0) + { + $smarty->assign('users' , userList()); + $smarty->display('user_list.tpl'); + } + + if(strcmp($_GET['action'] , 'edit') == 0) + { + if(isSet($_GET['id'])) + { + $user_info =& $db->getRow('select id,name,customer_id from customers where id = ' . $_GET['id'] . '' , DB_FETCHMODE_ASSOC); + + $form->setDefaults($user_info); + + $form->addElement('header' , null , 'Edit Customer'); + $form->addElement('text' , 'name' , 'Customer' , array('size' => 40 , 'maxlength' => 100 , 'class' => 'inputfield')); + $form->addElement('hidden' , 'id'); + $form->addElement('text' , 'customer_id' , 'Customer No' , array('size' => 40 , 'maxlenght' => 100 , 'class' => 'inputfield')); + $form->addElement('password' , 'password' , 'Password' , array('size' => 40 , 'maxlenght' => 20 , 'class' => 'inputfield')); + $form->addElement('submit' , null , 'Add'); + + $form->addRule('name' , 'You need to supply a customer' , 'required' , null); + $form->addRule('password' , 'You need to supply a password' , 'required' , null); + $form->applyFilter('__ALL__' , trim); + $form->applyFilter('name' , strtolower); + + if(!$form->validate()) + { + $form->display(); + } + else + { + $edit_contact = $form->getSubmitValues(); + + $name = $edit_contact['name']; + if($edit_contact['customer_id']) + $cust_id = $edit_contact['customer_id']; + else + $cust_id = 0; + + if(is_numeric($edit_contact['id'])) + $id = $edit_contact['id']; + else + $id = -1; + + $md_pass = crypt($edit_contact['password'] , CRYPT_MD5); + + $res = $db->query("update customers set customer_id='$cust_id' , name='$name' , password='$md_pass' where id='$id'"); + + + if(DB::isError($res)) + echo 'Could not update customer'; + else + echo 'Customer updated!'; + } + + } + } + + if(strcmp($_GET['action'] , 'customers') == 0) + { + $smarty->assign('users' , customerList()); + $smarty->display('customer_list.tpl'); + } + + if(strcmp($_GET['action'] , 'editusr') == 0) + { + if(isSet($_GET['id'])) + { + $user_info =& $db->getRow('select * from users where id = ' . $_GET['id'] . '' , DB_FETCHMODE_ASSOC); + + $form->setDefaults($user_info); + + $form->addElement('header' , null , 'Edit Person'); + $form->addElement('text' , 'firstname' , 'Firstname' , array('size' => 40 , 'maxlength' => 60 , 'class' => 'inputfield')); + $form->addElement('hidden' , 'id'); + $form->addElement('text' , 'lastname' , 'Lastname' , array('size' => 40 , 'maxlength' => 80 , 'class' => 'inputfield')); + $form->addElement('text' , 'email' , 'Email' , array('size' => 40 , 'maxlength' => 70 , 'class' => 'inputfield')); + $form->addElement('text' , 'telephone' , 'Telephone' , array('size' => 20 , 'maxlength' => 25 , 'class' => 'inputfield')); + $form->addElement('submit' , null , 'Add'); + + $form->addRule('lastname' , 'You need to supply a name' , 'required' , null); + $form->addRule('email' , 'You need to supply a email' , 'required' , null); + $form->addRule('email' , 'Not a valid email' , 'email' , null); + + $form->applyFilter('__ALL__' , trim); + $form->applyFilter('__ALL__' , strtolower); + + if(!$form->validate()) + { + $form->display(); + } + else + { + $edit_user = $form->getSubmitValues(); + if($edit_user['firstname']) + $fname = $edit_user['firstname']; + else + $fname = ''; + + $lname = $edit_user['lastname']; + $email = $edit_user['email']; + + if($edit_user['telephone']) + $tel = $edit_user['telephone']; + else + $tel = ''; + + if(is_numeric($edit_user['id'])) + $id = $edit_user['id']; + else + $id = -1; + + $res =& $db->query("update users set lastname='$lname' , firstname='$fname' , email='$email' , telephone='$tel' where id='$id'"); + + if(DB::isError($res)) + echo 'Could not update user'; + else + echo 'User updated'; + } + + } + } +} +else +{ + $smarty->assign('users' , customerList()); + $smarty->display('customer_list.tpl'); + +} + +$smarty->display('footer.tpl'); +?> --- versionner-server-0.2.0.orig/style/style.css +++ versionner-server-0.2.0/style/style.css @@ -0,0 +1,93 @@ +body { background-color: #ffffff; + text-align: center; +} + +.menu { font-size: 14px; + text-align: center; + font-family: verdana , arial , sans-serif; + padding: 10px; + border-style: solid; + border-width: 0px; + border-color: #cccccc; +} + +.maintable { + border-style: solid; + border-width: 1px; + border-color: #cccccc; + width: 800px; + margin-top: 2px; + padding: 5px; +} + +.centertable { + width: 800px; + border-style: solid; + border-width: 1px; + border-color: #cccccc; + border-top: 0px; +} + +.crums { + font-size: 10px; + border-style: none; + padding-left: 20px; +} + +.main { + font-size: 12px; + padding: 5px; +} + +#inputform { + color: red; + font-size: 10px; +} +#foot { + font-size: 10px; +} + + +a:link { text-decoration: underlined; + color: #000000; +} + +a:visited { color: #333333; + text-decoration: underlined; +} + +#submenu { + font-size: 12px; + +} + +.field_mid { + font-size: 13px; + text-align: left; + +} + +.tblhdr { + font-family: arial , sans-serif; + font-size: 11px; + text-align: left; +} + +.inputfield { + border-style: solid; + border-width: 1px; + border-color: #cccccc; +} + +.listitem { + text-align: left; + font-family: verdana , sans-serif; + font-size: 12px; + padding-left: 5px; + padding-right: 5px; +} + +td { + font-family: verdana , sans-serif; + +} --- versionner-server-0.2.0.orig/include/xmlrpc.inc +++ versionner-server-0.2.0/include/xmlrpc.inc @@ -0,0 +1,2202 @@ + +// $Id: xmlrpc.inc,v 1.1.1.1.4.1.2.1 2005/08/14 21:09:09 milosch Exp $ + + +// Copyright (c) 1999,2000,2002 Edd Dumbill. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// * Neither the name of the "XML-RPC for PHP" nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + + if (!function_exists('xml_parser_create')) + { + // Win 32 fix. From: 'Leo West' + if($WINDIR) + { + dl('php3_xml.dll'); + } + else + { + dl('xml.so'); + } + } + + // G. Giunta 2005/01/29: declare global these variables, + // so that xmlrpc.inc will work even if included from within a function + // NB: it will give warnings in PHP3, so we comment it out + // Milosch: Next round, maybe we should explicitly request these via $GLOBALS where used. + if (phpversion() >= '4') + { + global $xmlrpcI4; + global $xmlrpcInt; + global $xmlrpcDouble; + global $xmlrpcBoolean; + global $xmlrpcString; + global $xmlrpcDateTime; + global $xmlrpcBase64; + global $xmlrpcArray; + global $xmlrpcStruct; + + global $xmlrpcTypes; + global $xmlEntities; + global $xmlrpcerr; + global $xmlrpcstr; + global $xmlrpc_defencoding; + global $xmlrpc_internalencoding; + global $xmlrpcName; + global $xmlrpcVersion; + global $xmlrpcerruser; + global $xmlrpcerrxml; + global $xmlrpc_backslash; + global $_xh; + } + $xmlrpcI4='i4'; + $xmlrpcInt='int'; + $xmlrpcBoolean='boolean'; + $xmlrpcDouble='double'; + $xmlrpcString='string'; + $xmlrpcDateTime='dateTime.iso8601'; + $xmlrpcBase64='base64'; + $xmlrpcArray='array'; + $xmlrpcStruct='struct'; + + $xmlrpcTypes=array( + $xmlrpcI4 => 1, + $xmlrpcInt => 1, + $xmlrpcBoolean => 1, + $xmlrpcString => 1, + $xmlrpcDouble => 1, + $xmlrpcDateTime => 1, + $xmlrpcBase64 => 1, + $xmlrpcArray => 2, + $xmlrpcStruct => 3 + ); + + $xmlrpc_valid_parents = array( + 'BOOLEAN' => array('VALUE'), + 'I4' => array('VALUE'), + 'INT' => array('VALUE'), + 'STRING' => array('VALUE'), + 'DOUBLE' => array('VALUE'), + 'DATETIME.ISO8601' => array('VALUE'), + 'BASE64' => array('VALUE'), + 'ARRAY' => array('VALUE'), + 'STRUCT' => array('VALUE'), + 'PARAM' => array('PARAMS'), + 'METHODNAME' => array('METHODCALL'), + 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'), + 'MEMBER' => array('STRUCT'), + 'NAME' => array('MEMBER'), + 'DATA' => array('ARRAY'), + 'FAULT' => array('METHODRESPONSE'), + 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'), + ); + + $xmlEntities=array( + 'amp' => '&', + 'quot' => '"', + 'lt' => '<', + 'gt' => '>', + 'apos' => "'" + ); + + $xmlrpcerr['unknown_method']=1; + $xmlrpcstr['unknown_method']='Unknown method'; + $xmlrpcerr['invalid_return']=2; + $xmlrpcstr['invalid_return']='Invalid return payload: enable debugging to examine incoming payload'; + $xmlrpcerr['incorrect_params']=3; + $xmlrpcstr['incorrect_params']='Incorrect parameters passed to method'; + $xmlrpcerr['introspect_unknown']=4; + $xmlrpcstr['introspect_unknown']="Can't introspect: method unknown"; + $xmlrpcerr['http_error']=5; + $xmlrpcstr['http_error']="Didn't receive 200 OK from remote server."; + $xmlrpcerr['no_data']=6; + $xmlrpcstr['no_data']='No data received from server.'; + $xmlrpcerr['no_ssl']=7; + $xmlrpcstr['no_ssl']='No SSL support compiled in.'; + $xmlrpcerr['curl_fail']=8; + $xmlrpcstr['curl_fail']='CURL error'; + $xmlrpcerr['invalid_request']=15; + $xmlrpcstr['invalid_request']='Invalid request payload'; + + $xmlrpcerr['multicall_notstruct'] = 9; + $xmlrpcstr['multicall_notstruct'] = 'system.multicall expected struct'; + $xmlrpcerr['multicall_nomethod'] = 10; + $xmlrpcstr['multicall_nomethod'] = 'missing methodName'; + $xmlrpcerr['multicall_notstring'] = 11; + $xmlrpcstr['multicall_notstring'] = 'methodName is not a string'; + $xmlrpcerr['multicall_recursion'] = 12; + $xmlrpcstr['multicall_recursion'] = 'recursive system.multicall forbidden'; + $xmlrpcerr['multicall_noparams'] = 13; + $xmlrpcstr['multicall_noparams'] = 'missing params'; + $xmlrpcerr['multicall_notarray'] = 14; + $xmlrpcstr['multicall_notarray'] = 'params is not an array'; + + // The charset encoding expected by the server for received messages and + // by the client for received responses + $xmlrpc_defencoding='UTF-8'; + // The encoding used by PHP. + // String values received will be converted to this. + $xmlrpc_internalencoding='ISO-8859-1'; + + $xmlrpcName='XML-RPC for PHP'; + $xmlrpcVersion='1.2'; + + // let user errors start at 800 + $xmlrpcerruser=800; + // let XML parse errors start at 100 + $xmlrpcerrxml=100; + + // formulate backslashes for escaping regexp + $xmlrpc_backslash=chr(92).chr(92); + + // used to store state during parsing + // quick explanation of components: + // ac - used to accumulate values + // isf - used to indicate a fault + // lv - used to indicate "looking for a value": implements + // the logic to allow values with no types to be strings + // params - used to store parameters in method calls + // method - used to store method name + // stack - array with genealogy of xml elements names: + // used to validate nesting of xmlrpc elements + + $_xh=array(); + + /** + * To help correct communication of non-ascii chars inside strings, regardless + * of the charset used when sending requests, parsing them, sending responses + * and parsing responses, convert all non-ascii chars present in the message + * into their equivalent 'charset entity'. Charset entities enumerated this way + * are independent of the charset encoding used to transmit them, and all XML + * parsers are bound to understand them. + */ + function xmlrpc_entity_decode($string) + { + $top=split('&', $string); + $op=''; + $i=0; + while($i " ", + "¡" => "¡", + "¢" => "¢", + "£" => "£", + "¤" => "¤", + "¥" => "¥", + "¦" => "¦", + "§" => "§", + "¨" => "¨", + "©" => "©", + "ª" => "ª", + "«" => "«", + "¬" => "¬", + "­" => "­", + "®" => "®", + "¯" => "¯", + "°" => "°", + "±" => "±", + "²" => "²", + "³" => "³", + "´" => "´", + "µ" => "µ", + "¶" => "¶", + "·" => "·", + "¸" => "¸", + "¹" => "¹", + "º" => "º", + "»" => "»", + "¼" => "¼", + "½" => "½", + "¾" => "¾", + "¿" => "¿", + "À" => "À", + "Á" => "Á", + "Â" => "Â", + "Ã" => "Ã", + "Ä" => "Ä", + "Å" => "Å", + "Æ" => "Æ", + "Ç" => "Ç", + "È" => "È", + "É" => "É", + "Ê" => "Ê", + "Ë" => "Ë", + "Ì" => "Ì", + "Í" => "Í", + "Î" => "Î", + "Ï" => "Ï", + "Ð" => "Ð", + "Ñ" => "Ñ", + "Ò" => "Ò", + "Ó" => "Ó", + "Ô" => "Ô", + "Õ" => "Õ", + "Ö" => "Ö", + "×" => "×", + "Ø" => "Ø", + "Ù" => "Ù", + "Ú" => "Ú", + "Û" => "Û", + "Ü" => "Ü", + "Ý" => "Ý", + "Þ" => "Þ", + "ß" => "ß", + "à" => "à", + "á" => "á", + "â" => "â", + "ã" => "ã", + "ä" => "ä", + "å" => "å", + "æ" => "æ", + "ç" => "ç", + "è" => "è", + "é" => "é", + "ê" => "ê", + "ë" => "ë", + "ì" => "ì", + "í" => "í", + "î" => "î", + "ï" => "ï", + "ð" => "ð", + "ñ" => "ñ", + "ò" => "ò", + "ó" => "ó", + "ô" => "ô", + "õ" => "õ", + "ö" => "ö", + "÷" => "÷", + "ø" => "ø", + "ù" => "ù", + "ú" => "ú", + "û" => "û", + "ü" => "ü", + "ý" => "ý", + "þ" => "þ", + "ÿ" => "ÿ", + "Œ" => "Œ", + "œ" => "œ", + "Š" => "Š", + "š" => "š", + "Ÿ" => "Ÿ", + "ƒ" => "ƒ", + "ˆ" => "ˆ", + "˜" => "˜", + "Α" => "Α", + "Β" => "Β", + "Γ" => "Γ", + "Δ" => "Δ", + "Ε" => "Ε", + "Ζ" => "Ζ", + "Η" => "Η", + "Θ" => "Θ", + "Ι" => "Ι", + "Κ" => "Κ", + "Λ" => "Λ", + "Μ" => "Μ", + "Ν" => "Ν", + "Ξ" => "Ξ", + "Ο" => "Ο", + "Π" => "Π", + "Ρ" => "Ρ", + "Σ" => "Σ", + "Τ" => "Τ", + "Υ" => "Υ", + "Φ" => "Φ", + "Χ" => "Χ", + "Ψ" => "Ψ", + "Ω" => "Ω", + "β" => "β", + "γ" => "γ", + "δ" => "δ", + "ε" => "ε", + "ζ" => "ζ", + "η" => "η", + "θ" => "θ", + "ι" => "ι", + "κ" => "κ", + "λ" => "λ", + "μ" => "μ", + "ν" => "ν", + "ξ" => "ξ", + "ο" => "ο", + "π" => "π", + "ρ" => "ρ", + "ς" => "ς", + "σ" => "σ", + "τ" => "τ", + "υ" => "υ", + "φ" => "φ", + "χ" => "χ", + "ψ" => "ψ", + "ω" => "ω", + "ϑ" => "ϑ", + "ϒ" => "ϒ", + "ϖ" => "ϖ", + " " => " ", + " " => " ", + " " => " ", + "‌" => "‌", + "‍" => "‍", + "‎" => "‎", + "‏" => "‏", + "–" => "–", + "—" => "—", + "‘" => "‘", + "’" => "’", + "‚" => "‚", + "“" => "“", + "”" => "”", + "„" => "„", + "†" => "†", + "‡" => "‡", + "•" => "•", + "…" => "…", + "‰" => "‰", + "′" => "′", + "″" => "″", + "‹" => "‹", + "›" => "›", + "‾" => "‾", + "⁄" => "⁄", + "€" => "€", + "℘" => "℘", + "ℑ" => "ℑ", + "ℜ" => "ℜ", + "™" => "™", + "ℵ" => "ℵ", + "←" => "←", + "↑" => "↑", + "→" => "→", + "↓" => "↓", + "↔" => "↔", + "↵" => "↵", + "⇐" => "⇐", + "⇑" => "⇑", + "⇒" => "⇒", + "⇓" => "⇓", + "⇔" => "⇔", + "∀" => "∀", + "∂" => "∂", + "∃" => "∃", + "∅" => "∅", + "∇" => "∇", + "∈" => "∈", + "∉" => "∉", + "∋" => "∋", + "∏" => "∏", + "∑" => "∑", + "−" => "−", + "∗" => "∗", + "√" => "√", + "∝" => "∝", + "∞" => "∞", + "∠" => "∠", + "∧" => "∧", + "∨" => "∨", + "∩" => "∩", + "∪" => "∪", + "∫" => "∫", + "∴" => "∴", + "∼" => "∼", + "≅" => "≅", + "≈" => "≈", + "≠" => "≠", + "≡" => "≡", + "≤" => "≤", + "≥" => "≥", + "⊂" => "⊂", + "⊃" => "⊃", + "⊄" => "⊄", + "⊆" => "⊆", + "⊇" => "⊇", + "⊕" => "⊕", + "⊗" => "⊗", + "⊥" => "⊥", + "⋅" => "⋅", + "⌈" => "⌈", + "⌉" => "⌉", + "⌊" => "⌊", + "⌋" => "⌋", + "⟨" => "〈", + "⟩" => "〉", + "◊" => "◊", + "♠" => "♠", + "♣" => "♣", + "♥" => "♥", + "♦" => "♦"); + return strtr($data, $entities); + } + + function xmlrpc_encode_entitites($data) + { + $length = strlen($data); + $escapeddata = ""; + for($position = 0; $position < $length; $position++) + { + $character = substr($data, $position, 1); + $code = Ord($character); + switch($code) { + case 34: + $character = """; + break; + case 38: + $character = "&"; + break; + case 39: + $character = "'"; + break; + case 60: + $character = "<"; + break; + case 62: + $character = ">"; + break; + default: + if ($code < 32 || $code > 159) + $character = ("&#".strval($code).";"); + break; + } + $escapeddata .= $character; + } + return $escapeddata; + } + + function xmlrpc_se($parser, $name, $attrs) + { + global $_xh, $xmlrpcDateTime, $xmlrpcString, $xmlrpc_valid_parents; + + // if invalid xmlrpc already detected, skip all processing + if ($_xh[$parser]['isf'] < 2) + { + + // check for correct element nesting + // top level element can only be of 2 types + if (count($_xh[$parser]['stack']) == 0) + { + if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') + { + $_xh[$parser]['isf'] = 2; + $_xh[$parser]['isf_reason'] = 'missing top level xmlrpc element'; + return; + } + } + else + { + // not top level element: see if parent is OK + if (!in_array($_xh[$parser]['stack'][0], $xmlrpc_valid_parents[$name])) + { + $_xh[$parser]['isf'] = 2; + $_xh[$parser]['isf_reason'] = "xmlrpc element $name cannot be child of {$_xh[$parser]['stack'][0]}"; + return; + } + } + + switch($name) + { + case 'STRUCT': + case 'ARRAY': + //$_xh[$parser]['st'].='array('; + //$_xh[$parser]['cm']++; + // this last line turns quoting off + // this means if we get an empty array we'll + // simply get a bit of whitespace in the eval + //$_xh[$parser]['qt']=0; + + // create an empty array to hold child values, and push it onto appropriate stack + $cur_val = array(); + $cur_val['values'] = array(); + $cur_val['type'] = $name; + array_unshift($_xh[$parser]['valuestack'], $cur_val); + break; + case 'METHODNAME': + case 'NAME': + //$_xh[$parser]['st'].='"'; + $_xh[$parser]['ac']=''; + break; + case 'FAULT': + $_xh[$parser]['isf']=1; + break; + case 'PARAM': + //$_xh[$parser]['st']=''; + // clear value, so we can check later if no value will passed for this param/member + $_xh[$parser]['value']=null; + break; + case 'VALUE': + //$_xh[$parser]['st'].='new xmlrpcval('; + // look for a value: if this is still true by the + // time we reach the end tag for value then the type is string + // by implication + $_xh[$parser]['vt']='value'; + $_xh[$parser]['ac']=''; + //$_xh[$parser]['qt']=0; + $_xh[$parser]['lv']=1; + break; + case 'I4': + case 'INT': + case 'STRING': + case 'BOOLEAN': + case 'DOUBLE': + case 'DATETIME.ISO8601': + case 'BASE64': + if ($_xh[$parser]['vt']!='value') + { + //two data elements inside a value: an error occurred! + $_xh[$parser]['isf'] = 2; + $_xh[$parser]['isf_reason'] = "$name element following a {$_xh[$parser]['vt']} element inside a single value"; + return; + } + + // reset the accumulator + $_xh[$parser]['ac']=''; + + /*if ($name=='DATETIME.ISO8601' || $name=='STRING') + { + $_xh[$parser]['qt']=1; + if ($name=='DATETIME.ISO8601') + { + $_xh[$parser]['vt']=$xmlrpcDateTime; + } + } + elseif ($name=='BASE64') + { + $_xh[$parser]['qt']=2; + } + else + { + // No quoting is required here -- but + // at the end of the element we must check + // for data format errors. + $_xh[$parser]['qt']=0; + }*/ + break; + case 'MEMBER': + //$_xh[$parser]['ac']=''; + // avoid warnings later on if no NAME is found before VALUE inside + // a struct member predefining member name as NULL + $_xh[$parser]['valuestack'][0]['name'] = ''; + // clear value, so we can check later if no value will passed for this param/member + $_xh[$parser]['value']=null; + break; + case 'DATA': + case 'METHODCALL': + case 'METHODRESPONSE': + case 'PARAMS': + // valid elements that add little to processing + break; + default: + /// INVALID ELEMENT: RAISE ISF so that it is later recognized!!! + $_xh[$parser]['isf'] = 2; + $_xh[$parser]['isf_reason'] = "found not-xmlrpc xml element $name"; + break; + } + + // Save current element name to stack, to validate nesting + array_unshift($_xh[$parser]['stack'], $name); + + if ($name!='VALUE') + { + $_xh[$parser]['lv']=0; + } + } + } + + function xmlrpc_ee($parser, $name) + { + global $_xh,$xmlrpcTypes,$xmlrpcString,$xmlrpcDateTime; + + if ($_xh[$parser]['isf'] < 2) + { + + // push this element name from stack + // NB: if XML validates, correct opening/closing is guaranteed and + // we do not have to check for $name == $curr_elem. + // we also checked for proper nesting at start of elements... + $curr_elem = array_shift($_xh[$parser]['stack']); + + switch($name) + { + case 'STRUCT': + case 'ARRAY': + //if ($_xh[$parser]['cm'] && substr($_xh[$parser]['st'], -1) ==',') + //{ + // $_xh[$parser]['st']=substr($_xh[$parser]['st'],0,-1); + //} + //$_xh[$parser]['st'].=')'; + + // fetch out of stack array of values, and promote it to current value + $cur_val = array_shift($_xh[$parser]['valuestack']); + $_xh[$parser]['value'] = $cur_val['values']; + + $_xh[$parser]['vt']=strtolower($name); + //$_xh[$parser]['cm']--; + break; + case 'NAME': + //$_xh[$parser]['st'].= $_xh[$parser]['ac'] . '" => '; + $_xh[$parser]['valuestack'][0]['name'] = $_xh[$parser]['ac']; + break; + case 'BOOLEAN': + case 'I4': + case 'INT': + case 'STRING': + case 'DOUBLE': + case 'DATETIME.ISO8601': + case 'BASE64': + $_xh[$parser]['vt']=strtolower($name); + //if ($_xh[$parser]['qt']==1) + if ($name=='STRING') + { + // we use double quotes rather than single so backslashification works OK + //$_xh[$parser]['st'].='"'. $_xh[$parser]['ac'] . '"'; + $_xh[$parser]['value']=$_xh[$parser]['ac']; + } + elseif ($name=='DATETIME.ISO8601') + { + $_xh[$parser]['vt']=$xmlrpcDateTime; + $_xh[$parser]['value']=$_xh[$parser]['ac']; + } + elseif ($name=='BASE64') + { + //$_xh[$parser]['st'].='base64_decode("'. $_xh[$parser]['ac'] . '")'; + + ///@todo check for failure of base64 decoding / catch warnings + $_xh[$parser]['value']=base64_decode($_xh[$parser]['ac']); + } + elseif ($name=='BOOLEAN') + { + // special case here: we translate boolean 1 or 0 into PHP + // constants true or false + // NB: this simple checks helps a lot sanitizing input, ie no + // security problems around here + if ($_xh[$parser]['ac']=='1') + { + //$_xh[$parser]['ac']='true'; + $_xh[$parser]['value']=true; + } + else + { + //$_xh[$parser]['ac']='false'; + // log if receiveing something strange, even though we set the value to false anyway + if ($_xh[$parser]['ac']!='0') + error_log('XML-RPC: invalid value received in BOOLEAN: '.$_xh[$parser]['ac']); + $_xh[$parser]['value']=false; + } + //$_xh[$parser]['st'].=$_xh[$parser]['ac']; + } + elseif ($name=='DOUBLE') + { + // we have a DOUBLE + // we must check that only 0123456789-. are characters here + if (!ereg("^[+-]?[eE0123456789 \\t\\.]+$", $_xh[$parser]['ac'])) + { + // TODO: find a better way of throwing an error + // than this! + error_log('XML-RPC: non numeric value received in DOUBLE: '.$_xh[$parser]['ac']); + //$_xh[$parser]['st'].="'ERROR_NON_NUMERIC_FOUND'"; + $_xh[$parser]['value']='ERROR_NON_NUMERIC_FOUND'; + } + else + { + // it's ok, add it on + //$_xh[$parser]['st'].=(double)$_xh[$parser]['ac']; + $_xh[$parser]['value']=(double)$_xh[$parser]['ac']; + } + } + else + { + // we have an I4/INT + // we must check that only 0123456789- are characters here + if (!ereg("^[+-]?[0123456789 \\t]+$", $_xh[$parser]['ac'])) + { + // TODO: find a better way of throwing an error + // than this! + error_log('XML-RPC: non numeric value received in INT: '.$_xh[$parser]['ac']); + //$_xh[$parser]['st'].="'ERROR_NON_NUMERIC_FOUND'"; + $_xh[$parser]['value']='ERROR_NON_NUMERIC_FOUND'; + } + else + { + // it's ok, add it on + //$_xh[$parser]['st'].=(int)$_xh[$parser]['ac']; + $_xh[$parser]['value']=(int)$_xh[$parser]['ac']; + } + } + $_xh[$parser]['ac']=''; + //$_xh[$parser]['qt']=0; + $_xh[$parser]['lv']=3; // indicate we've found a value + break; + case 'VALUE': + // This if() detects if no scalar was inside + if ($_xh[$parser]['vt']=='value') + { + $_xh[$parser]['value']=$_xh[$parser]['ac']; + $_xh[$parser]['vt']=$xmlrpcString; + } + /*if (strlen($_xh[$parser]['ac'])>0 && + $_xh[$parser]['vt']==$xmlrpcString) + { + $_xh[$parser]['st'].='"'. $_xh[$parser]['ac'] . '"'; + } + // This if() detects if no scalar was inside + // and pads an empty ''. + if($_xh[$parser]['st'][strlen($_xh[$parser]['st'])-1] == '(') + { + $_xh[$parser]['st'].= '""'; + } + // G. Giunta 2005/03/12 save some chars in the reconstruction of string vals... + if ($_xh[$parser]['vt'] != $xmlrpcString) + $_xh[$parser]['st'].=", '" . $_xh[$parser]['vt'] . "')"; + else + $_xh[$parser]['st'].=")"; + if ($_xh[$parser]['cm']) + { + $_xh[$parser]['st'].=','; + }*/ + + // build the xmlrpc val out of the data received, and substitute it + $temp = new xmlrpcval($_xh[$parser]['value'], $_xh[$parser]['vt']); + // check if we are inside an array or struct: + // if value just built is inside an array, let's move it into array on the stack + if (count($_xh[$parser]['valuestack']) && $_xh[$parser]['valuestack'][0]['type']=='ARRAY') + { + $_xh[$parser]['valuestack'][0]['values'][] = $temp; + } + else + { + $_xh[$parser]['value'] = $temp; + } + break; + case 'MEMBER': + $_xh[$parser]['ac']=''; + //$_xh[$parser]['qt']=0; + // add to array in the stack the last element built + // unless no VALUE was found + if ($_xh[$parser]['value']) + $_xh[$parser]['valuestack'][0]['values'][$_xh[$parser]['valuestack'][0]['name']] = $_xh[$parser]['value']; + else + error_log('XML-RPC: missing VALUE inside STRUCT in received xml'); + break; + case 'DATA': + $_xh[$parser]['ac']=''; + //$_xh[$parser]['qt']=0; + break; + case 'PARAM': + //$_xh[$parser]['params'][]=$_xh[$parser]['st']; + if ($_xh[$parser]['value']) + $_xh[$parser]['params'][]=$_xh[$parser]['value']; + else + error_log('XML-RPC: missing VALUE inside PARAM in received xml'); + break; + case 'METHODNAME': + $_xh[$parser]['method']=ereg_replace("^[\n\r\t ]+", '', $_xh[$parser]['ac']); + break; + case 'PARAMS': + case 'FAULT': + case 'METHODCALL': + case 'METHORESPONSE': + break; + default: + // End of INVALID ELEMENT! + // shall we add an assert here for unreachable code??? + break; + } + + // if it's a valid type name, set the type + /*if (isset($xmlrpcTypes[strtolower($name)])) + { + $_xh[$parser]['vt']=strtolower($name); + }*/ + + } + + } + + function xmlrpc_cd($parser, $data) + { + global $_xh, $xmlrpc_backslash; + + //if (ereg("^[\n\r \t]+$", $data)) return; + // print "adding [${data}]\n"; + + // skip processing if xml fault already detected + if ($_xh[$parser]['isf'] < 2) + { + if ($_xh[$parser]['lv']!=3) + { + // "lookforvalue==3" means that we've found an entire value + // and should discard any further character data + if ($_xh[$parser]['lv']==1) + { + // if we've found text and we're just in a then + // turn quoting on, as this will be a string + //$_xh[$parser]['qt']=1; + // and say we've found a value + $_xh[$parser]['lv']=2; + } + if(!@isset($_xh[$parser]['ac'])) + { + $_xh[$parser]['ac'] = ''; + } + //$_xh[$parser]['ac'].=str_replace('$', '\$', str_replace('"', '\"', str_replace(chr(92),$xmlrpc_backslash, $data))); + $_xh[$parser]['ac'].=$data; + } + } + } + + function xmlrpc_dh($parser, $data) + { + global $_xh, $xmlrpc_backslash; + + // skip processing if xml fault already detected + if ($parser[$_xh]['isf'] < 2) + { + if (substr($data, 0, 1) == '&' && substr($data, -1, 1) == ';') + { + if ($_xh[$parser]['lv']==1) + { + //$_xh[$parser]['qt']=1; + $_xh[$parser]['lv']=2; + } + //$_xh[$parser]['ac'].=str_replace('$', '\$', str_replace('"', '\"', str_replace(chr(92),$xmlrpc_backslash, $data))); + $_xh[$parser]['ac'].=$data; + } + } + } + + class xmlrpc_client + { + var $path; + var $server; + var $port; + var $errno; + var $errstr; + var $debug=0; + var $username=''; + var $password=''; + var $cert=''; + var $certpass=''; + var $verifypeer=1; + var $verifyhost=1; + var $no_multicall=false; + + function xmlrpc_client($path, $server, $port=0) + { + $this->port=$port; $this->server=$server; $this->path=$path; + } + + function setDebug($in) + { + if ($in) + { + $this->debug=1; + } + else + { + $this->debug=0; + } + } + + function setCredentials($u, $p) + { + $this->username=$u; + $this->password=$p; + } + + function setCertificate($cert, $certpass) + { + $this->cert = $cert; + $this->certpass = $certpass; + } + + function setSSLVerifyPeer($i) + { + $this->verifypeer = $i; + } + + function setSSLVerifyHost($i) + { + $this->verifyhost = $i; + } + + function send($msg, $timeout=0, $method='http') + { + if (is_array($msg)) + { + // $msg is an array of xmlrpcmsg's + return $this->multicall($msg, $timeout, $method); + } + + // where msg is an xmlrpcmsg + $msg->debug=$this->debug; + + if ($method == 'https') + { + return $this->sendPayloadHTTPS($msg, + $this->server, + $this->port, $timeout, + $this->username, $this->password, + $this->cert, + $this->certpass); + } + else + { + return $this->sendPayloadHTTP10($msg, $this->server, $this->port, + $timeout, $this->username, + $this->password); + } + } + + function sendPayloadHTTP10($msg, $server, $port, $timeout=0,$username='', $password='') + { + global $xmlrpcerr, $xmlrpcstr, $xmlrpcName, $xmlrpcVersion, $xmlrpc_defencoding; + if ($port==0) + { + $port=80; + } + if($timeout>0) + { + $fp=@fsockopen($server, $port,$this->errno, $this->errstr, $timeout); + } + else + { + $fp=@fsockopen($server, $port,$this->errno, $this->errstr); + } + if ($fp) + { + if ($timeout>0 && function_exists('stream_set_timeout')) + stream_set_timeout($fp, $timeout); + } + else + { + $this->errstr='Connect error'; + $r=new xmlrpcresp(0, $xmlrpcerr['http_error'],$xmlrpcstr['http_error']); + return $r; + } + // Only create the payload if it was not created previously + if(empty($msg->payload)) + { + $msg->createPayload(); + } + + // thanks to Grant Rauscher + // for this + $credentials=''; + if ($username!='') + { + $credentials='Authorization: Basic ' . base64_encode($username . ':' . $password) . "\r\n"; + } + + $op= "POST " . $this->path. " HTTP/1.0\r\n" . + "User-Agent: " . $xmlrpcName . " " . $xmlrpcVersion . "\r\n" . + "Host: ". $server . "\r\n" . + $credentials . + "Accept-Charset: " . $xmlrpc_defencoding . "\r\n" . + "Content-Type: text/xml\r\nContent-Length: " . + strlen($msg->payload) . "\r\n\r\n" . + $msg->payload; + + if (!fputs($fp, $op, strlen($op))) + { + $this->errstr='Write error'; + $r=new xmlrpcresp(0, $xmlrpcerr['http_error'], $xmlrpcstr['http_error']); + return $r; + } + $resp=$msg->parseResponseFile($fp); + fclose($fp); + return $resp; + } + + // contributed by Justin Miller + // requires curl to be built into PHP + function sendPayloadHTTPS($msg, $server, $port, $timeout=0,$username='', $password='', $cert='',$certpass='') + { + global $xmlrpcerr, $xmlrpcstr, $xmlrpcVersion, $xmlrpc_internalencoding; + if ($port == 0) + { + $port = 443; + } + + // Only create the payload if it was not created previously + if(empty($msg->payload)) + { + $msg->createPayload(); + } + + if (!function_exists('curl_init')) + { + $this->errstr='SSL unavailable on this install'; + $r=new xmlrpcresp(0, $xmlrpcerr['no_ssl'], $xmlrpcstr['no_ssl']); + return $r; + } + + $curl = curl_init('https://' . $server . ':' . $port . $this->path); + + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + // results into variable + if ($this->debug) + { + curl_setopt($curl, CURLOPT_VERBOSE, 1); + } + curl_setopt($curl, CURLOPT_USERAGENT, 'PHP XMLRPC '.$xmlrpcVersion); + // required for XMLRPC + curl_setopt($curl, CURLOPT_POST, 1); + // post the data + curl_setopt($curl, CURLOPT_POSTFIELDS, $msg->payload); + // the data + curl_setopt($curl, CURLOPT_HEADER, 1); + // return the header too + curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/xml', 'Accept-Charset: '.$xmlrpc_internalencoding)); + // whether to verify remote host's cert + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verifypeer); + // whether to verify cert's common name (CN); 0 for no, 1 to verify that it exists, and 2 to verify that it matches the hostname used + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $this->verifyhost); + // required for XMLRPC + if ($timeout) + { + curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 : $timeout - 1); + } + // timeout is borked + if ($username && $password) + { + curl_setopt($curl, CURLOPT_USERPWD,"$username:$password"); + } + // set auth stuff + if ($cert) + { + curl_setopt($curl, CURLOPT_SSLCERT, $cert); + } + // set cert file + if ($certpass) + { + curl_setopt($curl, CURLOPT_SSLCERTPASSWD,$certpass); + } + // set cert password + + $result = curl_exec($curl); + + if (!$result) + { + $this->errstr='no response'; + $resp=new xmlrpcresp(0, $xmlrpcerr['curl_fail'], $xmlrpcstr['curl_fail']. ': '. curl_error($curl)); + curl_close($curl); + } + else + { + curl_close($curl); + $resp = $msg->parseResponse($result); + } + return $resp; + } + + function multicall($msgs, $timeout=0, $method='http') + { + $results = false; + + if (! $this->no_multicall) + { + $results = $this->_try_multicall($msgs, $timeout, $method); + /* TODO - this is not php3-friendly */ + // if($results !== false) + if(is_array($results)) + { + // Either the system.multicall succeeded, or the send + // failed (e.g. due to HTTP timeout). In either case, + // we're done for now. + return $results; + } + else + { + // system.multicall unsupported by server, + // don't try it next time... + $this->no_multicall = true; + } + } + + // system.multicall is unupported by server: + // Emulate multicall via multiple requests + $results = array(); + //foreach($msgs as $msg) + @reset($msgs); + while(list(,$msg) = @each($msgs)) + { + $results[] = $this->send($msg, $timeout, $method); + } + return $results; + } + + // Attempt to boxcar $msgs via system.multicall. + function _try_multicall($msgs, $timeout, $method) + { + // Construct multicall message + $calls = array(); + //foreach($msgs as $msg) + @reset($msgs); + while(list(,$msg) = @each($msgs)) + { + $call['methodName'] = new xmlrpcval($msg->method(),'string'); + $numParams = $msg->getNumParams(); + $params = array(); + for ($i = 0; $i < $numParams; $i++) + { + $params[$i] = $msg->getParam($i); + } + $call['params'] = new xmlrpcval($params, 'array'); + $calls[] = new xmlrpcval($call, 'struct'); + } + $multicall = new xmlrpcmsg('system.multicall'); + $multicall->addParam(new xmlrpcval($calls, 'array')); + + // Attempt RPC call + $result = $this->send($multicall, $timeout, $method); + if(!is_object($result)) + { + return ($result || 0); // transport failed + } + + if($result->faultCode() != 0) + { + return false; // system.multicall failed + } + + // Unpack responses. + $rets = $result->value(); + if($rets->kindOf() != 'array') + { + return false; // bad return type from system.multicall + } + $numRets = $rets->arraysize(); + if($numRets != count($msgs)) + { + return false; // wrong number of return values. + } + + $response = array(); + for ($i = 0; $i < $numRets; $i++) + { + $val = $rets->arraymem($i); + switch ($val->kindOf()) + { + case 'array': + if($val->arraysize() != 1) + { + return false; // Bad value + } + // Normal return value + $response[$i] = new xmlrpcresp($val->arraymem(0)); + break; + case 'struct': + $code = $val->structmem('faultCode'); + if($code->kindOf() != 'scalar' || $code->scalartyp() != 'int') + { + return false; + } + $str = $val->structmem('faultString'); + if($str->kindOf() != 'scalar' || $str->scalartyp() != 'string') + { + return false; + } + $response[$i] = new xmlrpcresp(0, $code->scalarval(), $str->scalarval()); + break; + default: + return false; + } + } + return $response; + } + } // end class xmlrpc_client + + class xmlrpcresp + { + var $val = 0; + var $errno = 0; + var $errstr = ''; + var $hdrs = array(); + + function xmlrpcresp($val, $fcode = 0, $fstr = '') + { + if ($fcode != 0) + { + // error + $this->errno = $fcode; + $this->errstr = $fstr; + //$this->errstr = htmlspecialchars($fstr); // XXX: encoding probably shouldn't be done here; fix later. + } + elseif (!is_object($val)) + { + // programmer error + error_log("Invalid type '" . gettype($val) . "' (value: $val) passed to xmlrpcresp. Defaulting to empty value."); + $this->val = new xmlrpcval(); + } + else + { + // success + $this->val = $val; + } + } + + function faultCode() + { + return $this->errno; + } + + function faultString() + { + return $this->errstr; + } + + function value() + { + return $this->val; + } + + function serialize() + { + $result = "\n"; + if ($this->errno) + { + // G. Giunta 2005/2/13: let non-ASCII response messages be tolerated by clients + $result .= ' + + + +faultCode +' . $this->errno . ' + + +faultString +' . xmlrpc_encode_entitites($this->errstr) . ' + + + +'; + } + else + { + $result .= "\n\n" . + $this->val->serialize() . + "\n"; + } + $result .= "\n"; + return $result; + } + } + + class xmlrpcmsg + { + var $payload; + var $methodname; + var $params=array(); + var $debug=0; + + function xmlrpcmsg($meth, $pars=0) + { + $this->methodname=$meth; + if (is_array($pars) && sizeof($pars)>0) + { + for($i=0; $iaddParam($pars[$i]); + } + } + } + + function xml_header() + { + return "\n\n"; + } + + function xml_footer() + { + return "\n"; + } + + function createPayload() + { + $this->payload=$this->xml_header(); + $this->payload.='' . $this->methodname . "\n"; + // if (sizeof($this->params)) { + $this->payload.="\n"; + for($i=0; $iparams); $i++) + { + $p=$this->params[$i]; + $this->payload.="\n" . $p->serialize() . + "\n"; + } + $this->payload.="\n"; + // } + $this->payload.=$this->xml_footer(); + //$this->payload=str_replace("\n", "\r\n", $this->payload); + } + + function method($meth='') + { + if ($meth!='') + { + $this->methodname=$meth; + } + return $this->methodname; + } + + function serialize() + { + $this->createPayload(); + return $this->payload; + } + + function addParam($par) { $this->params[]=$par; } + function getParam($i) { return $this->params[$i]; } + function getNumParams() { return sizeof($this->params); } + + function parseResponseFile($fp) + { + $ipd=''; + while($data=fread($fp, 32768)) + { + $ipd.=$data; + } + return $this->parseResponse($ipd); + } + + function parseResponse($data='') + { + global $_xh,$xmlrpcerr,$xmlrpcstr; + global $xmlrpc_defencoding, $xmlrpc_internalencoding; + + $hdrfnd = 0; + if($this->debug) + { + //by maHo, replaced htmlspecialchars with htmlentities + print "
---GOT---\n" . htmlentities($data) . "\n---END---\n
"; + } + + if($data == '') + { + error_log('No response received from server.'); + $r = new xmlrpcresp(0, $xmlrpcerr['no_data'], $xmlrpcstr['no_data']); + return $r; + } + // see if we got an HTTP 200 OK, else bomb + // but only do this if we're using the HTTP protocol. + if(ereg("^HTTP",$data)) + { + // Strip HTTP 1.1 100 Continue header if present + while (ereg('^HTTP/1.1 1[0-9]{2}', $data)) + { + $pos = strpos($data, 'HTTP', 12); + // server sent a Continue header without any (valid) content following... + // give the client a chance to know it + if (!$pos && !is_int($pos)) // works fine in php 3, 4 and 5 + break; + $data = substr($data, $pos); + } + if (!ereg("^HTTP/[0-9\\.]+ 200 ", $data)) + { + $errstr= substr($data, 0, strpos($data, "\n")-1); + error_log('HTTP error, got response: ' .$errstr); + $r=new xmlrpcresp(0, $xmlrpcerr['http_error'], $xmlrpcstr['http_error']. ' (' . $errstr . ')'); + return $r; + } + } + $parser = xml_parser_create($xmlrpc_defencoding); + + // G. Giunta 2004/04/06 + // Clean up the accumulator, or it will grow indefinitely long + // if making xmlrpc calls for a while + $_xh=array(); + $_xh[$parser]=array(); + $_xh[$parser]['headers'] = array(); + $_xh[$parser]['stack'] = array(); + $_xh[$parser]['valuestack'] = array(); + + // separate HTTP headers from data + if (ereg("^HTTP", $data)) + { + // be tolerant to usage of \n instead of \r\n to separate headers and data + // (even though it is not valid http) + $pos = strpos($data,"\r\n\r\n"); + if($pos || is_int($pos)) + $bd = $pos+4; + else + { + $pos = strpos($data,"\n\n"); + if($pos || is_int($pos)) + $bd = $pos+2; + else + { + // No separation between response headers and body: fault? + $bd = 0; + } + } + // be tolerant to line endings, and extra empty lines + $ar = split("\r?\n", trim(substr($data, 0, $pos))); + while (list(,$line) = @each($ar)) + { + // take care of multi-line headers + $arr = explode(':',$line); + if(count($arr) > 1) + { + $header_name = trim($arr[0]); + // TO DO: some headers (the ones that allow a CSV list of values) + // do allow many values to be passed using multiple header lines. + // We should add content to $_xh[$parser]['headers'][$header_name] + // instead of replacing it for those... + $_xh[$parser]['headers'][$header_name] = $arr[1]; + for ($i = 2; $i < count($arr); $i++) + { + $_xh[$parser]['headers'][$header_name] .= ':'.$arr[$i]; + } // while + $_xh[$parser]['headers'][$header_name] = trim($_xh[$parser]['headers'][$header_name]); + } else if (isset($header_name)) + { + $_xh[$parser]['headers'][$header_name] .= ' ' . trim($line); + } + } + $data = substr($data, $bd); + + if ($this->debug && count($_xh[$parser]['headers'])) + { + print '
';
+					//foreach ($_xh[$parser]['headers'] as $header)
+					@reset($_xh[$parser]['headers']);
+					while(list($header, $value) = @each($_xh[$parser]['headers']))
+					{
+						print "HEADER: $header: $value\n";
+					}
+					print "
\n"; + } + } + + // be tolerant of extra whitespace in response body + $data = trim($data); + + // be tolerant of junk after methodResponse (e.g. javascript automatically inserted by free hosts) + // idea from Luca Mariano originally in PEARified version of the lib + $bd = false; + $pos = strpos($data, ""); + while ($pos || is_int($pos)) + { + $bd = $pos+17; + $pos = strpos($data, "", $bd); + } + if ($bd) + $data = substr($data, 0, $bd); + + //$_xh[$parser]['st']=''; + //$_xh[$parser]['cm']=0; + $_xh[$parser]['isf']=0; + $_xh[$parser]['isf_reason']=0; + $_xh[$parser]['ac']=''; + //$_xh[$parser]['qt']=''; + + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + // G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell + // the xml parser to give us back data in the expected charset + xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $xmlrpc_internalencoding); + + xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee'); + xml_set_character_data_handler($parser, 'xmlrpc_cd'); + xml_set_default_handler($parser, 'xmlrpc_dh'); + //$xmlrpc_value=new xmlrpcval; + + if (!xml_parse($parser, $data, sizeof($data))) + { + // thanks to Peter Kocks + if((xml_get_current_line_number($parser)) == 1) + { + $errstr = 'XML error at line 1, check URL'; + } + else + { + $errstr = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser)); + } + error_log($errstr); + $r=new xmlrpcresp(0, $xmlrpcerr['invalid_return'], $xmlrpcstr['invalid_return'].' ('.$errstr.')'); + xml_parser_free($parser); + if ($this->debug) + echo $errstr; + $r->hdrs = $_xh[$parser]['headers']; + return $r; + } + xml_parser_free($parser); + + if ($_xh[$parser]['isf'] > 1) + { + if ($this->debug) + { + ///@todo echo something for user? + } + + $r = new xmlrpcresp(0, $xmlrpcerr['invalid_return'], + $xmlrpcstr['invalid_return'] . ' ' . $_xh[$parser]['isf_reason']); + } + //else if (strlen($_xh[$parser]['st'])==0) + else if (!is_object($_xh[$parser]['value'])) + { + // then something odd has happened + // and it's time to generate a client side error + // indicating something odd went on + $r=new xmlrpcresp(0, $xmlrpcerr['invalid_return'], + $xmlrpcstr['invalid_return']); + } + else + { + + if ($this->debug) + { + //print "
---EVALING---[" .
+					//strlen($_xh[$parser]['st']) . " chars]---\n" .
+					//htmlspecialchars($_xh[$parser]['st']) . ";\n---END---
"; + print "
---PARSED---\n" ;
+					var_dump($_xh[$parser]['value']);
+					print "\n---END---
"; + } + + //$allOK=0; + //@eval('$v=' . $_xh[$parser]['st'] . '; $allOK=1;'); + //if (!$allOK) + //{ + // $r = new xmlrpcresp(0, $xmlrpcerr['invalid_return'], $xmlrpcstr['invalid_return']); + //} + //else + $v = $_xh[$parser]['value']; + if ($_xh[$parser]['isf']) + { + $errno_v = $v->structmem('faultCode'); + $errstr_v = $v->structmem('faultString'); + $errno = $errno_v->scalarval(); + + if ($errno == 0) + { + // FAULT returned, errno needs to reflect that + $errno = -1; + } + + $r = new xmlrpcresp($v, $errno, $errstr_v->scalarval()); + } + else + { + $r=new xmlrpcresp($v); + } + } + + $r->hdrs = $_xh[$parser]['headers']; + return $r; + } + } + + class xmlrpcval + { + var $me=array(); + var $mytype=0; + + function xmlrpcval($val=-1, $type='') + { + global $xmlrpcTypes; + $this->me=array(); + $this->mytype=0; + if ($val!=-1 || !is_int($val) || $type!='') + { + if ($type=='') + { + $type='string'; + } + if ($xmlrpcTypes[$type]==1) + { + $this->addScalar($val,$type); + } + elseif ($xmlrpcTypes[$type]==2) + { + $this->addArray($val); + } + elseif ($xmlrpcTypes[$type]==3) + { + $this->addStruct($val); + } + } + } + + function addScalar($val, $type='string') + { + global $xmlrpcTypes, $xmlrpcBoolean; + + if ($this->mytype==1) + { + echo 'xmlrpcval: scalar can have only one value
'; + return 0; + } + $typeof=$xmlrpcTypes[$type]; + if ($typeof!=1) + { + echo 'xmlrpcval: not a scalar type (${typeof})
'; + return 0; + } + + if ($type==$xmlrpcBoolean) + { + if (strcasecmp($val,'true')==0 || $val==1 || ($val==true && strcasecmp($val,'false'))) + { + $val=1; + } + else + { + $val=0; + } + } + + if ($this->mytype==2) + { + // we're adding to an array here + $ar=$this->me['array']; + $ar[]=new xmlrpcval($val, $type); + $this->me['array']=$ar; + } + else + { + // a scalar, so set the value and remember we're scalar + $this->me[$type]=$val; + $this->mytype=$typeof; + } + return 1; + } + + function addArray($vals) + { + global $xmlrpcTypes; + if ($this->mytype!=0) + { + echo 'xmlrpcval: already initialized as a [' . $this->kindOf() . ']
'; + return 0; + } + + $this->mytype=$xmlrpcTypes['array']; + $this->me['array']=$vals; + return 1; + } + + function addStruct($vals) + { + global $xmlrpcTypes; + if ($this->mytype!=0) + { + echo 'xmlrpcval: already initialized as a [' . $this->kindOf() . ']
'; + return 0; + } + $this->mytype=$xmlrpcTypes['struct']; + $this->me['struct']=$vals; + return 1; + } + + function dump($ar) + { + reset($ar); + while ( list( $key, $val ) = each( $ar ) ) + { + echo "$key => $val
"; + if ($key == 'array') + { + while ( list( $key2, $val2 ) = each( $val ) ) + { + echo "-- $key2 => $val2
"; + } + } + } + } + + function kindOf() + { + switch($this->mytype) + { + case 3: + return 'struct'; + break; + case 2: + return 'array'; + break; + case 1: + return 'scalar'; + break; + default: + return 'undef'; + } + } + + function serializedata($typ, $val) + { + $rs=''; + global $xmlrpcTypes, $xmlrpcBase64, $xmlrpcString, + $xmlrpcBoolean; + switch(@$xmlrpcTypes[$typ]) + { + case 3: + // struct + $rs.="\n"; + reset($val); + while(list($key2, $val2)=each($val)) + { + $rs.="${key2}\n"; + $rs.=$this->serializeval($val2); + $rs.="\n"; + } + $rs.=''; + break; + case 2: + // array + $rs.="\n\n"; + for($i=0; $iserializeval($val[$i]); + } + $rs.="\n"; + break; + case 1: + switch ($typ) + { + case $xmlrpcBase64: + $rs.="<${typ}>" . base64_encode($val) . ""; + break; + case $xmlrpcBoolean: + $rs.="<${typ}>" . ($val ? '1' : '0') . ""; + break; + case $xmlrpcString: + // G. Giunta 2005/2/13: do NOT use htmlentities, since + // it will produce named html entities, which are invalid xml + $rs.="<${typ}>" . xmlrpc_encode_entitites($val). ""; + // $rs.="<${typ}>" . htmlentities($val). ""; + break; + default: + $rs.="<${typ}>${val}"; + } + break; + default: + break; + } + return $rs; + } + + function serialize() + { + return $this->serializeval($this); + } + + function serializeval($o) + { + //global $xmlrpcTypes; + $rs=''; + $ar=$o->me; + reset($ar); + list($typ, $val) = each($ar); + $rs.=''; + $rs.=$this->serializedata($typ, $val); + $rs.="\n"; + return $rs; + } + + function structmem($m) + { + $nv=$this->me['struct'][$m]; + return $nv; + } + + function structreset() + { + reset($this->me['struct']); + } + + function structeach() + { + return each($this->me['struct']); + } + + function getval() + { + // UNSTABLE + global $xmlrpcBoolean, $xmlrpcBase64; + reset($this->me); + list($a,$b)=each($this->me); + // contributed by I Sofer, 2001-03-24 + // add support for nested arrays to scalarval + // i've created a new method here, so as to + // preserve back compatibility + + if (is_array($b)) + { + @reset($b); + while(list($id,$cont) = @each($b)) + { + $b[$id] = $cont->scalarval(); + } + } + + // add support for structures directly encoding php objects + if (is_object($b)) + { + $t = get_object_vars($b); + @reset($t); + while(list($id,$cont) = @each($t)) + { + $t[$id] = $cont->scalarval(); + } + @reset($t); + while(list($id,$cont) = @each($t)) + { + //eval('$b->'.$id.' = $cont;'); + @$b->$id = $cont; + } + } + // end contrib + return $b; + } + + function scalarval() + { + //global $xmlrpcBoolean, $xmlrpcBase64; + reset($this->me); + list($a,$b)=each($this->me); + return $b; + } + + function scalartyp() + { + global $xmlrpcI4, $xmlrpcInt; + reset($this->me); + list($a,$b)=each($this->me); + if ($a==$xmlrpcI4) + { + $a=$xmlrpcInt; + } + return $a; + } + + function arraymem($m) + { + $nv=$this->me['array'][$m]; + return $nv; + } + + function arraysize() + { + reset($this->me); + list($a,$b)=each($this->me); + return sizeof($b); + } + } + + // date helpers + function iso8601_encode($timet, $utc=0) + { + // return an ISO8601 encoded string + // really, timezones ought to be supported + // but the XML-RPC spec says: + // + // "Don't assume a timezone. It should be specified by the server in its + // documentation what assumptions it makes about timezones." + // + // these routines always assume localtime unless + // $utc is set to 1, in which case UTC is assumed + // and an adjustment for locale is made when encoding + if (!$utc) + { + $t=strftime("%Y%m%dT%H:%M:%S", $timet); + } + else + { + if (function_exists('gmstrftime')) + { + // gmstrftime doesn't exist in some versions + // of PHP + $t=gmstrftime("%Y%m%dT%H:%M:%S", $timet); + } + else + { + $t=strftime("%Y%m%dT%H:%M:%S", $timet-date('Z')); + } + } + return $t; + } + + function iso8601_decode($idate, $utc=0) + { + // return a timet in the localtime, or UTC + $t=0; + if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})", $idate, $regs)) + { + if ($utc) + { + $t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); + } + else + { + $t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); + } + } + return $t; + } + + /**************************************************************** + * xmlrpc_decode takes a message in PHP xmlrpc object format and * + * tranlates it into native PHP types. * + * * + * author: Dan Libby (dan@libby.com) * + ****************************************************************/ + function php_xmlrpc_decode($xmlrpc_val) + { + $kind = $xmlrpc_val->kindOf(); + + if($kind == 'scalar') + { + return $xmlrpc_val->scalarval(); + } + elseif($kind == 'array') + { + $size = $xmlrpc_val->arraysize(); + $arr = array(); + + for($i = 0; $i < $size; $i++) + { + $arr[] = php_xmlrpc_decode($xmlrpc_val->arraymem($i)); + } + return $arr; + } + elseif($kind == 'struct') + { + $xmlrpc_val->structreset(); + $arr = array(); + + while(list($key,$value)=$xmlrpc_val->structeach()) + { + $arr[$key] = php_xmlrpc_decode($value); + } + return $arr; + } + } + + if(function_exists('xmlrpc_decode')) + { + define('XMLRPC_EPI_ENABLED','1'); + } + else + { + define('XMLRPC_EPI_ENABLED','0'); + function xmlrpc_decode($xmlrpc_val) + { + $kind = $xmlrpc_val->kindOf(); + + if($kind == 'scalar') + { + return $xmlrpc_val->scalarval(); + } + elseif($kind == 'array') + { + $size = $xmlrpc_val->arraysize(); + $arr = array(); + + for($i = 0; $i < $size; $i++) + { + $arr[]=xmlrpc_decode($xmlrpc_val->arraymem($i)); + } + return $arr; + } + elseif($kind == 'struct') + { + $xmlrpc_val->structreset(); + $arr = array(); + + while(list($key,$value)=$xmlrpc_val->structeach()) + { + $arr[$key] = xmlrpc_decode($value); + } + return $arr; + } + } + } + + /**************************************************************** + * xmlrpc_encode takes native php types and encodes them into * + * xmlrpc PHP object format. * + * BUG: All sequential arrays are turned into structs. I don't * + * know of a good way to determine if an array is sequential * + * only. * + * * + * feature creep -- could support more types via optional type * + * argument. * + * * + * author: Dan Libby (dan@libby.com) * + ****************************************************************/ + function php_xmlrpc_encode($php_val) + { + global $xmlrpcInt; + global $xmlrpcDouble; + global $xmlrpcString; + global $xmlrpcArray; + global $xmlrpcStruct; + global $xmlrpcBoolean; + + $type = gettype($php_val); + $xmlrpc_val = new xmlrpcval; + + switch($type) + { + case 'array': + case 'object': + $arr = array(); + while (list($k,$v) = each($php_val)) + { + $arr[$k] = php_xmlrpc_encode($v); + } + $xmlrpc_val->addStruct($arr); + break; + case 'integer': + $xmlrpc_val->addScalar($php_val, $xmlrpcInt); + break; + case 'double': + $xmlrpc_val->addScalar($php_val, $xmlrpcDouble); + break; + case 'string': + $xmlrpc_val->addScalar($php_val, $xmlrpcString); + break; + // + // Add support for encoding/decoding of booleans, since they are supported in PHP + case 'boolean': + $xmlrpc_val->addScalar($php_val, $xmlrpcBoolean); + break; + // + // catch "resource", "NULL", "user function", "unknown type" + //case 'unknown type': + default: + // giancarlo pinerolo + // it has to return + // an empty object in case (which is already + // at this point), not a boolean. + break; + } + return $xmlrpc_val; + } + + if(XMLRPC_EPI_ENABLED == '0') + { + function xmlrpc_encode($php_val) + { + global $xmlrpcInt; + global $xmlrpcDouble; + global $xmlrpcString; + global $xmlrpcArray; + global $xmlrpcStruct; + global $xmlrpcBoolean; + + $type = gettype($php_val); + $xmlrpc_val = new xmlrpcval; + + switch($type) + { + case 'array': + case 'object': + $arr = array(); + while (list($k,$v) = each($php_val)) + { + $arr[$k] = xmlrpc_encode($v); + } + $xmlrpc_val->addStruct($arr); + break; + case 'integer': + $xmlrpc_val->addScalar($php_val, $xmlrpcInt); + break; + case 'double': + $xmlrpc_val->addScalar($php_val, $xmlrpcDouble); + break; + case 'string': + $xmlrpc_val->addScalar($php_val, $xmlrpcString); + break; + // + // Add support for encoding/decoding of booleans, since they are supported in PHP + case 'boolean': + $xmlrpc_val->addScalar($php_val, $xmlrpcBoolean); + break; + // + //case 'unknown type': + default: + // giancarlo pinerolo + // it has to return + // an empty object in case (which is already + // at this point), not a boolean. + break; + } + return $xmlrpc_val; + } + } +?> --- versionner-server-0.2.0.orig/include/xmlrpcs.inc +++ versionner-server-0.2.0/include/xmlrpcs.inc @@ -0,0 +1,506 @@ + +// $Id: xmlrpcs.inc,v 1.1.1.1.4.1.2.1 2005/08/14 21:09:09 milosch Exp $ + +// Copyright (c) 1999,2000,2002 Edd Dumbill. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// * Neither the name of the "XML-RPC for PHP" nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + + // XML RPC Server class + // requires: xmlrpc.inc + + // listMethods: either a string, or nothing + $_xmlrpcs_listMethods_sig=array(array($xmlrpcArray, $xmlrpcString), array($xmlrpcArray)); + $_xmlrpcs_listMethods_doc='This method lists all the methods that the XML-RPC server knows how to dispatch'; + function _xmlrpcs_listMethods($server, $m) + { + global $xmlrpcerr, $xmlrpcstr, $_xmlrpcs_dmap; + $v=new xmlrpcval(); + $dmap=$server->dmap; + $outAr=array(); + for(reset($dmap); list($key, $val)=each($dmap); ) + { + $outAr[]=new xmlrpcval($key, 'string'); + } + $dmap=$_xmlrpcs_dmap; + for(reset($dmap); list($key, $val)=each($dmap); ) + { + $outAr[]=new xmlrpcval($key, 'string'); + } + $v->addArray($outAr); + return new xmlrpcresp($v); + } + + $_xmlrpcs_methodSignature_sig=array(array($xmlrpcArray, $xmlrpcString)); + $_xmlrpcs_methodSignature_doc='Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature)'; + function _xmlrpcs_methodSignature($server, $m) + { + global $xmlrpcerr, $xmlrpcstr, $_xmlrpcs_dmap; + + $methName=$m->getParam(0); + $methName=$methName->scalarval(); + if (ereg("^system\.", $methName)) + { + $dmap=$_xmlrpcs_dmap; $sysCall=1; + } + else + { + $dmap=$server->dmap; $sysCall=0; + } + // print "\n"; + if (isset($dmap[$methName])) + { + if ($dmap[$methName]['signature']) + { + $sigs=array(); + $thesigs=$dmap[$methName]['signature']; + for($i=0; $igetParam(0); + $methName=$methName->scalarval(); + if (ereg("^system\.", $methName)) + { + $dmap=$_xmlrpcs_dmap; $sysCall=1; + } + else + { + $dmap=$server->dmap; $sysCall=0; + } + // print "\n"; + if (isset($dmap[$methName])) + { + if ($dmap[$methName]['docstring']) + { + $r=new xmlrpcresp(new xmlrpcval($dmap[$methName]['docstring']), 'string'); + } + else + { + $r=new xmlrpcresp(new xmlrpcval('', 'string')); + } + } + else + { + $r=new xmlrpcresp(0, $xmlrpcerr['introspect_unknown'], $xmlrpcstr['introspect_unknown']); + } + return $r; + } + + $_xmlrpcs_multicall_sig = array(array($xmlrpcArray, $xmlrpcArray)); + $_xmlrpcs_multicall_doc = 'Boxcar multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details'; + + function _xmlrpcs_multicall_error($err) + { + if (is_string($err)) + { + global $xmlrpcerr, $xmlrpcstr; + $str = $xmlrpcstr["multicall_${err}"]; + $code = $xmlrpcerr["multicall_${err}"]; + } + else + { + $code = $err->faultCode(); + $str = $err->faultString(); + } + $struct['faultCode'] = new xmlrpcval($code, 'int'); + $struct['faultString'] = new xmlrpcval($str, 'string'); + return new xmlrpcval($struct, 'struct'); + } + + function _xmlrpcs_multicall_do_call($server, $call) + { + if ($call->kindOf() != 'struct') + { + return _xmlrpcs_multicall_error('notstruct'); + } + $methName = $call->structmem('methodName'); + if (!$methName) + { + return _xmlrpcs_multicall_error('nomethod'); + } + if ($methName->kindOf() != 'scalar' || $methName->scalartyp() != 'string') + { + return _xmlrpcs_multicall_error('notstring'); + } + if ($methName->scalarval() == 'system.multicall') + { + return _xmlrpcs_multicall_error('recursion'); + } + + $params = $call->structmem('params'); + if (!$params) + { + return _xmlrpcs_multicall_error('noparams'); + } + if ($params->kindOf() != 'array') + { + return _xmlrpcs_multicall_error('notarray'); + } + $numParams = $params->arraysize(); + + $msg = new xmlrpcmsg($methName->scalarval()); + for ($i = 0; $i < $numParams; $i++) + { + $msg->addParam($params->arraymem($i)); + } + + $result = $server->execute($msg); + + if ($result->faultCode() != 0) + { + return _xmlrpcs_multicall_error($result); // Method returned fault. + } + + return new xmlrpcval(array($result->value()), 'array'); + } + + function _xmlrpcs_multicall($server, $m) + { + $calls = $m->getParam(0); + $numCalls = $calls->arraysize(); + $result = array(); + + for ($i = 0; $i < $numCalls; $i++) + { + $call = $calls->arraymem($i); + $result[$i] = _xmlrpcs_multicall_do_call($server, $call); + } + + return new xmlrpcresp(new xmlrpcval($result, 'array')); + } + + $_xmlrpcs_dmap=array( + 'system.listMethods' => array( + 'function' => '_xmlrpcs_listMethods', + 'signature' => $_xmlrpcs_listMethods_sig, + 'docstring' => $_xmlrpcs_listMethods_doc), + 'system.methodHelp' => array( + 'function' => '_xmlrpcs_methodHelp', + 'signature' => $_xmlrpcs_methodHelp_sig, + 'docstring' => $_xmlrpcs_methodHelp_doc), + 'system.methodSignature' => array( + 'function' => '_xmlrpcs_methodSignature', + 'signature' => $_xmlrpcs_methodSignature_sig, + 'docstring' => $_xmlrpcs_methodSignature_doc), + 'system.multicall' => array( + 'function' => '_xmlrpcs_multicall', + 'signature' => $_xmlrpcs_multicall_sig, + 'docstring' => $_xmlrpcs_multicall_doc + ) + ); + + $_xmlrpc_debuginfo=''; + function xmlrpc_debugmsg($m) + { + global $_xmlrpc_debuginfo; + $_xmlrpc_debuginfo=$_xmlrpc_debuginfo . $m . "\n"; + } + + class xmlrpc_server + { + var $dmap=array(); + + function xmlrpc_server($dispMap='', $serviceNow=1) + { + global $HTTP_RAW_POST_DATA; + // dispMap is a dispatch array of methods + // mapped to function names and signatures + // if a method + // doesn't appear in the map then an unknown + // method error is generated + /* milosch - changed to make passing dispMap optional. + * instead, you can use the class add_to_map() function + * to add functions manually (borrowed from SOAPX4) + */ + if($dispMap) + { + $this->dmap = $dispMap; + if($serviceNow) + { + $this->service(); + } + } + } + + function serializeDebug() + { + global $_xmlrpc_debuginfo; + if ($_xmlrpc_debuginfo!='') + { + return "\n"; + } + else + { + return ''; + } + } + + function service() + { + //global $xmlrpc_defencoding; + + $r=$this->parseRequest(); + //$payload='' . "\n" + $payload='' . "\n" + . $this->serializeDebug() + . $r->serialize(); + header('Content-Type: text/xml'); + header('Content-Length: ' . (int)strlen($payload)); + print $payload; + } + + /* + add a method to the dispatch map + */ + function add_to_map($methodname,$function,$sig,$doc) + { + $this->dmap[$methodname] = array( + 'function' => $function, + 'signature' => $sig, + 'docstring' => $doc + ); + } + + function verifySignature($in, $sig) + { + for($i=0; $igetNumParams()+1) + { + $itsOK=1; + for($n=0; $n<$in->getNumParams(); $n++) + { + $p=$in->getParam($n); + // print "\n"; + if ($p->kindOf() == 'scalar') + { + $pt=$p->scalartyp(); + } + else + { + $pt=$p->kindOf(); + } + // $n+1 as first type of sig is return type + if ($pt != $cursig[$n+1]) + { + $itsOK=0; + $pno=$n+1; $wanted=$cursig[$n+1]; $got=$pt; + break; + } + } + if ($itsOK) + { + return array(1,''); + } + } + } + if (isset($wanted)) + return array(0, "Wanted ${wanted}, got ${got} at param ${pno})"); + else + return array(0, "No method signature matches number of parameters"); + } + + function parseRequest($data='') + { + global $_xh,$HTTP_RAW_POST_DATA; + global $xmlrpcerr, $xmlrpcstr, $xmlrpcerrxml, $xmlrpc_defencoding, + $_xmlrpcs_dmap, $xmlrpc_internalencoding; + + if ($data=='') + { + $data=$HTTP_RAW_POST_DATA; + } + // G. Giunta 2005/02/13: we do NOT expect to receive html entities + // so we do not try to convert them into xml character entities + //$data = xmlrpc_html_entity_xlate($data); + $parser = xml_parser_create($xmlrpc_defencoding); + + $_xh[$parser]=array(); + //$_xh[$parser]['st']=''; + //$_xh[$parser]['cm']=0; + $_xh[$parser]['isf']=0; + $_xh[$parser]['isf_reason']=''; + $_xh[$parser]['params']=array(); + $_xh[$parser]['stack']=array(); + $_xh[$parser]['valuestack'] = array(); + $_xh[$parser]['method']=''; + + // decompose incoming XML into request structure + + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + // G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell + // the xml parser to give us back data in the expected charset + xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $xmlrpc_internalencoding); + + xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee'); + xml_set_character_data_handler($parser, 'xmlrpc_cd'); + xml_set_default_handler($parser, 'xmlrpc_dh'); + if (!xml_parse($parser, $data, 1)) + { + // return XML error as a faultCode + $r=new xmlrpcresp(0, + $xmlrpcerrxml+xml_get_error_code($parser), + sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser))); + xml_parser_free($parser); + } + else + if ($_xh[$parser]['isf']) + { + xml_parser_free($parser); + $r=new xmlrpcresp(0, + $xmlrpcerr['invalid_request'], + $xmlrpcstr['invalid_request'] . ' ' . $_xh[$parser]['isf_reason']); + } + else + { + xml_parser_free($parser); + + $m=new xmlrpcmsg($_xh[$parser]['method']); + // now add parameters in + $plist=''; + //$allOK = 1; + for($i=0; $i\n"; + $plist.="$i - " . $_xh[$parser]['params'][$i]. ";\n"; + //$allOK = 0; + //@eval('$m->addParam(' . $_xh[$parser]['params'][$i]. '); $allOK=1;'); + @$m->addParam($_xh[$parser]['params'][$i]); + //if (!$allOK) + //{ + // break; + //} + } + // uncomment this to really see what the server's getting! + // xmlrpc_debugmsg($plist); + //if (!$allOK) + //{ + // $r = new xmlrpcresp(0, + // $xmlrpcerr['incorrect_params'], + // $xmlrpcstr['incorrect_params'] . ": xml error in param " . $i); + //} + //else + //{ + $r = $this->execute($m); + //} + } + return $r; + } + + function execute ($m) + { + global $xmlrpcerr, $xmlrpcstr, $_xmlrpcs_dmap; + // now to deal with the method + $methName = $m->method(); + $sysCall = ereg("^system\.", $methName); + $dmap = $sysCall ? $_xmlrpcs_dmap : $this->dmap; + + if (!isset($dmap[$methName]['function'])) + { + // No such method + return new xmlrpcresp(0, + $xmlrpcerr['unknown_method'], + $xmlrpcstr['unknown_method']); + } + + // Check signature. + if (isset($dmap[$methName]['signature'])) + { + $sig = $dmap[$methName]['signature']; + list($ok, $errstr) = $this->verifySignature($m, $sig); + if(!$ok) + { + // Didn't match. + return new xmlrpcresp( + 0, + $xmlrpcerr['incorrect_params'], + $xmlrpcstr['incorrect_params'] . ": ${errstr}" + ); + } + } + + $func = $dmap[$methName]['function']; + + if ($sysCall) + { + return call_user_func($func, $this, $m); + } + else + { + return call_user_func($func, $m); + } + } + + function echoInput() + { + global $HTTP_RAW_POST_DATA; + + // a debugging routine: just echos back the input + // packet as a string value + + $r=new xmlrpcresp; + $r->xv=new xmlrpcval( "'Aha said I: '" . $HTTP_RAW_POST_DATA, 'string'); + print $r->serialize(); + } + } +?> --- versionner-server-0.2.0.orig/include/lib.php +++ versionner-server-0.2.0/include/lib.php @@ -0,0 +1,30 @@ +getAll($query , DB_FETCHMODE_ASSOC); +} + +?> --- versionner-server-0.2.0.orig/include/main.php +++ versionner-server-0.2.0/include/main.php @@ -0,0 +1,118 @@ + 'sarge' , 'woody' => 'woody' , 'etch' => 'etch' , 'sid' => 'sid' , 'none' => 'none' ); +$distro = array('debian' => 'debian' , 'redhat' => 'redhat' , 'suse' => 'suse' , 'ubuntu' => 'ubuntu'); +$choice = array('y' => 'yes' , 'n' => 'no'); +$engineers = array('john' => 'john doe' , 'tony' => 'tony bell' , 'steve' => 'steve jobs'); + +$smarty = new Smarty; + +$smarty->template_dir = TEMPLATE_DIR . '/templates/'; +$smarty->compile_dir = TEMPLATE_DIR . '/templates_c/'; +$smarty->config_dir = TEMPLATE_DIR . '/configs/'; +$smarty->cache_dir = TEMPLATE_DIR . 'cache/'; + + +$intro = <<< EOF +The purpose of this interface is to +give a user at any time an overview +of the current state of a certain machine +EOF; + +function customerList($type='assoc') +{ + global $db; + + $res =& $db->getAll('select * from customers order by name' , DB_FETCHMODE_ASSOC); + + if(DB::isError($res)) + die('Could not fetch list of customers'); + + $customers = array(); + + if($type == 'index') + { + foreach($res as $cust) + { + $id = $cust['id']; + $customers[$id] = $cust['name']; + } + } + else + { + $customers = $res; + } + + return $customers; +} + +function userList($type='assoc') +{ + global $db; + + $res =& $db->getAll('select users.id,lastname,firstname,customers.name from users,customers where users.customer_id=customers.id order by lastname' , DB_FETCHMODE_ASSOC); + + if(DB::isError($res)) + die('Could not fetch list of users'); + + $users = array(); + + if($type == 'index') { + foreach($res as $cust) + { + $id = $cust['id']; + $users[$id] = $cust['firstname'] . ' ' . $cust['lastname']; + } + } + else + { + $users = $res; + } + + return $users; + +} + +function getCustomerByID($id) +{ + global $db; + + if($id) + return $db->getOne("select name from customers where id = '$id'"); +} + +function getMachineByID($id) +{ + global $db; + + if($id) + return $db->getOne("select name from machines where id = '$id'"); +} + +?> --- versionner-server-0.2.0.orig/include/db.php +++ versionner-server-0.2.0/include/db.php @@ -0,0 +1,8 @@ + --- versionner-server-0.2.0.orig/scripts/download-sdo-packages +++ versionner-server-0.2.0/scripts/download-sdo-packages @@ -0,0 +1,37 @@ +#!/bin/bash +# +# Leo Eraly +# The idea is to get the Packages list of security.debian.org +# (for main , contrib and non-free) after we get these 3 Packages +# files we put them all in 1 single file +# This script should be added to crontab +# e.g put the following line in a file /etc/cron.d/versionner-server +# 0-50/10 * * * * root sh /path/to/this/script/download-sdo-packages + +BASE_DIR=/path/to/sdo/ +BASE_URL=http://security.debian.org/debian-security/dists/ +MAIN_URL_SUFFIX=/updates/main/binary-i386/Packages +CON_URL_SUFFIX=/updates/contrib/binary-i386/Packages +NON_URL_SUFFIX=/updates/non-free/binary-i386/Packages + +lynx -dump "$BASE_URL/woody/$MAIN_URL_SUFFIX" > "$BASE_DIR/woody/Packages.main.tmp" +lynx -dump "$BASE_URL/woody/$CON_URL_SUFFIX" > "$BASE_DIR/woody/Packages.con.tmp" +lynx -dump "$BASE_URL/woody/$NON_URL_SUFFIX" > "$BASE_DIR/woody/Packages.non.tmp" + +if [ $? == 0 ] +then + cat "$BASE_DIR/woody/Packages.main.tmp" > "$BASE_DIR/woody/Packages" + cat "$BASE_DIR/woody/Packages.con.tmp" >> "$BASE_DIR/woody/Packages" + cat "$BASE_DIR/woody/Packages.non.tmp" >> "$BASE_DIR/woody/Packages" +fi + +lynx -dump "$BASE_URL/sarge/$MAIN_URL_SUFFIX" > "$BASE_DIR/sarge/Packages.main.tmp" +lynx -dump "$BASE_URL/sarge/$CON_URL_SUFFIX" > "$BASE_DIR/sarge/Packages.con.tmp" +lynx -dump "$BASE_URL/sarge/$NON_URL_SUFFIX" > "$BASE_DIR/sarge/Packages.non.tmp" + +if [ $? == 0 ] +then + cat "$BASE_DIR/sarge/Packages.main.tmp" > "$BASE_DIR/sarge/Packages" + cat "$BASE_DIR/sarge/Packages.con.tmp" >> "$BASE_DIR/sarge/Packages" + cat "$BASE_DIR/sarge/Packages.non.tmp" >> "$BASE_DIR/sarge/Packages" +fi --- versionner-server-0.2.0.orig/index.php +++ versionner-server-0.2.0/index.php @@ -1,15 +1,4 @@ display('header.tpl'); - -$smarty->assign('crums' , 'home'); -$smarty->display('main.tpl'); - -echo $intro; - -$smarty->display('footer.tpl'); ?> --- versionner-server-0.2.0.orig/sql/versionner-server.sql +++ versionner-server-0.2.0/sql/versionner-server.sql @@ -1,7 +1,7 @@ -- -- Selected TOC Entries: -- -\connect - postgres +--\connect - postgres -- -- TOC Entry ID 22 (OID 16556) @@ -9,7 +9,7 @@ -- Name: "plpgsql_call_handler" () Type: FUNCTION Owner: postgres -- -CREATE FUNCTION "plpgsql_call_handler" () RETURNS opaque AS '$libdir/plpgsql', 'plpgsql_call_handler' LANGUAGE 'C'; +--CREATE FUNCTION "plpgsql_call_handler" () RETURNS opaque AS '$libdir/plpgsql', 'plpgsql_call_handler' LANGUAGE 'C'; -- -- TOC Entry ID 23 (OID 16557) @@ -17,7 +17,7 @@ -- Name: plpgsql Type: PROCEDURAL LANGUAGE Owner: -- -CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER "plpgsql_call_handler" LANCOMPILER ''; +--CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER "plpgsql_call_handler" LANCOMPILER ''; \connect - versionner --- versionner-server-0.2.0.orig/templates/header.tpl +++ versionner-server-0.2.0/templates/header.tpl @@ -1,10 +1,10 @@ Versionner - + - + --- versionner-server-0.2.0.orig/templates/footer.tpl +++ versionner-server-0.2.0/templates/footer.tpl @@ -1,6 +1,6 @@
--- versionner-server-0.2.0.orig/templates/customer_header.tpl +++ versionner-server-0.2.0/templates/customer_header.tpl @@ -4,6 +4,6 @@ - +