From 081298ea8942ac81946caffd3e51d90a4b17ef3f Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 21 Sep 2004 00:43:11 +0000 Subject: [PATCH] Initial revision --- livesupport/modules/archiveServer/Makefile | 155 ++ livesupport/modules/archiveServer/doc/INSTALL | 28 + .../modules/archiveServer/etc/doxygen.config | 1144 +++++++++++++ .../modules/archiveServer/var/Archive.php | 157 ++ .../modules/archiveServer/var/conf.php | 63 + .../archiveServer/var/html/default.css | 19 + .../archiveServer/var/html/gbHtmlBrowse.php | 245 +++ .../archiveServer/var/html/gbHtmlLogin.php | 73 + .../archiveServer/var/html/gbHtmlPerms.php | 111 ++ .../archiveServer/var/html/gbHtmlSubj.php | 162 ++ .../archiveServer/var/html/gbHtmlTestAuth.php | 9 + .../archiveServer/var/html/gbHtmlTestData.php | 13 + .../archiveServer/var/html/gbHtml_h.php | 25 + .../modules/archiveServer/var/html/gbHttp.php | 197 +++ .../modules/archiveServer/var/html/index.php | 34 + .../modules/archiveServer/var/index.php | 45 + .../archiveServer/var/install/index.php | 34 + .../archiveServer/var/install/install.php | 91 + .../archiveServer/var/install/uninstall.php | 61 + .../archiveServer/var/xmlrpc/testRunner.sh | 105 ++ .../archiveServer/var/xmlrpc/xmlrpc.inc | 1489 +++++++++++++++++ .../archiveServer/var/xmlrpc/xmlrpcs.inc | 450 +++++ .../archiveServer/var/xmlrpc/xrArchive.php | 252 +++ .../archiveServer/var/xmlrpc/xr_cli_test.py | 89 + 24 files changed, 5051 insertions(+) create mode 100644 livesupport/modules/archiveServer/Makefile create mode 100644 livesupport/modules/archiveServer/doc/INSTALL create mode 100644 livesupport/modules/archiveServer/etc/doxygen.config create mode 100644 livesupport/modules/archiveServer/var/Archive.php create mode 100644 livesupport/modules/archiveServer/var/conf.php create mode 100644 livesupport/modules/archiveServer/var/html/default.css create mode 100644 livesupport/modules/archiveServer/var/html/gbHtmlBrowse.php create mode 100644 livesupport/modules/archiveServer/var/html/gbHtmlLogin.php create mode 100644 livesupport/modules/archiveServer/var/html/gbHtmlPerms.php create mode 100644 livesupport/modules/archiveServer/var/html/gbHtmlSubj.php create mode 100644 livesupport/modules/archiveServer/var/html/gbHtmlTestAuth.php create mode 100644 livesupport/modules/archiveServer/var/html/gbHtmlTestData.php create mode 100644 livesupport/modules/archiveServer/var/html/gbHtml_h.php create mode 100644 livesupport/modules/archiveServer/var/html/gbHttp.php create mode 100644 livesupport/modules/archiveServer/var/html/index.php create mode 100644 livesupport/modules/archiveServer/var/index.php create mode 100644 livesupport/modules/archiveServer/var/install/index.php create mode 100644 livesupport/modules/archiveServer/var/install/install.php create mode 100644 livesupport/modules/archiveServer/var/install/uninstall.php create mode 100755 livesupport/modules/archiveServer/var/xmlrpc/testRunner.sh create mode 100644 livesupport/modules/archiveServer/var/xmlrpc/xmlrpc.inc create mode 100644 livesupport/modules/archiveServer/var/xmlrpc/xmlrpcs.inc create mode 100644 livesupport/modules/archiveServer/var/xmlrpc/xrArchive.php create mode 100755 livesupport/modules/archiveServer/var/xmlrpc/xr_cli_test.py diff --git a/livesupport/modules/archiveServer/Makefile b/livesupport/modules/archiveServer/Makefile new file mode 100644 index 000000000..453fbf020 --- /dev/null +++ b/livesupport/modules/archiveServer/Makefile @@ -0,0 +1,155 @@ +#------------------------------------------------------------------------------- +# ArchiveServer - central archive component +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the LiveSupport project. +# +# LiveSupport 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. +# +# LiveSupport 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 LiveSupport; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: tomas $ +# Version : $Revision: 1.1 $ +# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/archiveServer/Attic/Makefile,v $ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen + +#------------------------------------------------------------------------------- +# Misc +#------------------------------------------------------------------------------- + +MODULE_NAME = archiveServer +TAR_C = tar -cj --exclude CVS --exclude '*~' -C ${BASE_DIR} -f +DIST_EXT = .tgz +DATE = `date +%y%m%d` + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +#BASE_DIR = @builddir@ +BASE_DIR = . +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp + +USR_DIR = ${BASE_DIR}/../../usr +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_LIB_DIR = ${USR_DIR}/lib + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +HTTP_GROUP = apache +#HTTP_GROUP = nobody + +PHP_DIR = ${BASE_DIR}/var +INSTALL_DIR = ${PHP_DIR}/install +STOR_DIR = ${PHP_DIR}/stor +ACCESS_DIR = ${PHP_DIR}/access +BUFF_DIR = ${STOR_DIR}/buffer +TEST_RUNNER = ${PHP_DIR}/xmlrpc/testRunner.sh + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +#CPPFLAGS = @CPPFLAGS@ +#CXXFLAGS = @CXXFLAGS@ @DEFS@ -I${USR_INCLUDE_DIR} -I${INCLUDE_DIR} -I${TMP_DIR}\ +# -pedantic -Wall +#LDFLAGS = @LDFLAGS@ -L${USR_LIB_DIR} -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +#HELLO_LIB_OBJS = ${TMP_DIR}/Hello.o +#TEST_RUNNER_OBJS = ${TMP_DIR}/HelloTest.o ${TMP_DIR}/TestRunner.o + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean dist db_init db_clean + +all: dir_setup db_init + +dir_setup: ${DOXYGEN_DIR} ${STOR_DIR} ${ACCESS_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: db_clean + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + +depclean: clean + +dist: + ${TAR_C} ${MODULE_NAME}${DATE}${DIST_EXT} * + +distclean: clean docclean + +#check: all ${TEST_RUNNER} +# ${TEST_RUNNER} +check: all + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +db_init: + cd var/install; php -q install.php + +db_clean: + cd var/install; php -q uninstall.php + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${STOR_DIR}: + ${MKDIR} ${STOR_DIR} + chown .${HTTP_GROUP} ${STOR_DIR} + chmod g+ws ${STOR_DIR} + +${ACCESS_DIR}: + ${MKDIR} ${ACCESS_DIR} + chown .${HTTP_GROUP} ${ACCESS_DIR} + chmod g+ws ${ACCESS_DIR} + +${BUFF_DIR}: + ${MKDIR} ${BUFF_DIR} + chmod g+w ${BUFF_DIR} + +${TEST_RUNNER}: + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +#${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx +# ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/livesupport/modules/archiveServer/doc/INSTALL b/livesupport/modules/archiveServer/doc/INSTALL new file mode 100644 index 000000000..14f4f44b1 --- /dev/null +++ b/livesupport/modules/archiveServer/doc/INSTALL @@ -0,0 +1,28 @@ + +The HTTP_GROUP variable in Makefile haveto be set to group running apache. + +Install steps for file uploading (do it with appropriate changes): +(PUT method for uploading from behind firewall with resume feature) + +1) mkdir cgi-bin-put in apache2 dir +2) move put.cgi there from var subdir +3) add to apache2 config (i.g. commonapache2.conf): + + + Script PUT /cgi-bin-put/put.cgi + +ScriptAlias /cgi-bin-put/ "/usr/local/apache2/cgi-bin-put/" + + AllowOverride All + Options ExecCGI + + Order allow,deny + Allow from all + + + +4) reload apache2 + +Tested with apache 2.0.49 and (without Directory tag) with apache 1.3.28. + +TODO: check more put.cgi for security problems! diff --git a/livesupport/modules/archiveServer/etc/doxygen.config b/livesupport/modules/archiveServer/etc/doxygen.config new file mode 100644 index 000000000..c30647e13 --- /dev/null +++ b/livesupport/modules/archiveServer/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# doxygen.config +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the LiveSupport project. +# +# LiveSupport 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. +# +# LiveSupport 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 LiveSupport; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: tomas $ +# Version : $Revision: 1.1 $ +# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/archiveServer/etc/doxygen.config,v $ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = LiveSupport - archiveServer module + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +#EXTRACT_ALL = NO +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = var var/xmlrpc + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = *.php + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/livesupport/modules/archiveServer/var/Archive.php b/livesupport/modules/archiveServer/var/Archive.php new file mode 100644 index 000000000..a36dee141 --- /dev/null +++ b/livesupport/modules/archiveServer/var/Archive.php @@ -0,0 +1,157 @@ +accessRawAudioData($sessid, $gunid); + if(PEAR::isError($lnk)) return $lnk; + // return tmpurl, fname, md5h + $url = $this->_lnk2url($lnk); + $md5h = $this->_md5sum($lnk); + return array('url'=>$url, 'md5h'=>$md5h, 'fname'=>basename($lnk)); + } + + + /** + * Close download + */ + function downloadClose($sessid, $url) + { + // release + $lnk = $this->_url2lnk($url); + $res = $this->releaseRawAudioData($sessid, $lnk); + return $res; + } + + + /** + * Open upload + */ + function uploadOpen($sessid, $gunid) + { + $fname = "{$this->storageDir}/buffer/$gunid"; + if(!$fp = fopen($fname, 'w')) return PEAR::raiseError( + "Archive::uploadOpen: unable to create blank file" + ); + fclose($fp); + $res = $this->storeAudioClip($sessid, $gunid, $fname, ''); + if(PEAR::isError($res)) return $res; + $lnk = $this->accessRawAudioData($sessid, $gunid); + if(PEAR::isError($lnk)) return $lnk; + $url = $this->_lnk2url($lnk); + return array('url'=>$url); + } + + + /** + * Abort upload + */ + function uploadAbort($sessid, $url) + { + $lnk = $this->_url2lnk($url); + $res = $this->releaseRawAudioData($sessid, $lnk); + return $res; + } + + + /** + * Check upload + */ + function uploadCheck($sessid, $url) + { + $lnk = $this->_url2lnk($url); + $md5h = $this->_md5sum($lnk); + $size = filesize($lnk); + return array('md5h'=>$md5h, 'size'=>$size, 'url'=>$url); + } + + + /** + * Close upload + */ + function uploadClose($sessid, $url, $type='file') + { + switch($type){ + default: // case"file": + // release + $lnk = $this->_url2lnk($url); + $res = $this->releaseRawAudioData($sessid, $lnk); + return $res; + break; + case"search": + // localSearch + // return results + break; + } + } + + /** + * Translate local symlink to URL + * + */ + function _lnk2url($lnk) + { + return "http://{$this->config['archiveUrlHost']}:{$this->config['archiveUrlPort']}". + "{$this->config['archiveUrlPath']}/access/".basename($lnk); + } + + /** + * Traslate URL to local symlink + * + */ + function _url2lnk($url) + { + return $this->accessDir."/".basename($url); + } + function _md5sum($fpath) + { + $md5h = `md5sum $fpath`; + $arr = split(' ', $md5h); + return $arr[0]; + } +} +?> \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/conf.php b/livesupport/modules/archiveServer/var/conf.php new file mode 100644 index 000000000..af580d0be --- /dev/null +++ b/livesupport/modules/archiveServer/var/conf.php @@ -0,0 +1,63 @@ + array( + 'username' => 'test', + 'password' => 'test', + 'hostspec' => 'localhost', +# 'hostspec' => '127.0.0.1', // for bad resolver + 'phptype' => 'pgsql', + 'database' => 'LiveSupport-test', + ), + 'tblNamePrefix' => 'as_', + 'authCookieName'=> 'assid', + 'RootNode' => 'RootNode', + 'tmpRootPass' => 'q', + 'objtypes' => array( + 'RootNode' => array('Folder'), + 'Storage' => array('Folder', 'File', 'Replica'), + 'Folder' => array('Folder', 'File', 'Replica'), + 'File' => array(), + 'Replica' => array(), + ), + 'allowedActions'=> array( + 'RootNode' => array('classes', 'subjects'), + 'Folder' => array('editPrivs', 'write', 'read'), + 'File' => array('editPrivs', 'write', 'read'), + 'Replica' => array('editPrivs', 'write', 'read'), + '_class' => array('editPrivs', 'write', 'read'), + ), + 'allActions' => array( + 'editPrivs', 'write', 'read', 'classes', 'subjects' + ), + 'storageDir' => dirname(getcwd()).'/stor', + 'accessDir' => dirname(getcwd()).'/access', +); +?> \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/html/default.css b/livesupport/modules/archiveServer/var/html/default.css new file mode 100644 index 000000000..a065ef231 --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/default.css @@ -0,0 +1,19 @@ + diff --git a/livesupport/modules/archiveServer/var/html/gbHtmlBrowse.php b/livesupport/modules/archiveServer/var/html/gbHtmlBrowse.php new file mode 100644 index 000000000..d0c40e0f0 --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHtmlBrowse.php @@ -0,0 +1,245 @@ +\n"; print_r($_FILES); print_r($_REQUEST); print_r($_SERVER); exit; +require_once"gbHtml_h.php"; +require_once"gbHtmlTestAuth.php"; + +$fldsname=array('author'=>'Author', 'title'=>'Title', 'creator'=>'Creator', + 'description'=>'Description', 'subject'=>'Subject', 'genre'=>'Genre'); + +$sessid = $_REQUEST[$config['authCookieName']]; +$userid = $gb->getSessUserId($sessid); +$login = $gb->getSessLogin($sessid); + +#$path = ($_REQUEST['path']=='' ? '/' : $_REQUEST['path']); +$id = (!$_REQUEST['id'] ? $gb->storId : $_REQUEST['id']); + +#echo"
\nsessid=$sessid\nuserid=$userid\nlogin=$login\n"; exit;
+
+$tpldata = array(
+    'msg'       => $_SESSION['alertMsg'],
+    'loggedAs'  => $login,
+    'id'        => $id,
+); unset($_SESSION['alertMsg']);
+
+switch($_REQUEST['act']){
+    case"getHomeDir":
+        $id = $gb->getObjId($login, $gb->storId);
+        $tpldata['id'] = $id;
+    default:
+#        echo"
\n$path\n$upath
\n"; print_r($_FILES); print_r($_REQUEST); exit; + $tpldata=array_merge($tpldata, array( + 'pathdata' => $gb->getPath($id, $sessid), + 'listdata' => ($gb->getObjType($id)=='Folder'? + $gb->listFolder($id, $sessid):array() + ), + 'tree' => ($_REQUEST['tree']=='Y'), + 'showPath' => true, + 'showTree' => true, + )); + if($_REQUEST['tree']=='Y'){ + $tpldata['treedata'] = $gb->getSubTree($id, $sessid); + } + break; + case"newfile": + $tpldata=array( + 'pathdata' => $gb->getPath($id, $sessid), + 'showEdit' => true, + 'id' => $id, + ); + break; + case"sform": + $tpldata=array( +# 'pathdata' => $gb->getPath($path, $sessid), + 'showSForm' => true, + 'id' => $id, + ); + break; + case"search": + $tpldata=array( +# 'pathdata' => $gb->getPath($path, $sessid), + 'search' => $gb->localSearch($_REQUEST['srch'], $sessid), + 'showSRes' => true, + 'id' => $id, + ); + break; +} + +if(PEAR::isError($tpldata['listdata'])){ + $tpldata['msg'] = $tpldata['listdata']->getMessage(); + $tpldata['listdata'] = array(); +} +#echo"
\n$path
\n"; print_r($tpldata['pathdata']); print_r($tpldata); exit; + +$tpldata['showMenu']=true; + + +// =================== template: =================== + +?> + +Browser + + + + + + + + +

+ Home directory + Upload new file + Create new folder + Search +

+ + + +

+ Tree   + + + / + : + + permissions + +

+ + + + + + +
+ + + + + + + + + +
+ href="gbHtmlBrowse.php?id="> + + 'D', 'File'=>'F', 'Replica'=>'R'); echo$a[$o['type']]?> +  rename +  move +  copy + +  replicate + +  permissions +  DEL + +  Access +  Analyze +  MetaData + + +   (->) + +
No objects
+ + + +
+?> + + + + + + + + +
File name:
Media file:
Metadata file:
+ +
+ + + +
+ + + +
+ + + +
Search string:
+ + +
+ + + +
    +$v){?> +
  • + + No items found + +
+ + + + + + \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/html/gbHtmlLogin.php b/livesupport/modules/archiveServer/var/html/gbHtmlLogin.php new file mode 100644 index 000000000..888a533c6 --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHtmlLogin.php @@ -0,0 +1,73 @@ + $gb->getSubjects(), + 'actions' => $gb->getAllActions(), + 'objects' => $gb->getAllObjects(), + 'msg' => $_SESSION['alertMsg'] +); +unset($_SESSION['alertMsg']); + +// forms prefill: +if(is_array($_SESSION['lastPost'])) $d = array_merge($d, array( + 'lastSubj' => $_SESSION['lastPost']['subj'], + 'lastAction'=> $_SESSION['lastPost']['permAction'], + 'lastObj' => $_SESSION['lastPost']['obj'] +)); +unset($_SESSION['lastPost']); + +#header("Content-type: text/plain"); print_r($d); exit; +#require_once"gbHtml_f.php"; +// template follows: +?> + +Storage - login + + + + + +
+ Test accounts/pass: + +
+ +

Storage - login

+ +
+ + + + +
Login:
Password:
+ +
+
+ + + + + \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/html/gbHtmlPerms.php b/livesupport/modules/archiveServer/var/html/gbHtmlPerms.php new file mode 100644 index 000000000..af2e286b6 --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHtmlPerms.php @@ -0,0 +1,111 @@ +getSessUserId($_REQUEST[$config['authCookieName']]); +$login = $gb->getSessLogin($_REQUEST[$config['authCookieName']]); + +$id = (!$_REQUEST['id'] ? $gb->storId : $_REQUEST['id']); + +#header("Content-type: text/plain"); print_r($_REQUEST); exit; +#header("Content-type: text/plain"); echo $gb->dumpTree($id, ' ')."\n"; exit; + +// prefill data structure for template +$tpldata = array( + 'pathdata' => $gb->getPath($id), + 'perms' => $gb->getObjPerms($id), + 'actions' => $gb->getAllowedActions($gb->getObjType($id)), + 'subjects' => $gb->getSubjects(), + 'id' => $id, + 'loggedAs' => $login, +); +$tpldata['msg'] = $_SESSION['alertMsg']; unset($_SESSION['alertMsg']); + +#header("Content-type: text/plain"); print_r($tpldata); exit; + + +#require_once"gbHtml_f.php"; +// template follows: +?> + +Storage - permission editor + + + + + + +

Permission editor

+ +

Path: + $it) {?> + / + + +

+ + + +0) foreach($tpldata['perms'] as $k=>$row) { + $da=($row['type']=='A' ? 'allow' : ($row['type']=='D' ? 'deny' : $row['type']));?> + + + + + + + + + +
subject nameactionpermission
> + remove +
none
+ +
+Add permission + +for action + +to subject + + + + +
+ + + + + \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/html/gbHtmlSubj.php b/livesupport/modules/archiveServer/var/html/gbHtmlSubj.php new file mode 100644 index 000000000..6039953d3 --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHtmlSubj.php @@ -0,0 +1,162 @@ +listGroup($id)); exit; + +// prefill data structure for template +switch($type){ + case "list": + $d = array( + 'subj' => $gb->getSubjectsWCnt(), + 'loggedAs' => $login + ); + break; + case "group": + $d = array( + 'rows' => $gb->listGroup($id), + 'id' => $id, + 'loggedAs' => $login, + 'gname' => $gb->getSubjName($id), + 'subj' => $gb->getSubjects() + ); + break; + case "passwd": + break; + default: +} +$d['msg'] = $_SESSION['alertMsg']; unset($_SESSION['alertMsg']); + +#header("Content-type: text/plain"); print_r($d); echo($list ? 'Y' : 'N')."\n"; exit; +#require_once"gbHtml_f.php"; +// template follows: +?> + +Storage - user and roles editor + + + + + + +

User/Group editor

+ + +

Subjects:

+ + +0) foreach($d['subj'] as $k=>$c) {?> + + + (G:) (U) + + + + + +
idloginuser/group
+ + + + + + remove + change password +
none
+ +
+Add subject with name: +[and password: ] + + +
+ + + +

Subjects in group :

+ + + + + +0) foreach($d['rows'] as $k=>$row) {?> + + + (G) (U) + + + + + +
+ All subjects +
+ + + + + + + removeFromGroup + +
none
+ +
+Add subject + +to group + + + + +
+ + +
+ + + + + +
Old password:
New password:
Retype:
+ + +
+ + + + + + \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/html/gbHtmlTestAuth.php b/livesupport/modules/archiveServer/var/html/gbHtmlTestAuth.php new file mode 100644 index 000000000..70da09b9b --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHtmlTestAuth.php @@ -0,0 +1,9 @@ +getSessLogin($_REQUEST[$config['authCookieName']]); +if(!isset($login)||$login==''){ + $_SESSION['alertMsg'] = "Login required"; + header("Location: gbHtmlLogin.php"); + exit; +} +?> diff --git a/livesupport/modules/archiveServer/var/html/gbHtmlTestData.php b/livesupport/modules/archiveServer/var/html/gbHtmlTestData.php new file mode 100644 index 000000000..eb50120dd --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHtmlTestData.php @@ -0,0 +1,13 @@ +initDb(); +$gb->init(); +#system("rm -f {$config['storageDir']}/*.bin {$config['storageDir']}/*.xml"); +$d = $gb->testData(); +$gb->putFile('/folder1/folder1_2/folder1_2_1', 'fileA', "123\n345\n", "", 'at'); +$gb->createReplica('/folder1/folder1_2/folder1_2_1/fileA', '/folder1/folder1_2/folder1_2_1', 'replFA', 'at'); +$gb->putFile('/folder1/folder1_2/folder1_2_1', 'fileB', "123\n345\n789\n", "", 'at'); +$gb->ovewriteMetadata('/folder1/folder1_2/folder1_2_1/fileA', "\n", 'at'); + +$gb->deleteFile('/folder1/folder1_2/folder1_2_1/fileB', 'at'); + +?> \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/html/gbHtml_h.php b/livesupport/modules/archiveServer/var/html/gbHtml_h.php new file mode 100644 index 000000000..e6630f8d8 --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHtml_h.php @@ -0,0 +1,25 @@ +gm:\n".$err->getMessage()."\ndi:\n".$err->getDebugInfo()."\nui:\n".$err->getUserInfo()."\n"; + echo "
BackTrace:\n"; + print_r($err->backtrace); + echo "
\n"; + exit; +} + +$dbc = DB::connect($config['dsn'], TRUE); +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$gb = &new GreenBox(&$dbc, $config); + +?> \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/html/gbHttp.php b/livesupport/modules/archiveServer/var/html/gbHttp.php new file mode 100644 index 000000000..d17b608ab --- /dev/null +++ b/livesupport/modules/archiveServer/var/html/gbHttp.php @@ -0,0 +1,197 @@ +\n"; print_r($_SERVER); exit; + +define('BROWSER', "gbHtmlBrowse.php"); + + +$sessid = $_REQUEST[$config['authCookieName']]; +$userid = $gb->getSessUserId($sessid); +$login = $gb->getSessLogin($sessid); + +#$path = ($_REQUEST['path']=='' ? '/' : $_REQUEST['path']); +#$upath = urlencode($path); +#$id = $gb->_idFromPath($path); +$id = (!$_REQUEST['id'] ? $gb->storId : $_REQUEST['id']); + + +#if(PEAR::isError($id)){ $_SESSION['msg'] = $id->getMessage(); header("Location: ".BROWSER."?id=$id"); exit; } +$redirUrl="gbHtmlBrowse.php?id=$id"; + +switch($_REQUEST['act']){ +// --- authentication --- + case"login"; +# echo"
\n"; print_r($_REQUEST); exit;
+        $sessid = $gb->login($_REQUEST['login'], $_REQUEST['pass']);
+        if($sessid && !PEAR::isError($sessid)){
+#            echo"
$sessid\n"; print_r($_REQUEST); exit;
+            setcookie($config['authCookieName'], $sessid);
+            $redirUrl="gbHtmlBrowse.php";
+            $fid = $gb->getObjId($_REQUEST['login'], $gb->storId);
+            if(!PEAR::isError($fid)) $redirUrl.="?id=$fid";
+        }else{ $redirUrl="gbHtmlLogin.php"; $_SESSION['alertMsg']='Login failed.'; }
+#        echo"
$redirUrl\n"; print_r($_REQUEST); exit;
+    break;
+    case"logout";
+        $gb->logout($sessid);
+        setcookie($config['authCookieName'], '');
+        $redirUrl="gbHtmlLogin.php";
+    break;
+
+// --- files ---
+    case"upload":
+        $tmpgunid = md5(microtime().$_SERVER['SERVER_ADDR'].rand()."org.mdlf.livesupport");
+        $ntmp = "{$gb->storageDir}/buffer/$tmpgunid";
+#        $ntmp = tempnam(""{$gb->storageDir}/buffer", 'gbTmp_');
+        $mdtmp = "";
+        move_uploaded_file($_FILES['mediafile']['tmp_name'], $ntmp); chmod($ntmp, 0664);
+        if($_FILES['mdatafile']['tmp_name']){
+            $mdtmp = "$ntmp.xml";
+            if(move_uploaded_file($_FILES['mdatafile']['tmp_name'], $mdtmp)){
+                chmod($mdtmp, 0664);
+            }
+        }
+        $r = $gb->putFile($id, $_REQUEST['filename'], $ntmp, $mdtmp, $sessid);
+        if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage();
+        else{
+#            $gb->updateMetadataDB($gb->_pathFromId($r), $mdata, $sessid);
+            @unlink($ntmp);
+            @unlink($mdtmp);
+        }
+        $redirUrl = BROWSER."?id=$id";
+    break;
+    case"newFolder":
+        $r = $gb->createFolder($id, $_REQUEST['newname'], $sessid);
+        if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage();
+        $redirUrl = BROWSER."?id=$id";
+    break;
+    case"rename":
+        $parid = $gb->getparent($id);
+        $r = $gb->renameFile($id, $_REQUEST['newname'], $sessid);
+        if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage();
+        $redirUrl = BROWSER."?id=$parid";
+    break;
+    case"move":
+        $newPath = urlencode($_REQUEST['newPath']);
+        $did = $gb->getObjIdFromRelPath($id, $newPath);
+        $parid = $gb->getparent($id);
+        $r = $gb->moveFile($id, $did, $sessid);
+        if(PEAR::isError($r)){
+            $_SESSION['alertMsg'] = $r->getMessage();
+            $redirUrl = BROWSER."?id=$parid";
+        }
+        else $redirUrl = BROWSER."?id=$did";
+    break;
+    case"copy":
+        $newPath = urldecode($_REQUEST['newPath']);
+        $did = $gb->getObjIdFromRelPath($id, $newPath);
+        $parid = $gb->getparent($id);
+#        echo"
\n$id\t$newPath\t$did\n"; print_r($did); exit;
+        $r = $gb->copyFile($id, $did, $sessid);
+        if(PEAR::isError($r)){
+            $_SESSION['alertMsg'] = $r->getMessage();
+            $redirUrl = BROWSER."?id=$parid";
+        }
+        else $redirUrl = BROWSER."?id=$did";
+    break;
+/* NOT WORKING - sorry
+    case"repl":
+        $unewpath = urlencode($_REQUEST['newpath']);
+        $r = $gb->createReplica($id, $_REQUEST['newpath'], '', $sessid);
+        if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage();
+        $redirUrl = BROWSER."?id=$newparid";
+    break;
+*/
+    case"delete":
+        $parid = $gb->getparent($id);
+        $r = $gb->deleteFile($id, $sessid);
+        if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage();
+        $redirUrl = BROWSER."?id=$parid";
+    break;
+    case"getFile":
+#        echo"
$t, $ctype\n"; exit;
+#        $r = $gb->getFile($id, $sessid);
+        $r = $gb->access($id, $sessid);
+        if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage();
+        else echo $r;
+        exit;
+    break;
+    case"getMdata":
+        header("Content-type: text/xml");
+        $r = $gb->getMdata($id, $sessid);
+        print_r($r);
+        exit;
+    break;
+    case"getInfo":
+        header("Content-type: text/plain");
+        $ia = $gb->analyzeFile($id, $sessid);
+        echo"fileformat: {$ia['fileformat']}\n";
+        echo"channels: {$ia['audio']['channels']}\n";
+        echo"sample_rate: {$ia['audio']['sample_rate']}\n";
+        echo"bits_per_sample: {$ia['audio']['bits_per_sample']}\n";
+        echo"channelmode: {$ia['audio']['channelmode']}\n";
+        echo"title: {$ia['id3v1']['title']}\n";
+        echo"artist: {$ia['id3v1']['artist']}\n";
+        echo"comment: {$ia['id3v1']['comment']}\n";
+#        echo": {$ia['id3v1']['']}\n";
+#        print_r($ia);
+        exit;
+    break;
+
+// --- subjs ----
+    case"addSubj";
+        $redirUrl="gbHtmlSubj.php";
+        if($gb->checkPerm($userid, 'subjects'))
+            $res = $gb->addSubj($_REQUEST['login'], ($_REQUEST['pass']=='' ? NULL:$_REQUEST['pass'] ));
+        else{ $_SESSION['alertMsg']='Access denied.'; break; }
+        if(PEAR::isError($res)) $_SESSION['alertMsg'] = $res->getMessage();
+    break;
+    case"removeSubj";
+        $redirUrl="gbHtmlSubj.php";
+        if($gb->checkPerm($userid, 'subjects'))
+            $res = $gb->removeSubj($_REQUEST['login']);
+        else{ $_SESSION['alertMsg']='Access denied.'; break; }
+        if(PEAR::isError($res)) $_SESSION['alertMsg'] = $res->getMessage();
+    break;
+    case"passwd";
+        $redirUrl="gbHtmlSubj.php";
+        $ulogin = $gb->getSubjName($_REQUEST['uid']);
+        if($userid != $_REQUEST['uid'] &&
+            ! $gb->checkPerm($userid, 'subjects')){
+            $_SESSION['alertMsg']='Access denied..';
+            break;
+        }
+        if(FALSE === $gb->authenticate($ulogin, $_REQUEST['oldpass'])){
+            $_SESSION['alertMsg']='Wrong old pasword.';
+            break;
+        }
+        if($_REQUEST['pass'] !== $_REQUEST['pass2']){
+            $_SESSION['alertMsg']="Passwords do not match. ({$_REQUEST['pass']}/{$_REQUEST['pass2']})";
+            break;
+        }
+        $gb->passwd($ulogin, $_REQUEST['oldpass'], $_REQUEST['pass']);
+    break;
+
+// --- perms ---
+    case"addPerm";
+        if($gb->checkPerm($userid, 'editPerms', $_REQUEST['id']))
+            $gb->addPerm($_REQUEST['subj'], $_REQUEST['permAction'], $_REQUEST['id'], $_REQUEST['allowDeny']);
+        else $_SESSION['alertMsg']='Access denied.';
+        $redirUrl="gbHtmlPerms.php?id=$id";
+    break;
+    case"removePerm";
+        if($gb->checkPerm($userid, 'editPerms', $_REQUEST['oid']))
+            $gb->removePerm($_GET['permid']);
+        else $_SESSION['alertMsg']='Access denied.';
+        $redirUrl="gbHtmlPerms.php?id=$id";
+    break;
+
+    default:
+        $_SESSION['alertMsg']="Unknown method: {$_REQUEST['act']}";
+        $redirUrl="gbHtmlLogin.php";
+}
+
+#echo"
$redirUrl\n"; print_r($_REQUEST); exit;
+header("Location: $redirUrl");
+?>
\ No newline at end of file
diff --git a/livesupport/modules/archiveServer/var/html/index.php b/livesupport/modules/archiveServer/var/html/index.php
new file mode 100644
index 000000000..47a34380e
--- /dev/null
+++ b/livesupport/modules/archiveServer/var/html/index.php
@@ -0,0 +1,34 @@
+
diff --git a/livesupport/modules/archiveServer/var/index.php b/livesupport/modules/archiveServer/var/index.php
new file mode 100644
index 000000000..200ad3e62
--- /dev/null
+++ b/livesupport/modules/archiveServer/var/index.php
@@ -0,0 +1,45 @@
+
+
+ArchiveServer module
+
+

ArchiveServer module

+
+HTML client
+XmlRpc test
+Test
+ + \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/install/index.php b/livesupport/modules/archiveServer/var/install/index.php new file mode 100644 index 000000000..534bacd18 --- /dev/null +++ b/livesupport/modules/archiveServer/var/install/index.php @@ -0,0 +1,34 @@ + diff --git a/livesupport/modules/archiveServer/var/install/install.php b/livesupport/modules/archiveServer/var/install/install.php new file mode 100644 index 000000000..4285a326d --- /dev/null +++ b/livesupport/modules/archiveServer/var/install/install.php @@ -0,0 +1,91 @@ +getMessage()."\ndi:\n".$err->getDebugInfo()."\nui:\n".$err->getUserInfo()."\n
\n"; + exit; +} + + +PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s
\n"); +$dbc = DB::connect($config['dsn'], TRUE); +if(PEAR::isError($dbc)){ + echo "Database connection problem.\n"; + echo "Check if database '{$config['dsn']['database']}' exists with corresponding permissions.\n"; + echo "Database access is defined by 'dsn' values in conf.php.\n"; + exit; +} + +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$gb = &new GreenBox(&$dbc, $config); + +echo "\nIMPORTANT settings:\n"; +echo " Makefile: HTTP_GROUP - group of running http daemon\n"; +echo " var/xmlrpc/testRunner.sh: XMLRPC - URL of XMLRPC server\n\n"; + +echo "Archive: Install ...\n"; +$dbc->setErrorHandling(PEAR_ERROR_RETURN); +$gb->uninstall(); +PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s
\n"); +$gb->install(); + +echo " Testing ...\n"; +$gb->test(); +$log = $gb->test_log; +echo " TESTS:\n$log\n---\n"; + +#echo " Reinstall + testdata insert ...\n"; +#$gb->reinstall(); +#$gb->sessid = $gb->login('root', $gb->config['tmpRootPass']); +#$gb->testData(); +#$gb->logout($gb->sessid); unset($gb->sessid); + +echo " TREE DUMP:\n"; +echo $gb->dumpTree(); + +echo " Delete test data ...\n"; +$gb->deleteData(); + +if(!($fp = @fopen($config['storageDir']."/_writeTest", 'w'))) + echo "\n!!! make {$config['storageDir']} dir webdaemon-writeable !!!\nand run install again\n\n"; +else{ + fclose($fp); unlink($config['storageDir']."/_writeTest"); + echo "\nArchive is probably installed OK\n"; +} + +$dbc->disconnect(); +?> diff --git a/livesupport/modules/archiveServer/var/install/uninstall.php b/livesupport/modules/archiveServer/var/install/uninstall.php new file mode 100644 index 000000000..30abf5257 --- /dev/null +++ b/livesupport/modules/archiveServer/var/install/uninstall.php @@ -0,0 +1,61 @@ +getMessage()."\ndi:\n".$err->getDebugInfo()."\nui:\n".$err->getUserInfo()."\n
\n"; + exit; +} + + +PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s
\n"); +$dbc = DB::connect($config['dsn'], TRUE); +if(PEAR::isError($dbc)){ + echo "Database connection problem.\n"; + echo "Check if database '{$config['dsn']['database']}' exists with corresponding permissions.\n"; + echo "Database access is defined by 'dsn' values in conf.php.\n"; + exit; +} + +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$gb = &new GreenBox(&$dbc, $config); + +# $dbc->setErrorHandling(PEAR_ERROR_RETURN); +echo "Trying to uninstall Archive ...\n"; +$gb->uninstall(); + +$dbc->disconnect(); +?> diff --git a/livesupport/modules/archiveServer/var/xmlrpc/testRunner.sh b/livesupport/modules/archiveServer/var/xmlrpc/testRunner.sh new file mode 100755 index 000000000..0096289fc --- /dev/null +++ b/livesupport/modules/archiveServer/var/xmlrpc/testRunner.sh @@ -0,0 +1,105 @@ +#!/bin/sh + +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the LiveSupport project. +# http://livesupport.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# LiveSupport 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. +# +# LiveSupport 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 LiveSupport; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: tomas $ +# Version : $Revision: 1.1 $ +# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/archiveServer/var/xmlrpc/testRunner.sh,v $ +#------------------------------------------------------------------------------- + +COMM=$1 +shift +GUNID=$1 + +XMLRPC=http://localhost:80/livesupport/modules/archiveServer/var/xmlrpc/xrArchive.php +echo "XMLRPC server URL (check it in troubles):" +echo $XMLRPC + +TESTDIR=`dirname $0` +XR_CLI="$TESTDIR/xr_cli_test.py -s $XMLRPC" + +login() { + echo "login:" + SESSID=`$XR_CLI login root q` + echo "sessid: $SESSID" +} + +ping() { + echo "ping:" + $XR_CLI ping abcDef +} + +# existsAudioClip() { +# echo "existsAudioClip:" +# $XR_CLI existsAudioClip $SESSID $GUNID +# } + +downloadOpenClose() { + echo "downloadOpen:" + FURL=`$XR_CLI downloadOpen $SESSID $GUNID` + FURL="" + FURL=`echo "$FURL" | php -q` + echo $FURL +# ls -l `dirname $FURL` + echo "downloadClose:" + $XR_CLI downloadClose $SESSID $FURL +#$XR_CLI getAudioClip $SESSID $GUNID +} + +# storeAudioClip() { +# echo "storeAudioClip:" +# MEDIA=../tests/ex1.mp3 +# METADATA=../tests/testStorage.xml +# RGUNID=`$XR_CLI storeAudioClip "$SESSID" 'X' "$MEDIA" "$METADATA"` +# echo $RGUNID +# } + +# searchMetadata() { +# echo "searchMetadata:" +# # $XR_CLI searchMetadata $SESSID '../tests/srch_cri1.xml' +# $XR_CLI searchMetadata $SESSID 'John %' +# } + +logout() { + echo "logout:" + $XR_CLI logout $SESSID +} + +usage(){ + echo "Usage: $0 [args]" + echo -e "commands:\n test, ...\n" +} + +if [ "$COMM" == "ping" ]; then + ping +elif [ "x$COMM" == "x" ]; then +# echo "No action" + login + downloadOpenClose + logout +elif [ "$COMM" == "help" ]; then + usage +else + echo "Unknown command" + usage +fi diff --git a/livesupport/modules/archiveServer/var/xmlrpc/xmlrpc.inc b/livesupport/modules/archiveServer/var/xmlrpc/xmlrpc.inc new file mode 100644 index 000000000..b85365633 --- /dev/null +++ b/livesupport/modules/archiveServer/var/xmlrpc/xmlrpc.inc @@ -0,0 +1,1489 @@ + +// $Id: xmlrpc.inc,v 1.1 2004/09/21 00:43:32 tomas 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'); + } + } + + $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 + ); + + $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: enabling 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["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"; + + $xmlrpc_defencoding='UTF-8'; + + $xmlrpcName='XML-RPC for PHP'; + $xmlrpcVersion='1.0.99'; + + // 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: + // st - used to build up a string for evaluation + // ac - used to accumulate values + // qt - used to decide if quotes are needed for evaluation + // cm - used to denote struct or array (comma needed) + // 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 + + $_xh=array(); + + function xmlrpc_entity_decode($string) + { + $top=split('&', $string); + $op=''; + $i=0; + while($i "; + break; + case 'BOOLEAN': + // special case here: we translate boolean 1 or 0 into PHP + // constants true or false + if ($_xh[$parser]['ac']=='1') + { + $_xh[$parser]['ac']='true'; + } + else + { + $_xh[$parser]['ac']='false'; + $_xh[$parser]['vt']=strtolower($name); + // Drop through intentionally. + } + case 'I4': + case 'INT': + case 'STRING': + case 'DOUBLE': + case 'DATETIME.ISO8601': + case 'BASE64': + if ($_xh[$parser]['qt']==1) + { + // we use double quotes rather than single so backslashification works OK + $_xh[$parser]['st'].='"'. $_xh[$parser]['ac'] . '"'; + } + elseif ($_xh[$parser]['qt']==2) + { + $_xh[$parser]['st'].="base64_decode('". $_xh[$parser]['ac'] . "')"; + } + elseif ($name=='BOOLEAN') + { + $_xh[$parser]['st'].=$_xh[$parser]['ac']; + } + else + { + // we have an I4, INT or a DOUBLE + // 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 or DOUBLE'); + $_xh[$parser]['st'].='ERROR_NON_NUMERIC_FOUND'; + } + else + { + // it's ok, add it on + $_xh[$parser]['st'].=$_xh[$parser]['ac']; + } + } + $_xh[$parser]['ac']=''; $_xh[$parser]['qt']=0; + $_xh[$parser]['lv']=3; // indicate we've found a value + break; + case 'VALUE': + // deal with a string value + 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'].= '""'; + } + $_xh[$parser]['st'].=", '" . $_xh[$parser]['vt'] . "')"; + if ($_xh[$parser]['cm']) + { + $_xh[$parser]['st'].=','; + } + break; + case 'MEMBER': + $_xh[$parser]['ac']=''; $_xh[$parser]['qt']=0; + break; + case 'DATA': + $_xh[$parser]['ac']=''; $_xh[$parser]['qt']=0; + break; + case 'PARAM': + $_xh[$parser]['params'][]=$_xh[$parser]['st']; + break; + case 'METHODNAME': + $_xh[$parser]['method']=ereg_replace("^[\n\r\t ]+", '', $_xh[$parser]['ac']); + break; + case 'BOOLEAN': + // special case here: we translate boolean 1 or 0 into PHP + // constants true or false + if ($_xh[$parser]['ac']=='1') + { + $_xh[$parser]['ac']='true'; + } + else + { + $_xh[$parser]['ac']='false'; + $_xh[$parser]['vt']=strtolower($name); + } + break; + default: + 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"; + + 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))); + } + } + + function xmlrpc_dh($parser, $data) + { + global $_xh; + 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))); + } + } + + class xmlrpc_client + { + var $path; + var $server; + var $port; + var $errno; + var $errstring; + 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; + 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) + { + $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"; + } + + // "Host: ". $this->server . ":" . $this->port . "\r\n" . + + $op= "POST " . $this->path. " HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\n" . + "Host: ". $this->server . "\r\n" . + $credentials . + "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; + 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 1.0'); + // 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')); + // 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)); + } + else + { + $resp = $msg->parseResponse($result); + } + curl_close($curl); + 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($results != false) + { + // 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 $xv; + var $fn; + var $fs; + var $hdrs; + + function xmlrpcresp($val, $fcode=0, $fstr='',$waserror=0) + { + //print "waserror=$waserror
"; + if(($fcode != 0) || ($waserror != 0)) + { + $this->xv = 0; + $this->fn = $fcode; + $this->fs = htmlspecialchars($fstr); + } + else + { + $this->xv = $val; + $this->fn = 0; + } + } + + function faultCode() + { + if(isset($this->fn)) + { + if($this->fn == 0) + { + return -1; + } + else + { + return $this->fn; + } + } + else + { + return 0; + } + } + + function faultString() + { + return $this->fs; + } + + function value() + { + return $this->xv; + } + + function serialize() + { + $rs="\n"; + if ($this->fn) + { + $rs.=' + + + +faultCode +' . $this->fn . ' + + +faultString +' . $this->fs . ' + + + +'; + } + else + { + $rs.="\n\n" . $this->xv->serialize() . + "\n"; + } + $rs.="\n"; + return $rs; + } + } + + 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; + + $parser = xml_parser_create($xmlrpc_defencoding); + + $_xh[$parser]=array(); + + $_xh[$parser]['st']=''; + $_xh[$parser]['cm']=0; + $_xh[$parser]['isf']=0; + $_xh[$parser]['ac']=''; + $_xh[$parser]['qt']=''; + $_xh[$parser]['ha']=''; + + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + 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; + + $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']); + xml_parser_free($parser); + 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) && !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 . ')'); + xml_parser_free($parser); + return $r; + } + + // if using HTTP, then gotta get rid of HTTP headers here + // and we store them in the 'ha' bit of our data array + if (ereg("^HTTP", $data)) + { + $ar=explode("\r\n", $data); + $newdata=''; + $hdrfnd=0; + for ($i=0; $i0) + { + $_xh[$parser]['ha'].=$ar[$i]. "\r\n"; + } + else + { + $hdrfnd=1; + } + } + else + { + $newdata.=$ar[$i] . "\r\n"; + } + } + $data=$newdata; + } + + if ($this->debug) + { + @reset($_xh[$parser]['ha']); + while (list($x,$header) = @each($_xh[$parser]['ha'])) + { + echo "HEADER: $header\n"; + } + } + // end Patch + 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']); + xml_parser_free($parser); + echo $errstr; + return $r; + } + } + xml_parser_free($parser); + if ($this->debug) + { + print "
---EVALING---[" . 
+				strlen($_xh[$parser]['st']) . " chars]---\n" . 
+				htmlspecialchars($_xh[$parser]['st']) . ";\n---END---
"; + } + if (strlen($_xh[$parser]['st'])==0) + { + // 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 + { + eval('$v=' . $_xh[$parser]['st'] . '; $allOK=1;'); + if ($_xh[$parser]['isf']) + { + $f=$v->structmem('faultCode'); + $fs=$v->structmem('faultString'); + + $r = new xmlrpcresp($v, $f->scalarval(), + $fs->scalarval(),1 /* even if errornum=0, indicate that there is error. modified by maHo */ + ); + + } + else + { + $r=new xmlrpcresp($v); + } + } + $r->hdrs = @split("\r?\n", $_xh[$parser]['ha'][1]); + 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 || $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: + $rs.="<${typ}>" . rawurlencode($val). ""; // micsik + //$rs.="<${typ}>" . htmlspecialchars($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;'); + } + } + // end contrib + return $b; + } + + function scalarval() + { + global $xmlrpcBoolean, $xmlrpcBase64; + reset($this->me); + list($a,$b)=each($this->me); + return rawurldecode($b); // micsik + } + + 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 xmlrpc_decoder($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_decoder($xmlrpc_val->arraymem($i)); + } + return $arr; + } + elseif($kind == 'struct') + { + $xmlrpc_val->structreset(); + $arr = array(); + + while(list($key,$value)=$xmlrpc_val->structeach()) + { + $arr[$key] = xmlrpc_decoder($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 xmlrpc_encoder($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_encoder($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; + } +?> diff --git a/livesupport/modules/archiveServer/var/xmlrpc/xmlrpcs.inc b/livesupport/modules/archiveServer/var/xmlrpc/xmlrpcs.inc new file mode 100644 index 000000000..daffa2ae2 --- /dev/null +++ b/livesupport/modules/archiveServer/var/xmlrpc/xmlrpcs.inc @@ -0,0 +1,450 @@ + +// $Id: xmlrpcs.inc,v 1.1 2004/09/21 00:43:34 tomas 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" + . $this->serializeDebug() + . $r->serialize(); + Header("Content-type: text/xml\r\nContent-length: " . + 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); + } + } + } + return array(0, "Wanted ${wanted}, got ${got} at param ${pno})"); + } + + function parseRequest($data='') + { + global $_xh,$HTTP_RAW_POST_DATA; + global $xmlrpcerr, $xmlrpcstr, $xmlrpcerrxml, $xmlrpc_defencoding, + $_xmlrpcs_dmap; + + if ($data=="") + { + $data=$HTTP_RAW_POST_DATA; + } + $parser = xml_parser_create($xmlrpc_defencoding); + + $_xh[$parser]=array(); + $_xh[$parser]['st']=''; + $_xh[$parser]['cm']=0; + $_xh[$parser]['isf']=0; + $_xh[$parser]['params']=array(); + $_xh[$parser]['method']=''; + + // decompose incoming XML into request structure + + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + 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 + { + xml_parser_free($parser); + $m=new xmlrpcmsg($_xh[$parser]['method']); + // now add parameters in + $plist=""; + for($i=0; $i\n"; + $plist.="$i - " . $_xh[$parser]['params'][$i]. " \n"; + eval('$m->addParam(' . $_xh[$parser]['params'][$i]. ");"); + } + // uncomment this to really see what the server's getting! + // xmlrpc_debugmsg($plist); + + $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(); + } + } +?> diff --git a/livesupport/modules/archiveServer/var/xmlrpc/xrArchive.php b/livesupport/modules/archiveServer/var/xmlrpc/xrArchive.php new file mode 100644 index 000000000..7c2b941d9 --- /dev/null +++ b/livesupport/modules/archiveServer/var/xmlrpc/xrArchive.php @@ -0,0 +1,252 @@ +setFetchMode(DB_FETCHMODE_ASSOC); + +/** + * XMLRPC layer for Archive module + */ +class XR_Archive extends Archive{ + /** + * Simple ping method - return strtouppered string + */ + function xr_ping($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + return new xmlrpcresp(new xmlrpcval(strtoupper($r['par']), "string")); + } + + /** + * Open download + */ + function xr_downloadOpen($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + $res = $this->downloadOpen($r['sessid'], $r['gunid']); + if(PEAR::isError($res)) + return new xmlrpcresp(0, 803, + "xr_downloadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new xmlrpcresp(xmlrpc_encoder($res)); + } + + /** + * Close download + */ + function xr_downloadClose($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + $res = $this->downloadClose($r['sessid'], $r['url']); + if(PEAR::isError($res)) + return new xmlrpcresp(0, 803, + "xr_downloadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new xmlrpcresp(xmlrpc_encoder($res)); + } + + /** + * Open upload + */ + function xr_uploadOpen($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + $res = $this->uploadOpen($r['sessid'], $r['gunid']); + if(PEAR::isError($res)) + return new xmlrpcresp(0, 803, + "xr_downloadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new xmlrpcresp(xmlrpc_encoder($res)); + } + + /** + * Abort upload + */ + function xr_uploadAbort($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + $res = $this->uploadAbort($r['sessid'], $r['url']); + if(PEAR::isError($res)) + return new xmlrpcresp(0, 803, + "xr_downloadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new xmlrpcresp(xmlrpc_encoder($res)); + } + + /** + * Check upload + */ + function xr_uploadCheck($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + $res = $this->uploadCheck($r['sessid'], $r['url']); + if(PEAR::isError($res)) + return new xmlrpcresp(0, 803, + "xr_downloadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new xmlrpcresp(xmlrpc_encoder($res)); + } + + /** + * Close upload + */ + function xr_uploadClose($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + $res = $this->uploadClose($r['sessid'], $r['url']); + if(PEAR::isError($res)) + return new xmlrpcresp(0, 803, + "xr_downloadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new xmlrpcresp(xmlrpc_encoder($res)); + } + + + /** + * Call Archive::login + * + * @param input XMLRPC struct + */ + function xr_login($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + if(!($res = $this->login($r['login'], $r['pass']))) + return new xmlrpcresp(0, 802, + "xr_login: login failed - incorrect username or password ({$r['login']}/{$r['pass']})." + ); + else + return new xmlrpcresp($this->_v2xr($res, false)); + } + + /** + * Call Archive::logout + * + * @param input XMLRPC struct + */ + function xr_logout($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if(!$ok) return $r; + $res = $this->logout($r['sessid']); + if(!PEAR::isError($res)) + return new xmlrpcresp($this->_v2xr('Bye', false)); + else + return new xmlrpcresp(0, 803, + "xr_logout: logout failed - not logged." + ); + } + + /** + * Convert PHP variables to XMLRPC objects + * + * @param var mixed - PHP variable + * @param struct boolean - flag for using XMLRPC struct instead of array + * @return XMLRPC object + */ + function _v2xr($var, $struct=true){ + if(is_array($var)){ + $r = array(); + foreach($var as $k=>$v){ + if($struct) $r[$k]=$this->_v2xr($v); + else $r[]=$this->_v2xr($v); + } + return new xmlrpcval($r, ($struct ? "struct" : "array")); + }else if(is_int($var)){ + return new xmlrpcval($var, "int"); + }else if(is_bool($var)){ + return new xmlrpcval($var, "boolean"); + }else{ + return new xmlrpcval($var, "string"); + } + } + + /** + * Convert XMLRPC struct to PHP array + * + * @param input XMLRPC struct + */ + function _xr_getPars($input) + { + $p = $input->getParam(0); + if(isset($p) && $p->scalartyp()=="struct"){ + $p->structreset(); $r = array(); + while(list($k,$v) = $p->structeach()){ $r[$k] = $v->scalarval(); } + return array(TRUE, $r); + } + else return array(FALSE, new xmlrpcresp(0, 801, + "xr_login: wrong 1st parameter, struct expected." + )); + } +} + +$archive = &new XR_Archive(&$dbc, $config); + +$methods = array( + 'login' => 'Login to storage.', + 'logout' => 'Logout from storage.', + 'ping' =>'Echo request', + 'downloadOpen' =>'Open download channel', + 'downloadClose' =>'Close download channel', + 'uploadOpen' =>'Open upload channel', + 'uploadAbort' =>'Close upload channel', + 'uploadCheck' =>'Check size and checksum of uploaded file', + 'uploadClose' =>'Close upload channel' +); + +$defs = array(); +foreach($methods as $method=>$description){ + $defs["archive.$method"] = array( + "function" => array(&$archive, "xr_$method"), + "signature" => array(array($xmlrpcStruct, $xmlrpcStruct)), + "docstring" => $description + ); +} +$s=new xmlrpc_server( $defs ); +?> \ No newline at end of file diff --git a/livesupport/modules/archiveServer/var/xmlrpc/xr_cli_test.py b/livesupport/modules/archiveServer/var/xmlrpc/xr_cli_test.py new file mode 100755 index 000000000..0353fdfed --- /dev/null +++ b/livesupport/modules/archiveServer/var/xmlrpc/xr_cli_test.py @@ -0,0 +1,89 @@ +#!/usr/bin/python + +#------------------------------------------------------------------------------ +# +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the LiveSupport project. +# http://livesupport.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# LiveSupport 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. +# +# LiveSupport 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 LiveSupport; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: tomas $ +# Version : $Revision: 1.1 $ +# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/archiveServer/var/xmlrpc/Attic/xr_cli_test.py,v $ +# +#------------------------------------------------------------------------------ + +from xmlrpclib import * +import sys + +if len(sys.argv)<3: + print """ + Usage: xr_cli_pok.py [-v] [-s http:////xmlrpc/xrGreenBox.php] + commands and args: + listMethods + methodHelp + methodSignature + ping + login + logout +""" + sys.exit(1) + +pars = sys.argv +verbose=0 +if pars[1]=="-v": + pars.pop(1) + verbose=1 +if pars[1]=="-s": + pars.pop(1) + serverPath = pars.pop(1) +else: + serverPath = 'http://localhost:80/storage/xmlrpc/xrLocStor.php' +server = Server(serverPath) +method = pars.pop(1) +pars.pop(0) +if verbose: + print "method: "+method + print "pars: " + print pars + print "result:" +#sys.exit(0) + +try: + if method=="listMethods": + print server.system.listMethods() + elif method=="methodHelp": + print server.system.methodHelp(pars[0]) + elif method=="methodSignature": + print server.system.methodSignature(pars[0]) + elif method=="ping": + print server.archive.ping({'par':pars[0]}) + elif method=="login": + print server.archive.login({'login':pars[0], 'pass':pars[1]}) + elif method=="logout": + print server.archive.logout({'sessid':pars[0]}) + elif method=="downloadOpen": + print server.archive.downloadOpen({'sessid':pars[0], 'gunid':pars[1]}) + elif method=="downloadClose": + print server.archive.downloadClose({'sessid':pars[0], 'url':pars[1]}) + else: + print "Unknown command: "+method + sys.exit(1) +except Error, v: + print "XML-RPC Error:",v