[-]
[+]
|
Changed |
php-pear.spec
|
|
[-]
[+]
|
Deleted |
Archive_Tar-1.3.2.tgz/Archive_Tar-1.3.2/Archive/Tar.php
^
|
@@ -1,1815 +0,0 @@
-<?php
-/* vim: set ts=4 sw=4: */
-// +----------------------------------------------------------------------+
-// | PHP Version 4 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1997-2003 The PHP Group |
-// +----------------------------------------------------------------------+
-// | This source file is subject to version 3.0 of the PHP license, |
-// | that is bundled with this package in the file LICENSE, and is |
-// | available through the world-wide-web at the following url: |
-// | http://www.php.net/license/3_0.txt. |
-// | If you did not receive a copy of the PHP license and are unable to |
-// | obtain it through the world-wide-web, please send a note to |
-// | license@php.net so we can mail you a copy immediately. |
-// +----------------------------------------------------------------------+
-// | Author: Vincent Blavet <vincent@phpconcept.net> |
-// +----------------------------------------------------------------------+
-//
-// $Id: Tar.php,v 1.39 2006/12/22 19:20:08 cellog Exp $
-
-require_once 'PEAR.php';
-
-
-define ('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
-define ('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));
-
-/**
-* Creates a (compressed) Tar archive
-*
-* @author Vincent Blavet <vincent@phpconcept.net>
-* @version $Revision: 1.39 $
-* @package Archive
-*/
-class Archive_Tar extends PEAR
-{
- /**
- * @var string Name of the Tar
- */
- var $_tarname='';
-
- /**
- * @var boolean if true, the Tar file will be gzipped
- */
- var $_compress=false;
-
- /**
- * @var string Type of compression : 'none', 'gz' or 'bz2'
- */
- var $_compress_type='none';
-
- /**
- * @var string Explode separator
- */
- var $_separator=' ';
-
- /**
- * @var file descriptor
- */
- var $_file=0;
-
- /**
- * @var string Local Tar name of a remote Tar (http:// or ftp://)
- */
- var $_temp_tarname='';
-
- // {{{ constructor
- /**
- * Archive_Tar Class constructor. This flavour of the constructor only
- * declare a new Archive_Tar object, identifying it by the name of the
- * tar file.
- * If the compress argument is set the tar will be read or created as a
- * gzip or bz2 compressed TAR file.
- *
- * @param string $p_tarname The name of the tar archive to create
- * @param string $p_compress can be null, 'gz' or 'bz2'. This
- * parameter indicates if gzip or bz2 compression
- * is required. For compatibility reason the
- * boolean value 'true' means 'gz'.
- * @access public
- */
- function Archive_Tar($p_tarname, $p_compress = null)
- {
- $this->PEAR();
- $this->_compress = false;
- $this->_compress_type = 'none';
- if (($p_compress === null) || ($p_compress == '')) {
- if (@file_exists($p_tarname)) {
- if ($fp = @fopen($p_tarname, "rb")) {
- // look for gzip magic cookie
- $data = fread($fp, 2);
- fclose($fp);
- if ($data == "\37\213") {
- $this->_compress = true;
- $this->_compress_type = 'gz';
- // No sure it's enought for a magic code ....
- } elseif ($data == "BZ") {
- $this->_compress = true;
- $this->_compress_type = 'bz2';
- }
- }
- } else {
- // probably a remote file or some file accessible
- // through a stream interface
- if (substr($p_tarname, -2) == 'gz') {
- $this->_compress = true;
- $this->_compress_type = 'gz';
- } elseif ((substr($p_tarname, -3) == 'bz2') ||
- (substr($p_tarname, -2) == 'bz')) {
- $this->_compress = true;
- $this->_compress_type = 'bz2';
- }
- }
- } else {
- if (($p_compress === true) || ($p_compress == 'gz')) {
- $this->_compress = true;
- $this->_compress_type = 'gz';
- } else if ($p_compress == 'bz2') {
- $this->_compress = true;
- $this->_compress_type = 'bz2';
- } else {
- die("Unsupported compression type '$p_compress'\n".
- "Supported types are 'gz' and 'bz2'.\n");
- return false;
- }
- }
- $this->_tarname = $p_tarname;
- if ($this->_compress) { // assert zlib or bz2 extension support
- if ($this->_compress_type == 'gz')
- $extname = 'zlib';
- else if ($this->_compress_type == 'bz2')
- $extname = 'bz2';
-
- if (!extension_loaded($extname)) {
- PEAR::loadExtension($extname);
- }
- if (!extension_loaded($extname)) {
- die("The extension '$extname' couldn't be found.\n".
- "Please make sure your version of PHP was built ".
- "with '$extname' support.\n");
- return false;
- }
- }
- }
- // }}}
-
- // {{{ destructor
- function _Archive_Tar()
- {
- $this->_close();
- // ----- Look for a local copy to delete
- if ($this->_temp_tarname != '')
- @unlink($this->_temp_tarname);
- $this->_PEAR();
- }
- // }}}
-
- // {{{ create()
- /**
- * This method creates the archive file and add the files / directories
- * that are listed in $p_filelist.
- * If a file with the same name exist and is writable, it is replaced
- * by the new tar.
- * The method return false and a PEAR error text.
- * The $p_filelist parameter can be an array of string, each string
- * representing a filename or a directory name with their path if
- * needed. It can also be a single string with names separated by a
- * single blank.
- * For each directory added in the archive, the files and
- * sub-directories are also added.
- * See also createModify() method for more details.
- *
- * @param array $p_filelist An array of filenames and directory names, or a
- * single string with names separated by a single
- * blank space.
- * @return true on success, false on error.
- * @see createModify()
- * @access public
- */
- function create($p_filelist)
- {
- return $this->createModify($p_filelist, '', '');
- }
- // }}}
-
- // {{{ add()
- /**
- * This method add the files / directories that are listed in $p_filelist in
- * the archive. If the archive does not exist it is created.
- * The method return false and a PEAR error text.
- * The files and directories listed are only added at the end of the archive,
- * even if a file with the same name is already archived.
- * See also createModify() method for more details.
- *
- * @param array $p_filelist An array of filenames and directory names, or a
- * single string with names separated by a single
- * blank space.
- * @return true on success, false on error.
- * @see createModify()
- * @access public
- */
- function add($p_filelist)
- {
- return $this->addModify($p_filelist, '', '');
- }
- // }}}
-
- // {{{ extract()
- function extract($p_path='')
- {
- return $this->extractModify($p_path, '');
- }
- // }}}
-
- // {{{ listContent()
- function listContent()
- {
- $v_list_detail = array();
-
- if ($this->_openRead()) {
- if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
- unset($v_list_detail);
- $v_list_detail = 0;
- }
- $this->_close();
- }
-
- return $v_list_detail;
- }
- // }}}
-
- // {{{ createModify()
- /**
- * This method creates the archive file and add the files / directories
- * that are listed in $p_filelist.
- * If the file already exists and is writable, it is replaced by the
- * new tar. It is a create and not an add. If the file exists and is
- * read-only or is a directory it is not replaced. The method return
- * false and a PEAR error text.
- * The $p_filelist parameter can be an array of string, each string
- * representing a filename or a directory name with their path if
- * needed. It can also be a single string with names separated by a
- * single blank.
- * The path indicated in $p_remove_dir will be removed from the
- * memorized path of each file / directory listed when this path
- * exists. By default nothing is removed (empty path '')
- * The path indicated in $p_add_dir will be added at the beginning of
- * the memorized path of each file / directory listed. However it can
- * be set to empty ''. The adding of a path is done after the removing
- * of path.
- * The path add/remove ability enables the user to prepare an archive
- * for extraction in a different path than the origin files are.
- * See also addModify() method for file adding properties.
- *
- * @param array $p_filelist An array of filenames and directory names,
- * or a single string with names separated by
- * a single blank space.
- * @param string $p_add_dir A string which contains a path to be added
- * to the memorized path of each element in
- * the list.
- * @param string $p_remove_dir A string which contains a path to be
- * removed from the memorized path of each
- * element in the list, when relevant.
- * @return boolean true on success, false on error.
- * @access public
- * @see addModify()
- */
- function createModify($p_filelist, $p_add_dir, $p_remove_dir='')
- {
- $v_result = true;
-
- if (!$this->_openWrite())
- return false;
-
- if ($p_filelist != '') {
- if (is_array($p_filelist))
- $v_list = $p_filelist;
- elseif (is_string($p_filelist))
- $v_list = explode($this->_separator, $p_filelist);
- else {
- $this->_cleanFile();
- $this->_error('Invalid file list');
- return false;
- }
-
- $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
- }
-
- if ($v_result) {
- $this->_writeFooter();
- $this->_close();
- } else
- $this->_cleanFile();
-
- return $v_result;
- }
- // }}}
-
- // {{{ addModify()
- /**
- * This method add the files / directories listed in $p_filelist at the
- * end of the existing archive. If the archive does not yet exists it
- * is created.
- * The $p_filelist parameter can be an array of string, each string
- * representing a filename or a directory name with their path if
- * needed. It can also be a single string with names separated by a
- * single blank.
- * The path indicated in $p_remove_dir will be removed from the
- * memorized path of each file / directory listed when this path
- * exists. By default nothing is removed (empty path '')
- * The path indicated in $p_add_dir will be added at the beginning of
- * the memorized path of each file / directory listed. However it can
- * be set to empty ''. The adding of a path is done after the removing
- * of path.
- * The path add/remove ability enables the user to prepare an archive
- * for extraction in a different path than the origin files are.
- * If a file/dir is already in the archive it will only be added at the
- * end of the archive. There is no update of the existing archived
- * file/dir. However while extracting the archive, the last file will
- * replace the first one. This results in a none optimization of the
- * archive size.
- * If a file/dir does not exist the file/dir is ignored. However an
- * error text is send to PEAR error.
- * If a file/dir is not readable the file/dir is ignored. However an
- * error text is send to PEAR error.
- *
- * @param array $p_filelist An array of filenames and directory
- * names, or a single string with names
- * separated by a single blank space.
- * @param string $p_add_dir A string which contains a path to be
- * added to the memorized path of each
- * element in the list.
- * @param string $p_remove_dir A string which contains a path to be
- * removed from the memorized path of
- * each element in the list, when
- * relevant.
- * @return true on success, false on error.
- * @access public
- */
- function addModify($p_filelist, $p_add_dir, $p_remove_dir='')
- {
- $v_result = true;
-
- if (!$this->_isArchive())
- $v_result = $this->createModify($p_filelist, $p_add_dir,
- $p_remove_dir);
- else {
- if (is_array($p_filelist))
- $v_list = $p_filelist;
- elseif (is_string($p_filelist))
- $v_list = explode($this->_separator, $p_filelist);
- else {
- $this->_error('Invalid file list');
- return false;
- }
-
- $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
- }
-
- return $v_result;
- }
- // }}}
-
- // {{{ addString()
- /**
- * This method add a single string as a file at the
- * end of the existing archive. If the archive does not yet exists it
- * is created.
- *
- * @param string $p_filename A string which contains the full
- * filename path that will be associated
- * with the string.
- * @param string $p_string The content of the file added in
- * the archive.
- * @return true on success, false on error.
- * @access public
- */
- function addString($p_filename, $p_string)
- {
- $v_result = true;
-
- if (!$this->_isArchive()) {
- if (!$this->_openWrite()) {
- return false;
- }
- $this->_close();
- }
-
- if (!$this->_openAppend())
- return false;
-
- // Need to check the get back to the temporary file ? ....
- $v_result = $this->_addString($p_filename, $p_string);
-
- $this->_writeFooter();
-
- $this->_close();
-
- return $v_result;
- }
- // }}}
-
- // {{{ extractModify()
- /**
- * This method extract all the content of the archive in the directory
- * indicated by $p_path. When relevant the memorized path of the
- * files/dir can be modified by removing the $p_remove_path path at the
- * beginning of the file/dir path.
- * While extracting a file, if the directory path does not exists it is
- * created.
- * While extracting a file, if the file already exists it is replaced
- * without looking for last modification date.
- * While extracting a file, if the file already exists and is write
- * protected, the extraction is aborted.
- * While extracting a file, if a directory with the same name already
- * exists, the extraction is aborted.
- * While extracting a directory, if a file with the same name already
- * exists, the extraction is aborted.
- * While extracting a file/directory if the destination directory exist
- * and is write protected, or does not exist but can not be created,
- * the extraction is aborted.
- * If after extraction an extracted file does not show the correct
- * stored file size, the extraction is aborted.
- * When the extraction is aborted, a PEAR error text is set and false
- * is returned. However the result can be a partial extraction that may
- * need to be manually cleaned.
- *
- * @param string $p_path The path of the directory where the
- * files/dir need to by extracted.
- * @param string $p_remove_path Part of the memorized path that can be
- * removed if present at the beginning of
- * the file/dir path.
- * @return boolean true on success, false on error.
- * @access public
- * @see extractList()
- */
- function extractModify($p_path, $p_remove_path)
- {
- $v_result = true;
- $v_list_detail = array();
-
- if ($v_result = $this->_openRead()) {
- $v_result = $this->_extractList($p_path, $v_list_detail,
- "complete", 0, $p_remove_path);
- $this->_close();
- }
-
- return $v_result;
- }
- // }}}
-
- // {{{ extractInString()
- /**
- * This method extract from the archive one file identified by $p_filename.
- * The return value is a string with the file content, or NULL on error.
- * @param string $p_filename The path of the file to extract in a string.
- * @return a string with the file content or NULL.
- * @access public
- */
- function extractInString($p_filename)
- {
- if ($this->_openRead()) {
- $v_result = $this->_extractInString($p_filename);
- $this->_close();
- } else {
- $v_result = NULL;
- }
-
- return $v_result;
- }
- // }}}
-
- // {{{ extractList()
- /**
- * This method extract from the archive only the files indicated in the
- * $p_filelist. These files are extracted in the current directory or
- * in the directory indicated by the optional $p_path parameter.
- * If indicated the $p_remove_path can be used in the same way as it is
- * used in extractModify() method.
- * @param array $p_filelist An array of filenames and directory names,
- * or a single string with names separated
- * by a single blank space.
- * @param string $p_path The path of the directory where the
- * files/dir need to by extracted.
- * @param string $p_remove_path Part of the memorized path that can be
- * removed if present at the beginning of
- * the file/dir path.
- * @return true on success, false on error.
- * @access public
- * @see extractModify()
- */
- function extractList($p_filelist, $p_path='', $p_remove_path='')
- {
- $v_result = true;
- $v_list_detail = array();
-
- if (is_array($p_filelist))
- $v_list = $p_filelist;
- elseif (is_string($p_filelist))
- $v_list = explode($this->_separator, $p_filelist);
- else {
- $this->_error('Invalid string list');
- return false;
- }
-
- if ($v_result = $this->_openRead()) {
- $v_result = $this->_extractList($p_path, $v_list_detail, "partial",
- $v_list, $p_remove_path);
- $this->_close();
- }
-
- return $v_result;
- }
- // }}}
-
- // {{{ setAttribute()
- /**
- * This method set specific attributes of the archive. It uses a variable
- * list of parameters, in the format attribute code + attribute values :
- * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ',');
- * @param mixed $argv variable list of attributes and values
- * @return true on success, false on error.
- * @access public
- */
- function setAttribute()
- {
- $v_result = true;
-
- // ----- Get the number of variable list of arguments
- if (($v_size = func_num_args()) == 0) {
- return true;
- }
-
- // ----- Get the arguments
- $v_att_list = &func_get_args();
-
- // ----- Read the attributes
- $i=0;
- while ($i<$v_size) {
-
- // ----- Look for next option
- switch ($v_att_list[$i]) {
- // ----- Look for options that request a string value
- case ARCHIVE_TAR_ATT_SEPARATOR :
- // ----- Check the number of parameters
- if (($i+1) >= $v_size) {
- $this->_error('Invalid number of parameters for '
- .'attribute ARCHIVE_TAR_ATT_SEPARATOR');
- return false;
- }
-
- // ----- Get the value
- $this->_separator = $v_att_list[$i+1];
- $i++;
- break;
-
- default :
- $this->_error('Unknow attribute code '.$v_att_list[$i].'');
- return false;
- }
-
- // ----- Next attribute
- $i++;
- }
-
- return $v_result;
- }
- // }}}
-
- // {{{ _error()
- function _error($p_message)
- {
- // ----- To be completed
- $this->raiseError($p_message);
- }
- // }}}
-
- // {{{ _warning()
- function _warning($p_message)
- {
- // ----- To be completed
- $this->raiseError($p_message);
- }
- // }}}
-
- // {{{ _isArchive()
- function _isArchive($p_filename=NULL)
- {
- if ($p_filename == NULL) {
- $p_filename = $this->_tarname;
- }
- clearstatcache();
- return @is_file($p_filename);
- }
- // }}}
-
- // {{{ _openWrite()
- function _openWrite()
- {
- if ($this->_compress_type == 'gz')
- $this->_file = @gzopen($this->_tarname, "wb9");
- else if ($this->_compress_type == 'bz2')
- $this->_file = @bzopen($this->_tarname, "wb");
- else if ($this->_compress_type == 'none')
- $this->_file = @fopen($this->_tarname, "wb");
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
-
- if ($this->_file == 0) {
- $this->_error('Unable to open in write mode \''
- .$this->_tarname.'\'');
- return false;
- }
-
- return true;
- }
- // }}}
-
- // {{{ _openRead()
- function _openRead()
- {
- if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {
-
- // ----- Look if a local copy need to be done
- if ($this->_temp_tarname == '') {
- $this->_temp_tarname = uniqid('tar').'.tmp';
- if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
- $this->_error('Unable to open in read mode \''
- .$this->_tarname.'\'');
- $this->_temp_tarname = '';
- return false;
- }
- if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
- $this->_error('Unable to open in write mode \''
- .$this->_temp_tarname.'\'');
- $this->_temp_tarname = '';
- return false;
- }
- while ($v_data = @fread($v_file_from, 1024))
- @fwrite($v_file_to, $v_data);
- @fclose($v_file_from);
- @fclose($v_file_to);
- }
-
- // ----- File to open if the local copy
- $v_filename = $this->_temp_tarname;
-
- } else
- // ----- File to open if the normal Tar file
- $v_filename = $this->_tarname;
-
- if ($this->_compress_type == 'gz')
- $this->_file = @gzopen($v_filename, "rb");
- else if ($this->_compress_type == 'bz2')
- $this->_file = @bzopen($v_filename, "rb");
- else if ($this->_compress_type == 'none')
- $this->_file = @fopen($v_filename, "rb");
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
-
- if ($this->_file == 0) {
- $this->_error('Unable to open in read mode \''.$v_filename.'\'');
- return false;
- }
-
- return true;
- }
- // }}}
-
- // {{{ _openReadWrite()
- function _openReadWrite()
- {
- if ($this->_compress_type == 'gz')
- $this->_file = @gzopen($this->_tarname, "r+b");
- else if ($this->_compress_type == 'bz2')
- $this->_file = @bzopen($this->_tarname, "r+b");
- else if ($this->_compress_type == 'none')
- $this->_file = @fopen($this->_tarname, "r+b");
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
-
- if ($this->_file == 0) {
- $this->_error('Unable to open in read/write mode \''
- .$this->_tarname.'\'');
- return false;
- }
-
- return true;
- }
- // }}}
-
- // {{{ _close()
- function _close()
- {
- //if (isset($this->_file)) {
- if (is_resource($this->_file)) {
- if ($this->_compress_type == 'gz')
- @gzclose($this->_file);
- else if ($this->_compress_type == 'bz2')
- @bzclose($this->_file);
- else if ($this->_compress_type == 'none')
- @fclose($this->_file);
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
-
- $this->_file = 0;
- }
-
- // ----- Look if a local copy need to be erase
- // Note that it might be interesting to keep the url for a time : ToDo
- if ($this->_temp_tarname != '') {
- @unlink($this->_temp_tarname);
- $this->_temp_tarname = '';
- }
-
- return true;
- }
- // }}}
-
- // {{{ _cleanFile()
- function _cleanFile()
- {
- $this->_close();
-
- // ----- Look for a local copy
- if ($this->_temp_tarname != '') {
- // ----- Remove the local copy but not the remote tarname
- @unlink($this->_temp_tarname);
- $this->_temp_tarname = '';
- } else {
- // ----- Remove the local tarname file
- @unlink($this->_tarname);
- }
- $this->_tarname = '';
-
- return true;
- }
- // }}}
-
- // {{{ _writeBlock()
- function _writeBlock($p_binary_data, $p_len=null)
- {
- if (is_resource($this->_file)) {
- if ($p_len === null) {
- if ($this->_compress_type == 'gz')
- @gzputs($this->_file, $p_binary_data);
- else if ($this->_compress_type == 'bz2')
- @bzwrite($this->_file, $p_binary_data);
- else if ($this->_compress_type == 'none')
- @fputs($this->_file, $p_binary_data);
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
- } else {
- if ($this->_compress_type == 'gz')
- @gzputs($this->_file, $p_binary_data, $p_len);
- else if ($this->_compress_type == 'bz2')
- @bzwrite($this->_file, $p_binary_data, $p_len);
- else if ($this->_compress_type == 'none')
- @fputs($this->_file, $p_binary_data, $p_len);
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
-
- }
- }
- return true;
- }
- // }}}
-
- // {{{ _readBlock()
- function _readBlock()
- {
- $v_block = null;
- if (is_resource($this->_file)) {
- if ($this->_compress_type == 'gz')
- $v_block = @gzread($this->_file, 512);
- else if ($this->_compress_type == 'bz2')
- $v_block = @bzread($this->_file, 512);
- else if ($this->_compress_type == 'none')
- $v_block = @fread($this->_file, 512);
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
- }
- return $v_block;
- }
- // }}}
-
- // {{{ _jumpBlock()
- function _jumpBlock($p_len=null)
- {
- if (is_resource($this->_file)) {
- if ($p_len === null)
- $p_len = 1;
-
- if ($this->_compress_type == 'gz') {
- @gzseek($this->_file, gztell($this->_file)+($p_len*512));
- }
- else if ($this->_compress_type == 'bz2') {
- // ----- Replace missing bztell() and bzseek()
- for ($i=0; $i<$p_len; $i++)
- $this->_readBlock();
- } else if ($this->_compress_type == 'none')
- @fseek($this->_file, ftell($this->_file)+($p_len*512));
- else
- $this->_error('Unknown or missing compression type ('
- .$this->_compress_type.')');
-
- }
- return true;
- }
- // }}}
-
- // {{{ _writeFooter()
- function _writeFooter()
- {
- if (is_resource($this->_file)) {
- // ----- Write the last 0 filled block for end of archive
- $v_binary_data = pack('a1024', '');
- $this->_writeBlock($v_binary_data);
- }
- return true;
- }
- // }}}
-
- // {{{ _addList()
- function _addList($p_list, $p_add_dir, $p_remove_dir)
- {
- $v_result=true;
- $v_header = array();
-
- // ----- Remove potential windows directory separator
- $p_add_dir = $this->_translateWinPath($p_add_dir);
- $p_remove_dir = $this->_translateWinPath($p_remove_dir, false);
-
- if (!$this->_file) {
- $this->_error('Invalid file descriptor');
- return false;
- }
-
- if (sizeof($p_list) == 0)
- return true;
-
- foreach ($p_list as $v_filename) {
- if (!$v_result) {
- break;
- }
-
- // ----- Skip the current tar name
- if ($v_filename == $this->_tarname)
- continue;
-
- if ($v_filename == '')
- continue;
-
- if (!file_exists($v_filename)) {
- $this->_warning("File '$v_filename' does not exist");
- continue;
- }
-
- // ----- Add the file or directory header
- if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir))
- return false;
-
- if (@is_dir($v_filename)) {
- if (!($p_hdir = opendir($v_filename))) {
- $this->_warning("Directory '$v_filename' can not be read");
- continue;
- }
- while (false !== ($p_hitem = readdir($p_hdir))) {
- if (($p_hitem != '.') && ($p_hitem != '..')) {
- if ($v_filename != ".")
- $p_temp_list[0] = $v_filename.'/'.$p_hitem;
- else
- $p_temp_list[0] = $p_hitem;
-
- $v_result = $this->_addList($p_temp_list,
- $p_add_dir,
- $p_remove_dir);
- }
- }
-
- unset($p_temp_list);
- unset($p_hdir);
- unset($p_hitem);
- }
- }
-
- return $v_result;
- }
- // }}}
-
- // {{{ _addFile()
- function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir)
- {
- if (!$this->_file) {
- $this->_error('Invalid file descriptor');
- return false;
- }
-
- if ($p_filename == '') {
- $this->_error('Invalid file name');
- return false;
- }
-
- // ----- Calculate the stored filename
- $p_filename = $this->_translateWinPath($p_filename, false);;
- $v_stored_filename = $p_filename;
- if (strcmp($p_filename, $p_remove_dir) == 0) {
- return true;
- }
- if ($p_remove_dir != '') {
- if (substr($p_remove_dir, -1) != '/')
- $p_remove_dir .= '/';
-
- if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)
- $v_stored_filename = substr($p_filename, strlen($p_remove_dir));
- }
- $v_stored_filename = $this->_translateWinPath($v_stored_filename);
- if ($p_add_dir != '') {
- if (substr($p_add_dir, -1) == '/')
- $v_stored_filename = $p_add_dir.$v_stored_filename;
- else
- $v_stored_filename = $p_add_dir.'/'.$v_stored_filename;
- }
-
- $v_stored_filename = $this->_pathReduction($v_stored_filename);
-
- if ($this->_isArchive($p_filename)) {
- if (($v_file = @fopen($p_filename, "rb")) == 0) {
- $this->_warning("Unable to open file '".$p_filename
- ."' in binary read mode");
- return true;
- }
-
- if (!$this->_writeHeader($p_filename, $v_stored_filename))
- return false;
-
- while (($v_buffer = fread($v_file, 512)) != '') {
- $v_binary_data = pack("a512", "$v_buffer");
- $this->_writeBlock($v_binary_data);
- }
-
- fclose($v_file);
-
- } else {
- // ----- Only header for dir
- if (!$this->_writeHeader($p_filename, $v_stored_filename))
- return false;
- }
-
- return true;
- }
- // }}}
-
- // {{{ _addString()
- function _addString($p_filename, $p_string)
- {
- if (!$this->_file) {
- $this->_error('Invalid file descriptor');
- return false;
- }
-
- if ($p_filename == '') {
- $this->_error('Invalid file name');
- return false;
- }
-
- // ----- Calculate the stored filename
- $p_filename = $this->_translateWinPath($p_filename, false);;
-
- if (!$this->_writeHeaderBlock($p_filename, strlen($p_string),
- time(), 384, "", 0, 0))
- return false;
-
- $i=0;
- while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') {
- $v_binary_data = pack("a512", $v_buffer);
- $this->_writeBlock($v_binary_data);
- }
-
- return true;
- }
- // }}}
-
- // {{{ _writeHeader()
- function _writeHeader($p_filename, $p_stored_filename)
- {
- if ($p_stored_filename == '')
- $p_stored_filename = $p_filename;
- $v_reduce_filename = $this->_pathReduction($p_stored_filename);
-
- if (strlen($v_reduce_filename) > 99) {
- if (!$this->_writeLongHeader($v_reduce_filename))
- return false;
- }
-
- $v_info = stat($p_filename);
- $v_uid = sprintf("%6s ", DecOct($v_info[4]));
- $v_gid = sprintf("%6s ", DecOct($v_info[5]));
- $v_perms = sprintf("%6s ", DecOct(fileperms($p_filename)));
-
- $v_mtime = sprintf("%11s", DecOct(filemtime($p_filename)));
-
- if (@is_dir($p_filename)) {
- $v_typeflag = "5";
- $v_size = sprintf("%11s ", DecOct(0));
- } else {
- $v_typeflag = '';
- clearstatcache();
- $v_size = sprintf("%11s ", DecOct(filesize($p_filename)));
- }
-
- $v_linkname = '';
-
- $v_magic = '';
-
- $v_version = '';
-
- $v_uname = '';
-
- $v_gname = '';
-
- $v_devmajor = '';
-
- $v_devminor = '';
-
- $v_prefix = '';
-
- $v_binary_data_first = pack("a100a8a8a8a12A12",
- $v_reduce_filename, $v_perms, $v_uid,
- $v_gid, $v_size, $v_mtime);
- $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
- $v_typeflag, $v_linkname, $v_magic,
- $v_version, $v_uname, $v_gname,
- $v_devmajor, $v_devminor, $v_prefix, '');
-
- // ----- Calculate the checksum
- $v_checksum = 0;
- // ..... First part of the header
- for ($i=0; $i<148; $i++)
- $v_checksum += ord(substr($v_binary_data_first,$i,1));
- // ..... Ignore the checksum value and replace it by ' ' (space)
- for ($i=148; $i<156; $i++)
- $v_checksum += ord(' ');
- // ..... Last part of the header
- for ($i=156, $j=0; $i<512; $i++, $j++)
- $v_checksum += ord(substr($v_binary_data_last,$j,1));
-
- // ----- Write the first 148 bytes of the header in the archive
- $this->_writeBlock($v_binary_data_first, 148);
-
- // ----- Write the calculated checksum
- $v_checksum = sprintf("%6s ", DecOct($v_checksum));
- $v_binary_data = pack("a8", $v_checksum);
- $this->_writeBlock($v_binary_data, 8);
-
- // ----- Write the last 356 bytes of the header in the archive
- $this->_writeBlock($v_binary_data_last, 356);
-
- return true;
- }
- // }}}
-
- // {{{ _writeHeaderBlock()
- function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0,
- $p_type='', $p_uid=0, $p_gid=0)
- {
- $p_filename = $this->_pathReduction($p_filename);
-
- if (strlen($p_filename) > 99) {
- if (!$this->_writeLongHeader($p_filename))
- return false;
- }
-
- if ($p_type == "5") {
- $v_size = sprintf("%11s ", DecOct(0));
- } else {
- $v_size = sprintf("%11s ", DecOct($p_size));
- }
-
- $v_uid = sprintf("%6s ", DecOct($p_uid));
- $v_gid = sprintf("%6s ", DecOct($p_gid));
- $v_perms = sprintf("%6s ", DecOct($p_perms));
-
- $v_mtime = sprintf("%11s", DecOct($p_mtime));
-
- $v_linkname = '';
-
- $v_magic = '';
-
- $v_version = '';
-
- $v_uname = '';
-
- $v_gname = '';
-
- $v_devmajor = '';
-
- $v_devminor = '';
-
- $v_prefix = '';
-
- $v_binary_data_first = pack("a100a8a8a8a12A12",
- $p_filename, $v_perms, $v_uid, $v_gid,
- $v_size, $v_mtime);
- $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
- $p_type, $v_linkname, $v_magic,
- $v_version, $v_uname, $v_gname,
- $v_devmajor, $v_devminor, $v_prefix, '');
-
- // ----- Calculate the checksum
- $v_checksum = 0;
- // ..... First part of the header
- for ($i=0; $i<148; $i++)
- $v_checksum += ord(substr($v_binary_data_first,$i,1));
- // ..... Ignore the checksum value and replace it by ' ' (space)
- for ($i=148; $i<156; $i++)
- $v_checksum += ord(' ');
- // ..... Last part of the header
- for ($i=156, $j=0; $i<512; $i++, $j++)
- $v_checksum += ord(substr($v_binary_data_last,$j,1));
-
- // ----- Write the first 148 bytes of the header in the archive
- $this->_writeBlock($v_binary_data_first, 148);
-
- // ----- Write the calculated checksum
- $v_checksum = sprintf("%6s ", DecOct($v_checksum));
- $v_binary_data = pack("a8", $v_checksum);
- $this->_writeBlock($v_binary_data, 8);
-
- // ----- Write the last 356 bytes of the header in the archive
- $this->_writeBlock($v_binary_data_last, 356);
-
- return true;
- }
- // }}}
-
- // {{{ _writeLongHeader()
- function _writeLongHeader($p_filename)
- {
- $v_size = sprintf("%11s ", DecOct(strlen($p_filename)));
-
- $v_typeflag = 'L';
-
- $v_linkname = '';
-
- $v_magic = '';
-
- $v_version = '';
-
- $v_uname = '';
-
- $v_gname = '';
-
- $v_devmajor = '';
-
- $v_devminor = '';
-
- $v_prefix = '';
-
- $v_binary_data_first = pack("a100a8a8a8a12A12",
- '././@LongLink', 0, 0, 0, $v_size, 0);
- $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
- $v_typeflag, $v_linkname, $v_magic,
- $v_version, $v_uname, $v_gname,
- $v_devmajor, $v_devminor, $v_prefix, '');
-
- // ----- Calculate the checksum
- $v_checksum = 0;
- // ..... First part of the header
- for ($i=0; $i<148; $i++)
- $v_checksum += ord(substr($v_binary_data_first,$i,1));
- // ..... Ignore the checksum value and replace it by ' ' (space)
- for ($i=148; $i<156; $i++)
- $v_checksum += ord(' ');
- // ..... Last part of the header
- for ($i=156, $j=0; $i<512; $i++, $j++)
- $v_checksum += ord(substr($v_binary_data_last,$j,1));
-
- // ----- Write the first 148 bytes of the header in the archive
- $this->_writeBlock($v_binary_data_first, 148);
-
- // ----- Write the calculated checksum
- $v_checksum = sprintf("%6s ", DecOct($v_checksum));
- $v_binary_data = pack("a8", $v_checksum);
- $this->_writeBlock($v_binary_data, 8);
-
- // ----- Write the last 356 bytes of the header in the archive
- $this->_writeBlock($v_binary_data_last, 356);
-
- // ----- Write the filename as content of the block
- $i=0;
- while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') {
- $v_binary_data = pack("a512", "$v_buffer");
- $this->_writeBlock($v_binary_data);
- }
-
- return true;
- }
- // }}}
-
- // {{{ _readHeader()
- function _readHeader($v_binary_data, &$v_header)
- {
- if (strlen($v_binary_data)==0) {
- $v_header['filename'] = '';
- return true;
- }
-
- if (strlen($v_binary_data) != 512) {
- $v_header['filename'] = '';
- $this->_error('Invalid block size : '.strlen($v_binary_data));
- return false;
- }
-
- if (!is_array($v_header)) {
- $v_header = array();
- }
- // ----- Calculate the checksum
- $v_checksum = 0;
- // ..... First part of the header
- for ($i=0; $i<148; $i++)
- $v_checksum+=ord(substr($v_binary_data,$i,1));
- // ..... Ignore the checksum value and replace it by ' ' (space)
- for ($i=148; $i<156; $i++)
- $v_checksum += ord(' ');
- // ..... Last part of the header
- for ($i=156; $i<512; $i++)
- $v_checksum+=ord(substr($v_binary_data,$i,1));
-
- $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/"
- ."a8checksum/a1typeflag/a100link/a6magic/a2version/"
- ."a32uname/a32gname/a8devmajor/a8devminor",
- $v_binary_data);
-
- // ----- Extract the checksum
- $v_header['checksum'] = OctDec(trim($v_data['checksum']));
- if ($v_header['checksum'] != $v_checksum) {
- $v_header['filename'] = '';
-
- // ----- Look for last block (empty block)
- if (($v_checksum == 256) && ($v_header['checksum'] == 0))
- return true;
-
- $this->_error('Invalid checksum for file "'.$v_data['filename']
- .'" : '.$v_checksum.' calculated, '
- .$v_header['checksum'].' expected');
- return false;
- }
-
- // ----- Extract the properties
- $v_header['filename'] = trim($v_data['filename']);
- if ($this->_maliciousFilename($v_header['filename'])) {
- $this->_error('Malicious .tar detected, file "' . $v_header['filename'] .
- '" will not install in desired directory tree');
- return false;
- }
- $v_header['mode'] = OctDec(trim($v_data['mode']));
- $v_header['uid'] = OctDec(trim($v_data['uid']));
- $v_header['gid'] = OctDec(trim($v_data['gid']));
- $v_header['size'] = OctDec(trim($v_data['size']));
- $v_header['mtime'] = OctDec(trim($v_data['mtime']));
- if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
- $v_header['size'] = 0;
- }
- $v_header['link'] = trim($v_data['link']);
- /* ----- All these fields are removed form the header because
- they do not carry interesting info
- $v_header[magic] = trim($v_data[magic]);
- $v_header[version] = trim($v_data[version]);
- $v_header[uname] = trim($v_data[uname]);
- $v_header[gname] = trim($v_data[gname]);
- $v_header[devmajor] = trim($v_data[devmajor]);
- $v_header[devminor] = trim($v_data[devminor]);
- */
-
- return true;
- }
- // }}}
-
- // {{{ _maliciousFilename()
- /**
- * Detect and report a malicious file name
- *
- * @param string $file
- * @return bool
- * @access private
- */
- function _maliciousFilename($file)
- {
- if (strpos($file, '/../') !== false) {
- return true;
- }
- if (strpos($file, '../') === 0) {
- return true;
- }
- return false;
- }
- // }}}
-
- // {{{ _readLongHeader()
- function _readLongHeader(&$v_header)
- {
- $v_filename = '';
- $n = floor($v_header['size']/512);
- for ($i=0; $i<$n; $i++) {
- $v_content = $this->_readBlock();
- $v_filename .= $v_content;
- }
- if (($v_header['size'] % 512) != 0) {
- $v_content = $this->_readBlock();
- $v_filename .= $v_content;
- }
-
- // ----- Read the next header
- $v_binary_data = $this->_readBlock();
-
- if (!$this->_readHeader($v_binary_data, $v_header))
- return false;
-
- $v_header['filename'] = $v_filename;
- if ($this->_maliciousFilename($v_filename)) {
- $this->_error('Malicious .tar detected, file "' . $v_filename .
- '" will not install in desired directory tree');
- return false;
- }
-
- return true;
- }
- // }}}
-
- // {{{ _extractInString()
- /**
- * This method extract from the archive one file identified by $p_filename.
- * The return value is a string with the file content, or NULL on error.
- * @param string $p_filename The path of the file to extract in a string.
- * @return a string with the file content or NULL.
- * @access private
- */
- function _extractInString($p_filename)
- {
- $v_result_str = "";
-
- While (strlen($v_binary_data = $this->_readBlock()) != 0)
- {
- if (!$this->_readHeader($v_binary_data, $v_header))
- return NULL;
-
- if ($v_header['filename'] == '')
- continue;
-
- // ----- Look for long filename
- if ($v_header['typeflag'] == 'L') {
- if (!$this->_readLongHeader($v_header))
- return NULL;
- }
-
- if ($v_header['filename'] == $p_filename) {
- if ($v_header['typeflag'] == "5") {
- $this->_error('Unable to extract in string a directory '
- .'entry {'.$v_header['filename'].'}');
- return NULL;
- } else {
- $n = floor($v_header['size']/512);
- for ($i=0; $i<$n; $i++) {
- $v_result_str .= $this->_readBlock();
- }
- if (($v_header['size'] % 512) != 0) {
- $v_content = $this->_readBlock();
- $v_result_str .= substr($v_content, 0,
- ($v_header['size'] % 512));
- }
- return $v_result_str;
- }
- } else {
- $this->_jumpBlock(ceil(($v_header['size']/512)));
- }
- }
-
- return NULL;
- }
- // }}}
-
- // {{{ _extractList()
- function _extractList($p_path, &$p_list_detail, $p_mode,
- $p_file_list, $p_remove_path)
- {
- $v_result=true;
- $v_nb = 0;
- $v_extract_all = true;
- $v_listing = false;
-
- $p_path = $this->_translateWinPath($p_path, false);
- if ($p_path == '' || (substr($p_path, 0, 1) != '/'
- && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) {
- $p_path = "./".$p_path;
- }
- $p_remove_path = $this->_translateWinPath($p_remove_path);
-
- // ----- Look for path to remove format (should end by /)
- if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/'))
- $p_remove_path .= '/';
- $p_remove_path_size = strlen($p_remove_path);
-
- switch ($p_mode) {
- case "complete" :
- $v_extract_all = TRUE;
- $v_listing = FALSE;
- break;
- case "partial" :
- $v_extract_all = FALSE;
- $v_listing = FALSE;
- break;
- case "list" :
- $v_extract_all = FALSE;
- $v_listing = TRUE;
- break;
- default :
- $this->_error('Invalid extract mode ('.$p_mode.')');
- return false;
- }
-
- clearstatcache();
-
- while (strlen($v_binary_data = $this->_readBlock()) != 0)
- {
- $v_extract_file = FALSE;
- $v_extraction_stopped = 0;
-
- if (!$this->_readHeader($v_binary_data, $v_header))
- return false;
-
- if ($v_header['filename'] == '') {
- continue;
- }
-
- // ----- Look for long filename
- if ($v_header['typeflag'] == 'L') {
- if (!$this->_readLongHeader($v_header))
- return false;
- }
-
- if ((!$v_extract_all) && (is_array($p_file_list))) {
- // ----- By default no unzip if the file is not found
- $v_extract_file = false;
-
- for ($i=0; $i<sizeof($p_file_list); $i++) {
- // ----- Look if it is a directory
- if (substr($p_file_list[$i], -1) == '/') {
- // ----- Look if the directory is in the filename path
- if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
- && (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
- == $p_file_list[$i])) {
- $v_extract_file = TRUE;
- break;
- }
- }
-
- // ----- It is a file, so compare the file names
- elseif ($p_file_list[$i] == $v_header['filename']) {
- $v_extract_file = TRUE;
- break;
- }
- }
- } else {
- $v_extract_file = TRUE;
- }
-
- // ----- Look if this file need to be extracted
- if (($v_extract_file) && (!$v_listing))
- {
- if (($p_remove_path != '')
- && (substr($v_header['filename'], 0, $p_remove_path_size)
- == $p_remove_path))
- $v_header['filename'] = substr($v_header['filename'],
- $p_remove_path_size);
- if (($p_path != './') && ($p_path != '/')) {
- while (substr($p_path, -1) == '/')
- $p_path = substr($p_path, 0, strlen($p_path)-1);
-
- if (substr($v_header['filename'], 0, 1) == '/')
- $v_header['filename'] = $p_path.$v_header['filename'];
- else
- $v_header['filename'] = $p_path.'/'.$v_header['filename'];
- }
- if (file_exists($v_header['filename'])) {
- if ( (@is_dir($v_header['filename']))
- && ($v_header['typeflag'] == '')) {
- $this->_error('File '.$v_header['filename']
- .' already exists as a directory');
- return false;
- }
- if ( ($this->_isArchive($v_header['filename']))
- && ($v_header['typeflag'] == "5")) {
- $this->_error('Directory '.$v_header['filename']
- .' already exists as a file');
- return false;
- }
- if (!is_writeable($v_header['filename'])) {
- $this->_error('File '.$v_header['filename']
- .' already exists and is write protected');
- return false;
- }
- if (filemtime($v_header['filename']) > $v_header['mtime']) {
- // To be completed : An error or silent no replace ?
- }
- }
-
- // ----- Check the directory availability and create it if necessary
- elseif (($v_result
- = $this->_dirCheck(($v_header['typeflag'] == "5"
- ?$v_header['filename']
- :dirname($v_header['filename'])))) != 1) {
- $this->_error('Unable to create path for '.$v_header['filename']);
- return false;
- }
-
- if ($v_extract_file) {
- if ($v_header['typeflag'] == "5") {
- if (!@file_exists($v_header['filename'])) {
- if (!@mkdir($v_header['filename'], 0777)) {
- $this->_error('Unable to create directory {'
- .$v_header['filename'].'}');
- return false;
- }
- }
- } elseif ($v_header['typeflag'] == "2") {
- if (!@symlink($v_header['link'], $v_header['filename'])) {
- $this->_error('Unable to extract symbolic link {'
- .$v_header['filename'].'}');
- return false;
- }
- } else {
- if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) {
- $this->_error('Error while opening {'.$v_header['filename']
- .'} in write binary mode');
- return false;
- } else {
- $n = floor($v_header['size']/512);
- for ($i=0; $i<$n; $i++) {
- $v_content = $this->_readBlock();
- fwrite($v_dest_file, $v_content, 512);
- }
- if (($v_header['size'] % 512) != 0) {
- $v_content = $this->_readBlock();
- fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
- }
-
- @fclose($v_dest_file);
-
- // ----- Change the file mode, mtime
- @touch($v_header['filename'], $v_header['mtime']);
- if ($v_header['mode'] & 0111) {
- // make file executable, obey umask
- $mode = fileperms($v_header['filename']) | (~umask() & 0111);
- @chmod($v_header['filename'], $mode);
- }
- }
-
- // ----- Check the file size
- clearstatcache();
- if (filesize($v_header['filename']) != $v_header['size']) {
- $this->_error('Extracted file '.$v_header['filename']
- .' does not have the correct file size \''
- .filesize($v_header['filename'])
- .'\' ('.$v_header['size']
- .' expected). Archive may be corrupted.');
- return false;
- }
- }
- } else {
- $this->_jumpBlock(ceil(($v_header['size']/512)));
- }
- } else {
- $this->_jumpBlock(ceil(($v_header['size']/512)));
- }
-
- /* TBC : Seems to be unused ...
- if ($this->_compress)
- $v_end_of_file = @gzeof($this->_file);
- else
- $v_end_of_file = @feof($this->_file);
- */
-
- if ($v_listing || $v_extract_file || $v_extraction_stopped) {
- // ----- Log extracted files
- if (($v_file_dir = dirname($v_header['filename']))
- == $v_header['filename'])
- $v_file_dir = '';
- if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == ''))
- $v_file_dir = '/';
-
- $p_list_detail[$v_nb++] = $v_header;
- if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) {
- return true;
- }
- }
- }
-
- return true;
- }
- // }}}
-
- // {{{ _openAppend()
- function _openAppend()
- {
- if (filesize($this->_tarname) == 0)
- return $this->_openWrite();
-
- if ($this->_compress) {
- $this->_close();
-
- if (!@rename($this->_tarname, $this->_tarname.".tmp")) {
- $this->_error('Error while renaming \''.$this->_tarname
- .'\' to temporary file \''.$this->_tarname
- .'.tmp\'');
- return false;
- }
-
- if ($this->_compress_type == 'gz')
- $v_temp_tar = @gzopen($this->_tarname.".tmp", "rb");
- elseif ($this->_compress_type == 'bz2')
- $v_temp_tar = @bzopen($this->_tarname.".tmp", "rb");
-
- if ($v_temp_tar == 0) {
- $this->_error('Unable to open file \''.$this->_tarname
- .'.tmp\' in binary read mode');
- @rename($this->_tarname.".tmp", $this->_tarname);
- return false;
- }
-
- if (!$this->_openWrite()) {
- @rename($this->_tarname.".tmp", $this->_tarname);
- return false;
- }
-
- if ($this->_compress_type == 'gz') {
- while (!@gzeof($v_temp_tar)) {
- $v_buffer = @gzread($v_temp_tar, 512);
- if ($v_buffer == ARCHIVE_TAR_END_BLOCK) {
- // do not copy end blocks, we will re-make them
- // after appending
- continue;
- }
- $v_binary_data = pack("a512", $v_buffer);
- $this->_writeBlock($v_binary_data);
- }
-
- @gzclose($v_temp_tar);
- }
- elseif ($this->_compress_type == 'bz2') {
- while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) {
- if ($v_buffer == ARCHIVE_TAR_END_BLOCK) {
- continue;
- }
- $v_binary_data = pack("a512", $v_buffer);
- $this->_writeBlock($v_binary_data);
- }
-
- @bzclose($v_temp_tar);
- }
-
- if (!@unlink($this->_tarname.".tmp")) {
- $this->_error('Error while deleting temporary file \''
- .$this->_tarname.'.tmp\'');
- }
-
- } else {
- // ----- For not compressed tar, just add files before the last
- // one or two 512 bytes block
- if (!$this->_openReadWrite())
- return false;
-
- clearstatcache();
- $v_size = filesize($this->_tarname);
-
- // We might have zero, one or two end blocks.
- // The standard is two, but we should try to handle
- // other cases.
- fseek($this->_file, $v_size - 1024);
- if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
- fseek($this->_file, $v_size - 1024);
- }
- elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
- fseek($this->_file, $v_size - 512);
- }
- }
-
- return true;
- }
- // }}}
-
- // {{{ _append()
- function _append($p_filelist, $p_add_dir='', $p_remove_dir='')
- {
- if (!$this->_openAppend())
- return false;
-
- if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir))
- $this->_writeFooter();
-
- $this->_close();
-
- return true;
- }
- // }}}
-
- // {{{ _dirCheck()
-
- /**
- * Check if a directory exists and create it (including parent
- * dirs) if not.
- *
- * @param string $p_dir directory to check
- *
- * @return bool TRUE if the directory exists or was created
- */
- function _dirCheck($p_dir)
- {
- clearstatcache();
- if ((@is_dir($p_dir)) || ($p_dir == ''))
- return true;
-
- $p_parent_dir = dirname($p_dir);
-
- if (($p_parent_dir != $p_dir) &&
- ($p_parent_dir != '') &&
- (!$this->_dirCheck($p_parent_dir)))
- return false;
-
- if (!@mkdir($p_dir, 0777)) {
- $this->_error("Unable to create directory '$p_dir'");
- return false;
- }
-
- return true;
- }
-
- // }}}
-
- // {{{ _pathReduction()
-
- /**
- * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar",
- * rand emove double slashes.
- *
- * @param string $p_dir path to reduce
- *
- * @return string reduced path
- *
- * @access private
- *
- */
- function _pathReduction($p_dir)
- {
- $v_result = '';
-
- // ----- Look for not empty path
- if ($p_dir != '') {
- // ----- Explode path by directory names
- $v_list = explode('/', $p_dir);
-
- // ----- Study directories from last to first
- for ($i=sizeof($v_list)-1; $i>=0; $i--) {
- // ----- Look for current path
- if ($v_list[$i] == ".") {
- // ----- Ignore this directory
- // Should be the first $i=0, but no check is done
- }
- else if ($v_list[$i] == "..") {
- // ----- Ignore it and ignore the $i-1
- $i--;
- }
- else if ( ($v_list[$i] == '')
- && ($i!=(sizeof($v_list)-1))
- && ($i!=0)) {
- // ----- Ignore only the double '//' in path,
- // but not the first and last /
- } else {
- $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/'
- .$v_result:'');
- }
- }
- }
- $v_result = strtr($v_result, '\\', '/');
- return $v_result;
- }
-
- // }}}
-
- // {{{ _translateWinPath()
- function _translateWinPath($p_path, $p_remove_disk_letter=true)
- {
- if (defined('OS_WINDOWS') && OS_WINDOWS) {
- // ----- Look for potential disk letter
- if ( ($p_remove_disk_letter)
- && (($v_position = strpos($p_path, ':')) != false)) {
- $p_path = substr($p_path, $v_position+1);
- }
- // ----- Change potential windows directory separator
- if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
- $p_path = strtr($p_path, '\\', '/');
- }
- }
- return $p_path;
- }
- // }}}
-
-}
-?>
|
[-]
[+]
|
Added |
Archive_Tar-1.3.3.tgz/Archive_Tar-1.3.3/Archive/Tar.php
^
|
@@ -0,0 +1,1848 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * File::CSV
+ *
+ * PHP versions 4 and 5
+ *
+ * Copyright (c) 1997-2008,
+ * Vincent Blavet <vincent@phpconcept.net>
+ * 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.
+ *
+ * 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 COPYRIGHT OWNER 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.
+ *
+ *
+ * @category File_Formats
+ * @package Archive_Tar
+ * @author Vincent Blavet <vincent@phpconcept.net>
+ * @copyright 1997-2008 The Authors
+ * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
+ * @version CVS: $Id: Tar.php,v 1.43 2008/10/30 17:58:42 dufuz Exp $
+ * @link http://pear.php.net/package/Archive_Tar
+ */
+
+require_once 'PEAR.php';
+
+
+define ('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
+define ('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));
+
+/**
+* Creates a (compressed) Tar archive
+*
+* @author Vincent Blavet <vincent@phpconcept.net>
+* @version $Revision: 1.43 $
+* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
+* @package Archive_Tar
+*/
+class Archive_Tar extends PEAR
+{
+ /**
+ * @var string Name of the Tar
+ */
+ var $_tarname='';
+
+ /**
+ * @var boolean if true, the Tar file will be gzipped
+ */
+ var $_compress=false;
+
+ /**
+ * @var string Type of compression : 'none', 'gz' or 'bz2'
+ */
+ var $_compress_type='none';
+
+ /**
+ * @var string Explode separator
+ */
+ var $_separator=' ';
+
+ /**
+ * @var file descriptor
+ */
+ var $_file=0;
+
+ /**
+ * @var string Local Tar name of a remote Tar (http:// or ftp://)
+ */
+ var $_temp_tarname='';
+
+ // {{{ constructor
+ /**
+ * Archive_Tar Class constructor. This flavour of the constructor only
+ * declare a new Archive_Tar object, identifying it by the name of the
+ * tar file.
+ * If the compress argument is set the tar will be read or created as a
+ * gzip or bz2 compressed TAR file.
+ *
+ * @param string $p_tarname The name of the tar archive to create
+ * @param string $p_compress can be null, 'gz' or 'bz2'. This
+ * parameter indicates if gzip or bz2 compression
+ * is required. For compatibility reason the
+ * boolean value 'true' means 'gz'.
+ * @access public
+ */
+ function Archive_Tar($p_tarname, $p_compress = null)
+ {
+ $this->PEAR();
+ $this->_compress = false;
+ $this->_compress_type = 'none';
+ if (($p_compress === null) || ($p_compress == '')) {
+ if (@file_exists($p_tarname)) {
+ if ($fp = @fopen($p_tarname, "rb")) {
+ // look for gzip magic cookie
+ $data = fread($fp, 2);
+ fclose($fp);
+ if ($data == "\37\213") {
+ $this->_compress = true;
+ $this->_compress_type = 'gz';
+ // No sure it's enought for a magic code ....
+ } elseif ($data == "BZ") {
+ $this->_compress = true;
+ $this->_compress_type = 'bz2';
+ }
+ }
+ } else {
+ // probably a remote file or some file accessible
+ // through a stream interface
+ if (substr($p_tarname, -2) == 'gz') {
+ $this->_compress = true;
+ $this->_compress_type = 'gz';
+ } elseif ((substr($p_tarname, -3) == 'bz2') ||
+ (substr($p_tarname, -2) == 'bz')) {
+ $this->_compress = true;
+ $this->_compress_type = 'bz2';
+ }
+ }
+ } else {
+ if (($p_compress === true) || ($p_compress == 'gz')) {
+ $this->_compress = true;
+ $this->_compress_type = 'gz';
+ } else if ($p_compress == 'bz2') {
+ $this->_compress = true;
+ $this->_compress_type = 'bz2';
+ } else {
+ die("Unsupported compression type '$p_compress'\n".
+ "Supported types are 'gz' and 'bz2'.\n");
+ return false;
+ }
+ }
+ $this->_tarname = $p_tarname;
+ if ($this->_compress) { // assert zlib or bz2 extension support
+ if ($this->_compress_type == 'gz')
+ $extname = 'zlib';
+ else if ($this->_compress_type == 'bz2')
+ $extname = 'bz2';
+
+ if (!extension_loaded($extname)) {
+ PEAR::loadExtension($extname);
+ }
+ if (!extension_loaded($extname)) {
+ die("The extension '$extname' couldn't be found.\n".
+ "Please make sure your version of PHP was built ".
+ "with '$extname' support.\n");
+ return false;
+ }
+ }
+ }
+ // }}}
+
+ // {{{ destructor
+ function _Archive_Tar()
+ {
+ $this->_close();
+ // ----- Look for a local copy to delete
+ if ($this->_temp_tarname != '')
+ @unlink($this->_temp_tarname);
+ $this->_PEAR();
+ }
+ // }}}
+
+ // {{{ create()
+ /**
+ * This method creates the archive file and add the files / directories
+ * that are listed in $p_filelist.
+ * If a file with the same name exist and is writable, it is replaced
+ * by the new tar.
+ * The method return false and a PEAR error text.
+ * The $p_filelist parameter can be an array of string, each string
+ * representing a filename or a directory name with their path if
+ * needed. It can also be a single string with names separated by a
+ * single blank.
+ * For each directory added in the archive, the files and
+ * sub-directories are also added.
+ * See also createModify() method for more details.
+ *
+ * @param array $p_filelist An array of filenames and directory names, or a
+ * single string with names separated by a single
+ * blank space.
+ * @return true on success, false on error.
+ * @see createModify()
+ * @access public
+ */
+ function create($p_filelist)
+ {
+ return $this->createModify($p_filelist, '', '');
+ }
+ // }}}
+
+ // {{{ add()
+ /**
+ * This method add the files / directories that are listed in $p_filelist in
+ * the archive. If the archive does not exist it is created.
+ * The method return false and a PEAR error text.
+ * The files and directories listed are only added at the end of the archive,
+ * even if a file with the same name is already archived.
+ * See also createModify() method for more details.
+ *
+ * @param array $p_filelist An array of filenames and directory names, or a
+ * single string with names separated by a single
+ * blank space.
+ * @return true on success, false on error.
+ * @see createModify()
+ * @access public
+ */
+ function add($p_filelist)
+ {
+ return $this->addModify($p_filelist, '', '');
+ }
+ // }}}
+
+ // {{{ extract()
+ function extract($p_path='')
+ {
+ return $this->extractModify($p_path, '');
+ }
+ // }}}
+
+ // {{{ listContent()
+ function listContent()
+ {
+ $v_list_detail = array();
+
+ if ($this->_openRead()) {
+ if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
+ unset($v_list_detail);
+ $v_list_detail = 0;
+ }
+ $this->_close();
+ }
+
+ return $v_list_detail;
+ }
+ // }}}
+
+ // {{{ createModify()
+ /**
+ * This method creates the archive file and add the files / directories
+ * that are listed in $p_filelist.
+ * If the file already exists and is writable, it is replaced by the
+ * new tar. It is a create and not an add. If the file exists and is
+ * read-only or is a directory it is not replaced. The method return
+ * false and a PEAR error text.
+ * The $p_filelist parameter can be an array of string, each string
+ * representing a filename or a directory name with their path if
+ * needed. It can also be a single string with names separated by a
+ * single blank.
+ * The path indicated in $p_remove_dir will be removed from the
+ * memorized path of each file / directory listed when this path
+ * exists. By default nothing is removed (empty path '')
+ * The path indicated in $p_add_dir will be added at the beginning of
+ * the memorized path of each file / directory listed. However it can
+ * be set to empty ''. The adding of a path is done after the removing
+ * of path.
+ * The path add/remove ability enables the user to prepare an archive
+ * for extraction in a different path than the origin files are.
+ * See also addModify() method for file adding properties.
+ *
+ * @param array $p_filelist An array of filenames and directory names,
+ * or a single string with names separated by
+ * a single blank space.
+ * @param string $p_add_dir A string which contains a path to be added
+ * to the memorized path of each element in
+ * the list.
+ * @param string $p_remove_dir A string which contains a path to be
+ * removed from the memorized path of each
+ * element in the list, when relevant.
+ * @return boolean true on success, false on error.
+ * @access public
+ * @see addModify()
+ */
+ function createModify($p_filelist, $p_add_dir, $p_remove_dir='')
+ {
+ $v_result = true;
+
+ if (!$this->_openWrite())
+ return false;
+
+ if ($p_filelist != '') {
+ if (is_array($p_filelist))
+ $v_list = $p_filelist;
+ elseif (is_string($p_filelist))
+ $v_list = explode($this->_separator, $p_filelist);
+ else {
+ $this->_cleanFile();
+ $this->_error('Invalid file list');
+ return false;
+ }
+
+ $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
+ }
+
+ if ($v_result) {
+ $this->_writeFooter();
+ $this->_close();
+ } else
+ $this->_cleanFile();
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ addModify()
+ /**
+ * This method add the files / directories listed in $p_filelist at the
+ * end of the existing archive. If the archive does not yet exists it
+ * is created.
+ * The $p_filelist parameter can be an array of string, each string
+ * representing a filename or a directory name with their path if
+ * needed. It can also be a single string with names separated by a
+ * single blank.
+ * The path indicated in $p_remove_dir will be removed from the
+ * memorized path of each file / directory listed when this path
+ * exists. By default nothing is removed (empty path '')
+ * The path indicated in $p_add_dir will be added at the beginning of
+ * the memorized path of each file / directory listed. However it can
+ * be set to empty ''. The adding of a path is done after the removing
+ * of path.
+ * The path add/remove ability enables the user to prepare an archive
+ * for extraction in a different path than the origin files are.
+ * If a file/dir is already in the archive it will only be added at the
+ * end of the archive. There is no update of the existing archived
+ * file/dir. However while extracting the archive, the last file will
+ * replace the first one. This results in a none optimization of the
+ * archive size.
+ * If a file/dir does not exist the file/dir is ignored. However an
+ * error text is send to PEAR error.
+ * If a file/dir is not readable the file/dir is ignored. However an
+ * error text is send to PEAR error.
+ *
+ * @param array $p_filelist An array of filenames and directory
+ * names, or a single string with names
+ * separated by a single blank space.
+ * @param string $p_add_dir A string which contains a path to be
+ * added to the memorized path of each
+ * element in the list.
+ * @param string $p_remove_dir A string which contains a path to be
+ * removed from the memorized path of
+ * each element in the list, when
+ * relevant.
+ * @return true on success, false on error.
+ * @access public
+ */
+ function addModify($p_filelist, $p_add_dir, $p_remove_dir='')
+ {
+ $v_result = true;
+
+ if (!$this->_isArchive())
+ $v_result = $this->createModify($p_filelist, $p_add_dir,
+ $p_remove_dir);
+ else {
+ if (is_array($p_filelist))
+ $v_list = $p_filelist;
+ elseif (is_string($p_filelist))
+ $v_list = explode($this->_separator, $p_filelist);
+ else {
+ $this->_error('Invalid file list');
+ return false;
+ }
+
+ $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
+ }
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ addString()
+ /**
+ * This method add a single string as a file at the
+ * end of the existing archive. If the archive does not yet exists it
+ * is created.
+ *
+ * @param string $p_filename A string which contains the full
+ * filename path that will be associated
+ * with the string.
+ * @param string $p_string The content of the file added in
+ * the archive.
+ * @return true on success, false on error.
+ * @access public
+ */
+ function addString($p_filename, $p_string)
+ {
+ $v_result = true;
+
+ if (!$this->_isArchive()) {
+ if (!$this->_openWrite()) {
+ return false;
+ }
+ $this->_close();
+ }
+
+ if (!$this->_openAppend())
+ return false;
+
+ // Need to check the get back to the temporary file ? ....
+ $v_result = $this->_addString($p_filename, $p_string);
+
+ $this->_writeFooter();
+
+ $this->_close();
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ extractModify()
+ /**
+ * This method extract all the content of the archive in the directory
+ * indicated by $p_path. When relevant the memorized path of the
+ * files/dir can be modified by removing the $p_remove_path path at the
+ * beginning of the file/dir path.
+ * While extracting a file, if the directory path does not exists it is
+ * created.
+ * While extracting a file, if the file already exists it is replaced
+ * without looking for last modification date.
+ * While extracting a file, if the file already exists and is write
+ * protected, the extraction is aborted.
+ * While extracting a file, if a directory with the same name already
+ * exists, the extraction is aborted.
+ * While extracting a directory, if a file with the same name already
+ * exists, the extraction is aborted.
+ * While extracting a file/directory if the destination directory exist
+ * and is write protected, or does not exist but can not be created,
+ * the extraction is aborted.
+ * If after extraction an extracted file does not show the correct
+ * stored file size, the extraction is aborted.
+ * When the extraction is aborted, a PEAR error text is set and false
+ * is returned. However the result can be a partial extraction that may
+ * need to be manually cleaned.
+ *
+ * @param string $p_path The path of the directory where the
+ * files/dir need to by extracted.
+ * @param string $p_remove_path Part of the memorized path that can be
+ * removed if present at the beginning of
+ * the file/dir path.
+ * @return boolean true on success, false on error.
+ * @access public
+ * @see extractList()
+ */
+ function extractModify($p_path, $p_remove_path)
+ {
+ $v_result = true;
+ $v_list_detail = array();
+
+ if ($v_result = $this->_openRead()) {
+ $v_result = $this->_extractList($p_path, $v_list_detail,
+ "complete", 0, $p_remove_path);
+ $this->_close();
+ }
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ extractInString()
+ /**
+ * This method extract from the archive one file identified by $p_filename.
+ * The return value is a string with the file content, or NULL on error.
+ * @param string $p_filename The path of the file to extract in a string.
+ * @return a string with the file content or NULL.
+ * @access public
+ */
+ function extractInString($p_filename)
+ {
+ if ($this->_openRead()) {
+ $v_result = $this->_extractInString($p_filename);
+ $this->_close();
+ } else {
+ $v_result = NULL;
+ }
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ extractList()
+ /**
+ * This method extract from the archive only the files indicated in the
+ * $p_filelist. These files are extracted in the current directory or
+ * in the directory indicated by the optional $p_path parameter.
+ * If indicated the $p_remove_path can be used in the same way as it is
+ * used in extractModify() method.
+ * @param array $p_filelist An array of filenames and directory names,
+ * or a single string with names separated
+ * by a single blank space.
+ * @param string $p_path The path of the directory where the
+ * files/dir need to by extracted.
+ * @param string $p_remove_path Part of the memorized path that can be
+ * removed if present at the beginning of
+ * the file/dir path.
+ * @return true on success, false on error.
+ * @access public
+ * @see extractModify()
+ */
+ function extractList($p_filelist, $p_path='', $p_remove_path='')
+ {
+ $v_result = true;
+ $v_list_detail = array();
+
+ if (is_array($p_filelist))
+ $v_list = $p_filelist;
+ elseif (is_string($p_filelist))
+ $v_list = explode($this->_separator, $p_filelist);
+ else {
+ $this->_error('Invalid string list');
+ return false;
+ }
+
+ if ($v_result = $this->_openRead()) {
+ $v_result = $this->_extractList($p_path, $v_list_detail, "partial",
+ $v_list, $p_remove_path);
+ $this->_close();
+ }
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ setAttribute()
+ /**
+ * This method set specific attributes of the archive. It uses a variable
+ * list of parameters, in the format attribute code + attribute values :
+ * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ',');
+ * @param mixed $argv variable list of attributes and values
+ * @return true on success, false on error.
+ * @access public
+ */
+ function setAttribute()
+ {
+ $v_result = true;
+
+ // ----- Get the number of variable list of arguments
+ if (($v_size = func_num_args()) == 0) {
+ return true;
+ }
+
+ // ----- Get the arguments
+ $v_att_list = &func_get_args();
+
+ // ----- Read the attributes
+ $i=0;
+ while ($i<$v_size) {
+
+ // ----- Look for next option
+ switch ($v_att_list[$i]) {
+ // ----- Look for options that request a string value
+ case ARCHIVE_TAR_ATT_SEPARATOR :
+ // ----- Check the number of parameters
+ if (($i+1) >= $v_size) {
+ $this->_error('Invalid number of parameters for '
+ .'attribute ARCHIVE_TAR_ATT_SEPARATOR');
+ return false;
+ }
+
+ // ----- Get the value
+ $this->_separator = $v_att_list[$i+1];
+ $i++;
+ break;
+
+ default :
+ $this->_error('Unknow attribute code '.$v_att_list[$i].'');
+ return false;
+ }
+
+ // ----- Next attribute
+ $i++;
+ }
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ _error()
+ function _error($p_message)
+ {
+ // ----- To be completed
+ $this->raiseError($p_message);
+ }
+ // }}}
+
+ // {{{ _warning()
+ function _warning($p_message)
+ {
+ // ----- To be completed
+ $this->raiseError($p_message);
+ }
+ // }}}
+
+ // {{{ _isArchive()
+ function _isArchive($p_filename=NULL)
+ {
+ if ($p_filename == NULL) {
+ $p_filename = $this->_tarname;
+ }
+ clearstatcache();
+ return @is_file($p_filename) && !@is_link($p_filename);
+ }
+ // }}}
+
+ // {{{ _openWrite()
+ function _openWrite()
+ {
+ if ($this->_compress_type == 'gz')
+ $this->_file = @gzopen($this->_tarname, "wb9");
+ else if ($this->_compress_type == 'bz2')
+ $this->_file = @bzopen($this->_tarname, "w");
+ else if ($this->_compress_type == 'none')
+ $this->_file = @fopen($this->_tarname, "wb");
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+
+ if ($this->_file == 0) {
+ $this->_error('Unable to open in write mode \''
+ .$this->_tarname.'\'');
+ return false;
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _openRead()
+ function _openRead()
+ {
+ if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {
+
+ // ----- Look if a local copy need to be done
+ if ($this->_temp_tarname == '') {
+ $this->_temp_tarname = uniqid('tar').'.tmp';
+ if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
+ $this->_error('Unable to open in read mode \''
+ .$this->_tarname.'\'');
+ $this->_temp_tarname = '';
+ return false;
+ }
+ if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
+ $this->_error('Unable to open in write mode \''
+ .$this->_temp_tarname.'\'');
+ $this->_temp_tarname = '';
+ return false;
+ }
+ while ($v_data = @fread($v_file_from, 1024))
+ @fwrite($v_file_to, $v_data);
+ @fclose($v_file_from);
+ @fclose($v_file_to);
+ }
+
+ // ----- File to open if the local copy
+ $v_filename = $this->_temp_tarname;
+
+ } else
+ // ----- File to open if the normal Tar file
+ $v_filename = $this->_tarname;
+
+ if ($this->_compress_type == 'gz')
+ $this->_file = @gzopen($v_filename, "rb");
+ else if ($this->_compress_type == 'bz2')
+ $this->_file = @bzopen($v_filename, "r");
+ else if ($this->_compress_type == 'none')
+ $this->_file = @fopen($v_filename, "rb");
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+
+ if ($this->_file == 0) {
+ $this->_error('Unable to open in read mode \''.$v_filename.'\'');
+ return false;
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _openReadWrite()
+ function _openReadWrite()
+ {
+ if ($this->_compress_type == 'gz')
+ $this->_file = @gzopen($this->_tarname, "r+b");
+ else if ($this->_compress_type == 'bz2') {
+ $this->_error('Unable to open bz2 in read/write mode \''
+ .$this->_tarname.'\' (limitation of bz2 extension)');
+ return false;
+ } else if ($this->_compress_type == 'none')
+ $this->_file = @fopen($this->_tarname, "r+b");
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+
+ if ($this->_file == 0) {
+ $this->_error('Unable to open in read/write mode \''
+ .$this->_tarname.'\'');
+ return false;
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _close()
+ function _close()
+ {
+ //if (isset($this->_file)) {
+ if (is_resource($this->_file)) {
+ if ($this->_compress_type == 'gz')
+ @gzclose($this->_file);
+ else if ($this->_compress_type == 'bz2')
+ @bzclose($this->_file);
+ else if ($this->_compress_type == 'none')
+ @fclose($this->_file);
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+
+ $this->_file = 0;
+ }
+
+ // ----- Look if a local copy need to be erase
+ // Note that it might be interesting to keep the url for a time : ToDo
+ if ($this->_temp_tarname != '') {
+ @unlink($this->_temp_tarname);
+ $this->_temp_tarname = '';
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _cleanFile()
+ function _cleanFile()
+ {
+ $this->_close();
+
+ // ----- Look for a local copy
+ if ($this->_temp_tarname != '') {
+ // ----- Remove the local copy but not the remote tarname
+ @unlink($this->_temp_tarname);
+ $this->_temp_tarname = '';
+ } else {
+ // ----- Remove the local tarname file
+ @unlink($this->_tarname);
+ }
+ $this->_tarname = '';
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _writeBlock()
+ function _writeBlock($p_binary_data, $p_len=null)
+ {
+ if (is_resource($this->_file)) {
+ if ($p_len === null) {
+ if ($this->_compress_type == 'gz')
+ @gzputs($this->_file, $p_binary_data);
+ else if ($this->_compress_type == 'bz2')
+ @bzwrite($this->_file, $p_binary_data);
+ else if ($this->_compress_type == 'none')
+ @fputs($this->_file, $p_binary_data);
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+ } else {
+ if ($this->_compress_type == 'gz')
+ @gzputs($this->_file, $p_binary_data, $p_len);
+ else if ($this->_compress_type == 'bz2')
+ @bzwrite($this->_file, $p_binary_data, $p_len);
+ else if ($this->_compress_type == 'none')
+ @fputs($this->_file, $p_binary_data, $p_len);
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+
+ }
+ }
+ return true;
+ }
+ // }}}
+
+ // {{{ _readBlock()
+ function _readBlock()
+ {
+ $v_block = null;
+ if (is_resource($this->_file)) {
+ if ($this->_compress_type == 'gz')
+ $v_block = @gzread($this->_file, 512);
+ else if ($this->_compress_type == 'bz2')
+ $v_block = @bzread($this->_file, 512);
+ else if ($this->_compress_type == 'none')
+ $v_block = @fread($this->_file, 512);
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+ }
+ return $v_block;
+ }
+ // }}}
+
+ // {{{ _jumpBlock()
+ function _jumpBlock($p_len=null)
+ {
+ if (is_resource($this->_file)) {
+ if ($p_len === null)
+ $p_len = 1;
+
+ if ($this->_compress_type == 'gz') {
+ @gzseek($this->_file, gztell($this->_file)+($p_len*512));
+ }
+ else if ($this->_compress_type == 'bz2') {
+ // ----- Replace missing bztell() and bzseek()
+ for ($i=0; $i<$p_len; $i++)
+ $this->_readBlock();
+ } else if ($this->_compress_type == 'none')
+ @fseek($this->_file, ftell($this->_file)+($p_len*512));
+ else
+ $this->_error('Unknown or missing compression type ('
+ .$this->_compress_type.')');
+
+ }
+ return true;
+ }
+ // }}}
+
+ // {{{ _writeFooter()
+ function _writeFooter()
+ {
+ if (is_resource($this->_file)) {
+ // ----- Write the last 0 filled block for end of archive
+ $v_binary_data = pack('a1024', '');
+ $this->_writeBlock($v_binary_data);
+ }
+ return true;
+ }
+ // }}}
+
+ // {{{ _addList()
+ function _addList($p_list, $p_add_dir, $p_remove_dir)
+ {
+ $v_result=true;
+ $v_header = array();
+
+ // ----- Remove potential windows directory separator
+ $p_add_dir = $this->_translateWinPath($p_add_dir);
+ $p_remove_dir = $this->_translateWinPath($p_remove_dir, false);
+
+ if (!$this->_file) {
+ $this->_error('Invalid file descriptor');
+ return false;
+ }
+
+ if (sizeof($p_list) == 0)
+ return true;
+
+ foreach ($p_list as $v_filename) {
+ if (!$v_result) {
+ break;
+ }
+
+ // ----- Skip the current tar name
+ if ($v_filename == $this->_tarname)
+ continue;
+
+ if ($v_filename == '')
+ continue;
+
+ if (!file_exists($v_filename)) {
+ $this->_warning("File '$v_filename' does not exist");
+ continue;
+ }
+
+ // ----- Add the file or directory header
+ if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir))
+ return false;
+
+ if (@is_dir($v_filename) && !@is_link($v_filename)) {
+ if (!($p_hdir = opendir($v_filename))) {
+ $this->_warning("Directory '$v_filename' can not be read");
+ continue;
+ }
+ while (false !== ($p_hitem = readdir($p_hdir))) {
+ if (($p_hitem != '.') && ($p_hitem != '..')) {
+ if ($v_filename != ".")
+ $p_temp_list[0] = $v_filename.'/'.$p_hitem;
+ else
+ $p_temp_list[0] = $p_hitem;
+
+ $v_result = $this->_addList($p_temp_list,
+ $p_add_dir,
+ $p_remove_dir);
+ }
+ }
+
+ unset($p_temp_list);
+ unset($p_hdir);
+ unset($p_hitem);
+ }
+ }
+
+ return $v_result;
+ }
+ // }}}
+
+ // {{{ _addFile()
+ function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir)
+ {
+ if (!$this->_file) {
+ $this->_error('Invalid file descriptor');
+ return false;
+ }
+
+ if ($p_filename == '') {
+ $this->_error('Invalid file name');
+ return false;
+ }
+
+ // ----- Calculate the stored filename
+ $p_filename = $this->_translateWinPath($p_filename, false);;
+ $v_stored_filename = $p_filename;
+ if (strcmp($p_filename, $p_remove_dir) == 0) {
+ return true;
+ }
+ if ($p_remove_dir != '') {
+ if (substr($p_remove_dir, -1) != '/')
+ $p_remove_dir .= '/';
+
+ if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)
+ $v_stored_filename = substr($p_filename, strlen($p_remove_dir));
+ }
+ $v_stored_filename = $this->_translateWinPath($v_stored_filename);
+ if ($p_add_dir != '') {
+ if (substr($p_add_dir, -1) == '/')
+ $v_stored_filename = $p_add_dir.$v_stored_filename;
+ else
+ $v_stored_filename = $p_add_dir.'/'.$v_stored_filename;
+ }
+
+ $v_stored_filename = $this->_pathReduction($v_stored_filename);
+
+ if ($this->_isArchive($p_filename)) {
+ if (($v_file = @fopen($p_filename, "rb")) == 0) {
+ $this->_warning("Unable to open file '".$p_filename
+ ."' in binary read mode");
+ return true;
+ }
+
+ if (!$this->_writeHeader($p_filename, $v_stored_filename))
+ return false;
+
+ while (($v_buffer = fread($v_file, 512)) != '') {
+ $v_binary_data = pack("a512", "$v_buffer");
+ $this->_writeBlock($v_binary_data);
+ }
+
+ fclose($v_file);
+
+ } else {
+ // ----- Only header for dir
+ if (!$this->_writeHeader($p_filename, $v_stored_filename))
+ return false;
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _addString()
+ function _addString($p_filename, $p_string)
+ {
+ if (!$this->_file) {
+ $this->_error('Invalid file descriptor');
+ return false;
+ }
+
+ if ($p_filename == '') {
+ $this->_error('Invalid file name');
+ return false;
+ }
+
+ // ----- Calculate the stored filename
+ $p_filename = $this->_translateWinPath($p_filename, false);;
+
+ if (!$this->_writeHeaderBlock($p_filename, strlen($p_string),
+ time(), 384, "", 0, 0))
+ return false;
+
+ $i=0;
+ while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') {
+ $v_binary_data = pack("a512", $v_buffer);
+ $this->_writeBlock($v_binary_data);
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _writeHeader()
+ function _writeHeader($p_filename, $p_stored_filename)
+ {
+ if ($p_stored_filename == '')
+ $p_stored_filename = $p_filename;
+ $v_reduce_filename = $this->_pathReduction($p_stored_filename);
+
+ if (strlen($v_reduce_filename) > 99) {
+ if (!$this->_writeLongHeader($v_reduce_filename))
+ return false;
+ }
+
+ $v_info = lstat($p_filename);
+ $v_uid = sprintf("%6s ", DecOct($v_info[4]));
+ $v_gid = sprintf("%6s ", DecOct($v_info[5]));
+ $v_perms = sprintf("%6s ", DecOct($v_info['mode']));
+
+ $v_mtime = sprintf("%11s", DecOct($v_info['mode']));
+
+ $v_linkname = '';
+
+ if (@is_link($p_filename)) {
+ $v_typeflag = '2';
+ $v_linkname = readlink($p_filename);
+ $v_size = sprintf("%11s ", DecOct(0));
+ } elseif (@is_dir($p_filename)) {
+ $v_typeflag = "5";
+ $v_size = sprintf("%11s ", DecOct(0));
+ } else {
+ $v_typeflag = '';
+ clearstatcache();
+ $v_size = sprintf("%11s ", DecOct($v_info['size']));
+ }
+
+ $v_magic = '';
+
+ $v_version = '';
+
+ $v_uname = '';
+
+ $v_gname = '';
+
+ $v_devmajor = '';
+
+ $v_devminor = '';
+
+ $v_prefix = '';
+
+ $v_binary_data_first = pack("a100a8a8a8a12A12",
+ $v_reduce_filename, $v_perms, $v_uid,
+ $v_gid, $v_size, $v_mtime);
+ $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
+ $v_typeflag, $v_linkname, $v_magic,
+ $v_version, $v_uname, $v_gname,
+ $v_devmajor, $v_devminor, $v_prefix, '');
+
+ // ----- Calculate the checksum
+ $v_checksum = 0;
+ // ..... First part of the header
+ for ($i=0; $i<148; $i++)
+ $v_checksum += ord(substr($v_binary_data_first,$i,1));
+ // ..... Ignore the checksum value and replace it by ' ' (space)
+ for ($i=148; $i<156; $i++)
+ $v_checksum += ord(' ');
+ // ..... Last part of the header
+ for ($i=156, $j=0; $i<512; $i++, $j++)
+ $v_checksum += ord(substr($v_binary_data_last,$j,1));
+
+ // ----- Write the first 148 bytes of the header in the archive
+ $this->_writeBlock($v_binary_data_first, 148);
+
+ // ----- Write the calculated checksum
+ $v_checksum = sprintf("%6s ", DecOct($v_checksum));
+ $v_binary_data = pack("a8", $v_checksum);
+ $this->_writeBlock($v_binary_data, 8);
+
+ // ----- Write the last 356 bytes of the header in the archive
+ $this->_writeBlock($v_binary_data_last, 356);
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _writeHeaderBlock()
+ function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0,
+ $p_type='', $p_uid=0, $p_gid=0)
+ {
+ $p_filename = $this->_pathReduction($p_filename);
+
+ if (strlen($p_filename) > 99) {
+ if (!$this->_writeLongHeader($p_filename))
+ return false;
+ }
+
+ if ($p_type == "5") {
+ $v_size = sprintf("%11s ", DecOct(0));
+ } else {
+ $v_size = sprintf("%11s ", DecOct($p_size));
+ }
+
+ $v_uid = sprintf("%6s ", DecOct($p_uid));
+ $v_gid = sprintf("%6s ", DecOct($p_gid));
+ $v_perms = sprintf("%6s ", DecOct($p_perms));
+
+ $v_mtime = sprintf("%11s", DecOct($p_mtime));
+
+ $v_linkname = '';
+
+ $v_magic = '';
+
+ $v_version = '';
+
+ $v_uname = '';
+
+ $v_gname = '';
+
+ $v_devmajor = '';
+
+ $v_devminor = '';
+
+ $v_prefix = '';
+
+ $v_binary_data_first = pack("a100a8a8a8a12A12",
+ $p_filename, $v_perms, $v_uid, $v_gid,
+ $v_size, $v_mtime);
+ $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
+ $p_type, $v_linkname, $v_magic,
+ $v_version, $v_uname, $v_gname,
+ $v_devmajor, $v_devminor, $v_prefix, '');
+
+ // ----- Calculate the checksum
+ $v_checksum = 0;
+ // ..... First part of the header
+ for ($i=0; $i<148; $i++)
+ $v_checksum += ord(substr($v_binary_data_first,$i,1));
+ // ..... Ignore the checksum value and replace it by ' ' (space)
+ for ($i=148; $i<156; $i++)
+ $v_checksum += ord(' ');
+ // ..... Last part of the header
+ for ($i=156, $j=0; $i<512; $i++, $j++)
+ $v_checksum += ord(substr($v_binary_data_last,$j,1));
+
+ // ----- Write the first 148 bytes of the header in the archive
+ $this->_writeBlock($v_binary_data_first, 148);
+
+ // ----- Write the calculated checksum
+ $v_checksum = sprintf("%6s ", DecOct($v_checksum));
+ $v_binary_data = pack("a8", $v_checksum);
+ $this->_writeBlock($v_binary_data, 8);
+
+ // ----- Write the last 356 bytes of the header in the archive
+ $this->_writeBlock($v_binary_data_last, 356);
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _writeLongHeader()
+ function _writeLongHeader($p_filename)
+ {
+ $v_size = sprintf("%11s ", DecOct(strlen($p_filename)));
+
+ $v_typeflag = 'L';
+
+ $v_linkname = '';
+
+ $v_magic = '';
+
+ $v_version = '';
+
+ $v_uname = '';
+
+ $v_gname = '';
+
+ $v_devmajor = '';
+
+ $v_devminor = '';
+
+ $v_prefix = '';
+
+ $v_binary_data_first = pack("a100a8a8a8a12A12",
+ '././@LongLink', 0, 0, 0, $v_size, 0);
+ $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
+ $v_typeflag, $v_linkname, $v_magic,
+ $v_version, $v_uname, $v_gname,
+ $v_devmajor, $v_devminor, $v_prefix, '');
+
+ // ----- Calculate the checksum
+ $v_checksum = 0;
+ // ..... First part of the header
+ for ($i=0; $i<148; $i++)
+ $v_checksum += ord(substr($v_binary_data_first,$i,1));
+ // ..... Ignore the checksum value and replace it by ' ' (space)
+ for ($i=148; $i<156; $i++)
+ $v_checksum += ord(' ');
+ // ..... Last part of the header
+ for ($i=156, $j=0; $i<512; $i++, $j++)
+ $v_checksum += ord(substr($v_binary_data_last,$j,1));
+
+ // ----- Write the first 148 bytes of the header in the archive
+ $this->_writeBlock($v_binary_data_first, 148);
+
+ // ----- Write the calculated checksum
+ $v_checksum = sprintf("%6s ", DecOct($v_checksum));
+ $v_binary_data = pack("a8", $v_checksum);
+ $this->_writeBlock($v_binary_data, 8);
+
+ // ----- Write the last 356 bytes of the header in the archive
+ $this->_writeBlock($v_binary_data_last, 356);
+
+ // ----- Write the filename as content of the block
+ $i=0;
+ while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') {
+ $v_binary_data = pack("a512", "$v_buffer");
+ $this->_writeBlock($v_binary_data);
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _readHeader()
+ function _readHeader($v_binary_data, &$v_header)
+ {
+ if (strlen($v_binary_data)==0) {
+ $v_header['filename'] = '';
+ return true;
+ }
+
+ if (strlen($v_binary_data) != 512) {
+ $v_header['filename'] = '';
+ $this->_error('Invalid block size : '.strlen($v_binary_data));
+ return false;
+ }
+
+ if (!is_array($v_header)) {
+ $v_header = array();
+ }
+ // ----- Calculate the checksum
+ $v_checksum = 0;
+ // ..... First part of the header
+ for ($i=0; $i<148; $i++)
+ $v_checksum+=ord(substr($v_binary_data,$i,1));
+ // ..... Ignore the checksum value and replace it by ' ' (space)
+ for ($i=148; $i<156; $i++)
+ $v_checksum += ord(' ');
+ // ..... Last part of the header
+ for ($i=156; $i<512; $i++)
+ $v_checksum+=ord(substr($v_binary_data,$i,1));
+
+ $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/"
+ ."a8checksum/a1typeflag/a100link/a6magic/a2version/"
+ ."a32uname/a32gname/a8devmajor/a8devminor",
+ $v_binary_data);
+
+ // ----- Extract the checksum
+ $v_header['checksum'] = OctDec(trim($v_data['checksum']));
+ if ($v_header['checksum'] != $v_checksum) {
+ $v_header['filename'] = '';
+
+ // ----- Look for last block (empty block)
+ if (($v_checksum == 256) && ($v_header['checksum'] == 0))
+ return true;
+
+ $this->_error('Invalid checksum for file "'.$v_data['filename']
+ .'" : '.$v_checksum.' calculated, '
+ .$v_header['checksum'].' expected');
+ return false;
+ }
+
+ // ----- Extract the properties
+ $v_header['filename'] = trim($v_data['filename']);
+ if ($this->_maliciousFilename($v_header['filename'])) {
+ $this->_error('Malicious .tar detected, file "' . $v_header['filename'] .
+ '" will not install in desired directory tree');
+ return false;
+ }
+ $v_header['mode'] = OctDec(trim($v_data['mode']));
+ $v_header['uid'] = OctDec(trim($v_data['uid']));
+ $v_header['gid'] = OctDec(trim($v_data['gid']));
+ $v_header['size'] = OctDec(trim($v_data['size']));
+ $v_header['mtime'] = OctDec(trim($v_data['mtime']));
+ if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
+ $v_header['size'] = 0;
+ }
+ $v_header['link'] = trim($v_data['link']);
+ /* ----- All these fields are removed form the header because
+ they do not carry interesting info
+ $v_header[magic] = trim($v_data[magic]);
+ $v_header[version] = trim($v_data[version]);
+ $v_header[uname] = trim($v_data[uname]);
+ $v_header[gname] = trim($v_data[gname]);
+ $v_header[devmajor] = trim($v_data[devmajor]);
+ $v_header[devminor] = trim($v_data[devminor]);
+ */
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _maliciousFilename()
+ /**
+ * Detect and report a malicious file name
+ *
+ * @param string $file
+ * @return bool
+ * @access private
+ */
+ function _maliciousFilename($file)
+ {
+ if (strpos($file, '/../') !== false) {
+ return true;
+ }
+ if (strpos($file, '../') === 0) {
+ return true;
+ }
+ return false;
+ }
+ // }}}
+
+ // {{{ _readLongHeader()
+ function _readLongHeader(&$v_header)
+ {
+ $v_filename = '';
+ $n = floor($v_header['size']/512);
+ for ($i=0; $i<$n; $i++) {
+ $v_content = $this->_readBlock();
+ $v_filename .= $v_content;
+ }
+ if (($v_header['size'] % 512) != 0) {
+ $v_content = $this->_readBlock();
+ $v_filename .= $v_content;
+ }
+
+ // ----- Read the next header
+ $v_binary_data = $this->_readBlock();
+
+ if (!$this->_readHeader($v_binary_data, $v_header))
+ return false;
+
+ $v_filename = trim($v_filename);
+ $v_header['filename'] = $v_filename;
+ if ($this->_maliciousFilename($v_filename)) {
+ $this->_error('Malicious .tar detected, file "' . $v_filename .
+ '" will not install in desired directory tree');
+ return false;
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _extractInString()
+ /**
+ * This method extract from the archive one file identified by $p_filename.
+ * The return value is a string with the file content, or NULL on error.
+ * @param string $p_filename The path of the file to extract in a string.
+ * @return a string with the file content or NULL.
+ * @access private
+ */
+ function _extractInString($p_filename)
+ {
+ $v_result_str = "";
+
+ While (strlen($v_binary_data = $this->_readBlock()) != 0)
+ {
+ if (!$this->_readHeader($v_binary_data, $v_header))
+ return NULL;
+
+ if ($v_header['filename'] == '')
+ continue;
+
+ // ----- Look for long filename
+ if ($v_header['typeflag'] == 'L') {
+ if (!$this->_readLongHeader($v_header))
+ return NULL;
+ }
+
+ if ($v_header['filename'] == $p_filename) {
+ if ($v_header['typeflag'] == "5") {
+ $this->_error('Unable to extract in string a directory '
+ .'entry {'.$v_header['filename'].'}');
+ return NULL;
+ } else {
+ $n = floor($v_header['size']/512);
+ for ($i=0; $i<$n; $i++) {
+ $v_result_str .= $this->_readBlock();
+ }
+ if (($v_header['size'] % 512) != 0) {
+ $v_content = $this->_readBlock();
+ $v_result_str .= substr($v_content, 0,
+ ($v_header['size'] % 512));
+ }
+ return $v_result_str;
+ }
+ } else {
+ $this->_jumpBlock(ceil(($v_header['size']/512)));
+ }
+ }
+
+ return NULL;
+ }
+ // }}}
+
+ // {{{ _extractList()
+ function _extractList($p_path, &$p_list_detail, $p_mode,
+ $p_file_list, $p_remove_path)
+ {
+ $v_result=true;
+ $v_nb = 0;
+ $v_extract_all = true;
+ $v_listing = false;
+
+ $p_path = $this->_translateWinPath($p_path, false);
+ if ($p_path == '' || (substr($p_path, 0, 1) != '/'
+ && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) {
+ $p_path = "./".$p_path;
+ }
+ $p_remove_path = $this->_translateWinPath($p_remove_path);
+
+ // ----- Look for path to remove format (should end by /)
+ if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/'))
+ $p_remove_path .= '/';
+ $p_remove_path_size = strlen($p_remove_path);
+
+ switch ($p_mode) {
+ case "complete" :
+ $v_extract_all = TRUE;
+ $v_listing = FALSE;
+ break;
+ case "partial" :
+ $v_extract_all = FALSE;
+ $v_listing = FALSE;
+ break;
+ case "list" :
+ $v_extract_all = FALSE;
+ $v_listing = TRUE;
+ break;
+ default :
+ $this->_error('Invalid extract mode ('.$p_mode.')');
+ return false;
+ }
+
+ clearstatcache();
+
+ while (strlen($v_binary_data = $this->_readBlock()) != 0)
+ {
+ $v_extract_file = FALSE;
+ $v_extraction_stopped = 0;
+
+ if (!$this->_readHeader($v_binary_data, $v_header))
+ return false;
+
+ if ($v_header['filename'] == '') {
+ continue;
+ }
+
+ // ----- Look for long filename
+ if ($v_header['typeflag'] == 'L') {
+ if (!$this->_readLongHeader($v_header))
+ return false;
+ }
+
+ if ((!$v_extract_all) && (is_array($p_file_list))) {
+ // ----- By default no unzip if the file is not found
+ $v_extract_file = false;
+
+ for ($i=0; $i<sizeof($p_file_list); $i++) {
+ // ----- Look if it is a directory
+ if (substr($p_file_list[$i], -1) == '/') {
+ // ----- Look if the directory is in the filename path
+ if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
+ && (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
+ == $p_file_list[$i])) {
+ $v_extract_file = TRUE;
+ break;
+ }
+ }
+
+ // ----- It is a file, so compare the file names
+ elseif ($p_file_list[$i] == $v_header['filename']) {
+ $v_extract_file = TRUE;
+ break;
+ }
+ }
+ } else {
+ $v_extract_file = TRUE;
+ }
+
+ // ----- Look if this file need to be extracted
+ if (($v_extract_file) && (!$v_listing))
+ {
+ if (($p_remove_path != '')
+ && (substr($v_header['filename'], 0, $p_remove_path_size)
+ == $p_remove_path))
+ $v_header['filename'] = substr($v_header['filename'],
+ $p_remove_path_size);
+ if (($p_path != './') && ($p_path != '/')) {
+ while (substr($p_path, -1) == '/')
+ $p_path = substr($p_path, 0, strlen($p_path)-1);
+
+ if (substr($v_header['filename'], 0, 1) == '/')
+ $v_header['filename'] = $p_path.$v_header['filename'];
+ else
+ $v_header['filename'] = $p_path.'/'.$v_header['filename'];
+ }
+ if (file_exists($v_header['filename'])) {
+ if ( (@is_dir($v_header['filename']))
+ && ($v_header['typeflag'] == '')) {
+ $this->_error('File '.$v_header['filename']
+ .' already exists as a directory');
+ return false;
+ }
+ if ( ($this->_isArchive($v_header['filename']))
+ && ($v_header['typeflag'] == "5")) {
+ $this->_error('Directory '.$v_header['filename']
+ .' already exists as a file');
+ return false;
+ }
+ if (!is_writeable($v_header['filename'])) {
+ $this->_error('File '.$v_header['filename']
+ .' already exists and is write protected');
+ return false;
+ }
+ if (filemtime($v_header['filename']) > $v_header['mtime']) {
+ // To be completed : An error or silent no replace ?
+ }
+ }
+
+ // ----- Check the directory availability and create it if necessary
+ elseif (($v_result
+ = $this->_dirCheck(($v_header['typeflag'] == "5"
+ ?$v_header['filename']
+ :dirname($v_header['filename'])))) != 1) {
+ $this->_error('Unable to create path for '.$v_header['filename']);
+ return false;
+ }
+
+ if ($v_extract_file) {
+ if ($v_header['typeflag'] == "5") {
+ if (!@file_exists($v_header['filename'])) {
+ if (!@mkdir($v_header['filename'], 0777)) {
+ $this->_error('Unable to create directory {'
+ .$v_header['filename'].'}');
+ return false;
+ }
+ }
+ } elseif ($v_header['typeflag'] == "2") {
+ if (@file_exists($v_header['filename'])) {
+ @unlink($v_header['filename']);
+ }
+ if (!@symlink($v_header['link'], $v_header['filename'])) {
+ $this->_error('Unable to extract symbolic link {'
+ .$v_header['filename'].'}');
+ return false;
+ }
+ } else {
+ if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) {
+ $this->_error('Error while opening {'.$v_header['filename']
+ .'} in write binary mode');
+ return false;
+ } else {
+ $n = floor($v_header['size']/512);
+ for ($i=0; $i<$n; $i++) {
+ $v_content = $this->_readBlock();
+ fwrite($v_dest_file, $v_content, 512);
+ }
+ if (($v_header['size'] % 512) != 0) {
+ $v_content = $this->_readBlock();
+ fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
+ }
+
+ @fclose($v_dest_file);
+
+ // ----- Change the file mode, mtime
+ @touch($v_header['filename'], $v_header['mtime']);
+ if ($v_header['mode'] & 0111) {
+ // make file executable, obey umask
+ $mode = fileperms($v_header['filename']) | (~umask() & 0111);
+ @chmod($v_header['filename'], $mode);
+ }
+ }
+
+ // ----- Check the file size
+ clearstatcache();
+ if (filesize($v_header['filename']) != $v_header['size']) {
+ $this->_error('Extracted file '.$v_header['filename']
+ .' does not have the correct file size \''
+ .filesize($v_header['filename'])
+ .'\' ('.$v_header['size']
+ .' expected). Archive may be corrupted.');
+ return false;
+ }
+ }
+ } else {
+ $this->_jumpBlock(ceil(($v_header['size']/512)));
+ }
+ } else {
+ $this->_jumpBlock(ceil(($v_header['size']/512)));
+ }
+
+ /* TBC : Seems to be unused ...
+ if ($this->_compress)
+ $v_end_of_file = @gzeof($this->_file);
+ else
+ $v_end_of_file = @feof($this->_file);
+ */
+
+ if ($v_listing || $v_extract_file || $v_extraction_stopped) {
+ // ----- Log extracted files
+ if (($v_file_dir = dirname($v_header['filename']))
+ == $v_header['filename'])
+ $v_file_dir = '';
+ if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == ''))
+ $v_file_dir = '/';
+
+ $p_list_detail[$v_nb++] = $v_header;
+ if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) {
+ return true;
+ }
+ }
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _openAppend()
+ function _openAppend()
+ {
+ if (filesize($this->_tarname) == 0)
+ return $this->_openWrite();
+
+ if ($this->_compress) {
+ $this->_close();
+
+ if (!@rename($this->_tarname, $this->_tarname.".tmp")) {
+ $this->_error('Error while renaming \''.$this->_tarname
+ .'\' to temporary file \''.$this->_tarname
+ .'.tmp\'');
+ return false;
+ }
+
+ if ($this->_compress_type == 'gz')
+ $v_temp_tar = @gzopen($this->_tarname.".tmp", "rb");
+ elseif ($this->_compress_type == 'bz2')
+ $v_temp_tar = @bzopen($this->_tarname.".tmp", "r");
+
+ if ($v_temp_tar == 0) {
+ $this->_error('Unable to open file \''.$this->_tarname
+ .'.tmp\' in binary read mode');
+ @rename($this->_tarname.".tmp", $this->_tarname);
+ return false;
+ }
+
+ if (!$this->_openWrite()) {
+ @rename($this->_tarname.".tmp", $this->_tarname);
+ return false;
+ }
+
+ if ($this->_compress_type == 'gz') {
+ while (!@gzeof($v_temp_tar)) {
+ $v_buffer = @gzread($v_temp_tar, 512);
+ if ($v_buffer == ARCHIVE_TAR_END_BLOCK) {
+ // do not copy end blocks, we will re-make them
+ // after appending
+ continue;
+ }
+ $v_binary_data = pack("a512", $v_buffer);
+ $this->_writeBlock($v_binary_data);
+ }
+
+ @gzclose($v_temp_tar);
+ }
+ elseif ($this->_compress_type == 'bz2') {
+ while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) {
+ if ($v_buffer == ARCHIVE_TAR_END_BLOCK) {
+ continue;
+ }
+ $v_binary_data = pack("a512", $v_buffer);
+ $this->_writeBlock($v_binary_data);
+ }
+
+ @bzclose($v_temp_tar);
+ }
+
+ if (!@unlink($this->_tarname.".tmp")) {
+ $this->_error('Error while deleting temporary file \''
+ .$this->_tarname.'.tmp\'');
+ }
+
+ } else {
+ // ----- For not compressed tar, just add files before the last
+ // one or two 512 bytes block
+ if (!$this->_openReadWrite())
+ return false;
+
+ clearstatcache();
+ $v_size = filesize($this->_tarname);
+
+ // We might have zero, one or two end blocks.
+ // The standard is two, but we should try to handle
+ // other cases.
+ fseek($this->_file, $v_size - 1024);
+ if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
+ fseek($this->_file, $v_size - 1024);
+ }
+ elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
+ fseek($this->_file, $v_size - 512);
+ }
+ }
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _append()
+ function _append($p_filelist, $p_add_dir='', $p_remove_dir='')
+ {
+ if (!$this->_openAppend())
+ return false;
+
+ if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir))
+ $this->_writeFooter();
+
+ $this->_close();
+
+ return true;
+ }
+ // }}}
+
+ // {{{ _dirCheck()
+
+ /**
+ * Check if a directory exists and create it (including parent
+ * dirs) if not.
+ *
+ * @param string $p_dir directory to check
+ *
+ * @return bool TRUE if the directory exists or was created
+ */
+ function _dirCheck($p_dir)
+ {
+ clearstatcache();
+ if ((@is_dir($p_dir)) || ($p_dir == ''))
+ return true;
+
+ $p_parent_dir = dirname($p_dir);
+
+ if (($p_parent_dir != $p_dir) &&
+ ($p_parent_dir != '') &&
+ (!$this->_dirCheck($p_parent_dir)))
+ return false;
+
+ if (!@mkdir($p_dir, 0777)) {
+ $this->_error("Unable to create directory '$p_dir'");
+ return false;
+ }
+
+ return true;
+ }
+
+ // }}}
+
+ // {{{ _pathReduction()
+
+ /**
+ * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar",
+ * rand emove double slashes.
+ *
+ * @param string $p_dir path to reduce
+ *
+ * @return string reduced path
+ *
+ * @access private
+ *
+ */
+ function _pathReduction($p_dir)
+ {
+ $v_result = '';
+
+ // ----- Look for not empty path
+ if ($p_dir != '') {
+ // ----- Explode path by directory names
+ $v_list = explode('/', $p_dir);
+
+ // ----- Study directories from last to first
+ for ($i=sizeof($v_list)-1; $i>=0; $i--) {
+ // ----- Look for current path
+ if ($v_list[$i] == ".") {
+ // ----- Ignore this directory
+ // Should be the first $i=0, but no check is done
+ }
+ else if ($v_list[$i] == "..") {
+ // ----- Ignore it and ignore the $i-1
+ $i--;
+ }
+ else if ( ($v_list[$i] == '')
+ && ($i!=(sizeof($v_list)-1))
+ && ($i!=0)) {
+ // ----- Ignore only the double '//' in path,
+ // but not the first and last /
+ } else {
+ $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/'
+ .$v_result:'');
+ }
+ }
+ }
+ $v_result = strtr($v_result, '\\', '/');
+ return $v_result;
+ }
+
+ // }}}
+
+ // {{{ _translateWinPath()
+ function _translateWinPath($p_path, $p_remove_disk_letter=true)
+ {
+ if (defined('OS_WINDOWS') && OS_WINDOWS) {
+ // ----- Look for potential disk letter
+ if ( ($p_remove_disk_letter)
+ && (($v_position = strpos($p_path, ':')) != false)) {
+ $p_path = substr($p_path, $v_position+1);
+ }
+ // ----- Change potential windows directory separator
+ if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
+ $p_path = strtr($p_path, '\\', '/');
+ }
+ }
+ return $p_path;
+ }
+ // }}}
+
+}
+?>
|
[-]
[+]
|
Changed |
Archive_Tar-1.3.3.tgz/Archive_Tar-1.3.3/docs/Archive_Tar.txt
^
|
(renamed from Archive_Tar-1.3.2/docs/Archive_Tar.txt)
|
[-]
[+]
|
Changed |
Archive_Tar-1.3.3.tgz/Archive_Tar-1.3.3/docs/Archive_Tar.txt
^
|
(renamed from Archive_Tar-1.3.2/docs/Archive_Tar.txt)
|
[-]
[+]
|
Changed |
Archive_Tar-1.3.3.tgz/package.xml
^
|
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE package SYSTEM "http://pear.php.net/dtd/package-1.0">
-<package version="1.0" packagerversion="1.5.0RC2">
+<package version="1.0" packagerversion="1.8.0RC1">
<name>Archive_Tar</name>
<summary>Tar file management class</summary>
<description>This class provides handling of tar files in PHP.
@@ -29,19 +29,14 @@
</maintainer>
</maintainers>
<release>
- <version>1.3.2</version>
- <date>2007-01-03</date>
- <license>PHP License</license>
+ <version>1.3.3</version>
+ <date>2009-03-27</date>
+ <license>New BSD License</license>
<state>stable</state>
- <notes>Correct Bug #4016
-Remove duplicate remove error display with '@'
-Correct Bug #3909 : Check existence of OS_WINDOWS constant
-Correct Bug #5452 fix for "lone zero block" when untarring packages
-Change filemode (from pear-core/Archive/Tar.php v.1.21)
-Correct Bug #6486 Can not extract symlinks
-Correct Bug #6933 Archive_Tar (Tar file management class) Directory traversal
-Correct Bug #8114 Files added on-the-fly not storing date
-Correct Bug #9352 Bug on _dirCheck function over nfs path
+ <notes>minor bugfix release
+* fix Bug #9921 compression with bzip2 fails [cellog]
+* fix Bug #11594 _readLongHeader leaves 0 bytes in filename [jamessas]
+* fix Bug #11769 Incorrect symlink handing [fajar99]
</notes>
<provides type="class" name="Archive_Tar" />
<provides type="function" name="Archive_Tar::create" />
@@ -62,6 +57,28 @@
</release>
<changelog>
<release>
+ <version>1.3.3</version>
+ <date>2007-08-25</date>
+ <license>PHP License</license>
+ <state>stable</state>
+ </release>
+ <release>
+ <version>1.3.2</version>
+ <date>2007-01-03</date>
+ <license>PHP License</license>
+ <state>stable</state>
+ <notes>Correct Bug #4016
+Remove duplicate remove error display with '@'
+Correct Bug #3909 : Check existence of OS_WINDOWS constant
+Correct Bug #5452 fix for "lone zero block" when untarring packages
+Change filemode (from pear-core/Archive/Tar.php v.1.21)
+Correct Bug #6486 Can not extract symlinks
+Correct Bug #6933 Archive_Tar (Tar file management class) Directory traversal
+Correct Bug #8114 Files added on-the-fly not storing date
+Correct Bug #9352 Bug on _dirCheck function over nfs path
+ </notes>
+ </release>
+ <release>
<version>1.3.1</version>
<date>2005-03-17</date>
<license>PHP License</license>
|
[-]
[+]
|
Changed |
Archive_Tar-1.3.3.tgz/package2.xml
^
|
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.5.0RC2" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+<package packagerversion="1.8.0RC1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
<name>Archive_Tar</name>
<channel>pear.php.net</channel>
<summary>Tar file management class</summary>
@@ -25,29 +25,28 @@
<email>stig@php.net</email>
<active>no</active>
</helper>
- <date>2007-01-03</date>
- <time>15:31:40</time>
+ <date>2009-03-27</date>
+ <time>02:37:57</time>
<version>
- <release>1.3.2</release>
- <api>1.3.2</api>
+ <release>1.3.3</release>
+ <api>1.3.1</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
- <license uri="http://www.php.net/license">PHP License</license>
- <notes>Correct Bug #4016
-Remove duplicate remove error display with '@'
-Correct Bug #3909 : Check existence of OS_WINDOWS constant
-Correct Bug #5452 fix for "lone zero block" when untarring packages
-Change filemode (from pear-core/Archive/Tar.php v.1.21)
-Correct Bug #6486 Can not extract symlinks
-Correct Bug #6933 Archive_Tar (Tar file management class) Directory traversal
-Correct Bug #8114 Files added on-the-fly not storing date
-Correct Bug #9352 Bug on _dirCheck function over nfs path</notes>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">New BSD License</license>
+ <notes>
+Change the license to New BSD license
+
+ minor bugfix release
+ * fix Bug #9921 compression with bzip2 fails [cellog]
+ * fix Bug #11594 _readLongHeader leaves 0 bytes in filename [jamessas]
+ * fix Bug #11769 Incorrect symlink handing [fajar99]
+ </notes>
<contents>
<dir name="/">
- <file baseinstalldir="/" md5sum="06409d39f4268a9aa9e2924c7f397a38" name="Archive/Tar.php" role="php" />
+ <file baseinstalldir="/" md5sum="d6c6633566e7484aff188f798529b061" name="Archive/Tar.php" role="php" />
<file baseinstalldir="/" md5sum="29b03715377b18b1fafcff98a99cc9a7" name="docs/Archive_Tar.txt" role="doc" />
</dir>
</contents>
@@ -60,10 +59,10 @@
<dependencies>
<required>
<php>
- <min>4.0.0</min>
+ <min>4.3.0</min>
</php>
<pearinstaller>
- <min>1.4.0b1</min>
+ <min>1.5.4</min>
</pearinstaller>
</required>
</dependencies>
@@ -71,6 +70,29 @@
<changelog>
<release>
<version>
+ <release>1.3.2</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-01-03</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+Correct Bug #4016
+Remove duplicate remove error display with '@'
+Correct Bug #3909 : Check existence of OS_WINDOWS constant
+Correct Bug #5452 fix for "lone zero block" when untarring packages
+Change filemode (from pear-core/Archive/Tar.php v.1.21)
+Correct Bug #6486 Can not extract symlinks
+Correct Bug #6933 Archive_Tar (Tar file management class) Directory traversal
+Correct Bug #8114 Files added on-the-fly not storing date
+Correct Bug #9352 Bug on _dirCheck function over nfs path
+ </notes>
+ </release>
+ <release>
+ <version>
<release>1.3.1</release>
<api>1.3.1</api>
</version>
@@ -80,7 +102,9 @@
</stability>
<date>2005-03-17</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Correct Bug #3855</notes>
+ <notes>
+Correct Bug #3855
+ </notes>
</release>
<release>
<version>
@@ -93,7 +117,9 @@
</stability>
<date>2005-03-06</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Bugs correction (2475, 2488, 2135, 2176)</notes>
+ <notes>
+Bugs correction (2475, 2488, 2135, 2176)
+ </notes>
</release>
<release>
<version>
@@ -106,8 +132,10 @@
</stability>
<date>2004-05-08</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Add support for other separator than the space char and bug
- correction</notes>
+ <notes>
+Add support for other separator than the space char and bug
+ correction
+ </notes>
</release>
<release>
<version>
@@ -120,8 +148,10 @@
</stability>
<date>2003-05-28</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>* Add support for BZ2 compression
-* Add support for add and extract without using temporary files : methods addString() and extractInString()</notes>
+ <notes>
+* Add support for BZ2 compression
+* Add support for add and extract without using temporary files : methods addString() and extractInString()
+ </notes>
</release>
<release>
<version>
@@ -134,7 +164,9 @@
</stability>
<date>2003-01-24</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Change status to stable</notes>
+ <notes>
+Change status to stable
+ </notes>
</release>
<release>
<version>
@@ -147,7 +179,9 @@
</stability>
<date>2003-01-08</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Add support for long filenames (greater than 99 characters)</notes>
+ <notes>
+Add support for long filenames (greater than 99 characters)
+ </notes>
</release>
<release>
<version>
@@ -160,7 +194,9 @@
</stability>
<date>2002-05-27</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Auto-detect gzip'ed files</notes>
+ <notes>
+Auto-detect gzip'ed files
+ </notes>
</release>
<release>
<version>
@@ -173,7 +209,9 @@
</stability>
<date>2002-05-20</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Windows bugfix: use forward slashes inside archives</notes>
+ <notes>
+Windows bugfix: use forward slashes inside archives
+ </notes>
</release>
<release>
<version>
@@ -186,7 +224,9 @@
</stability>
<date>2002-02-18</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>From initial commit to stable</notes>
+ <notes>
+From initial commit to stable
+ </notes>
</release>
<release>
<version>
@@ -199,7 +239,9 @@
</stability>
<date>2002-04-13</date>
<license uri="http://www.php.net/license">PHP License</license>
- <notes>Windows bugfix: used wrong directory separators</notes>
+ <notes>
+Windows bugfix: used wrong directory separators
+ </notes>
</release>
</changelog>
</package>
|
|
Changed |
PEAR-1.9.0.tgz
^
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/Dump.php
^
|
@@ -1,187 +0,0 @@
-<?php
-
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Function and class to dump XML_RPC_Value objects in a nice way
- *
- * Should be helpful as a normal var_dump(..) displays all internals which
- * doesn't really give you an overview due to too much information.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Christian Weiske <cweiske@php.net>
- * @version CVS: $Id: Dump.php,v 1.7 2005/01/24 03:47:55 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- */
-
-
-/**
- * Pull in the XML_RPC class
- */
-require_once 'XML/RPC.php';
-
-
-/**
- * Generates the dump of the XML_RPC_Value and echoes it
- *
- * @param object $value the XML_RPC_Value object to dump
- *
- * @return void
- */
-function XML_RPC_Dump($value)
-{
- $dumper = new XML_RPC_Dump();
- echo $dumper->generateDump($value);
-}
-
-
-/**
- * Class which generates a dump of a XML_RPC_Value object
- *
- * @category Web Services
- * @package XML_RPC
- * @author Christian Weiske <cweiske@php.net>
- * @version Release: 1.5.1
- * @link http://pear.php.net/package/XML_RPC
- */
-class XML_RPC_Dump
-{
- /**
- * The indentation array cache
- * @var array
- */
- var $arIndent = array();
-
- /**
- * The spaces used for indenting the XML
- * @var string
- */
- var $strBaseIndent = ' ';
-
- /**
- * Returns the dump in XML format without printing it out
- *
- * @param object $value the XML_RPC_Value object to dump
- * @param int $nLevel the level of indentation
- *
- * @return string the dump
- */
- function generateDump($value, $nLevel = 0)
- {
- if (!is_object($value) && get_class($value) != 'xml_rpc_value') {
- require_once 'PEAR.php';
- PEAR::raiseError('Tried to dump non-XML_RPC_Value variable' . "\r\n",
- 0, PEAR_ERROR_PRINT);
- if (is_object($value)) {
- $strType = get_class($value);
- } else {
- $strType = gettype($value);
- }
- return $this->getIndent($nLevel) . 'NOT A XML_RPC_Value: '
- . $strType . "\r\n";
- }
-
- switch ($value->kindOf()) {
- case 'struct':
- $ret = $this->genStruct($value, $nLevel);
- break;
- case 'array':
- $ret = $this->genArray($value, $nLevel);
- break;
- case 'scalar':
- $ret = $this->genScalar($value->scalarval(), $nLevel);
- break;
- default:
- require_once 'PEAR.php';
- PEAR::raiseError('Illegal type "' . $value->kindOf()
- . '" in XML_RPC_Value' . "\r\n", 0,
- PEAR_ERROR_PRINT);
- }
-
- return $ret;
- }
-
- /**
- * Returns the scalar value dump
- *
- * @param object $value the scalar XML_RPC_Value object to dump
- * @param int $nLevel the level of indentation
- *
- * @return string Dumped version of the scalar value
- */
- function genScalar($value, $nLevel)
- {
- if (gettype($value) == 'object') {
- $strClass = ' ' . get_class($value);
- } else {
- $strClass = '';
- }
- return $this->getIndent($nLevel) . gettype($value) . $strClass
- . ' ' . $value . "\r\n";
- }
-
- /**
- * Returns the dump of a struct
- *
- * @param object $value the struct XML_RPC_Value object to dump
- * @param int $nLevel the level of indentation
- *
- * @return string Dumped version of the scalar value
- */
- function genStruct($value, $nLevel)
- {
- $value->structreset();
- $strOutput = $this->getIndent($nLevel) . 'struct' . "\r\n";
- while (list($key, $keyval) = $value->structeach()) {
- $strOutput .= $this->getIndent($nLevel + 1) . $key . "\r\n";
- $strOutput .= $this->generateDump($keyval, $nLevel + 2);
- }
- return $strOutput;
- }
-
- /**
- * Returns the dump of an array
- *
- * @param object $value the array XML_RPC_Value object to dump
- * @param int $nLevel the level of indentation
- *
- * @return string Dumped version of the scalar value
- */
- function genArray($value, $nLevel)
- {
- $nSize = $value->arraysize();
- $strOutput = $this->getIndent($nLevel) . 'array' . "\r\n";
- for($nA = 0; $nA < $nSize; $nA++) {
- $strOutput .= $this->getIndent($nLevel + 1) . $nA . "\r\n";
- $strOutput .= $this->generateDump($value->arraymem($nA),
- $nLevel + 2);
- }
- return $strOutput;
- }
-
- /**
- * Returns the indent for a specific level and caches it for faster use
- *
- * @param int $nLevel the level
- *
- * @return string the indented string
- */
- function getIndent($nLevel)
- {
- if (!isset($this->arIndent[$nLevel])) {
- $this->arIndent[$nLevel] = str_repeat($this->strBaseIndent, $nLevel);
- }
- return $this->arIndent[$nLevel];
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/RPC.php
^
|
@@ -1,2077 +0,0 @@
-<?php
-
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * PHP implementation of the XML-RPC protocol
- *
- * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
- * It has support for HTTP transport, proxies and authentication.
- *
- * PHP versions 4 and 5
- *
- * LICENSE: License is granted to use or modify this software
- * ("XML-RPC for PHP") for commercial or non-commercial use provided the
- * copyright of the author is preserved in any distributed or derivative work.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESSED 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 AUTHOR 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.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version CVS: $Id: RPC.php,v 1.101 2006/10/28 16:42:34 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- */
-
-
-if (!function_exists('xml_parser_create')) {
- include_once 'PEAR.php';
- PEAR::loadExtension('xml');
-}
-
-/**#@+
- * Error constants
- */
-/**
- * Parameter values don't match parameter types
- */
-define('XML_RPC_ERROR_INVALID_TYPE', 101);
-/**
- * Parameter declared to be numeric but the values are not
- */
-define('XML_RPC_ERROR_NON_NUMERIC_FOUND', 102);
-/**
- * Communication error
- */
-define('XML_RPC_ERROR_CONNECTION_FAILED', 103);
-/**
- * The array or struct has already been started
- */
-define('XML_RPC_ERROR_ALREADY_INITIALIZED', 104);
-/**
- * Incorrect parameters submitted
- */
-define('XML_RPC_ERROR_INCORRECT_PARAMS', 105);
-/**
- * Programming error by developer
- */
-define('XML_RPC_ERROR_PROGRAMMING', 106);
-/**#@-*/
-
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_I4']
- */
-$GLOBALS['XML_RPC_I4'] = 'i4';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_Int']
- */
-$GLOBALS['XML_RPC_Int'] = 'int';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_Boolean']
- */
-$GLOBALS['XML_RPC_Boolean'] = 'boolean';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_Double']
- */
-$GLOBALS['XML_RPC_Double'] = 'double';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_String']
- */
-$GLOBALS['XML_RPC_String'] = 'string';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_DateTime']
- */
-$GLOBALS['XML_RPC_DateTime'] = 'dateTime.iso8601';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_Base64']
- */
-$GLOBALS['XML_RPC_Base64'] = 'base64';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_Array']
- */
-$GLOBALS['XML_RPC_Array'] = 'array';
-
-/**
- * Data types
- * @global string $GLOBALS['XML_RPC_Struct']
- */
-$GLOBALS['XML_RPC_Struct'] = 'struct';
-
-
-/**
- * Data type meta-types
- * @global array $GLOBALS['XML_RPC_Types']
- */
-$GLOBALS['XML_RPC_Types'] = array(
- $GLOBALS['XML_RPC_I4'] => 1,
- $GLOBALS['XML_RPC_Int'] => 1,
- $GLOBALS['XML_RPC_Boolean'] => 1,
- $GLOBALS['XML_RPC_String'] => 1,
- $GLOBALS['XML_RPC_Double'] => 1,
- $GLOBALS['XML_RPC_DateTime'] => 1,
- $GLOBALS['XML_RPC_Base64'] => 1,
- $GLOBALS['XML_RPC_Array'] => 2,
- $GLOBALS['XML_RPC_Struct'] => 3,
-);
-
-
-/**
- * Error message numbers
- * @global array $GLOBALS['XML_RPC_err']
- */
-$GLOBALS['XML_RPC_err'] = array(
- 'unknown_method' => 1,
- 'invalid_return' => 2,
- 'incorrect_params' => 3,
- 'introspect_unknown' => 4,
- 'http_error' => 5,
- 'not_response_object' => 6,
- 'invalid_request' => 7,
-);
-
-/**
- * Error message strings
- * @global array $GLOBALS['XML_RPC_str']
- */
-$GLOBALS['XML_RPC_str'] = array(
- 'unknown_method' => 'Unknown method',
- 'invalid_return' => 'Invalid return payload: enable debugging to examine incoming payload',
- 'incorrect_params' => 'Incorrect parameters passed to method',
- 'introspect_unknown' => 'Can\'t introspect: method unknown',
- 'http_error' => 'Didn\'t receive 200 OK from remote server.',
- 'not_response_object' => 'The requested method didn\'t return an XML_RPC_Response object.',
- 'invalid_request' => 'Invalid request payload',
-);
-
-
-/**
- * Default XML encoding (ISO-8859-1, UTF-8 or US-ASCII)
- * @global string $GLOBALS['XML_RPC_defencoding']
- */
-$GLOBALS['XML_RPC_defencoding'] = 'UTF-8';
-
-/**
- * User error codes start at 800
- * @global int $GLOBALS['XML_RPC_erruser']
- */
-$GLOBALS['XML_RPC_erruser'] = 800;
-
-/**
- * XML parse error codes start at 100
- * @global int $GLOBALS['XML_RPC_errxml']
- */
-$GLOBALS['XML_RPC_errxml'] = 100;
-
-
-/**
- * Compose backslashes for escaping regexp
- * @global string $GLOBALS['XML_RPC_backslash']
- */
-$GLOBALS['XML_RPC_backslash'] = chr(92) . chr(92);
-
-
-/**#@+
- * Which functions to use, depending on whether mbstring is enabled or not.
- */
-if (function_exists('mb_ereg')) {
- /** @global string $GLOBALS['XML_RPC_func_ereg'] */
- $GLOBALS['XML_RPC_func_ereg'] = 'mb_eregi';
- /** @global string $GLOBALS['XML_RPC_func_ereg_replace'] */
- $GLOBALS['XML_RPC_func_ereg_replace'] = 'mb_eregi_replace';
- /** @global string $GLOBALS['XML_RPC_func_split'] */
- $GLOBALS['XML_RPC_func_split'] = 'mb_split';
-} else {
- /** @ignore */
- $GLOBALS['XML_RPC_func_ereg'] = 'eregi';
- /** @ignore */
- $GLOBALS['XML_RPC_func_ereg_replace'] = 'eregi_replace';
- /** @ignore */
- $GLOBALS['XML_RPC_func_split'] = 'split';
-}
-/**#@-*/
-
-
-/**
- * Should we automatically base64 encode strings that contain characters
- * which can cause PHP's SAX-based XML parser to break?
- * @global boolean $GLOBALS['XML_RPC_auto_base64']
- */
-$GLOBALS['XML_RPC_auto_base64'] = false;
-
-
-/**
- * Valid parents of XML elements
- * @global array $GLOBALS['XML_RPC_valid_parents']
- */
-$GLOBALS['XML_RPC_valid_parents'] = array(
- 'BOOLEAN' => array('VALUE'),
- 'I4' => array('VALUE'),
- 'INT' => array('VALUE'),
- 'STRING' => array('VALUE'),
- 'DOUBLE' => array('VALUE'),
- 'DATETIME.ISO8601' => array('VALUE'),
- 'BASE64' => array('VALUE'),
- 'ARRAY' => array('VALUE'),
- 'STRUCT' => array('VALUE'),
- 'PARAM' => array('PARAMS'),
- 'METHODNAME' => array('METHODCALL'),
- 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
- 'MEMBER' => array('STRUCT'),
- 'NAME' => array('MEMBER'),
- 'DATA' => array('ARRAY'),
- 'FAULT' => array('METHODRESPONSE'),
- 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),
-);
-
-
-/**
- * Stores state during parsing
- *
- * quick explanation of components:
- * + ac = accumulates values
- * + qt = decides if quotes are needed for evaluation
- * + cm = denotes struct or array (comma needed)
- * + isf = indicates a fault
- * + lv = indicates "looking for a value": implements the logic
- * to allow values with no types to be strings
- * + params = stores parameters in method calls
- * + method = stores method name
- *
- * @global array $GLOBALS['XML_RPC_xh']
- */
-$GLOBALS['XML_RPC_xh'] = array();
-
-
-/**
- * Start element handler for the XML parser
- *
- * @return void
- */
-function XML_RPC_se($parser_resource, $name, $attrs)
-{
- global $XML_RPC_xh, $XML_RPC_valid_parents;
-
- $parser = (int) $parser_resource;
-
- // if invalid xmlrpc already detected, skip all processing
- if ($XML_RPC_xh[$parser]['isf'] >= 2) {
- return;
- }
-
- // check for correct element nesting
- // top level element can only be of 2 types
- if (count($XML_RPC_xh[$parser]['stack']) == 0) {
- if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') {
- $XML_RPC_xh[$parser]['isf'] = 2;
- $XML_RPC_xh[$parser]['isf_reason'] = 'missing top level xmlrpc element';
- return;
- }
- } else {
- // not top level element: see if parent is OK
- if (!in_array($XML_RPC_xh[$parser]['stack'][0], $XML_RPC_valid_parents[$name])) {
- $name = $GLOBALS['XML_RPC_func_ereg_replace']('[^a-zA-Z0-9._-]', '', $name);
- $XML_RPC_xh[$parser]['isf'] = 2;
- $XML_RPC_xh[$parser]['isf_reason'] = "xmlrpc element $name cannot be child of {$XML_RPC_xh[$parser]['stack'][0]}";
- return;
- }
- }
-
- switch ($name) {
- case 'STRUCT':
- $XML_RPC_xh[$parser]['cm']++;
-
- // turn quoting off
- $XML_RPC_xh[$parser]['qt'] = 0;
-
- $cur_val = array();
- $cur_val['value'] = array();
- $cur_val['members'] = 1;
- array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
- break;
-
- case 'ARRAY':
- $XML_RPC_xh[$parser]['cm']++;
-
- // turn quoting off
- $XML_RPC_xh[$parser]['qt'] = 0;
-
- $cur_val = array();
- $cur_val['value'] = array();
- $cur_val['members'] = 0;
- array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
- break;
-
- case 'NAME':
- $XML_RPC_xh[$parser]['ac'] = '';
- break;
-
- case 'FAULT':
- $XML_RPC_xh[$parser]['isf'] = 1;
- break;
-
- case 'PARAM':
- $XML_RPC_xh[$parser]['valuestack'] = array();
- break;
-
- case 'VALUE':
- $XML_RPC_xh[$parser]['lv'] = 1;
- $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_String'];
- $XML_RPC_xh[$parser]['ac'] = '';
- $XML_RPC_xh[$parser]['qt'] = 0;
- // look for a value: if this is still 1 by the
- // time we reach the first data segment then the type is string
- // by implication and we need to add in a quote
- break;
-
- case 'I4':
- case 'INT':
- case 'STRING':
- case 'BOOLEAN':
- case 'DOUBLE':
- case 'DATETIME.ISO8601':
- case 'BASE64':
- $XML_RPC_xh[$parser]['ac'] = ''; // reset the accumulator
-
- if ($name == 'DATETIME.ISO8601' || $name == 'STRING') {
- $XML_RPC_xh[$parser]['qt'] = 1;
-
- if ($name == 'DATETIME.ISO8601') {
- $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_DateTime'];
- }
-
- } elseif ($name == 'BASE64') {
- $XML_RPC_xh[$parser]['qt'] = 2;
- } else {
- // No quoting is required here -- but
- // at the end of the element we must check
- // for data format errors.
- $XML_RPC_xh[$parser]['qt'] = 0;
- }
- break;
-
- case 'MEMBER':
- $XML_RPC_xh[$parser]['ac'] = '';
- break;
-
- case 'DATA':
- case 'METHODCALL':
- case 'METHODNAME':
- case 'METHODRESPONSE':
- case 'PARAMS':
- // valid elements that add little to processing
- break;
- }
-
-
- // Save current element to stack
- array_unshift($XML_RPC_xh[$parser]['stack'], $name);
-
- if ($name != 'VALUE') {
- $XML_RPC_xh[$parser]['lv'] = 0;
- }
-}
-
-/**
- * End element handler for the XML parser
- *
- * @return void
- */
-function XML_RPC_ee($parser_resource, $name)
-{
- global $XML_RPC_xh;
-
- $parser = (int) $parser_resource;
-
- if ($XML_RPC_xh[$parser]['isf'] >= 2) {
- return;
- }
-
- // push this element from stack
- // NB: if XML validates, correct opening/closing is guaranteed and
- // we do not have to check for $name == $curr_elem.
- // we also checked for proper nesting at start of elements...
- $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']);
-
- switch ($name) {
- case 'STRUCT':
- case 'ARRAY':
- $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
- $XML_RPC_xh[$parser]['value'] = $cur_val['value'];
- $XML_RPC_xh[$parser]['vt'] = strtolower($name);
- $XML_RPC_xh[$parser]['cm']--;
- break;
-
- case 'NAME':
- $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac'];
- break;
-
- case 'BOOLEAN':
- // special case here: we translate boolean 1 or 0 into PHP
- // constants true or false
- if ($XML_RPC_xh[$parser]['ac'] == '1') {
- $XML_RPC_xh[$parser]['ac'] = 'true';
- } else {
- $XML_RPC_xh[$parser]['ac'] = 'false';
- }
-
- $XML_RPC_xh[$parser]['vt'] = strtolower($name);
- // Drop through intentionally.
-
- case 'I4':
- case 'INT':
- case 'STRING':
- case 'DOUBLE':
- case 'DATETIME.ISO8601':
- case 'BASE64':
- if ($XML_RPC_xh[$parser]['qt'] == 1) {
- // we use double quotes rather than single so backslashification works OK
- $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
- } elseif ($XML_RPC_xh[$parser]['qt'] == 2) {
- $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']);
- } elseif ($name == 'BOOLEAN') {
- $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
- } else {
- // we have an I4, INT or a DOUBLE
- // we must check that only 0123456789-.<space> are characters here
- if (!$GLOBALS['XML_RPC_func_ereg']("^[+-]?[0123456789 \t\.]+$", $XML_RPC_xh[$parser]['ac'])) {
- XML_RPC_Base::raiseError('Non-numeric value received in INT or DOUBLE',
- XML_RPC_ERROR_NON_NUMERIC_FOUND);
- $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
- } else {
- // it's ok, add it on
- $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
- }
- }
-
- $XML_RPC_xh[$parser]['ac'] = '';
- $XML_RPC_xh[$parser]['qt'] = 0;
- $XML_RPC_xh[$parser]['lv'] = 3; // indicate we've found a value
- break;
-
- case 'VALUE':
- if ($XML_RPC_xh[$parser]['vt'] == $GLOBALS['XML_RPC_String']) {
- if (strlen($XML_RPC_xh[$parser]['ac']) > 0) {
- $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
- } elseif ($XML_RPC_xh[$parser]['lv'] == 1) {
- // The <value> element was empty.
- $XML_RPC_xh[$parser]['value'] = '';
- }
- }
-
- $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']);
-
- $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
- if (is_array($cur_val)) {
- if ($cur_val['members']==0) {
- $cur_val['value'][] = $temp;
- } else {
- $XML_RPC_xh[$parser]['value'] = $temp;
- }
- array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
- } else {
- $XML_RPC_xh[$parser]['value'] = $temp;
- }
- break;
-
- case 'MEMBER':
- $XML_RPC_xh[$parser]['ac'] = '';
- $XML_RPC_xh[$parser]['qt'] = 0;
-
- $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
- if (is_array($cur_val)) {
- if ($cur_val['members']==1) {
- $cur_val['value'][$cur_val['name']] = $XML_RPC_xh[$parser]['value'];
- }
- array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
- }
- break;
-
- case 'DATA':
- $XML_RPC_xh[$parser]['ac'] = '';
- $XML_RPC_xh[$parser]['qt'] = 0;
- break;
-
- case 'PARAM':
- $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value'];
- break;
-
- case 'METHODNAME':
- case 'RPCMETHODNAME':
- $XML_RPC_xh[$parser]['method'] = $GLOBALS['XML_RPC_func_ereg_replace']("^[\n\r\t ]+", '',
- $XML_RPC_xh[$parser]['ac']);
- break;
- }
-
- // if it's a valid type name, set the type
- if (isset($GLOBALS['XML_RPC_Types'][strtolower($name)])) {
- $XML_RPC_xh[$parser]['vt'] = strtolower($name);
- }
-}
-
-/**
- * Character data handler for the XML parser
- *
- * @return void
- */
-function XML_RPC_cd($parser_resource, $data)
-{
- global $XML_RPC_xh, $XML_RPC_backslash;
-
- $parser = (int) $parser_resource;
-
- if ($XML_RPC_xh[$parser]['lv'] != 3) {
- // "lookforvalue==3" means that we've found an entire value
- // and should discard any further character data
-
- if ($XML_RPC_xh[$parser]['lv'] == 1) {
- // if we've found text and we're just in a <value> then
- // turn quoting on, as this will be a string
- $XML_RPC_xh[$parser]['qt'] = 1;
- // and say we've found a value
- $XML_RPC_xh[$parser]['lv'] = 2;
- }
-
- // replace characters that eval would
- // do special things with
- if (!isset($XML_RPC_xh[$parser]['ac'])) {
- $XML_RPC_xh[$parser]['ac'] = '';
- }
- $XML_RPC_xh[$parser]['ac'] .= $data;
- }
-}
-
-/**
- * The common methods and properties for all of the XML_RPC classes
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version Release: 1.5.1
- * @link http://pear.php.net/package/XML_RPC
- */
-class XML_RPC_Base {
-
- /**
- * PEAR Error handling
- *
- * @return object PEAR_Error object
- */
- function raiseError($msg, $code)
- {
- include_once 'PEAR.php';
- if (is_object(@$this)) {
- return PEAR::raiseError(get_class($this) . ': ' . $msg, $code);
- } else {
- return PEAR::raiseError('XML_RPC: ' . $msg, $code);
- }
- }
-
- /**
- * Tell whether something is a PEAR_Error object
- *
- * @param mixed $value the item to check
- *
- * @return bool whether $value is a PEAR_Error object or not
- *
- * @access public
- */
- function isError($value)
- {
- return is_a($value, 'PEAR_Error');
- }
-}
-
-/**
- * The methods and properties for submitting XML RPC requests
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version Release: 1.5.1
- * @link http://pear.php.net/package/XML_RPC
- */
-class XML_RPC_Client extends XML_RPC_Base {
-
- /**
- * The path and name of the RPC server script you want the request to go to
- * @var string
- */
- var $path = '';
-
- /**
- * The name of the remote server to connect to
- * @var string
- */
- var $server = '';
-
- /**
- * The protocol to use in contacting the remote server
- * @var string
- */
- var $protocol = 'http://';
-
- /**
- * The port for connecting to the remote server
- *
- * The default is 80 for http:// connections
- * and 443 for https:// and ssl:// connections.
- *
- * @var integer
- */
- var $port = 80;
-
- /**
- * A user name for accessing the RPC server
- * @var string
- * @see XML_RPC_Client::setCredentials()
- */
- var $username = '';
-
- /**
- * A password for accessing the RPC server
- * @var string
- * @see XML_RPC_Client::setCredentials()
- */
- var $password = '';
-
- /**
- * The name of the proxy server to use, if any
- * @var string
- */
- var $proxy = '';
-
- /**
- * The protocol to use in contacting the proxy server, if any
- * @var string
- */
- var $proxy_protocol = 'http://';
-
- /**
- * The port for connecting to the proxy server
- *
- * The default is 8080 for http:// connections
- * and 443 for https:// and ssl:// connections.
- *
- * @var integer
- */
- var $proxy_port = 8080;
-
- /**
- * A user name for accessing the proxy server
- * @var string
- */
- var $proxy_user = '';
-
- /**
- * A password for accessing the proxy server
- * @var string
- */
- var $proxy_pass = '';
-
- /**
- * The error number, if any
- * @var integer
- */
- var $errno = 0;
-
- /**
- * The error message, if any
- * @var string
- */
- var $errstr = '';
-
- /**
- * The current debug mode (1 = on, 0 = off)
- * @var integer
- */
- var $debug = 0;
-
- /**
- * The HTTP headers for the current request.
- * @var string
- */
- var $headers = '';
-
-
- /**
- * Sets the object's properties
- *
- * @param string $path the path and name of the RPC server script
- * you want the request to go to
- * @param string $server the URL of the remote server to connect to.
- * If this parameter doesn't specify a
- * protocol and $port is 443, ssl:// is
- * assumed.
- * @param integer $port a port for connecting to the remote server.
- * Defaults to 80 for http:// connections and
- * 443 for https:// and ssl:// connections.
- * @param string $proxy the URL of the proxy server to use, if any.
- * If this parameter doesn't specify a
- * protocol and $port is 443, ssl:// is
- * assumed.
- * @param integer $proxy_port a port for connecting to the remote server.
- * Defaults to 8080 for http:// connections and
- * 443 for https:// and ssl:// connections.
- * @param string $proxy_user a user name for accessing the proxy server
- * @param string $proxy_pass a password for accessing the proxy server
- *
- * @return void
- */
- function XML_RPC_Client($path, $server, $port = 0,
- $proxy = '', $proxy_port = 0,
- $proxy_user = '', $proxy_pass = '')
- {
- $this->path = $path;
- $this->proxy_user = $proxy_user;
- $this->proxy_pass = $proxy_pass;
-
- $GLOBALS['XML_RPC_func_ereg']('^(http://|https://|ssl://)?(.*)$', $server, $match);
- if ($match[1] == '') {
- if ($port == 443) {
- $this->server = $match[2];
- $this->protocol = 'ssl://';
- $this->port = 443;
- } else {
- $this->server = $match[2];
- if ($port) {
- $this->port = $port;
- }
- }
- } elseif ($match[1] == 'http://') {
- $this->server = $match[2];
- if ($port) {
- $this->port = $port;
- }
- } else {
- $this->server = $match[2];
- $this->protocol = 'ssl://';
- if ($port) {
- $this->port = $port;
- } else {
- $this->port = 443;
- }
- }
-
- if ($proxy) {
- $GLOBALS['XML_RPC_func_ereg']('^(http://|https://|ssl://)?(.*)$', $proxy, $match);
- if ($match[1] == '') {
- if ($proxy_port == 443) {
- $this->proxy = $match[2];
- $this->proxy_protocol = 'ssl://';
- $this->proxy_port = 443;
- } else {
- $this->proxy = $match[2];
- if ($proxy_port) {
- $this->proxy_port = $proxy_port;
- }
- }
- } elseif ($match[1] == 'http://') {
- $this->proxy = $match[2];
- if ($proxy_port) {
- $this->proxy_port = $proxy_port;
- }
- } else {
- $this->proxy = $match[2];
- $this->proxy_protocol = 'ssl://';
- if ($proxy_port) {
- $this->proxy_port = $proxy_port;
- } else {
- $this->proxy_port = 443;
- }
- }
- }
- }
-
- /**
- * Change the current debug mode
- *
- * @param int $in where 1 = on, 0 = off
- *
- * @return void
- */
- function setDebug($in)
- {
- if ($in) {
- $this->debug = 1;
- } else {
- $this->debug = 0;
- }
- }
-
- /**
- * Sets whether strings that contain characters which may cause PHP's
- * SAX-based XML parser to break should be automatically base64 encoded
- *
- * This is is a workaround for systems that don't have PHP's mbstring
- * extension available.
- *
- * @param int $in where 1 = on, 0 = off
- *
- * @return void
- */
- function setAutoBase64($in)
- {
- if ($in) {
- $GLOBALS['XML_RPC_auto_base64'] = true;
- } else {
- $GLOBALS['XML_RPC_auto_base64'] = false;
- }
- }
-
- /**
- * Set username and password properties for connecting to the RPC server
- *
- * @param string $u the user name
- * @param string $p the password
- *
- * @return void
- *
- * @see XML_RPC_Client::$username, XML_RPC_Client::$password
- */
- function setCredentials($u, $p)
- {
- $this->username = $u;
- $this->password = $p;
- }
-
- /**
- * Transmit the RPC request via HTTP 1.0 protocol
- *
- * @param object $msg the XML_RPC_Message object
- * @param int $timeout how many seconds to wait for the request
- *
- * @return object an XML_RPC_Response object. 0 is returned if any
- * problems happen.
- *
- * @see XML_RPC_Message, XML_RPC_Client::XML_RPC_Client(),
- * XML_RPC_Client::setCredentials()
- */
- function send($msg, $timeout = 0)
- {
- if (!is_a($msg, 'XML_RPC_Message')) {
- $this->errstr = 'send()\'s $msg parameter must be an'
- . ' XML_RPC_Message object.';
- $this->raiseError($this->errstr, XML_RPC_ERROR_PROGRAMMING);
- return 0;
- }
- $msg->debug = $this->debug;
- return $this->sendPayloadHTTP10($msg, $this->server, $this->port,
- $timeout, $this->username,
- $this->password);
- }
-
- /**
- * Transmit the RPC request via HTTP 1.0 protocol
- *
- * Requests should be sent using XML_RPC_Client send() rather than
- * calling this method directly.
- *
- * @param object $msg the XML_RPC_Message object
- * @param string $server the server to send the request to
- * @param int $port the server port send the request to
- * @param int $timeout how many seconds to wait for the request
- * before giving up
- * @param string $username a user name for accessing the RPC server
- * @param string $password a password for accessing the RPC server
- *
- * @return object an XML_RPC_Response object. 0 is returned if any
- * problems happen.
- *
- * @access protected
- * @see XML_RPC_Client::send()
- */
- function sendPayloadHTTP10($msg, $server, $port, $timeout = 0,
- $username = '', $password = '')
- {
- /*
- * If we're using a proxy open a socket to the proxy server
- * instead to the xml-rpc server
- */
- if ($this->proxy) {
- if ($this->proxy_protocol == 'http://') {
- $protocol = '';
- } else {
- $protocol = $this->proxy_protocol;
- }
- if ($timeout > 0) {
- $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
- $this->errno, $this->errstr, $timeout);
- } else {
- $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
- $this->errno, $this->errstr);
- }
- } else {
- if ($this->protocol == 'http://') {
- $protocol = '';
- } else {
- $protocol = $this->protocol;
- }
- if ($timeout > 0) {
- $fp = @fsockopen($protocol . $server, $port,
- $this->errno, $this->errstr, $timeout);
- } else {
- $fp = @fsockopen($protocol . $server, $port,
- $this->errno, $this->errstr);
- }
- }
-
- /*
- * Just raising the error without returning it is strange,
- * but keep it here for backwards compatibility.
- */
- if (!$fp && $this->proxy) {
- $this->raiseError('Connection to proxy server '
- . $this->proxy . ':' . $this->proxy_port
- . ' failed. ' . $this->errstr,
- XML_RPC_ERROR_CONNECTION_FAILED);
- return 0;
- } elseif (!$fp) {
- $this->raiseError('Connection to RPC server '
- . $server . ':' . $port
- . ' failed. ' . $this->errstr,
- XML_RPC_ERROR_CONNECTION_FAILED);
- return 0;
- }
-
- if ($timeout) {
- /*
- * Using socket_set_timeout() because stream_set_timeout()
- * was introduced in 4.3.0, but we need to support 4.2.0.
- */
- socket_set_timeout($fp, $timeout);
- }
-
- // Pre-emptive BC hacks for fools calling sendPayloadHTTP10() directly
- if ($username != $this->username) {
- $this->setCredentials($username, $password);
- }
-
- // Only create the payload if it was not created previously
- if (empty($msg->payload)) {
- $msg->createPayload();
- }
- $this->createHeaders($msg);
-
- $op = $this->headers . "\r\n\r\n";
- $op .= $msg->payload;
-
- if (!fputs($fp, $op, strlen($op))) {
- $this->errstr = 'Write error';
- return 0;
- }
- $resp = $msg->parseResponseFile($fp);
-
- $meta = socket_get_status($fp);
- if ($meta['timed_out']) {
- fclose($fp);
- $this->errstr = 'RPC server did not send response before timeout.';
- $this->raiseError($this->errstr, XML_RPC_ERROR_CONNECTION_FAILED);
- return 0;
- }
-
- fclose($fp);
- return $resp;
- }
-
- /**
- * Determines the HTTP headers and puts it in the $headers property
- *
- * @param object $msg the XML_RPC_Message object
- *
- * @return boolean TRUE if okay, FALSE if the message payload isn't set.
- *
- * @access protected
- */
- function createHeaders($msg)
- {
- if (empty($msg->payload)) {
- return false;
- }
- if ($this->proxy) {
- $this->headers = 'POST ' . $this->protocol . $this->server;
- if ($this->proxy_port) {
- $this->headers .= ':' . $this->port;
- }
- } else {
- $this->headers = 'POST ';
- }
- $this->headers .= $this->path. " HTTP/1.0\r\n";
-
- $this->headers .= "User-Agent: PEAR XML_RPC\r\n";
- $this->headers .= 'Host: ' . $this->server . "\r\n";
-
- if ($this->proxy && $this->proxy_user) {
- $this->headers .= 'Proxy-Authorization: Basic '
- . base64_encode("$this->proxy_user:$this->proxy_pass")
- . "\r\n";
- }
-
- // thanks to Grant Rauscher <grant7@firstworld.net> for this
- if ($this->username) {
- $this->headers .= 'Authorization: Basic '
- . base64_encode("$this->username:$this->password")
- . "\r\n";
- }
-
- $this->headers .= "Content-Type: text/xml\r\n";
- $this->headers .= 'Content-Length: ' . strlen($msg->payload);
- return true;
- }
-}
-
-/**
- * The methods and properties for interpreting responses to XML RPC requests
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version Release: 1.5.1
- * @link http://pear.php.net/package/XML_RPC
- */
-class XML_RPC_Response extends XML_RPC_Base
-{
- var $xv;
- var $fn;
- var $fs;
- var $hdrs;
-
- /**
- * @return void
- */
- function XML_RPC_Response($val, $fcode = 0, $fstr = '')
- {
- if ($fcode != 0) {
- $this->fn = $fcode;
- $this->fs = htmlspecialchars($fstr);
- } else {
- $this->xv = $val;
- }
- }
-
- /**
- * @return int the error code
- */
- function faultCode()
- {
- if (isset($this->fn)) {
- return $this->fn;
- } else {
- return 0;
- }
- }
-
- /**
- * @return string the error string
- */
- function faultString()
- {
- return $this->fs;
- }
-
- /**
- * @return mixed the value
- */
- function value()
- {
- return $this->xv;
- }
-
- /**
- * @return string the error message in XML format
- */
- function serialize()
- {
- $rs = "<methodResponse>\n";
- if ($this->fn) {
- $rs .= "<fault>
- <value>
- <struct>
- <member>
- <name>faultCode</name>
- <value><int>" . $this->fn . "</int></value>
- </member>
- <member>
- <name>faultString</name>
- <value><string>" . $this->fs . "</string></value>
- </member>
- </struct>
- </value>
-</fault>";
- } else {
- $rs .= "<params>\n<param>\n" . $this->xv->serialize() .
- "</param>\n</params>";
- }
- $rs .= "\n</methodResponse>";
- return $rs;
- }
-}
-
-/**
- * The methods and properties for composing XML RPC messages
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version Release: 1.5.1
- * @link http://pear.php.net/package/XML_RPC
- */
-class XML_RPC_Message extends XML_RPC_Base
-{
- /**
- * Should the payload's content be passed through mb_convert_encoding()?
- *
- * @see XML_RPC_Message::setConvertPayloadEncoding()
- * @since Property available since Release 1.5.1
- * @var boolean
- */
- var $convert_payload_encoding = false;
-
- /**
- * The current debug mode (1 = on, 0 = off)
- * @var integer
- */
- var $debug = 0;
-
- /**
- * The encoding to be used for outgoing messages
- *
- * Defaults to the value of <var>$GLOBALS['XML_RPC_defencoding']</var>
- *
- * @var string
- * @see XML_RPC_Message::setSendEncoding(),
- * $GLOBALS['XML_RPC_defencoding'], XML_RPC_Message::xml_header()
- */
- var $send_encoding = '';
-
- /**
- * The method presently being evaluated
- * @var string
- */
- var $methodname = '';
-
- /**
- * @var array
- */
- var $params = array();
-
- /**
- * The XML message being generated
- * @var string
- */
- var $payload = '';
-
- /**
- * Should extra line breaks be removed from the payload?
- * @since Property available since Release 1.4.6
- * @var boolean
- */
- var $remove_extra_lines = true;
-
- /**
- * The XML response from the remote server
- * @since Property available since Release 1.4.6
- * @var string
- */
- var $response_payload = '';
-
-
- /**
- * @return void
- */
- function XML_RPC_Message($meth, $pars = 0)
- {
- $this->methodname = $meth;
- if (is_array($pars) && sizeof($pars) > 0) {
- for ($i = 0; $i < sizeof($pars); $i++) {
- $this->addParam($pars[$i]);
- }
- }
- }
-
- /**
- * Produces the XML declaration including the encoding attribute
- *
- * The encoding is determined by this class' <var>$send_encoding</var>
- * property. If the <var>$send_encoding</var> property is not set, use
- * <var>$GLOBALS['XML_RPC_defencoding']</var>.
- *
- * @return string the XML declaration and <methodCall> element
- *
- * @see XML_RPC_Message::setSendEncoding(),
- * XML_RPC_Message::$send_encoding, $GLOBALS['XML_RPC_defencoding']
- */
- function xml_header()
- {
- global $XML_RPC_defencoding;
-
- if (!$this->send_encoding) {
- $this->send_encoding = $XML_RPC_defencoding;
- }
- return '<?xml version="1.0" encoding="' . $this->send_encoding . '"?>'
- . "\n<methodCall>\n";
- }
-
- /**
- * @return string the closing </methodCall> tag
- */
- function xml_footer()
- {
- return "</methodCall>\n";
- }
-
- /**
- * Fills the XML_RPC_Message::$payload property
- *
- * Part of the process makes sure all line endings are in DOS format
- * (CRLF), which is probably required by specifications.
- *
- * If XML_RPC_Message::setConvertPayloadEncoding() was set to true,
- * the payload gets passed through mb_convert_encoding()
- * to ensure the payload matches the encoding set in the
- * XML declaration. The encoding type can be manually set via
- * XML_RPC_Message::setSendEncoding().
- *
- * @return void
- *
- * @uses XML_RPC_Message::xml_header(), XML_RPC_Message::xml_footer()
- * @see XML_RPC_Message::setSendEncoding(), $GLOBALS['XML_RPC_defencoding'],
- * XML_RPC_Message::setConvertPayloadEncoding()
- */
- function createPayload()
- {
- $this->payload = $this->xml_header();
- $this->payload .= '<methodName>' . $this->methodname . "</methodName>\n";
- $this->payload .= "<params>\n";
- for ($i = 0; $i < sizeof($this->params); $i++) {
- $p = $this->params[$i];
- $this->payload .= "<param>\n" . $p->serialize() . "</param>\n";
- }
- $this->payload .= "</params>\n";
- $this->payload .= $this->xml_footer();
- if ($this->remove_extra_lines) {
- $this->payload = $GLOBALS['XML_RPC_func_ereg_replace']("[\r\n]+", "\r\n", $this->payload);
- } else {
- $this->payload = $GLOBALS['XML_RPC_func_ereg_replace']("\r\n|\n|\r|\n\r", "\r\n", $this->payload);
- }
- if ($this->convert_payload_encoding) {
- $this->payload = mb_convert_encoding($this->payload, $this->send_encoding);
- }
- }
-
- /**
- * @return string the name of the method
- */
- function method($meth = '')
- {
- if ($meth != '') {
- $this->methodname = $meth;
- }
- return $this->methodname;
- }
-
- /**
- * @return string the payload
- */
- function serialize()
- {
- $this->createPayload();
- return $this->payload;
- }
-
- /**
- * @return void
- */
- function addParam($par)
- {
- $this->params[] = $par;
- }
-
- /**
- * Obtains an XML_RPC_Value object for the given parameter
- *
- * @param int $i the index number of the parameter to obtain
- *
- * @return object the XML_RPC_Value object.
- * If the parameter doesn't exist, an XML_RPC_Response object.
- *
- * @since Returns XML_RPC_Response object on error since Release 1.3.0
- */
- function getParam($i)
- {
- global $XML_RPC_err, $XML_RPC_str;
-
- if (isset($this->params[$i])) {
- return $this->params[$i];
- } else {
- $this->raiseError('The submitted request did not contain this parameter',
- XML_RPC_ERROR_INCORRECT_PARAMS);
- return new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
- $XML_RPC_str['incorrect_params']);
- }
- }
-
- /**
- * @return int the number of parameters
- */
- function getNumParams()
- {
- return sizeof($this->params);
- }
-
- /**
- * Sets whether the payload's content gets passed through
- * mb_convert_encoding()
- *
- * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
- *
- * @param int $in where 1 = on, 0 = off
- *
- * @return void
- *
- * @see XML_RPC_Message::setSendEncoding()
- * @since Method available since Release 1.5.1
- */
- function setConvertPayloadEncoding($in)
- {
- if ($in && !function_exists('mb_convert_encoding')) {
- return $this->raiseError('mb_convert_encoding() is not available',
- XML_RPC_ERROR_PROGRAMMING);
- }
- $this->convert_payload_encoding = $in;
- }
-
- /**
- * Sets the XML declaration's encoding attribute
- *
- * @param string $type the encoding type (ISO-8859-1, UTF-8 or US-ASCII)
- *
- * @return void
- *
- * @see XML_RPC_Message::setConvertPayloadEncoding(), XML_RPC_Message::xml_header()
- * @since Method available since Release 1.2.0
- */
- function setSendEncoding($type)
- {
- $this->send_encoding = $type;
- }
-
- /**
- * Determine the XML's encoding via the encoding attribute
- * in the XML declaration
- *
- * If the encoding parameter is not set or is not ISO-8859-1, UTF-8
- * or US-ASCII, $XML_RPC_defencoding will be returned.
- *
- * @param string $data the XML that will be parsed
- *
- * @return string the encoding to be used
- *
- * @link http://php.net/xml_parser_create
- * @since Method available since Release 1.2.0
- */
- function getEncoding($data)
- {
- global $XML_RPC_defencoding;
-
- if ($GLOBALS['XML_RPC_func_ereg']('<\?xml[^>]*[:space:]*encoding[:space:]*=[:space:]*[\'"]([^"\']*)[\'"]',
- $data, $match))
- {
- $match[1] = trim(strtoupper($match[1]));
- switch ($match[1]) {
- case 'ISO-8859-1':
- case 'UTF-8':
- case 'US-ASCII':
- return $match[1];
- break;
-
- default:
- return $XML_RPC_defencoding;
- }
- } else {
- return $XML_RPC_defencoding;
- }
- }
-
- /**
- * @return object a new XML_RPC_Response object
- */
- function parseResponseFile($fp)
- {
- $ipd = '';
- while ($data = @fread($fp, 8192)) {
- $ipd .= $data;
- }
- return $this->parseResponse($ipd);
- }
-
- /**
- * @return object a new XML_RPC_Response object
- */
- function parseResponse($data = '')
- {
- global $XML_RPC_xh, $XML_RPC_err, $XML_RPC_str, $XML_RPC_defencoding;
-
- $encoding = $this->getEncoding($data);
- $parser_resource = xml_parser_create($encoding);
- $parser = (int) $parser_resource;
-
- $XML_RPC_xh = array();
- $XML_RPC_xh[$parser] = array();
-
- $XML_RPC_xh[$parser]['cm'] = 0;
- $XML_RPC_xh[$parser]['isf'] = 0;
- $XML_RPC_xh[$parser]['ac'] = '';
- $XML_RPC_xh[$parser]['qt'] = '';
- $XML_RPC_xh[$parser]['stack'] = array();
- $XML_RPC_xh[$parser]['valuestack'] = array();
-
- xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
- xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
- xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
-
- $hdrfnd = 0;
- if ($this->debug) {
- print "\n<pre>---GOT---\n";
- print isset($_SERVER['SERVER_PROTOCOL']) ? htmlspecialchars($data) : $data;
- print "\n---END---</pre>\n";
- }
-
- // See if response is a 200 or a 100 then a 200, else raise error.
- // But only do this if we're using the HTTP protocol.
- if ($GLOBALS['XML_RPC_func_ereg']('^HTTP', $data) &&
- !$GLOBALS['XML_RPC_func_ereg']('^HTTP/[0-9\.]+ 200 ', $data) &&
- !$GLOBALS['XML_RPC_func_ereg']('^HTTP/[0-9\.]+ 10[0-9]([A-Z ]+)?[\r\n]+HTTP/[0-9\.]+ 200', $data))
- {
- $errstr = substr($data, 0, strpos($data, "\n") - 1);
- error_log('HTTP error, got response: ' . $errstr);
- $r = new XML_RPC_Response(0, $XML_RPC_err['http_error'],
- $XML_RPC_str['http_error'] . ' (' .
- $errstr . ')');
- xml_parser_free($parser_resource);
- return $r;
- }
-
- // gotta get rid of headers here
- if (!$hdrfnd && ($brpos = strpos($data,"\r\n\r\n"))) {
- $XML_RPC_xh[$parser]['ha'] = substr($data, 0, $brpos);
- $data = substr($data, $brpos + 4);
- $hdrfnd = 1;
- }
-
- /*
- * be tolerant of junk after methodResponse
- * (e.g. javascript automatically inserted by free hosts)
- * thanks to Luca Mariano <luca.mariano@email.it>
- */
- $data = substr($data, 0, strpos($data, "</methodResponse>") + 17);
- $this->response_payload = $data;
-
- if (!xml_parse($parser_resource, $data, sizeof($data))) {
- // thanks to Peter Kocks <peter.kocks@baygate.com>
- if (xml_get_current_line_number($parser_resource) == 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_resource)),
- xml_get_current_line_number($parser_resource));
- }
- error_log($errstr);
- $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
- $XML_RPC_str['invalid_return']);
- xml_parser_free($parser_resource);
- return $r;
- }
-
- xml_parser_free($parser_resource);
-
- if ($this->debug) {
- print "\n<pre>---PARSED---\n";
- var_dump($XML_RPC_xh[$parser]['value']);
- print "---END---</pre>\n";
- }
-
- if ($XML_RPC_xh[$parser]['isf'] > 1) {
- $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
- $XML_RPC_str['invalid_return'].' '.$XML_RPC_xh[$parser]['isf_reason']);
- } elseif (!is_object($XML_RPC_xh[$parser]['value'])) {
- // then something odd has happened
- // and it's time to generate a client side error
- // indicating something odd went on
- $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
- $XML_RPC_str['invalid_return']);
- } else {
- $v = $XML_RPC_xh[$parser]['value'];
- if ($XML_RPC_xh[$parser]['isf']) {
- $f = $v->structmem('faultCode');
- $fs = $v->structmem('faultString');
- $r = new XML_RPC_Response($v, $f->scalarval(),
- $fs->scalarval());
- } else {
- $r = new XML_RPC_Response($v);
- }
- }
- $r->hdrs = split("\r?\n", $XML_RPC_xh[$parser]['ha'][1]);
- return $r;
- }
-}
-
-/**
- * The methods and properties that represent data in XML RPC format
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version Release: 1.5.1
- * @link http://pear.php.net/package/XML_RPC
- */
-class XML_RPC_Value extends XML_RPC_Base
-{
- var $me = array();
- var $mytype = 0;
-
- /**
- * @return void
- */
- function XML_RPC_Value($val = -1, $type = '')
- {
- $this->me = array();
- $this->mytype = 0;
- if ($val != -1 || $type != '') {
- if ($type == '') {
- $type = 'string';
- }
- if (!array_key_exists($type, $GLOBALS['XML_RPC_Types'])) {
- // XXX
- // need some way to report this error
- } elseif ($GLOBALS['XML_RPC_Types'][$type] == 1) {
- $this->addScalar($val, $type);
- } elseif ($GLOBALS['XML_RPC_Types'][$type] == 2) {
- $this->addArray($val);
- } elseif ($GLOBALS['XML_RPC_Types'][$type] == 3) {
- $this->addStruct($val);
- }
- }
- }
-
- /**
- * @return int returns 1 if successful or 0 if there are problems
- */
- function addScalar($val, $type = 'string')
- {
- if ($this->mytype == 1) {
- $this->raiseError('Scalar can have only one value',
- XML_RPC_ERROR_INVALID_TYPE);
- return 0;
- }
- $typeof = $GLOBALS['XML_RPC_Types'][$type];
- if ($typeof != 1) {
- $this->raiseError("Not a scalar type (${typeof})",
- XML_RPC_ERROR_INVALID_TYPE);
- return 0;
- }
-
- if ($type == $GLOBALS['XML_RPC_Boolean']) {
- 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 XML_RPC_Value($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;
- }
-
- /**
- * @return int returns 1 if successful or 0 if there are problems
- */
- function addArray($vals)
- {
- if ($this->mytype != 0) {
- $this->raiseError(
- 'Already initialized as a [' . $this->kindOf() . ']',
- XML_RPC_ERROR_ALREADY_INITIALIZED);
- return 0;
- }
- $this->mytype = $GLOBALS['XML_RPC_Types']['array'];
- $this->me['array'] = $vals;
- return 1;
- }
-
- /**
- * @return int returns 1 if successful or 0 if there are problems
- */
- function addStruct($vals)
- {
- if ($this->mytype != 0) {
- $this->raiseError(
- 'Already initialized as a [' . $this->kindOf() . ']',
- XML_RPC_ERROR_ALREADY_INITIALIZED);
- return 0;
- }
- $this->mytype = $GLOBALS['XML_RPC_Types']['struct'];
- $this->me['struct'] = $vals;
- return 1;
- }
-
- /**
- * @return void
- */
- function dump($ar)
- {
- reset($ar);
- foreach ($ar as $key => $val) {
- echo "$key => $val<br />";
- if ($key == 'array') {
- foreach ($val as $key2 => $val2) {
- echo "-- $key2 => $val2<br />";
- }
- }
- }
- }
-
- /**
- * @return string the data type of the current value
- */
- function kindOf()
- {
- switch ($this->mytype) {
- case 3:
- return 'struct';
-
- case 2:
- return 'array';
-
- case 1:
- return 'scalar';
-
- default:
- return 'undef';
- }
- }
-
- /**
- * @return string the data in XML format
- */
- function serializedata($typ, $val)
- {
- $rs = '';
- if (!array_key_exists($typ, $GLOBALS['XML_RPC_Types'])) {
- // XXX
- // need some way to report this error
- return;
- }
- switch ($GLOBALS['XML_RPC_Types'][$typ]) {
- case 3:
- // struct
- $rs .= "<struct>\n";
- reset($val);
- foreach ($val as $key2 => $val2) {
- $rs .= "<member><name>${key2}</name>\n";
- $rs .= $this->serializeval($val2);
- $rs .= "</member>\n";
- }
- $rs .= '</struct>';
- break;
-
- case 2:
- // array
- $rs .= "<array>\n<data>\n";
- for ($i = 0; $i < sizeof($val); $i++) {
- $rs .= $this->serializeval($val[$i]);
- }
- $rs .= "</data>\n</array>";
- break;
-
- case 1:
- switch ($typ) {
- case $GLOBALS['XML_RPC_Base64']:
- $rs .= "<${typ}>" . base64_encode($val) . "</${typ}>";
- break;
- case $GLOBALS['XML_RPC_Boolean']:
- $rs .= "<${typ}>" . ($val ? '1' : '0') . "</${typ}>";
- break;
- case $GLOBALS['XML_RPC_String']:
- $rs .= "<${typ}>" . htmlspecialchars($val). "</${typ}>";
- break;
- default:
- $rs .= "<${typ}>${val}</${typ}>";
- }
- }
- return $rs;
- }
-
- /**
- * @return string the data in XML format
- */
- function serialize()
- {
- return $this->serializeval($this);
- }
-
- /**
- * @return string the data in XML format
- */
- function serializeval($o)
- {
- if (!is_object($o) || empty($o->me) || !is_array($o->me)) {
- return '';
- }
- $ar = $o->me;
- reset($ar);
- list($typ, $val) = each($ar);
- return '<value>' . $this->serializedata($typ, $val) . "</value>\n";
- }
-
- /**
- * @return mixed the contents of the element requested
- */
- function structmem($m)
- {
- return $this->me['struct'][$m];
- }
-
- /**
- * @return void
- */
- function structreset()
- {
- reset($this->me['struct']);
- }
-
- /**
- * @return the key/value pair of the struct's current element
- */
- function structeach()
- {
- return each($this->me['struct']);
- }
-
- /**
- * @return mixed the current value
- */
- function getval()
- {
- // UNSTABLE
-
- reset($this->me);
- $b = current($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)) {
- foreach ($b as $id => $cont) {
- $b[$id] = $cont->scalarval();
- }
- }
-
- // add support for structures directly encoding php objects
- if (is_object($b)) {
- $t = get_object_vars($b);
- foreach ($t as $id => $cont) {
- $t[$id] = $cont->scalarval();
- }
- foreach ($t as $id => $cont) {
- $b->$id = $cont;
- }
- }
-
- // end contrib
- return $b;
- }
-
- /**
- * @return mixed the current element's scalar value. If the value is
- * not scalar, FALSE is returned.
- */
- function scalarval()
- {
- reset($this->me);
- $v = current($this->me);
- if (!is_scalar($v)) {
- $v = false;
- }
- return $v;
- }
-
- /**
- * @return string
- */
- function scalartyp()
- {
- reset($this->me);
- $a = key($this->me);
- if ($a == $GLOBALS['XML_RPC_I4']) {
- $a = $GLOBALS['XML_RPC_Int'];
- }
- return $a;
- }
-
- /**
- * @return mixed the struct's current element
- */
- function arraymem($m)
- {
- return $this->me['array'][$m];
- }
-
- /**
- * @return int the number of elements in the array
- */
- function arraysize()
- {
- reset($this->me);
- list($a, $b) = each($this->me);
- return sizeof($b);
- }
-
- /**
- * Determines if the item submitted is an XML_RPC_Value object
- *
- * @param mixed $val the variable to be evaluated
- *
- * @return bool TRUE if the item is an XML_RPC_Value object
- *
- * @static
- * @since Method available since Release 1.3.0
- */
- function isValue($val)
- {
- return (strtolower(get_class($val)) == 'xml_rpc_value');
- }
-}
-
-/**
- * Return an ISO8601 encoded string
- *
- * While timezones ought to be supported, 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."
- *
- * This routine always assumes localtime unless $utc is set to 1, in which
- * case UTC is assumed and an adjustment for locale is made when encoding.
- *
- * @return string the formatted date
- */
-function XML_RPC_iso8601_encode($timet, $utc = 0)
-{
- 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;
-}
-
-/**
- * Convert a datetime string into a Unix timestamp
- *
- * While timezones ought to be supported, 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."
- *
- * This routine always assumes localtime unless $utc is set to 1, in which
- * case UTC is assumed and an adjustment for locale is made when encoding.
- *
- * @return int the unix timestamp of the date submitted
- */
-function XML_RPC_iso8601_decode($idate, $utc = 0)
-{
- $t = 0;
- if ($GLOBALS['XML_RPC_func_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;
-}
-
-/**
- * Converts an XML_RPC_Value object into native PHP types
- *
- * @param object $XML_RPC_val the XML_RPC_Value object to decode
- *
- * @return mixed the PHP values
- */
-function XML_RPC_decode($XML_RPC_val)
-{
- $kind = $XML_RPC_val->kindOf();
-
- if ($kind == 'scalar') {
- return $XML_RPC_val->scalarval();
-
- } elseif ($kind == 'array') {
- $size = $XML_RPC_val->arraysize();
- $arr = array();
- for ($i = 0; $i < $size; $i++) {
- $arr[] = XML_RPC_decode($XML_RPC_val->arraymem($i));
- }
- return $arr;
-
- } elseif ($kind == 'struct') {
- $XML_RPC_val->structreset();
- $arr = array();
- while (list($key, $value) = $XML_RPC_val->structeach()) {
- $arr[$key] = XML_RPC_decode($value);
- }
- return $arr;
- }
-}
-
-/**
- * Converts native PHP types into an XML_RPC_Value object
- *
- * @param mixed $php_val the PHP value or variable you want encoded
- *
- * @return object the XML_RPC_Value object
- */
-function XML_RPC_encode($php_val)
-{
- $type = gettype($php_val);
- $XML_RPC_val = new XML_RPC_Value;
-
- switch ($type) {
- case 'array':
- if (empty($php_val)) {
- $XML_RPC_val->addArray($php_val);
- break;
- }
- $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1));
- if (empty($tmp)) {
- $arr = array();
- foreach ($php_val as $k => $v) {
- $arr[$k] = XML_RPC_encode($v);
- }
- $XML_RPC_val->addArray($arr);
- break;
- }
- // fall though if it's not an enumerated array
-
- case 'object':
- $arr = array();
- foreach ($php_val as $k => $v) {
- $arr[$k] = XML_RPC_encode($v);
- }
- $XML_RPC_val->addStruct($arr);
- break;
-
- case 'integer':
- $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Int']);
- break;
-
- case 'double':
- $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Double']);
- break;
-
- case 'string':
- case 'NULL':
- if ($GLOBALS['XML_RPC_func_ereg']('^[0-9]{8}\T{1}[0-9]{2}\:[0-9]{2}\:[0-9]{2}$', $php_val)) {
- $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_DateTime']);
- } elseif ($GLOBALS['XML_RPC_auto_base64']
- && $GLOBALS['XML_RPC_func_ereg']("[^ -~\t\r\n]", $php_val))
- {
- // Characters other than alpha-numeric, punctuation, SP, TAB,
- // LF and CR break the XML parser, encode value via Base 64.
- $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Base64']);
- } else {
- $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_String']);
- }
- break;
-
- case 'boolean':
- // Add support for encoding/decoding of booleans, since they
- // are supported in PHP
- // by <G_Giunta_2001-02-29>
- $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Boolean']);
- break;
-
- case 'unknown type':
- default:
- $XML_RPC_val = false;
- }
- return $XML_RPC_val;
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/Server.php
^
|
@@ -1,685 +0,0 @@
-<?php
-
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Server commands for our PHP implementation of the XML-RPC protocol
- *
- * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
- * It has support for HTTP transport, proxies and authentication.
- *
- * PHP versions 4 and 5
- *
- * LICENSE: License is granted to use or modify this software
- * ("XML-RPC for PHP") for commercial or non-commercial use provided the
- * copyright of the author is preserved in any distributed or derivative work.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESSED 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 AUTHOR 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.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version CVS: $Id: Server.php,v 1.37 2006/10/28 16:42:34 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- */
-
-
-/**
- * Pull in the XML_RPC class
- */
-require_once 'XML/RPC.php';
-
-
-/**
- * signature for system.listMethods: return = array,
- * parameters = a string or nothing
- * @global array $GLOBALS['XML_RPC_Server_listMethods_sig']
- */
-$GLOBALS['XML_RPC_Server_listMethods_sig'] = array(
- array($GLOBALS['XML_RPC_Array'],
- $GLOBALS['XML_RPC_String']
- ),
- array($GLOBALS['XML_RPC_Array'])
-);
-
-/**
- * docstring for system.listMethods
- * @global string $GLOBALS['XML_RPC_Server_listMethods_doc']
- */
-$GLOBALS['XML_RPC_Server_listMethods_doc'] = 'This method lists all the'
- . ' methods that the XML-RPC server knows how to dispatch';
-
-/**
- * signature for system.methodSignature: return = array,
- * parameters = string
- * @global array $GLOBALS['XML_RPC_Server_methodSignature_sig']
- */
-$GLOBALS['XML_RPC_Server_methodSignature_sig'] = array(
- array($GLOBALS['XML_RPC_Array'],
- $GLOBALS['XML_RPC_String']
- )
-);
-
-/**
- * docstring for system.methodSignature
- * @global string $GLOBALS['XML_RPC_Server_methodSignature_doc']
- */
-$GLOBALS['XML_RPC_Server_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)';
-
-/**
- * signature for system.methodHelp: return = string,
- * parameters = string
- * @global array $GLOBALS['XML_RPC_Server_methodHelp_sig']
- */
-$GLOBALS['XML_RPC_Server_methodHelp_sig'] = array(
- array($GLOBALS['XML_RPC_String'],
- $GLOBALS['XML_RPC_String']
- )
-);
-
-/**
- * docstring for methodHelp
- * @global string $GLOBALS['XML_RPC_Server_methodHelp_doc']
- */
-$GLOBALS['XML_RPC_Server_methodHelp_doc'] = 'Returns help text if defined'
- . ' for the method passed, otherwise returns an empty string';
-
-/**
- * dispatch map for the automatically declared XML-RPC methods.
- * @global array $GLOBALS['XML_RPC_Server_dmap']
- */
-$GLOBALS['XML_RPC_Server_dmap'] = array(
- 'system.listMethods' => array(
- 'function' => 'XML_RPC_Server_listMethods',
- 'signature' => $GLOBALS['XML_RPC_Server_listMethods_sig'],
- 'docstring' => $GLOBALS['XML_RPC_Server_listMethods_doc']
- ),
- 'system.methodHelp' => array(
- 'function' => 'XML_RPC_Server_methodHelp',
- 'signature' => $GLOBALS['XML_RPC_Server_methodHelp_sig'],
- 'docstring' => $GLOBALS['XML_RPC_Server_methodHelp_doc']
- ),
- 'system.methodSignature' => array(
- 'function' => 'XML_RPC_Server_methodSignature',
- 'signature' => $GLOBALS['XML_RPC_Server_methodSignature_sig'],
- 'docstring' => $GLOBALS['XML_RPC_Server_methodSignature_doc']
- )
-);
-
-/**
- * @global string $GLOBALS['XML_RPC_Server_debuginfo']
- */
-$GLOBALS['XML_RPC_Server_debuginfo'] = '';
-
-
-/**
- * Lists all the methods that the XML-RPC server knows how to dispatch
- *
- * @return object a new XML_RPC_Response object
- */
-function XML_RPC_Server_listMethods($server, $m)
-{
- global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
-
- $v = new XML_RPC_Value();
- $outAr = array();
- foreach ($server->dmap as $key => $val) {
- $outAr[] = new XML_RPC_Value($key, 'string');
- }
- foreach ($XML_RPC_Server_dmap as $key => $val) {
- $outAr[] = new XML_RPC_Value($key, 'string');
- }
- $v->addArray($outAr);
- return new XML_RPC_Response($v);
-}
-
-/**
- * Returns an array of known signatures (an array of arrays)
- * for the given method
- *
- * If no signatures are known, returns a none-array
- * (test for type != array to detect missing signature)
- *
- * @return object a new XML_RPC_Response object
- */
-function XML_RPC_Server_methodSignature($server, $m)
-{
- global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
-
- $methName = $m->getParam(0);
- $methName = $methName->scalarval();
- if (strpos($methName, 'system.') === 0) {
- $dmap = $XML_RPC_Server_dmap;
- $sysCall = 1;
- } else {
- $dmap = $server->dmap;
- $sysCall = 0;
- }
- // print "<!-- ${methName} -->\n";
- if (isset($dmap[$methName])) {
- if ($dmap[$methName]['signature']) {
- $sigs = array();
- $thesigs = $dmap[$methName]['signature'];
- for ($i = 0; $i < sizeof($thesigs); $i++) {
- $cursig = array();
- $inSig = $thesigs[$i];
- for ($j = 0; $j < sizeof($inSig); $j++) {
- $cursig[] = new XML_RPC_Value($inSig[$j], 'string');
- }
- $sigs[] = new XML_RPC_Value($cursig, 'array');
- }
- $r = new XML_RPC_Response(new XML_RPC_Value($sigs, 'array'));
- } else {
- $r = new XML_RPC_Response(new XML_RPC_Value('undef', 'string'));
- }
- } else {
- $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
- $XML_RPC_str['introspect_unknown']);
- }
- return $r;
-}
-
-/**
- * Returns help text if defined for the method passed, otherwise returns
- * an empty string
- *
- * @return object a new XML_RPC_Response object
- */
-function XML_RPC_Server_methodHelp($server, $m)
-{
- global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
-
- $methName = $m->getParam(0);
- $methName = $methName->scalarval();
- if (strpos($methName, 'system.') === 0) {
- $dmap = $XML_RPC_Server_dmap;
- $sysCall = 1;
- } else {
- $dmap = $server->dmap;
- $sysCall = 0;
- }
-
- if (isset($dmap[$methName])) {
- if ($dmap[$methName]['docstring']) {
- $r = new XML_RPC_Response(new XML_RPC_Value($dmap[$methName]['docstring']),
- 'string');
- } else {
- $r = new XML_RPC_Response(new XML_RPC_Value('', 'string'));
- }
- } else {
- $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
- $XML_RPC_str['introspect_unknown']);
- }
- return $r;
-}
-
-/**
- * @return void
- */
-function XML_RPC_Server_debugmsg($m)
-{
- global $XML_RPC_Server_debuginfo;
- $XML_RPC_Server_debuginfo = $XML_RPC_Server_debuginfo . $m . "\n";
-}
-
-
-/**
- * A server for receiving and replying to XML RPC requests
- *
- * <code>
- * $server = new XML_RPC_Server(
- * array(
- * 'isan8' =>
- * array(
- * 'function' => 'is_8',
- * 'signature' =>
- * array(
- * array('boolean', 'int'),
- * array('boolean', 'int', 'boolean'),
- * array('boolean', 'string'),
- * array('boolean', 'string', 'boolean'),
- * ),
- * 'docstring' => 'Is the value an 8?'
- * ),
- * ),
- * 1,
- * 0
- * );
- * </code>
- *
- * @category Web Services
- * @package XML_RPC
- * @author Edd Dumbill <edd@usefulinc.com>
- * @author Stig Bakken <stig@php.net>
- * @author Martin Jansen <mj@php.net>
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
- * @version Release: 1.5.1
- * @link http://pear.php.net/package/XML_RPC
- */
-class XML_RPC_Server
-{
- /**
- * Should the payload's content be passed through mb_convert_encoding()?
- *
- * @see XML_RPC_Server::setConvertPayloadEncoding()
- * @since Property available since Release 1.5.1
- * @var boolean
- */
- var $convert_payload_encoding = false;
-
- /**
- * The dispatch map, listing the methods this server provides.
- * @var array
- */
- var $dmap = array();
-
- /**
- * The present response's encoding
- * @var string
- * @see XML_RPC_Message::getEncoding()
- */
- var $encoding = '';
-
- /**
- * Debug mode (0 = off, 1 = on)
- * @var integer
- */
- var $debug = 0;
-
- /**
- * The response's HTTP headers
- * @var string
- */
- var $server_headers = '';
-
- /**
- * The response's XML payload
- * @var string
- */
- var $server_payload = '';
-
-
- /**
- * Constructor for the XML_RPC_Server class
- *
- * @param array $dispMap the dispatch map. An associative array
- * explaining each function. The keys of the main
- * array are the procedure names used by the
- * clients. The value is another associative array
- * that contains up to three elements:
- * + The 'function' element's value is the name
- * of the function or method that gets called.
- * To define a class' method: 'class::method'.
- * + The 'signature' element (optional) is an
- * array describing the return values and
- * parameters
- * + The 'docstring' element (optional) is a
- * string describing what the method does
- * @param int $serviceNow should the HTTP response be sent now?
- * (1 = yes, 0 = no)
- * @param int $debug should debug output be displayed?
- * (1 = yes, 0 = no)
- *
- * @return void
- */
- function XML_RPC_Server($dispMap, $serviceNow = 1, $debug = 0)
- {
- global $HTTP_RAW_POST_DATA;
-
- if ($debug) {
- $this->debug = 1;
- } else {
- $this->debug = 0;
- }
-
- $this->dmap = $dispMap;
-
- if ($serviceNow) {
- $this->service();
- } else {
- $this->createServerPayload();
- $this->createServerHeaders();
- }
- }
-
- /**
- * @return string the debug information if debug debug mode is on
- */
- function serializeDebug()
- {
- global $XML_RPC_Server_debuginfo, $HTTP_RAW_POST_DATA;
-
- if ($this->debug) {
- XML_RPC_Server_debugmsg('vvv POST DATA RECEIVED BY SERVER vvv' . "\n"
- . $HTTP_RAW_POST_DATA
- . "\n" . '^^^ END POST DATA ^^^');
- }
-
- if ($XML_RPC_Server_debuginfo != '') {
- return "<!-- PEAR XML_RPC SERVER DEBUG INFO:\n\n"
- . $GLOBALS['XML_RPC_func_ereg_replace']('--', '- - ', $XML_RPC_Server_debuginfo)
- . "-->\n";
- } else {
- return '';
- }
- }
-
- /**
- * Sets whether the payload's content gets passed through
- * mb_convert_encoding()
- *
- * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
- *
- * @param int $in where 1 = on, 0 = off
- *
- * @return void
- *
- * @see XML_RPC_Message::getEncoding()
- * @since Method available since Release 1.5.1
- */
- function setConvertPayloadEncoding($in)
- {
- if ($in && !function_exists('mb_convert_encoding')) {
- return $this->raiseError('mb_convert_encoding() is not available',
- XML_RPC_ERROR_PROGRAMMING);
- }
- $this->convert_payload_encoding = $in;
- }
-
- /**
- * Sends the response
- *
- * The encoding and content-type are determined by
- * XML_RPC_Message::getEncoding()
- *
- * @return void
- *
- * @uses XML_RPC_Server::createServerPayload(),
- * XML_RPC_Server::createServerHeaders()
- */
- function service()
- {
- if (!$this->server_payload) {
- $this->createServerPayload();
- }
- if (!$this->server_headers) {
- $this->createServerHeaders();
- }
-
- /*
- * $server_headers needs to remain a string for compatibility with
- * old scripts using this package, but PHP 4.4.2 no longer allows
- * line breaks in header() calls. So, we split each header into
- * an individual call. The initial replace handles the off chance
- * that someone composed a single header with multiple lines, which
- * the RFCs allow.
- */
- $this->server_headers = $GLOBALS['XML_RPC_func_ereg_replace']("[\r\n]+[ \t]+",
- ' ', trim($this->server_headers));
- $headers = $GLOBALS['XML_RPC_func_split']("[\r\n]+", $this->server_headers);
- foreach ($headers as $header)
- {
- header($header);
- }
-
- print $this->server_payload;
- }
-
- /**
- * Generates the payload and puts it in the $server_payload property
- *
- * If XML_RPC_Server::setConvertPayloadEncoding() was set to true,
- * the payload gets passed through mb_convert_encoding()
- * to ensure the payload matches the encoding set in the
- * XML declaration. The encoding type can be manually set via
- * XML_RPC_Message::setSendEncoding().
- *
- * @return void
- *
- * @uses XML_RPC_Server::parseRequest(), XML_RPC_Server::$encoding,
- * XML_RPC_Response::serialize(), XML_RPC_Server::serializeDebug()
- * @see XML_RPC_Server::setConvertPayloadEncoding()
- */
- function createServerPayload()
- {
- $r = $this->parseRequest();
- $this->server_payload = '<?xml version="1.0" encoding="'
- . $this->encoding . '"?>' . "\n"
- . $this->serializeDebug()
- . $r->serialize();
- if ($this->convert_payload_encoding) {
- $this->server_payload = mb_convert_encoding($this->server_payload,
- $this->encoding);
- }
- }
-
- /**
- * Determines the HTTP headers and puts them in the $server_headers
- * property
- *
- * @return boolean TRUE if okay, FALSE if $server_payload isn't set.
- *
- * @uses XML_RPC_Server::createServerPayload(),
- * XML_RPC_Server::$server_headers
- */
- function createServerHeaders()
- {
- if (!$this->server_payload) {
- return false;
- }
- $this->server_headers = 'Content-Length: '
- . strlen($this->server_payload) . "\r\n"
- . 'Content-Type: text/xml;'
- . ' charset=' . $this->encoding;
- return true;
- }
-
- /**
- * @return array
- */
- function verifySignature($in, $sig)
- {
- for ($i = 0; $i < sizeof($sig); $i++) {
- // check each possible signature in turn
- $cursig = $sig[$i];
- if (sizeof($cursig) == $in->getNumParams() + 1) {
- $itsOK = 1;
- for ($n = 0; $n < $in->getNumParams(); $n++) {
- $p = $in->getParam($n);
- // print "<!-- $p -->\n";
- if ($p->kindOf() == 'scalar') {
- $pt = $p->scalartyp();
- } else {
- $pt = $p->kindOf();
- }
- // $n+1 as first type of sig is return type
- if ($pt != $cursig[$n+1]) {
- $itsOK = 0;
- $pno = $n+1;
- $wanted = $cursig[$n+1];
- $got = $pt;
- break;
- }
- }
- if ($itsOK) {
- return array(1);
- }
- }
- }
- if (isset($wanted)) {
- return array(0, "Wanted ${wanted}, got ${got} at param ${pno}");
- } else {
- $allowed = array();
- foreach ($sig as $val) {
- end($val);
- $allowed[] = key($val);
- }
- $allowed = array_unique($allowed);
- $last = count($allowed) - 1;
- if ($last > 0) {
- $allowed[$last] = 'or ' . $allowed[$last];
- }
- return array(0,
- 'Signature permits ' . implode(', ', $allowed)
- . ' parameters but the request had '
- . $in->getNumParams());
- }
- }
-
- /**
- * @return object a new XML_RPC_Response object
- *
- * @uses XML_RPC_Message::getEncoding(), XML_RPC_Server::$encoding
- */
- function parseRequest($data = '')
- {
- global $XML_RPC_xh, $HTTP_RAW_POST_DATA,
- $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml,
- $XML_RPC_defencoding, $XML_RPC_Server_dmap;
-
- if ($data == '') {
- $data = $HTTP_RAW_POST_DATA;
- }
-
- $this->encoding = XML_RPC_Message::getEncoding($data);
- $parser_resource = xml_parser_create($this->encoding);
- $parser = (int) $parser_resource;
-
- $XML_RPC_xh[$parser] = array();
- $XML_RPC_xh[$parser]['cm'] = 0;
- $XML_RPC_xh[$parser]['isf'] = 0;
- $XML_RPC_xh[$parser]['params'] = array();
- $XML_RPC_xh[$parser]['method'] = '';
- $XML_RPC_xh[$parser]['stack'] = array();
- $XML_RPC_xh[$parser]['valuestack'] = array();
-
- $plist = '';
-
- // decompose incoming XML into request structure
-
- xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
- xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
- xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
- if (!xml_parse($parser_resource, $data, 1)) {
- // return XML error as a faultCode
- $r = new XML_RPC_Response(0,
- $XML_RPC_errxml+xml_get_error_code($parser_resource),
- sprintf('XML error: %s at line %d',
- xml_error_string(xml_get_error_code($parser_resource)),
- xml_get_current_line_number($parser_resource)));
- xml_parser_free($parser_resource);
- } elseif ($XML_RPC_xh[$parser]['isf']>1) {
- $r = new XML_RPC_Response(0,
- $XML_RPC_err['invalid_request'],
- $XML_RPC_str['invalid_request']
- . ': '
- . $XML_RPC_xh[$parser]['isf_reason']);
- xml_parser_free($parser_resource);
- } else {
- xml_parser_free($parser_resource);
- $m = new XML_RPC_Message($XML_RPC_xh[$parser]['method']);
- // now add parameters in
- for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) {
- // print '<!-- ' . $XML_RPC_xh[$parser]['params'][$i]. "-->\n";
- $plist .= "$i - " . var_export($XML_RPC_xh[$parser]['params'][$i], true) . " \n";
- $m->addParam($XML_RPC_xh[$parser]['params'][$i]);
- }
-
- if ($this->debug) {
- XML_RPC_Server_debugmsg($plist);
- }
-
- // now to deal with the method
- $methName = $XML_RPC_xh[$parser]['method'];
- if (strpos($methName, 'system.') === 0) {
- $dmap = $XML_RPC_Server_dmap;
- $sysCall = 1;
- } else {
- $dmap = $this->dmap;
- $sysCall = 0;
- }
-
- if (isset($dmap[$methName]['function'])
- && is_string($dmap[$methName]['function'])
- && strpos($dmap[$methName]['function'], '::') !== false)
- {
- $dmap[$methName]['function'] =
- explode('::', $dmap[$methName]['function']);
- }
-
- if (isset($dmap[$methName]['function'])
- && is_callable($dmap[$methName]['function']))
- {
- // dispatch if exists
- if (isset($dmap[$methName]['signature'])) {
- $sr = $this->verifySignature($m,
- $dmap[$methName]['signature'] );
- }
- if (!isset($dmap[$methName]['signature']) || $sr[0]) {
- // if no signature or correct signature
- if ($sysCall) {
- $r = call_user_func($dmap[$methName]['function'], $this, $m);
- } else {
- $r = call_user_func($dmap[$methName]['function'], $m);
- }
- if (!is_a($r, 'XML_RPC_Response')) {
- $r = new XML_RPC_Response(0, $XML_RPC_err['not_response_object'],
- $XML_RPC_str['not_response_object']);
- }
- } else {
- $r = new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
- $XML_RPC_str['incorrect_params']
- . ': ' . $sr[1]);
- }
- } else {
- // else prepare error response
- $r = new XML_RPC_Response(0, $XML_RPC_err['unknown_method'],
- $XML_RPC_str['unknown_method']);
- }
- }
- return $r;
- }
-
- /**
- * Echos back the input packet as a string value
- *
- * @return void
- *
- * Useful for debugging.
- */
- function echoInput()
- {
- global $HTTP_RAW_POST_DATA;
-
- $r = new XML_RPC_Response(0);
- $r->xv = new XML_RPC_Value("'Aha said I: '" . $HTTP_RAW_POST_DATA, 'string');
- print $r->serialize();
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/tests/allgot.inc
^
|
@@ -1,58 +0,0 @@
-<?php
-
-/**
- *
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.01 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_01.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 2005-2006 The PHP Group
- * @license http://www.php.net/license/3_01.txt PHP License
- * @version CVS: $Id: allgot.inc,v 1.2 2006/06/11 00:25:17 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- * @since File available since Release 1.4.4
- */
-
-ob_start();
-
-function returnAllGot($params) {
- $out = '';
- $count = count($params->params);
- for ($i = 0; $i < $count; $i++) {
- $param = $params->getParam($i);
- if (!XML_RPC_Value::isValue($param)) {
- $out .= "parameter $i was error: $param\n";
- continue;
- }
- $got = XML_RPC_Decode($param);
- $out .= "param $i: " . var_export($got, true) . "\n";
- }
- $val = new XML_RPC_Value($out, 'string');
- return new XML_RPC_Response($val);
-}
-
-$server = new XML_RPC_Server(
- array(
- 'allgot' => array(
- 'function' => 'returnAllGot',
- ),
- )
-);
-
-$got = ob_get_clean();
-
-if ($got == $expect) {
- echo "passed\n";
-} else {
- echo "FAILED\n";
- echo "Expected:\n$expect\n";
- echo "Got:\n$got\n";
-}
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/tests/empty-value-struct.php
^
|
@@ -1,90 +0,0 @@
-<?php
-
-/**
- * Tests how the XML_RPC server handles a parameter with an empty struct without
- * any spaces in the XML after the empty value.
- *
- * If you are running this test from a CVS checkout, you must rename the working
- * directory from "XML_RPC" to "XML".
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 2005-2006 The PHP Group
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id: empty-value-struct.php,v 1.2 2006/06/11 00:25:17 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- * @since File available since Release 1.4.4
- */
-
-/*
- * If the package version number is found in the left hand
- * portion of the if() expression below, that means this file has
- * come from the PEAR installer. Therefore, let's test the
- * installed version of XML_RPC which should be in the include path.
- *
- * If the version has not been substituted in the if() expression,
- * this file has likely come from a CVS checkout or a .tar file.
- * Therefore, we'll assume the tests should use the version of
- * XML_RPC that has come from there as well.
- */
-if ('1.5.1' != '@'.'package_version'.'@') {
- /**
- * Get the needed class from the PEAR installation
- */
- require_once 'XML/RPC/Server.php';
-} else {
- if (substr(dirname(__FILE__), -9, -6) != 'XML') {
- echo "The parent directory must be named 'XML'.\n";
- exit;
- }
-
- ini_set('include_path', '../../'
- . PATH_SEPARATOR . '.' . PATH_SEPARATOR
- . ini_get('include_path')
- );
-
- /**
- * Get the needed class from the parent directory
- */
- require_once '../Server.php';
-}
-
-$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
-<?xml version="1.0"?>
-<methodCall>
- <methodName>allgot</methodName>
- <params>
- <param>
- <value>
- <struct>
- <member>
- <name>fld1</name><value></value></member></struct></value>
- </param>
- </params>
- </methodCall>
-EOPOST;
-
-$expect = <<<EOEXP
-<?xml version="1.0" encoding="UTF-8"?>
-<methodResponse>
-<params>
-<param>
-<value><string>param 0: array (
- 'fld1' => '',
-)
-</string></value>
-</param>
-</params>
-</methodResponse>
-EOEXP;
-
-include './allgot.inc';
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/tests/empty-value.php
^
|
@@ -1,88 +0,0 @@
-<?php
-
-/**
- * Tests how the XML_RPC server handles parameters with empty values.
- *
- * If you are running this test from a CVS checkout, you must rename the working
- * directory from "XML_RPC" to "XML".
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.01 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_01.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 2005-2006 The PHP Group
- * @license http://www.php.net/license/3_01.txt PHP License
- * @version CVS: $Id: empty-value.php,v 1.2 2006/06/11 00:25:17 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- * @since File available since Release 1.4.4
- */
-
-/*
- * If the package version number is found in the left hand
- * portion of the if() expression below, that means this file has
- * come from the PEAR installer. Therefore, let's test the
- * installed version of XML_RPC which should be in the include path.
- *
- * If the version has not been substituted in the if() expression,
- * this file has likely come from a CVS checkout or a .tar file.
- * Therefore, we'll assume the tests should use the version of
- * XML_RPC that has come from there as well.
- */
-if ('1.5.1' != '@'.'package_version'.'@') {
- /**
- * Get the needed class from the PEAR installation
- */
- require_once 'XML/RPC/Server.php';
-} else {
- if (substr(dirname(__FILE__), -9, -6) != 'XML') {
- echo "The parent directory must be named 'XML'.\n";
- exit;
- }
-
- ini_set('include_path', '../../'
- . PATH_SEPARATOR . '.' . PATH_SEPARATOR
- . ini_get('include_path')
- );
-
- /**
- * Get the needed class from the parent directory
- */
- require_once '../Server.php';
-}
-
-$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
-<?xml version="1.0"?>
-<methodCall>
- <methodName>allgot</methodName>
- <params>
- <param><value><string></string></value></param>
- <param><value>first</value></param>
- <param><value> </value></param>
- <param><value></value></param>
- </params>
- </methodCall>
-EOPOST;
-
-$expect = <<<EOEXP
-<?xml version="1.0" encoding="UTF-8"?>
-<methodResponse>
-<params>
-<param>
-<value><string>param 0: ''
-param 1: 'first'
-param 2: ' '
-param 3: ''
-</string></value>
-</param>
-</params>
-</methodResponse>
-EOEXP;
-
-include './allgot.inc';
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/tests/protoport.php
^
|
@@ -1,437 +0,0 @@
-<?php
-
-/**
- * Tests that properties of XML_RPC_Client get properly set
- *
- * Any individual tests that fail will have their name, expected result
- * and actual result printed out. So seeing no output when executing
- * this file is a good thing.
- *
- * Can be run via CLI or a web server.
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.01 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_01.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 2005-2006 The PHP Group
- * @license http://www.php.net/license/3_01.txt PHP License
- * @version CVS: $Id: protoport.php,v 1.6 2006/06/11 00:25:17 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- * @since File available since Release 1.2
- */
-
-/*
- * If the package version number is found in the left hand
- * portion of the if() expression below, that means this file has
- * come from the PEAR installer. Therefore, let's test the
- * installed version of XML_RPC which should be in the include path.
- *
- * If the version has not been substituted in the if() expression,
- * this file has likely come from a CVS checkout or a .tar file.
- * Therefore, we'll assume the tests should use the version of
- * XML_RPC that has come from there as well.
- */
-if ('1.5.1' != '@'.'package_version'.'@') {
- /**
- * Get the needed class from the PEAR installation
- */
- require_once 'XML/RPC.php';
-} else {
- /**
- * Get the needed class from the parent directory
- */
- require_once '../RPC.php';
-}
-
-/**
- * Compare the test result to the expected result
- *
- * If the test fails, echo out the results.
- *
- * @param array $expect the array of object properties you expect
- * from the test
- * @param object $actual the object results from the test
- * @param string $test_name the name of the test
- *
- * @return void
- */
-function compare($expect, $actual, $test_name) {
- $actual = get_object_vars($actual);
- if (count(array_diff($actual, $expect))) {
- echo "$test_name failed.\nExpect: ";
- print_r($expect);
- echo "Actual: ";
- print_r($actual);
- echo "\n";
- }
-}
-
-if (php_sapi_name() != 'cli') {
- echo "<pre>\n";
-}
-
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 80,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'theserver');
-compare($x, $c, 'defaults');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 80,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'http://theserver');
-compare($x, $c, 'defaults with http');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 443,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'https://theserver');
-compare($x, $c, 'defaults with https');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 443,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'ssl://theserver');
-compare($x, $c, 'defaults with ssl');
-
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 65,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'theserver', 65);
-compare($x, $c, 'port 65');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 65,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'http://theserver', 65);
-compare($x, $c, 'port 65 with http');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 65,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'https://theserver', 65);
-compare($x, $c, 'port 65 with https');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 65,
- 'proxy' => '',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65);
-compare($x, $c, 'port 65 with ssl');
-
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 80,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'theserver', 0,
- 'theproxy');
-compare($x, $c, 'defaults proxy');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 80,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 8080,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'http://theserver', 0,
- 'http://theproxy');
-compare($x, $c, 'defaults with http proxy');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 443,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'ssl://',
- 'proxy_port' => 443,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'https://theserver', 0,
- 'https://theproxy');
-compare($x, $c, 'defaults with https proxy');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 443,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'ssl://',
- 'proxy_port' => 443,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'ssl://theserver', 0,
- 'ssl://theproxy');
-compare($x, $c, 'defaults with ssl proxy');
-
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 65,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 6565,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'theserver', 65,
- 'theproxy', 6565);
-compare($x, $c, 'port 65 proxy 6565');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 65,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'http://',
- 'proxy_port' => 6565,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'http://theserver', 65,
- 'http://theproxy', 6565);
-compare($x, $c, 'port 65 with http proxy 6565');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 65,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'ssl://',
- 'proxy_port' => 6565,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'https://theserver', 65,
- 'https://theproxy', 6565);
-compare($x, $c, 'port 65 with https proxy 6565');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 65,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'ssl://',
- 'proxy_port' => 6565,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65,
- 'ssl://theproxy', 6565);
-compare($x, $c, 'port 65 with ssl proxy 6565');
-
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'ssl://',
- 'port' => 443,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'ssl://',
- 'proxy_port' => 443,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'theserver', 443,
- 'theproxy', 443);
-compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');
-
-$x = array(
- 'path' => 'thepath',
- 'server' => 'theserver',
- 'protocol' => 'http://',
- 'port' => 80,
- 'proxy' => 'theproxy',
- 'proxy_protocol' => 'ssl://',
- 'proxy_port' => 6565,
- 'proxy_user' => '',
- 'proxy_pass' => '',
- 'errno' => 0,
- 'errstring' => '',
- 'debug' => 0,
- 'username' => '',
- 'password' => '',
-);
-$c = new XML_RPC_Client('thepath', 'theserver', 0,
- 'ssl://theproxy', 6565);
-compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');
-
-echo "\nIf no other output was produced, these tests passed.\n";
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/tests/test_Dump.php
^
|
@@ -1,50 +0,0 @@
-<?php
-
-/*
- * If the package version number is found in the left hand
- * portion of the if() expression below, that means this file has
- * come from the PEAR installer. Therefore, let's test the
- * installed version of XML_RPC which should be in the include path.
- *
- * If the version has not been substituted in the if() expression,
- * this file has likely come from a CVS checkout or a .tar file.
- * Therefore, we'll assume the tests should use the version of
- * XML_RPC that has come from there as well.
- */
-if ('1.5.1' != '@'.'package_version'.'@') {
- /**
- * Get the needed class from the PEAR installation
- */
- require_once 'XML/RPC/Dump.php';
-} else {
- /**
- * Get the needed class from the parent directory
- */
- require_once '../Dump.php';
-}
-
-$val = new XML_RPC_Value(array(
- 'title' =>new XML_RPC_Value('das ist der Titel', 'string'),
- 'startDate'=>new XML_RPC_Value(mktime(0,0,0,13,11,2004), 'dateTime.iso8601'),
- 'endDate' =>new XML_RPC_Value(mktime(0,0,0,15,11,2004), 'dateTime.iso8601'),
- 'error' =>'string',
- 'arkey' => new XML_RPC_Value( array(
- new XML_RPC_Value('simple string'),
- new XML_RPC_Value(12345, 'int')
- ), 'array')
- )
- ,'struct');
-
-XML_RPC_Dump($val);
-
-echo '==============' . "\r\n";
-$val2 = new XML_RPC_Value(44353, 'int');
-XML_RPC_Dump($val2);
-
-echo '==============' . "\r\n";
-$val3 = new XML_RPC_Value('this should be a string', 'string');
-XML_RPC_Dump($val3);
-
-echo '==============' . "\r\n";
-$val4 = new XML_RPC_Value(true, 'boolean');
-XML_RPC_Dump($val4);
|
[-]
[+]
|
Deleted |
XML_RPC-1.5.1.tgz/XML_RPC-1.5.1/tests/types.php
^
|
@@ -1,132 +0,0 @@
-<?php
-
-/**
- * Tests how the XML_RPC server handles a bunch of different parameter
- * data types.
- *
- * If you are running this test from a CVS checkout, you must rename the working
- * directory from "XML_RPC" to "XML".
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.01 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_01.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Web Services
- * @package XML_RPC
- * @author Daniel Convissor <danielc@php.net>
- * @copyright 2005-2006 The PHP Group
- * @license http://www.php.net/license/3_01.txt PHP License
- * @version CVS: $Id: types.php,v 1.2 2006/06/11 00:25:17 danielc Exp $
- * @link http://pear.php.net/package/XML_RPC
- * @since File available since Release 1.4.4
- */
-
-/*
- * If the package version number is found in the left hand
- * portion of the if() expression below, that means this file has
- * come from the PEAR installer. Therefore, let's test the
- * installed version of XML_RPC which should be in the include path.
- *
- * If the version has not been substituted in the if() expression,
- * this file has likely come from a CVS checkout or a .tar file.
- * Therefore, we'll assume the tests should use the version of
- * XML_RPC that has come from there as well.
- */
-if ('1.5.1' != '@'.'package_version'.'@') {
- /**
- * Get the needed class from the PEAR installation
- */
- require_once 'XML/RPC/Server.php';
-} else {
- if (substr(dirname(__FILE__), -9, -6) != 'XML') {
- echo "The parent directory must be named 'XML'.\n";
- exit;
- }
-
- ini_set('include_path', '../../'
- . PATH_SEPARATOR . '.' . PATH_SEPARATOR
- . ini_get('include_path')
- );
-
- /**
- * Get the needed class from the parent directory
- */
- require_once '../Server.php';
-}
-
-$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
-<?xml version="1.0"?>
-<methodCall>
- <methodName>allgot</methodName>
- <params>
- <param><value>default to string</value></param>
- <param><value><string>inside string</string></value></param>
- <param><value><int>8</int></value></param>
- <param><value><datetime.iso8601>20050809T01:33:44</datetime.iso8601></value></param>
-
- <param>
- <value>
- <array>
- <data>
- <value>
- <string>a</string>
- </value>
- <value>
- <string>b</string>
- </value>
- </data>
- </array>
- </value>
- </param>
-
- <param>
- <value>
- <struct>
- <member>
- <name>a</name>
- <value>
- <string>ay</string>
- </value>
- </member>
- <member>
- <name>b</name>
- <value>
- <string>be</string>
- </value>
- </member>
- </struct>
- </value>
- </param>
-
- </params>
- </methodCall>
-EOPOST;
-
-$expect = <<<EOEXP
-<?xml version="1.0" encoding="UTF-8"?>
-<methodResponse>
-<params>
-<param>
-<value><string>param 0: 'default to string'
-param 1: 'inside string'
-param 2: '8'
-param 3: '20050809T01:33:44'
-param 4: array (
- 0 => 'a',
- 1 => 'b',
-)
-param 5: array (
- 'a' => 'ay',
- 'b' => 'be',
-)
-</string></value>
-</param>
-</params>
-</methodResponse>
-EOEXP;
-
-include './allgot.inc';
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/Dump.php
^
|
@@ -0,0 +1,187 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Function and class to dump XML_RPC_Value objects in a nice way
+ *
+ * Should be helpful as a normal var_dump(..) displays all internals which
+ * doesn't really give you an overview due to too much information.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Christian Weiske <cweiske@php.net>
+ * @version CVS: $Id: Dump.php 178076 2005-01-24 03:47:55Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ */
+
+
+/**
+ * Pull in the XML_RPC class
+ */
+require_once 'XML/RPC.php';
+
+
+/**
+ * Generates the dump of the XML_RPC_Value and echoes it
+ *
+ * @param object $value the XML_RPC_Value object to dump
+ *
+ * @return void
+ */
+function XML_RPC_Dump($value)
+{
+ $dumper = new XML_RPC_Dump();
+ echo $dumper->generateDump($value);
+}
+
+
+/**
+ * Class which generates a dump of a XML_RPC_Value object
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Christian Weiske <cweiske@php.net>
+ * @version Release: 1.5.2
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Dump
+{
+ /**
+ * The indentation array cache
+ * @var array
+ */
+ var $arIndent = array();
+
+ /**
+ * The spaces used for indenting the XML
+ * @var string
+ */
+ var $strBaseIndent = ' ';
+
+ /**
+ * Returns the dump in XML format without printing it out
+ *
+ * @param object $value the XML_RPC_Value object to dump
+ * @param int $nLevel the level of indentation
+ *
+ * @return string the dump
+ */
+ function generateDump($value, $nLevel = 0)
+ {
+ if (!is_object($value) && get_class($value) != 'xml_rpc_value') {
+ require_once 'PEAR.php';
+ PEAR::raiseError('Tried to dump non-XML_RPC_Value variable' . "\r\n",
+ 0, PEAR_ERROR_PRINT);
+ if (is_object($value)) {
+ $strType = get_class($value);
+ } else {
+ $strType = gettype($value);
+ }
+ return $this->getIndent($nLevel) . 'NOT A XML_RPC_Value: '
+ . $strType . "\r\n";
+ }
+
+ switch ($value->kindOf()) {
+ case 'struct':
+ $ret = $this->genStruct($value, $nLevel);
+ break;
+ case 'array':
+ $ret = $this->genArray($value, $nLevel);
+ break;
+ case 'scalar':
+ $ret = $this->genScalar($value->scalarval(), $nLevel);
+ break;
+ default:
+ require_once 'PEAR.php';
+ PEAR::raiseError('Illegal type "' . $value->kindOf()
+ . '" in XML_RPC_Value' . "\r\n", 0,
+ PEAR_ERROR_PRINT);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Returns the scalar value dump
+ *
+ * @param object $value the scalar XML_RPC_Value object to dump
+ * @param int $nLevel the level of indentation
+ *
+ * @return string Dumped version of the scalar value
+ */
+ function genScalar($value, $nLevel)
+ {
+ if (gettype($value) == 'object') {
+ $strClass = ' ' . get_class($value);
+ } else {
+ $strClass = '';
+ }
+ return $this->getIndent($nLevel) . gettype($value) . $strClass
+ . ' ' . $value . "\r\n";
+ }
+
+ /**
+ * Returns the dump of a struct
+ *
+ * @param object $value the struct XML_RPC_Value object to dump
+ * @param int $nLevel the level of indentation
+ *
+ * @return string Dumped version of the scalar value
+ */
+ function genStruct($value, $nLevel)
+ {
+ $value->structreset();
+ $strOutput = $this->getIndent($nLevel) . 'struct' . "\r\n";
+ while (list($key, $keyval) = $value->structeach()) {
+ $strOutput .= $this->getIndent($nLevel + 1) . $key . "\r\n";
+ $strOutput .= $this->generateDump($keyval, $nLevel + 2);
+ }
+ return $strOutput;
+ }
+
+ /**
+ * Returns the dump of an array
+ *
+ * @param object $value the array XML_RPC_Value object to dump
+ * @param int $nLevel the level of indentation
+ *
+ * @return string Dumped version of the scalar value
+ */
+ function genArray($value, $nLevel)
+ {
+ $nSize = $value->arraysize();
+ $strOutput = $this->getIndent($nLevel) . 'array' . "\r\n";
+ for($nA = 0; $nA < $nSize; $nA++) {
+ $strOutput .= $this->getIndent($nLevel + 1) . $nA . "\r\n";
+ $strOutput .= $this->generateDump($value->arraymem($nA),
+ $nLevel + 2);
+ }
+ return $strOutput;
+ }
+
+ /**
+ * Returns the indent for a specific level and caches it for faster use
+ *
+ * @param int $nLevel the level
+ *
+ * @return string the indented string
+ */
+ function getIndent($nLevel)
+ {
+ if (!isset($this->arIndent[$nLevel])) {
+ $this->arIndent[$nLevel] = str_repeat($this->strBaseIndent, $nLevel);
+ }
+ return $this->arIndent[$nLevel];
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+
+?>
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/RPC.php
^
|
@@ -0,0 +1,2077 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP implementation of the XML-RPC protocol
+ *
+ * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
+ * It has support for HTTP transport, proxies and authentication.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: License is granted to use or modify this software
+ * ("XML-RPC for PHP") for commercial or non-commercial use provided the
+ * copyright of the author is preserved in any distributed or derivative work.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESSED 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 AUTHOR 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.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version CVS: $Id: RPC.php 222479 2006-10-28 16:42:34Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ */
+
+
+if (!function_exists('xml_parser_create')) {
+ include_once 'PEAR.php';
+ PEAR::loadExtension('xml');
+}
+
+/**#@+
+ * Error constants
+ */
+/**
+ * Parameter values don't match parameter types
+ */
+define('XML_RPC_ERROR_INVALID_TYPE', 101);
+/**
+ * Parameter declared to be numeric but the values are not
+ */
+define('XML_RPC_ERROR_NON_NUMERIC_FOUND', 102);
+/**
+ * Communication error
+ */
+define('XML_RPC_ERROR_CONNECTION_FAILED', 103);
+/**
+ * The array or struct has already been started
+ */
+define('XML_RPC_ERROR_ALREADY_INITIALIZED', 104);
+/**
+ * Incorrect parameters submitted
+ */
+define('XML_RPC_ERROR_INCORRECT_PARAMS', 105);
+/**
+ * Programming error by developer
+ */
+define('XML_RPC_ERROR_PROGRAMMING', 106);
+/**#@-*/
+
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_I4']
+ */
+$GLOBALS['XML_RPC_I4'] = 'i4';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Int']
+ */
+$GLOBALS['XML_RPC_Int'] = 'int';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Boolean']
+ */
+$GLOBALS['XML_RPC_Boolean'] = 'boolean';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Double']
+ */
+$GLOBALS['XML_RPC_Double'] = 'double';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_String']
+ */
+$GLOBALS['XML_RPC_String'] = 'string';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_DateTime']
+ */
+$GLOBALS['XML_RPC_DateTime'] = 'dateTime.iso8601';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Base64']
+ */
+$GLOBALS['XML_RPC_Base64'] = 'base64';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Array']
+ */
+$GLOBALS['XML_RPC_Array'] = 'array';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Struct']
+ */
+$GLOBALS['XML_RPC_Struct'] = 'struct';
+
+
+/**
+ * Data type meta-types
+ * @global array $GLOBALS['XML_RPC_Types']
+ */
+$GLOBALS['XML_RPC_Types'] = array(
+ $GLOBALS['XML_RPC_I4'] => 1,
+ $GLOBALS['XML_RPC_Int'] => 1,
+ $GLOBALS['XML_RPC_Boolean'] => 1,
+ $GLOBALS['XML_RPC_String'] => 1,
+ $GLOBALS['XML_RPC_Double'] => 1,
+ $GLOBALS['XML_RPC_DateTime'] => 1,
+ $GLOBALS['XML_RPC_Base64'] => 1,
+ $GLOBALS['XML_RPC_Array'] => 2,
+ $GLOBALS['XML_RPC_Struct'] => 3,
+);
+
+
+/**
+ * Error message numbers
+ * @global array $GLOBALS['XML_RPC_err']
+ */
+$GLOBALS['XML_RPC_err'] = array(
+ 'unknown_method' => 1,
+ 'invalid_return' => 2,
+ 'incorrect_params' => 3,
+ 'introspect_unknown' => 4,
+ 'http_error' => 5,
+ 'not_response_object' => 6,
+ 'invalid_request' => 7,
+);
+
+/**
+ * Error message strings
+ * @global array $GLOBALS['XML_RPC_str']
+ */
+$GLOBALS['XML_RPC_str'] = array(
+ 'unknown_method' => 'Unknown method',
+ 'invalid_return' => 'Invalid return payload: enable debugging to examine incoming payload',
+ 'incorrect_params' => 'Incorrect parameters passed to method',
+ 'introspect_unknown' => 'Can\'t introspect: method unknown',
+ 'http_error' => 'Didn\'t receive 200 OK from remote server.',
+ 'not_response_object' => 'The requested method didn\'t return an XML_RPC_Response object.',
+ 'invalid_request' => 'Invalid request payload',
+);
+
+
+/**
+ * Default XML encoding (ISO-8859-1, UTF-8 or US-ASCII)
+ * @global string $GLOBALS['XML_RPC_defencoding']
+ */
+$GLOBALS['XML_RPC_defencoding'] = 'UTF-8';
+
+/**
+ * User error codes start at 800
+ * @global int $GLOBALS['XML_RPC_erruser']
+ */
+$GLOBALS['XML_RPC_erruser'] = 800;
+
+/**
+ * XML parse error codes start at 100
+ * @global int $GLOBALS['XML_RPC_errxml']
+ */
+$GLOBALS['XML_RPC_errxml'] = 100;
+
+
+/**
+ * Compose backslashes for escaping regexp
+ * @global string $GLOBALS['XML_RPC_backslash']
+ */
+$GLOBALS['XML_RPC_backslash'] = chr(92) . chr(92);
+
+
+/**#@+
+ * Which functions to use, depending on whether mbstring is enabled or not.
+ */
+if (function_exists('mb_ereg')) {
+ /** @global string $GLOBALS['XML_RPC_func_ereg'] */
+ $GLOBALS['XML_RPC_func_ereg'] = 'mb_eregi';
+ /** @global string $GLOBALS['XML_RPC_func_ereg_replace'] */
+ $GLOBALS['XML_RPC_func_ereg_replace'] = 'mb_eregi_replace';
+ /** @global string $GLOBALS['XML_RPC_func_split'] */
+ $GLOBALS['XML_RPC_func_split'] = 'mb_split';
+} else {
+ /** @ignore */
+ $GLOBALS['XML_RPC_func_ereg'] = 'eregi';
+ /** @ignore */
+ $GLOBALS['XML_RPC_func_ereg_replace'] = 'eregi_replace';
+ /** @ignore */
+ $GLOBALS['XML_RPC_func_split'] = 'split';
+}
+/**#@-*/
+
+
+/**
+ * Should we automatically base64 encode strings that contain characters
+ * which can cause PHP's SAX-based XML parser to break?
+ * @global boolean $GLOBALS['XML_RPC_auto_base64']
+ */
+$GLOBALS['XML_RPC_auto_base64'] = false;
+
+
+/**
+ * Valid parents of XML elements
+ * @global array $GLOBALS['XML_RPC_valid_parents']
+ */
+$GLOBALS['XML_RPC_valid_parents'] = array(
+ 'BOOLEAN' => array('VALUE'),
+ 'I4' => array('VALUE'),
+ 'INT' => array('VALUE'),
+ 'STRING' => array('VALUE'),
+ 'DOUBLE' => array('VALUE'),
+ 'DATETIME.ISO8601' => array('VALUE'),
+ 'BASE64' => array('VALUE'),
+ 'ARRAY' => array('VALUE'),
+ 'STRUCT' => array('VALUE'),
+ 'PARAM' => array('PARAMS'),
+ 'METHODNAME' => array('METHODCALL'),
+ 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
+ 'MEMBER' => array('STRUCT'),
+ 'NAME' => array('MEMBER'),
+ 'DATA' => array('ARRAY'),
+ 'FAULT' => array('METHODRESPONSE'),
+ 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),
+);
+
+
+/**
+ * Stores state during parsing
+ *
+ * quick explanation of components:
+ * + ac = accumulates values
+ * + qt = decides if quotes are needed for evaluation
+ * + cm = denotes struct or array (comma needed)
+ * + isf = indicates a fault
+ * + lv = indicates "looking for a value": implements the logic
+ * to allow values with no types to be strings
+ * + params = stores parameters in method calls
+ * + method = stores method name
+ *
+ * @global array $GLOBALS['XML_RPC_xh']
+ */
+$GLOBALS['XML_RPC_xh'] = array();
+
+
+/**
+ * Start element handler for the XML parser
+ *
+ * @return void
+ */
+function XML_RPC_se($parser_resource, $name, $attrs)
+{
+ global $XML_RPC_xh, $XML_RPC_valid_parents;
+
+ $parser = (int) $parser_resource;
+
+ // if invalid xmlrpc already detected, skip all processing
+ if ($XML_RPC_xh[$parser]['isf'] >= 2) {
+ return;
+ }
+
+ // check for correct element nesting
+ // top level element can only be of 2 types
+ if (count($XML_RPC_xh[$parser]['stack']) == 0) {
+ if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') {
+ $XML_RPC_xh[$parser]['isf'] = 2;
+ $XML_RPC_xh[$parser]['isf_reason'] = 'missing top level xmlrpc element';
+ return;
+ }
+ } else {
+ // not top level element: see if parent is OK
+ if (!in_array($XML_RPC_xh[$parser]['stack'][0], $XML_RPC_valid_parents[$name])) {
+ $name = $GLOBALS['XML_RPC_func_ereg_replace']('[^a-zA-Z0-9._-]', '', $name);
+ $XML_RPC_xh[$parser]['isf'] = 2;
+ $XML_RPC_xh[$parser]['isf_reason'] = "xmlrpc element $name cannot be child of {$XML_RPC_xh[$parser]['stack'][0]}";
+ return;
+ }
+ }
+
+ switch ($name) {
+ case 'STRUCT':
+ $XML_RPC_xh[$parser]['cm']++;
+
+ // turn quoting off
+ $XML_RPC_xh[$parser]['qt'] = 0;
+
+ $cur_val = array();
+ $cur_val['value'] = array();
+ $cur_val['members'] = 1;
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ break;
+
+ case 'ARRAY':
+ $XML_RPC_xh[$parser]['cm']++;
+
+ // turn quoting off
+ $XML_RPC_xh[$parser]['qt'] = 0;
+
+ $cur_val = array();
+ $cur_val['value'] = array();
+ $cur_val['members'] = 0;
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ break;
+
+ case 'NAME':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ break;
+
+ case 'FAULT':
+ $XML_RPC_xh[$parser]['isf'] = 1;
+ break;
+
+ case 'PARAM':
+ $XML_RPC_xh[$parser]['valuestack'] = array();
+ break;
+
+ case 'VALUE':
+ $XML_RPC_xh[$parser]['lv'] = 1;
+ $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_String'];
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ // look for a value: if this is still 1 by the
+ // time we reach the first data segment then the type is string
+ // by implication and we need to add in a quote
+ break;
+
+ case 'I4':
+ case 'INT':
+ case 'STRING':
+ case 'BOOLEAN':
+ case 'DOUBLE':
+ case 'DATETIME.ISO8601':
+ case 'BASE64':
+ $XML_RPC_xh[$parser]['ac'] = ''; // reset the accumulator
+
+ if ($name == 'DATETIME.ISO8601' || $name == 'STRING') {
+ $XML_RPC_xh[$parser]['qt'] = 1;
+
+ if ($name == 'DATETIME.ISO8601') {
+ $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_DateTime'];
+ }
+
+ } elseif ($name == 'BASE64') {
+ $XML_RPC_xh[$parser]['qt'] = 2;
+ } else {
+ // No quoting is required here -- but
+ // at the end of the element we must check
+ // for data format errors.
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ }
+ break;
+
+ case 'MEMBER':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ break;
+
+ case 'DATA':
+ case 'METHODCALL':
+ case 'METHODNAME':
+ case 'METHODRESPONSE':
+ case 'PARAMS':
+ // valid elements that add little to processing
+ break;
+ }
+
+
+ // Save current element to stack
+ array_unshift($XML_RPC_xh[$parser]['stack'], $name);
+
+ if ($name != 'VALUE') {
+ $XML_RPC_xh[$parser]['lv'] = 0;
+ }
+}
+
+/**
+ * End element handler for the XML parser
+ *
+ * @return void
+ */
+function XML_RPC_ee($parser_resource, $name)
+{
+ global $XML_RPC_xh;
+
+ $parser = (int) $parser_resource;
+
+ if ($XML_RPC_xh[$parser]['isf'] >= 2) {
+ return;
+ }
+
+ // push this element from stack
+ // NB: if XML validates, correct opening/closing is guaranteed and
+ // we do not have to check for $name == $curr_elem.
+ // we also checked for proper nesting at start of elements...
+ $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']);
+
+ switch ($name) {
+ case 'STRUCT':
+ case 'ARRAY':
+ $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
+ $XML_RPC_xh[$parser]['value'] = $cur_val['value'];
+ $XML_RPC_xh[$parser]['vt'] = strtolower($name);
+ $XML_RPC_xh[$parser]['cm']--;
+ break;
+
+ case 'NAME':
+ $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac'];
+ break;
+
+ case 'BOOLEAN':
+ // special case here: we translate boolean 1 or 0 into PHP
+ // constants true or false
+ if ($XML_RPC_xh[$parser]['ac'] == '1') {
+ $XML_RPC_xh[$parser]['ac'] = 'true';
+ } else {
+ $XML_RPC_xh[$parser]['ac'] = 'false';
+ }
+
+ $XML_RPC_xh[$parser]['vt'] = strtolower($name);
+ // Drop through intentionally.
+
+ case 'I4':
+ case 'INT':
+ case 'STRING':
+ case 'DOUBLE':
+ case 'DATETIME.ISO8601':
+ case 'BASE64':
+ if ($XML_RPC_xh[$parser]['qt'] == 1) {
+ // we use double quotes rather than single so backslashification works OK
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ } elseif ($XML_RPC_xh[$parser]['qt'] == 2) {
+ $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']);
+ } elseif ($name == 'BOOLEAN') {
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ } else {
+ // we have an I4, INT or a DOUBLE
+ // we must check that only 0123456789-.<space> are characters here
+ if (!$GLOBALS['XML_RPC_func_ereg']("^[+-]?[0123456789 \t\.]+$", $XML_RPC_xh[$parser]['ac'])) {
+ XML_RPC_Base::raiseError('Non-numeric value received in INT or DOUBLE',
+ XML_RPC_ERROR_NON_NUMERIC_FOUND);
+ $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
+ } else {
+ // it's ok, add it on
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ }
+ }
+
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ $XML_RPC_xh[$parser]['lv'] = 3; // indicate we've found a value
+ break;
+
+ case 'VALUE':
+ if ($XML_RPC_xh[$parser]['vt'] == $GLOBALS['XML_RPC_String']) {
+ if (strlen($XML_RPC_xh[$parser]['ac']) > 0) {
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ } elseif ($XML_RPC_xh[$parser]['lv'] == 1) {
+ // The <value> element was empty.
+ $XML_RPC_xh[$parser]['value'] = '';
+ }
+ }
+
+ $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']);
+
+ $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
+ if (is_array($cur_val)) {
+ if ($cur_val['members']==0) {
+ $cur_val['value'][] = $temp;
+ } else {
+ $XML_RPC_xh[$parser]['value'] = $temp;
+ }
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ } else {
+ $XML_RPC_xh[$parser]['value'] = $temp;
+ }
+ break;
+
+ case 'MEMBER':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+
+ $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
+ if (is_array($cur_val)) {
+ if ($cur_val['members']==1) {
+ $cur_val['value'][$cur_val['name']] = $XML_RPC_xh[$parser]['value'];
+ }
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ }
+ break;
+
+ case 'DATA':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ break;
+
+ case 'PARAM':
+ $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value'];
+ break;
+
+ case 'METHODNAME':
+ case 'RPCMETHODNAME':
+ $XML_RPC_xh[$parser]['method'] = $GLOBALS['XML_RPC_func_ereg_replace']("^[\n\r\t ]+", '',
+ $XML_RPC_xh[$parser]['ac']);
+ break;
+ }
+
+ // if it's a valid type name, set the type
+ if (isset($GLOBALS['XML_RPC_Types'][strtolower($name)])) {
+ $XML_RPC_xh[$parser]['vt'] = strtolower($name);
+ }
+}
+
+/**
+ * Character data handler for the XML parser
+ *
+ * @return void
+ */
+function XML_RPC_cd($parser_resource, $data)
+{
+ global $XML_RPC_xh, $XML_RPC_backslash;
+
+ $parser = (int) $parser_resource;
+
+ if ($XML_RPC_xh[$parser]['lv'] != 3) {
+ // "lookforvalue==3" means that we've found an entire value
+ // and should discard any further character data
+
+ if ($XML_RPC_xh[$parser]['lv'] == 1) {
+ // if we've found text and we're just in a <value> then
+ // turn quoting on, as this will be a string
+ $XML_RPC_xh[$parser]['qt'] = 1;
+ // and say we've found a value
+ $XML_RPC_xh[$parser]['lv'] = 2;
+ }
+
+ // replace characters that eval would
+ // do special things with
+ if (!isset($XML_RPC_xh[$parser]['ac'])) {
+ $XML_RPC_xh[$parser]['ac'] = '';
+ }
+ $XML_RPC_xh[$parser]['ac'] .= $data;
+ }
+}
+
+/**
+ * The common methods and properties for all of the XML_RPC classes
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version Release: 1.5.2
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Base {
+
+ /**
+ * PEAR Error handling
+ *
+ * @return object PEAR_Error object
+ */
+ function raiseError($msg, $code)
+ {
+ include_once 'PEAR.php';
+ if (is_object(@$this)) {
+ return PEAR::raiseError(get_class($this) . ': ' . $msg, $code);
+ } else {
+ return PEAR::raiseError('XML_RPC: ' . $msg, $code);
+ }
+ }
+
+ /**
+ * Tell whether something is a PEAR_Error object
+ *
+ * @param mixed $value the item to check
+ *
+ * @return bool whether $value is a PEAR_Error object or not
+ *
+ * @access public
+ */
+ function isError($value)
+ {
+ return is_a($value, 'PEAR_Error');
+ }
+}
+
+/**
+ * The methods and properties for submitting XML RPC requests
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version Release: 1.5.2
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Client extends XML_RPC_Base {
+
+ /**
+ * The path and name of the RPC server script you want the request to go to
+ * @var string
+ */
+ var $path = '';
+
+ /**
+ * The name of the remote server to connect to
+ * @var string
+ */
+ var $server = '';
+
+ /**
+ * The protocol to use in contacting the remote server
+ * @var string
+ */
+ var $protocol = 'http://';
+
+ /**
+ * The port for connecting to the remote server
+ *
+ * The default is 80 for http:// connections
+ * and 443 for https:// and ssl:// connections.
+ *
+ * @var integer
+ */
+ var $port = 80;
+
+ /**
+ * A user name for accessing the RPC server
+ * @var string
+ * @see XML_RPC_Client::setCredentials()
+ */
+ var $username = '';
+
+ /**
+ * A password for accessing the RPC server
+ * @var string
+ * @see XML_RPC_Client::setCredentials()
+ */
+ var $password = '';
+
+ /**
+ * The name of the proxy server to use, if any
+ * @var string
+ */
+ var $proxy = '';
+
+ /**
+ * The protocol to use in contacting the proxy server, if any
+ * @var string
+ */
+ var $proxy_protocol = 'http://';
+
+ /**
+ * The port for connecting to the proxy server
+ *
+ * The default is 8080 for http:// connections
+ * and 443 for https:// and ssl:// connections.
+ *
+ * @var integer
+ */
+ var $proxy_port = 8080;
+
+ /**
+ * A user name for accessing the proxy server
+ * @var string
+ */
+ var $proxy_user = '';
+
+ /**
+ * A password for accessing the proxy server
+ * @var string
+ */
+ var $proxy_pass = '';
+
+ /**
+ * The error number, if any
+ * @var integer
+ */
+ var $errno = 0;
+
+ /**
+ * The error message, if any
+ * @var string
+ */
+ var $errstr = '';
+
+ /**
+ * The current debug mode (1 = on, 0 = off)
+ * @var integer
+ */
+ var $debug = 0;
+
+ /**
+ * The HTTP headers for the current request.
+ * @var string
+ */
+ var $headers = '';
+
+
+ /**
+ * Sets the object's properties
+ *
+ * @param string $path the path and name of the RPC server script
+ * you want the request to go to
+ * @param string $server the URL of the remote server to connect to.
+ * If this parameter doesn't specify a
+ * protocol and $port is 443, ssl:// is
+ * assumed.
+ * @param integer $port a port for connecting to the remote server.
+ * Defaults to 80 for http:// connections and
+ * 443 for https:// and ssl:// connections.
+ * @param string $proxy the URL of the proxy server to use, if any.
+ * If this parameter doesn't specify a
+ * protocol and $port is 443, ssl:// is
+ * assumed.
+ * @param integer $proxy_port a port for connecting to the remote server.
+ * Defaults to 8080 for http:// connections and
+ * 443 for https:// and ssl:// connections.
+ * @param string $proxy_user a user name for accessing the proxy server
+ * @param string $proxy_pass a password for accessing the proxy server
+ *
+ * @return void
+ */
+ function XML_RPC_Client($path, $server, $port = 0,
+ $proxy = '', $proxy_port = 0,
+ $proxy_user = '', $proxy_pass = '')
+ {
+ $this->path = $path;
+ $this->proxy_user = $proxy_user;
+ $this->proxy_pass = $proxy_pass;
+
+ $GLOBALS['XML_RPC_func_ereg']('^(http://|https://|ssl://)?(.*)$', $server, $match);
+ if ($match[1] == '') {
+ if ($port == 443) {
+ $this->server = $match[2];
+ $this->protocol = 'ssl://';
+ $this->port = 443;
+ } else {
+ $this->server = $match[2];
+ if ($port) {
+ $this->port = $port;
+ }
+ }
+ } elseif ($match[1] == 'http://') {
+ $this->server = $match[2];
+ if ($port) {
+ $this->port = $port;
+ }
+ } else {
+ $this->server = $match[2];
+ $this->protocol = 'ssl://';
+ if ($port) {
+ $this->port = $port;
+ } else {
+ $this->port = 443;
+ }
+ }
+
+ if ($proxy) {
+ $GLOBALS['XML_RPC_func_ereg']('^(http://|https://|ssl://)?(.*)$', $proxy, $match);
+ if ($match[1] == '') {
+ if ($proxy_port == 443) {
+ $this->proxy = $match[2];
+ $this->proxy_protocol = 'ssl://';
+ $this->proxy_port = 443;
+ } else {
+ $this->proxy = $match[2];
+ if ($proxy_port) {
+ $this->proxy_port = $proxy_port;
+ }
+ }
+ } elseif ($match[1] == 'http://') {
+ $this->proxy = $match[2];
+ if ($proxy_port) {
+ $this->proxy_port = $proxy_port;
+ }
+ } else {
+ $this->proxy = $match[2];
+ $this->proxy_protocol = 'ssl://';
+ if ($proxy_port) {
+ $this->proxy_port = $proxy_port;
+ } else {
+ $this->proxy_port = 443;
+ }
+ }
+ }
+ }
+
+ /**
+ * Change the current debug mode
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ */
+ function setDebug($in)
+ {
+ if ($in) {
+ $this->debug = 1;
+ } else {
+ $this->debug = 0;
+ }
+ }
+
+ /**
+ * Sets whether strings that contain characters which may cause PHP's
+ * SAX-based XML parser to break should be automatically base64 encoded
+ *
+ * This is is a workaround for systems that don't have PHP's mbstring
+ * extension available.
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ */
+ function setAutoBase64($in)
+ {
+ if ($in) {
+ $GLOBALS['XML_RPC_auto_base64'] = true;
+ } else {
+ $GLOBALS['XML_RPC_auto_base64'] = false;
+ }
+ }
+
+ /**
+ * Set username and password properties for connecting to the RPC server
+ *
+ * @param string $u the user name
+ * @param string $p the password
+ *
+ * @return void
+ *
+ * @see XML_RPC_Client::$username, XML_RPC_Client::$password
+ */
+ function setCredentials($u, $p)
+ {
+ $this->username = $u;
+ $this->password = $p;
+ }
+
+ /**
+ * Transmit the RPC request via HTTP 1.0 protocol
+ *
+ * @param object $msg the XML_RPC_Message object
+ * @param int $timeout how many seconds to wait for the request
+ *
+ * @return object an XML_RPC_Response object. 0 is returned if any
+ * problems happen.
+ *
+ * @see XML_RPC_Message, XML_RPC_Client::XML_RPC_Client(),
+ * XML_RPC_Client::setCredentials()
+ */
+ function send($msg, $timeout = 0)
+ {
+ if (!is_a($msg, 'XML_RPC_Message')) {
+ $this->errstr = 'send()\'s $msg parameter must be an'
+ . ' XML_RPC_Message object.';
+ $this->raiseError($this->errstr, XML_RPC_ERROR_PROGRAMMING);
+ return 0;
+ }
+ $msg->debug = $this->debug;
+ return $this->sendPayloadHTTP10($msg, $this->server, $this->port,
+ $timeout, $this->username,
+ $this->password);
+ }
+
+ /**
+ * Transmit the RPC request via HTTP 1.0 protocol
+ *
+ * Requests should be sent using XML_RPC_Client send() rather than
+ * calling this method directly.
+ *
+ * @param object $msg the XML_RPC_Message object
+ * @param string $server the server to send the request to
+ * @param int $port the server port send the request to
+ * @param int $timeout how many seconds to wait for the request
+ * before giving up
+ * @param string $username a user name for accessing the RPC server
+ * @param string $password a password for accessing the RPC server
+ *
+ * @return object an XML_RPC_Response object. 0 is returned if any
+ * problems happen.
+ *
+ * @access protected
+ * @see XML_RPC_Client::send()
+ */
+ function sendPayloadHTTP10($msg, $server, $port, $timeout = 0,
+ $username = '', $password = '')
+ {
+ /*
+ * If we're using a proxy open a socket to the proxy server
+ * instead to the xml-rpc server
+ */
+ if ($this->proxy) {
+ if ($this->proxy_protocol == 'http://') {
+ $protocol = '';
+ } else {
+ $protocol = $this->proxy_protocol;
+ }
+ if ($timeout > 0) {
+ $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
+ $this->errno, $this->errstr, $timeout);
+ } else {
+ $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
+ $this->errno, $this->errstr);
+ }
+ } else {
+ if ($this->protocol == 'http://') {
+ $protocol = '';
+ } else {
+ $protocol = $this->protocol;
+ }
+ if ($timeout > 0) {
+ $fp = @fsockopen($protocol . $server, $port,
+ $this->errno, $this->errstr, $timeout);
+ } else {
+ $fp = @fsockopen($protocol . $server, $port,
+ $this->errno, $this->errstr);
+ }
+ }
+
+ /*
+ * Just raising the error without returning it is strange,
+ * but keep it here for backwards compatibility.
+ */
+ if (!$fp && $this->proxy) {
+ $this->raiseError('Connection to proxy server '
+ . $this->proxy . ':' . $this->proxy_port
+ . ' failed. ' . $this->errstr,
+ XML_RPC_ERROR_CONNECTION_FAILED);
+ return 0;
+ } elseif (!$fp) {
+ $this->raiseError('Connection to RPC server '
+ . $server . ':' . $port
+ . ' failed. ' . $this->errstr,
+ XML_RPC_ERROR_CONNECTION_FAILED);
+ return 0;
+ }
+
+ if ($timeout) {
+ /*
+ * Using socket_set_timeout() because stream_set_timeout()
+ * was introduced in 4.3.0, but we need to support 4.2.0.
+ */
+ socket_set_timeout($fp, $timeout);
+ }
+
+ // Pre-emptive BC hacks for fools calling sendPayloadHTTP10() directly
+ if ($username != $this->username) {
+ $this->setCredentials($username, $password);
+ }
+
+ // Only create the payload if it was not created previously
+ if (empty($msg->payload)) {
+ $msg->createPayload();
+ }
+ $this->createHeaders($msg);
+
+ $op = $this->headers . "\r\n\r\n";
+ $op .= $msg->payload;
+
+ if (!fputs($fp, $op, strlen($op))) {
+ $this->errstr = 'Write error';
+ return 0;
+ }
+ $resp = $msg->parseResponseFile($fp);
+
+ $meta = socket_get_status($fp);
+ if ($meta['timed_out']) {
+ fclose($fp);
+ $this->errstr = 'RPC server did not send response before timeout.';
+ $this->raiseError($this->errstr, XML_RPC_ERROR_CONNECTION_FAILED);
+ return 0;
+ }
+
+ fclose($fp);
+ return $resp;
+ }
+
+ /**
+ * Determines the HTTP headers and puts it in the $headers property
+ *
+ * @param object $msg the XML_RPC_Message object
+ *
+ * @return boolean TRUE if okay, FALSE if the message payload isn't set.
+ *
+ * @access protected
+ */
+ function createHeaders($msg)
+ {
+ if (empty($msg->payload)) {
+ return false;
+ }
+ if ($this->proxy) {
+ $this->headers = 'POST ' . $this->protocol . $this->server;
+ if ($this->proxy_port) {
+ $this->headers .= ':' . $this->port;
+ }
+ } else {
+ $this->headers = 'POST ';
+ }
+ $this->headers .= $this->path. " HTTP/1.0\r\n";
+
+ $this->headers .= "User-Agent: PEAR XML_RPC\r\n";
+ $this->headers .= 'Host: ' . $this->server . "\r\n";
+
+ if ($this->proxy && $this->proxy_user) {
+ $this->headers .= 'Proxy-Authorization: Basic '
+ . base64_encode("$this->proxy_user:$this->proxy_pass")
+ . "\r\n";
+ }
+
+ // thanks to Grant Rauscher <grant7@firstworld.net> for this
+ if ($this->username) {
+ $this->headers .= 'Authorization: Basic '
+ . base64_encode("$this->username:$this->password")
+ . "\r\n";
+ }
+
+ $this->headers .= "Content-Type: text/xml\r\n";
+ $this->headers .= 'Content-Length: ' . strlen($msg->payload);
+ return true;
+ }
+}
+
+/**
+ * The methods and properties for interpreting responses to XML RPC requests
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version Release: 1.5.2
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Response extends XML_RPC_Base
+{
+ var $xv;
+ var $fn;
+ var $fs;
+ var $hdrs;
+
+ /**
+ * @return void
+ */
+ function XML_RPC_Response($val, $fcode = 0, $fstr = '')
+ {
+ if ($fcode != 0) {
+ $this->fn = $fcode;
+ $this->fs = htmlspecialchars($fstr);
+ } else {
+ $this->xv = $val;
+ }
+ }
+
+ /**
+ * @return int the error code
+ */
+ function faultCode()
+ {
+ if (isset($this->fn)) {
+ return $this->fn;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * @return string the error string
+ */
+ function faultString()
+ {
+ return $this->fs;
+ }
+
+ /**
+ * @return mixed the value
+ */
+ function value()
+ {
+ return $this->xv;
+ }
+
+ /**
+ * @return string the error message in XML format
+ */
+ function serialize()
+ {
+ $rs = "<methodResponse>\n";
+ if ($this->fn) {
+ $rs .= "<fault>
+ <value>
+ <struct>
+ <member>
+ <name>faultCode</name>
+ <value><int>" . $this->fn . "</int></value>
+ </member>
+ <member>
+ <name>faultString</name>
+ <value><string>" . $this->fs . "</string></value>
+ </member>
+ </struct>
+ </value>
+</fault>";
+ } else {
+ $rs .= "<params>\n<param>\n" . $this->xv->serialize() .
+ "</param>\n</params>";
+ }
+ $rs .= "\n</methodResponse>";
+ return $rs;
+ }
+}
+
+/**
+ * The methods and properties for composing XML RPC messages
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version Release: 1.5.2
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Message extends XML_RPC_Base
+{
+ /**
+ * Should the payload's content be passed through mb_convert_encoding()?
+ *
+ * @see XML_RPC_Message::setConvertPayloadEncoding()
+ * @since Property available since Release 1.5.1
+ * @var boolean
+ */
+ var $convert_payload_encoding = false;
+
+ /**
+ * The current debug mode (1 = on, 0 = off)
+ * @var integer
+ */
+ var $debug = 0;
+
+ /**
+ * The encoding to be used for outgoing messages
+ *
+ * Defaults to the value of <var>$GLOBALS['XML_RPC_defencoding']</var>
+ *
+ * @var string
+ * @see XML_RPC_Message::setSendEncoding(),
+ * $GLOBALS['XML_RPC_defencoding'], XML_RPC_Message::xml_header()
+ */
+ var $send_encoding = '';
+
+ /**
+ * The method presently being evaluated
+ * @var string
+ */
+ var $methodname = '';
+
+ /**
+ * @var array
+ */
+ var $params = array();
+
+ /**
+ * The XML message being generated
+ * @var string
+ */
+ var $payload = '';
+
+ /**
+ * Should extra line breaks be removed from the payload?
+ * @since Property available since Release 1.4.6
+ * @var boolean
+ */
+ var $remove_extra_lines = true;
+
+ /**
+ * The XML response from the remote server
+ * @since Property available since Release 1.4.6
+ * @var string
+ */
+ var $response_payload = '';
+
+
+ /**
+ * @return void
+ */
+ function XML_RPC_Message($meth, $pars = 0)
+ {
+ $this->methodname = $meth;
+ if (is_array($pars) && sizeof($pars) > 0) {
+ for ($i = 0; $i < sizeof($pars); $i++) {
+ $this->addParam($pars[$i]);
+ }
+ }
+ }
+
+ /**
+ * Produces the XML declaration including the encoding attribute
+ *
+ * The encoding is determined by this class' <var>$send_encoding</var>
+ * property. If the <var>$send_encoding</var> property is not set, use
+ * <var>$GLOBALS['XML_RPC_defencoding']</var>.
+ *
+ * @return string the XML declaration and <methodCall> element
+ *
+ * @see XML_RPC_Message::setSendEncoding(),
+ * XML_RPC_Message::$send_encoding, $GLOBALS['XML_RPC_defencoding']
+ */
+ function xml_header()
+ {
+ global $XML_RPC_defencoding;
+
+ if (!$this->send_encoding) {
+ $this->send_encoding = $XML_RPC_defencoding;
+ }
+ return '<?xml version="1.0" encoding="' . $this->send_encoding . '"?>'
+ . "\n<methodCall>\n";
+ }
+
+ /**
+ * @return string the closing </methodCall> tag
+ */
+ function xml_footer()
+ {
+ return "</methodCall>\n";
+ }
+
+ /**
+ * Fills the XML_RPC_Message::$payload property
+ *
+ * Part of the process makes sure all line endings are in DOS format
+ * (CRLF), which is probably required by specifications.
+ *
+ * If XML_RPC_Message::setConvertPayloadEncoding() was set to true,
+ * the payload gets passed through mb_convert_encoding()
+ * to ensure the payload matches the encoding set in the
+ * XML declaration. The encoding type can be manually set via
+ * XML_RPC_Message::setSendEncoding().
+ *
+ * @return void
+ *
+ * @uses XML_RPC_Message::xml_header(), XML_RPC_Message::xml_footer()
+ * @see XML_RPC_Message::setSendEncoding(), $GLOBALS['XML_RPC_defencoding'],
+ * XML_RPC_Message::setConvertPayloadEncoding()
+ */
+ function createPayload()
+ {
+ $this->payload = $this->xml_header();
+ $this->payload .= '<methodName>' . $this->methodname . "</methodName>\n";
+ $this->payload .= "<params>\n";
+ for ($i = 0; $i < sizeof($this->params); $i++) {
+ $p = $this->params[$i];
+ $this->payload .= "<param>\n" . $p->serialize() . "</param>\n";
+ }
+ $this->payload .= "</params>\n";
+ $this->payload .= $this->xml_footer();
+ if ($this->remove_extra_lines) {
+ $this->payload = $GLOBALS['XML_RPC_func_ereg_replace']("[\r\n]+", "\r\n", $this->payload);
+ } else {
+ $this->payload = $GLOBALS['XML_RPC_func_ereg_replace']("\r\n|\n|\r|\n\r", "\r\n", $this->payload);
+ }
+ if ($this->convert_payload_encoding) {
+ $this->payload = mb_convert_encoding($this->payload, $this->send_encoding);
+ }
+ }
+
+ /**
+ * @return string the name of the method
+ */
+ function method($meth = '')
+ {
+ if ($meth != '') {
+ $this->methodname = $meth;
+ }
+ return $this->methodname;
+ }
+
+ /**
+ * @return string the payload
+ */
+ function serialize()
+ {
+ $this->createPayload();
+ return $this->payload;
+ }
+
+ /**
+ * @return void
+ */
+ function addParam($par)
+ {
+ $this->params[] = $par;
+ }
+
+ /**
+ * Obtains an XML_RPC_Value object for the given parameter
+ *
+ * @param int $i the index number of the parameter to obtain
+ *
+ * @return object the XML_RPC_Value object.
+ * If the parameter doesn't exist, an XML_RPC_Response object.
+ *
+ * @since Returns XML_RPC_Response object on error since Release 1.3.0
+ */
+ function getParam($i)
+ {
+ global $XML_RPC_err, $XML_RPC_str;
+
+ if (isset($this->params[$i])) {
+ return $this->params[$i];
+ } else {
+ $this->raiseError('The submitted request did not contain this parameter',
+ XML_RPC_ERROR_INCORRECT_PARAMS);
+ return new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
+ $XML_RPC_str['incorrect_params']);
+ }
+ }
+
+ /**
+ * @return int the number of parameters
+ */
+ function getNumParams()
+ {
+ return sizeof($this->params);
+ }
+
+ /**
+ * Sets whether the payload's content gets passed through
+ * mb_convert_encoding()
+ *
+ * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ *
+ * @see XML_RPC_Message::setSendEncoding()
+ * @since Method available since Release 1.5.1
+ */
+ function setConvertPayloadEncoding($in)
+ {
+ if ($in && !function_exists('mb_convert_encoding')) {
+ return $this->raiseError('mb_convert_encoding() is not available',
+ XML_RPC_ERROR_PROGRAMMING);
+ }
+ $this->convert_payload_encoding = $in;
+ }
+
+ /**
+ * Sets the XML declaration's encoding attribute
+ *
+ * @param string $type the encoding type (ISO-8859-1, UTF-8 or US-ASCII)
+ *
+ * @return void
+ *
+ * @see XML_RPC_Message::setConvertPayloadEncoding(), XML_RPC_Message::xml_header()
+ * @since Method available since Release 1.2.0
+ */
+ function setSendEncoding($type)
+ {
+ $this->send_encoding = $type;
+ }
+
+ /**
+ * Determine the XML's encoding via the encoding attribute
+ * in the XML declaration
+ *
+ * If the encoding parameter is not set or is not ISO-8859-1, UTF-8
+ * or US-ASCII, $XML_RPC_defencoding will be returned.
+ *
+ * @param string $data the XML that will be parsed
+ *
+ * @return string the encoding to be used
+ *
+ * @link http://php.net/xml_parser_create
+ * @since Method available since Release 1.2.0
+ */
+ function getEncoding($data)
+ {
+ global $XML_RPC_defencoding;
+
+ if ($GLOBALS['XML_RPC_func_ereg']('<\?xml[^>]*[:space:]*encoding[:space:]*=[:space:]*[\'"]([^"\']*)[\'"]',
+ $data, $match))
+ {
+ $match[1] = trim(strtoupper($match[1]));
+ switch ($match[1]) {
+ case 'ISO-8859-1':
+ case 'UTF-8':
+ case 'US-ASCII':
+ return $match[1];
+ break;
+
+ default:
+ return $XML_RPC_defencoding;
+ }
+ } else {
+ return $XML_RPC_defencoding;
+ }
+ }
+
+ /**
+ * @return object a new XML_RPC_Response object
+ */
+ function parseResponseFile($fp)
+ {
+ $ipd = '';
+ while ($data = @fread($fp, 8192)) {
+ $ipd .= $data;
+ }
+ return $this->parseResponse($ipd);
+ }
+
+ /**
+ * @return object a new XML_RPC_Response object
+ */
+ function parseResponse($data = '')
+ {
+ global $XML_RPC_xh, $XML_RPC_err, $XML_RPC_str, $XML_RPC_defencoding;
+
+ $encoding = $this->getEncoding($data);
+ $parser_resource = xml_parser_create($encoding);
+ $parser = (int) $parser_resource;
+
+ $XML_RPC_xh = array();
+ $XML_RPC_xh[$parser] = array();
+
+ $XML_RPC_xh[$parser]['cm'] = 0;
+ $XML_RPC_xh[$parser]['isf'] = 0;
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = '';
+ $XML_RPC_xh[$parser]['stack'] = array();
+ $XML_RPC_xh[$parser]['valuestack'] = array();
+
+ xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
+ xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
+ xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
+
+ $hdrfnd = 0;
+ if ($this->debug) {
+ print "\n<pre>---GOT---\n";
+ print isset($_SERVER['SERVER_PROTOCOL']) ? htmlspecialchars($data) : $data;
+ print "\n---END---</pre>\n";
+ }
+
+ // See if response is a 200 or a 100 then a 200, else raise error.
+ // But only do this if we're using the HTTP protocol.
+ if ($GLOBALS['XML_RPC_func_ereg']('^HTTP', $data) &&
+ !$GLOBALS['XML_RPC_func_ereg']('^HTTP/[0-9\.]+ 200 ', $data) &&
+ !$GLOBALS['XML_RPC_func_ereg']('^HTTP/[0-9\.]+ 10[0-9]([A-Z ]+)?[\r\n]+HTTP/[0-9\.]+ 200', $data))
+ {
+ $errstr = substr($data, 0, strpos($data, "\n") - 1);
+ error_log('HTTP error, got response: ' . $errstr);
+ $r = new XML_RPC_Response(0, $XML_RPC_err['http_error'],
+ $XML_RPC_str['http_error'] . ' (' .
+ $errstr . ')');
+ xml_parser_free($parser_resource);
+ return $r;
+ }
+
+ // gotta get rid of headers here
+ if (!$hdrfnd && ($brpos = strpos($data,"\r\n\r\n"))) {
+ $XML_RPC_xh[$parser]['ha'] = substr($data, 0, $brpos);
+ $data = substr($data, $brpos + 4);
+ $hdrfnd = 1;
+ }
+
+ /*
+ * be tolerant of junk after methodResponse
+ * (e.g. javascript automatically inserted by free hosts)
+ * thanks to Luca Mariano <luca.mariano@email.it>
+ */
+ $data = substr($data, 0, strpos($data, "</methodResponse>") + 17);
+ $this->response_payload = $data;
+
+ if (!xml_parse($parser_resource, $data, sizeof($data))) {
+ // thanks to Peter Kocks <peter.kocks@baygate.com>
+ if (xml_get_current_line_number($parser_resource) == 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_resource)),
+ xml_get_current_line_number($parser_resource));
+ }
+ error_log($errstr);
+ $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
+ $XML_RPC_str['invalid_return']);
+ xml_parser_free($parser_resource);
+ return $r;
+ }
+
+ xml_parser_free($parser_resource);
+
+ if ($this->debug) {
+ print "\n<pre>---PARSED---\n";
+ var_dump($XML_RPC_xh[$parser]['value']);
+ print "---END---</pre>\n";
+ }
+
+ if ($XML_RPC_xh[$parser]['isf'] > 1) {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
+ $XML_RPC_str['invalid_return'].' '.$XML_RPC_xh[$parser]['isf_reason']);
+ } elseif (!is_object($XML_RPC_xh[$parser]['value'])) {
+ // then something odd has happened
+ // and it's time to generate a client side error
+ // indicating something odd went on
+ $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
+ $XML_RPC_str['invalid_return']);
+ } else {
+ $v = $XML_RPC_xh[$parser]['value'];
+ if ($XML_RPC_xh[$parser]['isf']) {
+ $f = $v->structmem('faultCode');
+ $fs = $v->structmem('faultString');
+ $r = new XML_RPC_Response($v, $f->scalarval(),
+ $fs->scalarval());
+ } else {
+ $r = new XML_RPC_Response($v);
+ }
+ }
+ $r->hdrs = split("\r?\n", $XML_RPC_xh[$parser]['ha'][1]);
+ return $r;
+ }
+}
+
+/**
+ * The methods and properties that represent data in XML RPC format
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version Release: 1.5.2
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Value extends XML_RPC_Base
+{
+ var $me = array();
+ var $mytype = 0;
+
+ /**
+ * @return void
+ */
+ function XML_RPC_Value($val = -1, $type = '')
+ {
+ $this->me = array();
+ $this->mytype = 0;
+ if ($val != -1 || $type != '') {
+ if ($type == '') {
+ $type = 'string';
+ }
+ if (!array_key_exists($type, $GLOBALS['XML_RPC_Types'])) {
+ // XXX
+ // need some way to report this error
+ } elseif ($GLOBALS['XML_RPC_Types'][$type] == 1) {
+ $this->addScalar($val, $type);
+ } elseif ($GLOBALS['XML_RPC_Types'][$type] == 2) {
+ $this->addArray($val);
+ } elseif ($GLOBALS['XML_RPC_Types'][$type] == 3) {
+ $this->addStruct($val);
+ }
+ }
+ }
+
+ /**
+ * @return int returns 1 if successful or 0 if there are problems
+ */
+ function addScalar($val, $type = 'string')
+ {
+ if ($this->mytype == 1) {
+ $this->raiseError('Scalar can have only one value',
+ XML_RPC_ERROR_INVALID_TYPE);
+ return 0;
+ }
+ $typeof = $GLOBALS['XML_RPC_Types'][$type];
+ if ($typeof != 1) {
+ $this->raiseError("Not a scalar type (${typeof})",
+ XML_RPC_ERROR_INVALID_TYPE);
+ return 0;
+ }
+
+ if ($type == $GLOBALS['XML_RPC_Boolean']) {
+ 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 XML_RPC_Value($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;
+ }
+
+ /**
+ * @return int returns 1 if successful or 0 if there are problems
+ */
+ function addArray($vals)
+ {
+ if ($this->mytype != 0) {
+ $this->raiseError(
+ 'Already initialized as a [' . $this->kindOf() . ']',
+ XML_RPC_ERROR_ALREADY_INITIALIZED);
+ return 0;
+ }
+ $this->mytype = $GLOBALS['XML_RPC_Types']['array'];
+ $this->me['array'] = $vals;
+ return 1;
+ }
+
+ /**
+ * @return int returns 1 if successful or 0 if there are problems
+ */
+ function addStruct($vals)
+ {
+ if ($this->mytype != 0) {
+ $this->raiseError(
+ 'Already initialized as a [' . $this->kindOf() . ']',
+ XML_RPC_ERROR_ALREADY_INITIALIZED);
+ return 0;
+ }
+ $this->mytype = $GLOBALS['XML_RPC_Types']['struct'];
+ $this->me['struct'] = $vals;
+ return 1;
+ }
+
+ /**
+ * @return void
+ */
+ function dump($ar)
+ {
+ reset($ar);
+ foreach ($ar as $key => $val) {
+ echo "$key => $val<br />";
+ if ($key == 'array') {
+ foreach ($val as $key2 => $val2) {
+ echo "-- $key2 => $val2<br />";
+ }
+ }
+ }
+ }
+
+ /**
+ * @return string the data type of the current value
+ */
+ function kindOf()
+ {
+ switch ($this->mytype) {
+ case 3:
+ return 'struct';
+
+ case 2:
+ return 'array';
+
+ case 1:
+ return 'scalar';
+
+ default:
+ return 'undef';
+ }
+ }
+
+ /**
+ * @return string the data in XML format
+ */
+ function serializedata($typ, $val)
+ {
+ $rs = '';
+ if (!array_key_exists($typ, $GLOBALS['XML_RPC_Types'])) {
+ // XXX
+ // need some way to report this error
+ return;
+ }
+ switch ($GLOBALS['XML_RPC_Types'][$typ]) {
+ case 3:
+ // struct
+ $rs .= "<struct>\n";
+ reset($val);
+ foreach ($val as $key2 => $val2) {
+ $rs .= "<member><name>${key2}</name>\n";
+ $rs .= $this->serializeval($val2);
+ $rs .= "</member>\n";
+ }
+ $rs .= '</struct>';
+ break;
+
+ case 2:
+ // array
+ $rs .= "<array>\n<data>\n";
+ for ($i = 0; $i < sizeof($val); $i++) {
+ $rs .= $this->serializeval($val[$i]);
+ }
+ $rs .= "</data>\n</array>";
+ break;
+
+ case 1:
+ switch ($typ) {
+ case $GLOBALS['XML_RPC_Base64']:
+ $rs .= "<${typ}>" . base64_encode($val) . "</${typ}>";
+ break;
+ case $GLOBALS['XML_RPC_Boolean']:
+ $rs .= "<${typ}>" . ($val ? '1' : '0') . "</${typ}>";
+ break;
+ case $GLOBALS['XML_RPC_String']:
+ $rs .= "<${typ}>" . htmlspecialchars($val). "</${typ}>";
+ break;
+ default:
+ $rs .= "<${typ}>${val}</${typ}>";
+ }
+ }
+ return $rs;
+ }
+
+ /**
+ * @return string the data in XML format
+ */
+ function serialize()
+ {
+ return $this->serializeval($this);
+ }
+
+ /**
+ * @return string the data in XML format
+ */
+ function serializeval($o)
+ {
+ if (!is_object($o) || empty($o->me) || !is_array($o->me)) {
+ return '';
+ }
+ $ar = $o->me;
+ reset($ar);
+ list($typ, $val) = each($ar);
+ return '<value>' . $this->serializedata($typ, $val) . "</value>\n";
+ }
+
+ /**
+ * @return mixed the contents of the element requested
+ */
+ function structmem($m)
+ {
+ return $this->me['struct'][$m];
+ }
+
+ /**
+ * @return void
+ */
+ function structreset()
+ {
+ reset($this->me['struct']);
+ }
+
+ /**
+ * @return the key/value pair of the struct's current element
+ */
+ function structeach()
+ {
+ return each($this->me['struct']);
+ }
+
+ /**
+ * @return mixed the current value
+ */
+ function getval()
+ {
+ // UNSTABLE
+
+ reset($this->me);
+ $b = current($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)) {
+ foreach ($b as $id => $cont) {
+ $b[$id] = $cont->scalarval();
+ }
+ }
+
+ // add support for structures directly encoding php objects
+ if (is_object($b)) {
+ $t = get_object_vars($b);
+ foreach ($t as $id => $cont) {
+ $t[$id] = $cont->scalarval();
+ }
+ foreach ($t as $id => $cont) {
+ $b->$id = $cont;
+ }
+ }
+
+ // end contrib
+ return $b;
+ }
+
+ /**
+ * @return mixed the current element's scalar value. If the value is
+ * not scalar, FALSE is returned.
+ */
+ function scalarval()
+ {
+ reset($this->me);
+ $v = current($this->me);
+ if (!is_scalar($v)) {
+ $v = false;
+ }
+ return $v;
+ }
+
+ /**
+ * @return string
+ */
+ function scalartyp()
+ {
+ reset($this->me);
+ $a = key($this->me);
+ if ($a == $GLOBALS['XML_RPC_I4']) {
+ $a = $GLOBALS['XML_RPC_Int'];
+ }
+ return $a;
+ }
+
+ /**
+ * @return mixed the struct's current element
+ */
+ function arraymem($m)
+ {
+ return $this->me['array'][$m];
+ }
+
+ /**
+ * @return int the number of elements in the array
+ */
+ function arraysize()
+ {
+ reset($this->me);
+ list($a, $b) = each($this->me);
+ return sizeof($b);
+ }
+
+ /**
+ * Determines if the item submitted is an XML_RPC_Value object
+ *
+ * @param mixed $val the variable to be evaluated
+ *
+ * @return bool TRUE if the item is an XML_RPC_Value object
+ *
+ * @static
+ * @since Method available since Release 1.3.0
+ */
+ function isValue($val)
+ {
+ return (strtolower(get_class($val)) == 'xml_rpc_value');
+ }
+}
+
+/**
+ * Return an ISO8601 encoded string
+ *
+ * While timezones ought to be supported, 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."
+ *
+ * This routine always assumes localtime unless $utc is set to 1, in which
+ * case UTC is assumed and an adjustment for locale is made when encoding.
+ *
+ * @return string the formatted date
+ */
+function XML_RPC_iso8601_encode($timet, $utc = 0)
+{
+ 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;
+}
+
+/**
+ * Convert a datetime string into a Unix timestamp
+ *
+ * While timezones ought to be supported, 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."
+ *
+ * This routine always assumes localtime unless $utc is set to 1, in which
+ * case UTC is assumed and an adjustment for locale is made when encoding.
+ *
+ * @return int the unix timestamp of the date submitted
+ */
+function XML_RPC_iso8601_decode($idate, $utc = 0)
+{
+ $t = 0;
+ if ($GLOBALS['XML_RPC_func_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;
+}
+
+/**
+ * Converts an XML_RPC_Value object into native PHP types
+ *
+ * @param object $XML_RPC_val the XML_RPC_Value object to decode
+ *
+ * @return mixed the PHP values
+ */
+function XML_RPC_decode($XML_RPC_val)
+{
+ $kind = $XML_RPC_val->kindOf();
+
+ if ($kind == 'scalar') {
+ return $XML_RPC_val->scalarval();
+
+ } elseif ($kind == 'array') {
+ $size = $XML_RPC_val->arraysize();
+ $arr = array();
+ for ($i = 0; $i < $size; $i++) {
+ $arr[] = XML_RPC_decode($XML_RPC_val->arraymem($i));
+ }
+ return $arr;
+
+ } elseif ($kind == 'struct') {
+ $XML_RPC_val->structreset();
+ $arr = array();
+ while (list($key, $value) = $XML_RPC_val->structeach()) {
+ $arr[$key] = XML_RPC_decode($value);
+ }
+ return $arr;
+ }
+}
+
+/**
+ * Converts native PHP types into an XML_RPC_Value object
+ *
+ * @param mixed $php_val the PHP value or variable you want encoded
+ *
+ * @return object the XML_RPC_Value object
+ */
+function XML_RPC_encode($php_val)
+{
+ $type = gettype($php_val);
+ $XML_RPC_val = new XML_RPC_Value;
+
+ switch ($type) {
+ case 'array':
+ if (empty($php_val)) {
+ $XML_RPC_val->addArray($php_val);
+ break;
+ }
+ $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1));
+ if (empty($tmp)) {
+ $arr = array();
+ foreach ($php_val as $k => $v) {
+ $arr[$k] = XML_RPC_encode($v);
+ }
+ $XML_RPC_val->addArray($arr);
+ break;
+ }
+ // fall though if it's not an enumerated array
+
+ case 'object':
+ $arr = array();
+ foreach ($php_val as $k => $v) {
+ $arr[$k] = XML_RPC_encode($v);
+ }
+ $XML_RPC_val->addStruct($arr);
+ break;
+
+ case 'integer':
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Int']);
+ break;
+
+ case 'double':
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Double']);
+ break;
+
+ case 'string':
+ case 'NULL':
+ if ($GLOBALS['XML_RPC_func_ereg']('^[0-9]{8}\T{1}[0-9]{2}\:[0-9]{2}\:[0-9]{2}$', $php_val)) {
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_DateTime']);
+ } elseif ($GLOBALS['XML_RPC_auto_base64']
+ && $GLOBALS['XML_RPC_func_ereg']("[^ -~\t\r\n]", $php_val))
+ {
+ // Characters other than alpha-numeric, punctuation, SP, TAB,
+ // LF and CR break the XML parser, encode value via Base 64.
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Base64']);
+ } else {
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_String']);
+ }
+ break;
+
+ case 'boolean':
+ // Add support for encoding/decoding of booleans, since they
+ // are supported in PHP
+ // by <G_Giunta_2001-02-29>
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Boolean']);
+ break;
+
+ case 'unknown type':
+ default:
+ $XML_RPC_val = false;
+ }
+ return $XML_RPC_val;
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+
+?>
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/Server.php
^
|
@@ -0,0 +1,685 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Server commands for our PHP implementation of the XML-RPC protocol
+ *
+ * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
+ * It has support for HTTP transport, proxies and authentication.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: License is granted to use or modify this software
+ * ("XML-RPC for PHP") for commercial or non-commercial use provided the
+ * copyright of the author is preserved in any distributed or derivative work.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESSED 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 AUTHOR 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.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version CVS: $Id: Server.php 222479 2006-10-28 16:42:34Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ */
+
+
+/**
+ * Pull in the XML_RPC class
+ */
+require_once 'XML/RPC.php';
+
+
+/**
+ * signature for system.listMethods: return = array,
+ * parameters = a string or nothing
+ * @global array $GLOBALS['XML_RPC_Server_listMethods_sig']
+ */
+$GLOBALS['XML_RPC_Server_listMethods_sig'] = array(
+ array($GLOBALS['XML_RPC_Array'],
+ $GLOBALS['XML_RPC_String']
+ ),
+ array($GLOBALS['XML_RPC_Array'])
+);
+
+/**
+ * docstring for system.listMethods
+ * @global string $GLOBALS['XML_RPC_Server_listMethods_doc']
+ */
+$GLOBALS['XML_RPC_Server_listMethods_doc'] = 'This method lists all the'
+ . ' methods that the XML-RPC server knows how to dispatch';
+
+/**
+ * signature for system.methodSignature: return = array,
+ * parameters = string
+ * @global array $GLOBALS['XML_RPC_Server_methodSignature_sig']
+ */
+$GLOBALS['XML_RPC_Server_methodSignature_sig'] = array(
+ array($GLOBALS['XML_RPC_Array'],
+ $GLOBALS['XML_RPC_String']
+ )
+);
+
+/**
+ * docstring for system.methodSignature
+ * @global string $GLOBALS['XML_RPC_Server_methodSignature_doc']
+ */
+$GLOBALS['XML_RPC_Server_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)';
+
+/**
+ * signature for system.methodHelp: return = string,
+ * parameters = string
+ * @global array $GLOBALS['XML_RPC_Server_methodHelp_sig']
+ */
+$GLOBALS['XML_RPC_Server_methodHelp_sig'] = array(
+ array($GLOBALS['XML_RPC_String'],
+ $GLOBALS['XML_RPC_String']
+ )
+);
+
+/**
+ * docstring for methodHelp
+ * @global string $GLOBALS['XML_RPC_Server_methodHelp_doc']
+ */
+$GLOBALS['XML_RPC_Server_methodHelp_doc'] = 'Returns help text if defined'
+ . ' for the method passed, otherwise returns an empty string';
+
+/**
+ * dispatch map for the automatically declared XML-RPC methods.
+ * @global array $GLOBALS['XML_RPC_Server_dmap']
+ */
+$GLOBALS['XML_RPC_Server_dmap'] = array(
+ 'system.listMethods' => array(
+ 'function' => 'XML_RPC_Server_listMethods',
+ 'signature' => $GLOBALS['XML_RPC_Server_listMethods_sig'],
+ 'docstring' => $GLOBALS['XML_RPC_Server_listMethods_doc']
+ ),
+ 'system.methodHelp' => array(
+ 'function' => 'XML_RPC_Server_methodHelp',
+ 'signature' => $GLOBALS['XML_RPC_Server_methodHelp_sig'],
+ 'docstring' => $GLOBALS['XML_RPC_Server_methodHelp_doc']
+ ),
+ 'system.methodSignature' => array(
+ 'function' => 'XML_RPC_Server_methodSignature',
+ 'signature' => $GLOBALS['XML_RPC_Server_methodSignature_sig'],
+ 'docstring' => $GLOBALS['XML_RPC_Server_methodSignature_doc']
+ )
+);
+
+/**
+ * @global string $GLOBALS['XML_RPC_Server_debuginfo']
+ */
+$GLOBALS['XML_RPC_Server_debuginfo'] = '';
+
+
+/**
+ * Lists all the methods that the XML-RPC server knows how to dispatch
+ *
+ * @return object a new XML_RPC_Response object
+ */
+function XML_RPC_Server_listMethods($server, $m)
+{
+ global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
+
+ $v = new XML_RPC_Value();
+ $outAr = array();
+ foreach ($server->dmap as $key => $val) {
+ $outAr[] = new XML_RPC_Value($key, 'string');
+ }
+ foreach ($XML_RPC_Server_dmap as $key => $val) {
+ $outAr[] = new XML_RPC_Value($key, 'string');
+ }
+ $v->addArray($outAr);
+ return new XML_RPC_Response($v);
+}
+
+/**
+ * Returns an array of known signatures (an array of arrays)
+ * for the given method
+ *
+ * If no signatures are known, returns a none-array
+ * (test for type != array to detect missing signature)
+ *
+ * @return object a new XML_RPC_Response object
+ */
+function XML_RPC_Server_methodSignature($server, $m)
+{
+ global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
+
+ $methName = $m->getParam(0);
+ $methName = $methName->scalarval();
+ if (strpos($methName, 'system.') === 0) {
+ $dmap = $XML_RPC_Server_dmap;
+ $sysCall = 1;
+ } else {
+ $dmap = $server->dmap;
+ $sysCall = 0;
+ }
+ // print "<!-- ${methName} -->\n";
+ if (isset($dmap[$methName])) {
+ if ($dmap[$methName]['signature']) {
+ $sigs = array();
+ $thesigs = $dmap[$methName]['signature'];
+ for ($i = 0; $i < sizeof($thesigs); $i++) {
+ $cursig = array();
+ $inSig = $thesigs[$i];
+ for ($j = 0; $j < sizeof($inSig); $j++) {
+ $cursig[] = new XML_RPC_Value($inSig[$j], 'string');
+ }
+ $sigs[] = new XML_RPC_Value($cursig, 'array');
+ }
+ $r = new XML_RPC_Response(new XML_RPC_Value($sigs, 'array'));
+ } else {
+ $r = new XML_RPC_Response(new XML_RPC_Value('undef', 'string'));
+ }
+ } else {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
+ $XML_RPC_str['introspect_unknown']);
+ }
+ return $r;
+}
+
+/**
+ * Returns help text if defined for the method passed, otherwise returns
+ * an empty string
+ *
+ * @return object a new XML_RPC_Response object
+ */
+function XML_RPC_Server_methodHelp($server, $m)
+{
+ global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
+
+ $methName = $m->getParam(0);
+ $methName = $methName->scalarval();
+ if (strpos($methName, 'system.') === 0) {
+ $dmap = $XML_RPC_Server_dmap;
+ $sysCall = 1;
+ } else {
+ $dmap = $server->dmap;
+ $sysCall = 0;
+ }
+
+ if (isset($dmap[$methName])) {
+ if ($dmap[$methName]['docstring']) {
+ $r = new XML_RPC_Response(new XML_RPC_Value($dmap[$methName]['docstring']),
+ 'string');
+ } else {
+ $r = new XML_RPC_Response(new XML_RPC_Value('', 'string'));
+ }
+ } else {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
+ $XML_RPC_str['introspect_unknown']);
+ }
+ return $r;
+}
+
+/**
+ * @return void
+ */
+function XML_RPC_Server_debugmsg($m)
+{
+ global $XML_RPC_Server_debuginfo;
+ $XML_RPC_Server_debuginfo = $XML_RPC_Server_debuginfo . $m . "\n";
+}
+
+
+/**
+ * A server for receiving and replying to XML RPC requests
+ *
+ * <code>
+ * $server = new XML_RPC_Server(
+ * array(
+ * 'isan8' =>
+ * array(
+ * 'function' => 'is_8',
+ * 'signature' =>
+ * array(
+ * array('boolean', 'int'),
+ * array('boolean', 'int', 'boolean'),
+ * array('boolean', 'string'),
+ * array('boolean', 'string', 'boolean'),
+ * ),
+ * 'docstring' => 'Is the value an 8?'
+ * ),
+ * ),
+ * 1,
+ * 0
+ * );
+ * </code>
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2006 The PHP Group
+ * @version Release: 1.5.2
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Server
+{
+ /**
+ * Should the payload's content be passed through mb_convert_encoding()?
+ *
+ * @see XML_RPC_Server::setConvertPayloadEncoding()
+ * @since Property available since Release 1.5.1
+ * @var boolean
+ */
+ var $convert_payload_encoding = false;
+
+ /**
+ * The dispatch map, listing the methods this server provides.
+ * @var array
+ */
+ var $dmap = array();
+
+ /**
+ * The present response's encoding
+ * @var string
+ * @see XML_RPC_Message::getEncoding()
+ */
+ var $encoding = '';
+
+ /**
+ * Debug mode (0 = off, 1 = on)
+ * @var integer
+ */
+ var $debug = 0;
+
+ /**
+ * The response's HTTP headers
+ * @var string
+ */
+ var $server_headers = '';
+
+ /**
+ * The response's XML payload
+ * @var string
+ */
+ var $server_payload = '';
+
+
+ /**
+ * Constructor for the XML_RPC_Server class
+ *
+ * @param array $dispMap the dispatch map. An associative array
+ * explaining each function. The keys of the main
+ * array are the procedure names used by the
+ * clients. The value is another associative array
+ * that contains up to three elements:
+ * + The 'function' element's value is the name
+ * of the function or method that gets called.
+ * To define a class' method: 'class::method'.
+ * + The 'signature' element (optional) is an
+ * array describing the return values and
+ * parameters
+ * + The 'docstring' element (optional) is a
+ * string describing what the method does
+ * @param int $serviceNow should the HTTP response be sent now?
+ * (1 = yes, 0 = no)
+ * @param int $debug should debug output be displayed?
+ * (1 = yes, 0 = no)
+ *
+ * @return void
+ */
+ function XML_RPC_Server($dispMap, $serviceNow = 1, $debug = 0)
+ {
+ global $HTTP_RAW_POST_DATA;
+
+ if ($debug) {
+ $this->debug = 1;
+ } else {
+ $this->debug = 0;
+ }
+
+ $this->dmap = $dispMap;
+
+ if ($serviceNow) {
+ $this->service();
+ } else {
+ $this->createServerPayload();
+ $this->createServerHeaders();
+ }
+ }
+
+ /**
+ * @return string the debug information if debug debug mode is on
+ */
+ function serializeDebug()
+ {
+ global $XML_RPC_Server_debuginfo, $HTTP_RAW_POST_DATA;
+
+ if ($this->debug) {
+ XML_RPC_Server_debugmsg('vvv POST DATA RECEIVED BY SERVER vvv' . "\n"
+ . $HTTP_RAW_POST_DATA
+ . "\n" . '^^^ END POST DATA ^^^');
+ }
+
+ if ($XML_RPC_Server_debuginfo != '') {
+ return "<!-- PEAR XML_RPC SERVER DEBUG INFO:\n\n"
+ . $GLOBALS['XML_RPC_func_ereg_replace']('--', '- - ', $XML_RPC_Server_debuginfo)
+ . "-->\n";
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Sets whether the payload's content gets passed through
+ * mb_convert_encoding()
+ *
+ * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ *
+ * @see XML_RPC_Message::getEncoding()
+ * @since Method available since Release 1.5.1
+ */
+ function setConvertPayloadEncoding($in)
+ {
+ if ($in && !function_exists('mb_convert_encoding')) {
+ return $this->raiseError('mb_convert_encoding() is not available',
+ XML_RPC_ERROR_PROGRAMMING);
+ }
+ $this->convert_payload_encoding = $in;
+ }
+
+ /**
+ * Sends the response
+ *
+ * The encoding and content-type are determined by
+ * XML_RPC_Message::getEncoding()
+ *
+ * @return void
+ *
+ * @uses XML_RPC_Server::createServerPayload(),
+ * XML_RPC_Server::createServerHeaders()
+ */
+ function service()
+ {
+ if (!$this->server_payload) {
+ $this->createServerPayload();
+ }
+ if (!$this->server_headers) {
+ $this->createServerHeaders();
+ }
+
+ /*
+ * $server_headers needs to remain a string for compatibility with
+ * old scripts using this package, but PHP 4.4.2 no longer allows
+ * line breaks in header() calls. So, we split each header into
+ * an individual call. The initial replace handles the off chance
+ * that someone composed a single header with multiple lines, which
+ * the RFCs allow.
+ */
+ $this->server_headers = $GLOBALS['XML_RPC_func_ereg_replace']("[\r\n]+[ \t]+",
+ ' ', trim($this->server_headers));
+ $headers = $GLOBALS['XML_RPC_func_split']("[\r\n]+", $this->server_headers);
+ foreach ($headers as $header)
+ {
+ header($header);
+ }
+
+ print $this->server_payload;
+ }
+
+ /**
+ * Generates the payload and puts it in the $server_payload property
+ *
+ * If XML_RPC_Server::setConvertPayloadEncoding() was set to true,
+ * the payload gets passed through mb_convert_encoding()
+ * to ensure the payload matches the encoding set in the
+ * XML declaration. The encoding type can be manually set via
+ * XML_RPC_Message::setSendEncoding().
+ *
+ * @return void
+ *
+ * @uses XML_RPC_Server::parseRequest(), XML_RPC_Server::$encoding,
+ * XML_RPC_Response::serialize(), XML_RPC_Server::serializeDebug()
+ * @see XML_RPC_Server::setConvertPayloadEncoding()
+ */
+ function createServerPayload()
+ {
+ $r = $this->parseRequest();
+ $this->server_payload = '<?xml version="1.0" encoding="'
+ . $this->encoding . '"?>' . "\n"
+ . $this->serializeDebug()
+ . $r->serialize();
+ if ($this->convert_payload_encoding) {
+ $this->server_payload = mb_convert_encoding($this->server_payload,
+ $this->encoding);
+ }
+ }
+
+ /**
+ * Determines the HTTP headers and puts them in the $server_headers
+ * property
+ *
+ * @return boolean TRUE if okay, FALSE if $server_payload isn't set.
+ *
+ * @uses XML_RPC_Server::createServerPayload(),
+ * XML_RPC_Server::$server_headers
+ */
+ function createServerHeaders()
+ {
+ if (!$this->server_payload) {
+ return false;
+ }
+ $this->server_headers = 'Content-Length: '
+ . strlen($this->server_payload) . "\r\n"
+ . 'Content-Type: text/xml;'
+ . ' charset=' . $this->encoding;
+ return true;
+ }
+
+ /**
+ * @return array
+ */
+ function verifySignature($in, $sig)
+ {
+ for ($i = 0; $i < sizeof($sig); $i++) {
+ // check each possible signature in turn
+ $cursig = $sig[$i];
+ if (sizeof($cursig) == $in->getNumParams() + 1) {
+ $itsOK = 1;
+ for ($n = 0; $n < $in->getNumParams(); $n++) {
+ $p = $in->getParam($n);
+ // print "<!-- $p -->\n";
+ if ($p->kindOf() == 'scalar') {
+ $pt = $p->scalartyp();
+ } else {
+ $pt = $p->kindOf();
+ }
+ // $n+1 as first type of sig is return type
+ if ($pt != $cursig[$n+1]) {
+ $itsOK = 0;
+ $pno = $n+1;
+ $wanted = $cursig[$n+1];
+ $got = $pt;
+ break;
+ }
+ }
+ if ($itsOK) {
+ return array(1);
+ }
+ }
+ }
+ if (isset($wanted)) {
+ return array(0, "Wanted ${wanted}, got ${got} at param ${pno}");
+ } else {
+ $allowed = array();
+ foreach ($sig as $val) {
+ end($val);
+ $allowed[] = key($val);
+ }
+ $allowed = array_unique($allowed);
+ $last = count($allowed) - 1;
+ if ($last > 0) {
+ $allowed[$last] = 'or ' . $allowed[$last];
+ }
+ return array(0,
+ 'Signature permits ' . implode(', ', $allowed)
+ . ' parameters but the request had '
+ . $in->getNumParams());
+ }
+ }
+
+ /**
+ * @return object a new XML_RPC_Response object
+ *
+ * @uses XML_RPC_Message::getEncoding(), XML_RPC_Server::$encoding
+ */
+ function parseRequest($data = '')
+ {
+ global $XML_RPC_xh, $HTTP_RAW_POST_DATA,
+ $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml,
+ $XML_RPC_defencoding, $XML_RPC_Server_dmap;
+
+ if ($data == '') {
+ $data = $HTTP_RAW_POST_DATA;
+ }
+
+ $this->encoding = XML_RPC_Message::getEncoding($data);
+ $parser_resource = xml_parser_create($this->encoding);
+ $parser = (int) $parser_resource;
+
+ $XML_RPC_xh[$parser] = array();
+ $XML_RPC_xh[$parser]['cm'] = 0;
+ $XML_RPC_xh[$parser]['isf'] = 0;
+ $XML_RPC_xh[$parser]['params'] = array();
+ $XML_RPC_xh[$parser]['method'] = '';
+ $XML_RPC_xh[$parser]['stack'] = array();
+ $XML_RPC_xh[$parser]['valuestack'] = array();
+
+ $plist = '';
+
+ // decompose incoming XML into request structure
+
+ xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
+ xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
+ xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
+ if (!xml_parse($parser_resource, $data, 1)) {
+ // return XML error as a faultCode
+ $r = new XML_RPC_Response(0,
+ $XML_RPC_errxml+xml_get_error_code($parser_resource),
+ sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($parser_resource)),
+ xml_get_current_line_number($parser_resource)));
+ xml_parser_free($parser_resource);
+ } elseif ($XML_RPC_xh[$parser]['isf']>1) {
+ $r = new XML_RPC_Response(0,
+ $XML_RPC_err['invalid_request'],
+ $XML_RPC_str['invalid_request']
+ . ': '
+ . $XML_RPC_xh[$parser]['isf_reason']);
+ xml_parser_free($parser_resource);
+ } else {
+ xml_parser_free($parser_resource);
+ $m = new XML_RPC_Message($XML_RPC_xh[$parser]['method']);
+ // now add parameters in
+ for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) {
+ // print '<!-- ' . $XML_RPC_xh[$parser]['params'][$i]. "-->\n";
+ $plist .= "$i - " . var_export($XML_RPC_xh[$parser]['params'][$i], true) . " \n";
+ $m->addParam($XML_RPC_xh[$parser]['params'][$i]);
+ }
+
+ if ($this->debug) {
+ XML_RPC_Server_debugmsg($plist);
+ }
+
+ // now to deal with the method
+ $methName = $XML_RPC_xh[$parser]['method'];
+ if (strpos($methName, 'system.') === 0) {
+ $dmap = $XML_RPC_Server_dmap;
+ $sysCall = 1;
+ } else {
+ $dmap = $this->dmap;
+ $sysCall = 0;
+ }
+
+ if (isset($dmap[$methName]['function'])
+ && is_string($dmap[$methName]['function'])
+ && strpos($dmap[$methName]['function'], '::') !== false)
+ {
+ $dmap[$methName]['function'] =
+ explode('::', $dmap[$methName]['function']);
+ }
+
+ if (isset($dmap[$methName]['function'])
+ && is_callable($dmap[$methName]['function']))
+ {
+ // dispatch if exists
+ if (isset($dmap[$methName]['signature'])) {
+ $sr = $this->verifySignature($m,
+ $dmap[$methName]['signature'] );
+ }
+ if (!isset($dmap[$methName]['signature']) || $sr[0]) {
+ // if no signature or correct signature
+ if ($sysCall) {
+ $r = call_user_func($dmap[$methName]['function'], $this, $m);
+ } else {
+ $r = call_user_func($dmap[$methName]['function'], $m);
+ }
+ if (!is_a($r, 'XML_RPC_Response')) {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['not_response_object'],
+ $XML_RPC_str['not_response_object']);
+ }
+ } else {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
+ $XML_RPC_str['incorrect_params']
+ . ': ' . $sr[1]);
+ }
+ } else {
+ // else prepare error response
+ $r = new XML_RPC_Response(0, $XML_RPC_err['unknown_method'],
+ $XML_RPC_str['unknown_method']);
+ }
+ }
+ return $r;
+ }
+
+ /**
+ * Echos back the input packet as a string value
+ *
+ * @return void
+ *
+ * Useful for debugging.
+ */
+ function echoInput()
+ {
+ global $HTTP_RAW_POST_DATA;
+
+ $r = new XML_RPC_Response(0);
+ $r->xv = new XML_RPC_Value("'Aha said I: '" . $HTTP_RAW_POST_DATA, 'string');
+ print $r->serialize();
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+
+?>
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/tests/allgot.inc
^
|
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ *
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt. If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 2005-2006 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version CVS: $Id: allgot.inc 214593 2006-06-11 00:25:17Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ * @since File available since Release 1.4.4
+ */
+
+ob_start();
+
+function returnAllGot($params) {
+ $out = '';
+ $count = count($params->params);
+ for ($i = 0; $i < $count; $i++) {
+ $param = $params->getParam($i);
+ if (!XML_RPC_Value::isValue($param)) {
+ $out .= "parameter $i was error: $param\n";
+ continue;
+ }
+ $got = XML_RPC_Decode($param);
+ $out .= "param $i: " . var_export($got, true) . "\n";
+ }
+ $val = new XML_RPC_Value($out, 'string');
+ return new XML_RPC_Response($val);
+}
+
+$server = new XML_RPC_Server(
+ array(
+ 'allgot' => array(
+ 'function' => 'returnAllGot',
+ ),
+ )
+);
+
+$got = ob_get_clean();
+
+if ($got == $expect) {
+ echo "passed\n";
+} else {
+ echo "FAILED\n";
+ echo "Expected:\n$expect\n";
+ echo "Got:\n$got\n";
+}
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/tests/empty-value-struct.php
^
|
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Tests how the XML_RPC server handles a parameter with an empty struct without
+ * any spaces in the XML after the empty value.
+ *
+ * If you are running this test from a CVS checkout, you must rename the working
+ * directory from "XML_RPC" to "XML".
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt. If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 2005-2006 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version CVS: $Id: empty-value-struct.php 287458 2009-08-18 15:56:40Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ * @since File available since Release 1.4.4
+ */
+
+/*
+ * If the package version number is found in the left hand
+ * portion of the if() expression below, that means this file has
+ * come from the PEAR installer. Therefore, let's test the
+ * installed version of XML_RPC which should be in the include path.
+ *
+ * If the version has not been substituted in the if() expression,
+ * this file has likely come from a CVS checkout or a .tar file.
+ * Therefore, we'll assume the tests should use the version of
+ * XML_RPC that has come from there as well.
+ */
+if ('1.5.2' != '@'.'package_version'.'@') {
+ /**
+ * Get the needed class from the PEAR installation
+ */
+ require_once 'XML/RPC/Server.php';
+} else {
+ if (substr(dirname(__FILE__), -9, -6) != 'XML') {
+ echo "The parent directory must be named 'XML'.\n";
+ exit;
+ }
+
+ ini_set('include_path', '../../'
+ . PATH_SEPARATOR . '.' . PATH_SEPARATOR
+ . ini_get('include_path')
+ );
+
+ /**
+ * Get the needed class from the parent directory
+ */
+ require_once '../Server.php';
+}
+
+$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
+<?xml version="1.0"?>
+<methodCall>
+ <methodName>allgot</methodName>
+ <params>
+ <param>
+ <value>
+ <struct>
+ <member>
+ <name>fld1</name><value></value></member></struct></value>
+ </param>
+ </params>
+ </methodCall>
+EOPOST;
+
+$expect = <<<EOEXP
+<?xml version="1.0" encoding="UTF-8"?>
+<methodResponse>
+<params>
+<param>
+<value><string>param 0: array (
+ 'fld1' => '',
+)
+</string></value>
+</param>
+</params>
+</methodResponse>
+EOEXP;
+
+include './allgot.inc';
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/tests/empty-value.php
^
|
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * Tests how the XML_RPC server handles parameters with empty values.
+ *
+ * If you are running this test from a CVS checkout, you must rename the working
+ * directory from "XML_RPC" to "XML".
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt. If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 2005-2006 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version CVS: $Id: empty-value.php 214593 2006-06-11 00:25:17Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ * @since File available since Release 1.4.4
+ */
+
+/*
+ * If the package version number is found in the left hand
+ * portion of the if() expression below, that means this file has
+ * come from the PEAR installer. Therefore, let's test the
+ * installed version of XML_RPC which should be in the include path.
+ *
+ * If the version has not been substituted in the if() expression,
+ * this file has likely come from a CVS checkout or a .tar file.
+ * Therefore, we'll assume the tests should use the version of
+ * XML_RPC that has come from there as well.
+ */
+if ('1.5.2' != '@'.'package_version'.'@') {
+ /**
+ * Get the needed class from the PEAR installation
+ */
+ require_once 'XML/RPC/Server.php';
+} else {
+ if (substr(dirname(__FILE__), -9, -6) != 'XML') {
+ echo "The parent directory must be named 'XML'.\n";
+ exit;
+ }
+
+ ini_set('include_path', '../../'
+ . PATH_SEPARATOR . '.' . PATH_SEPARATOR
+ . ini_get('include_path')
+ );
+
+ /**
+ * Get the needed class from the parent directory
+ */
+ require_once '../Server.php';
+}
+
+$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
+<?xml version="1.0"?>
+<methodCall>
+ <methodName>allgot</methodName>
+ <params>
+ <param><value><string></string></value></param>
+ <param><value>first</value></param>
+ <param><value> </value></param>
+ <param><value></value></param>
+ </params>
+ </methodCall>
+EOPOST;
+
+$expect = <<<EOEXP
+<?xml version="1.0" encoding="UTF-8"?>
+<methodResponse>
+<params>
+<param>
+<value><string>param 0: ''
+param 1: 'first'
+param 2: ' '
+param 3: ''
+</string></value>
+</param>
+</params>
+</methodResponse>
+EOEXP;
+
+include './allgot.inc';
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/tests/protoport.php
^
|
@@ -0,0 +1,437 @@
+<?php
+
+/**
+ * Tests that properties of XML_RPC_Client get properly set
+ *
+ * Any individual tests that fail will have their name, expected result
+ * and actual result printed out. So seeing no output when executing
+ * this file is a good thing.
+ *
+ * Can be run via CLI or a web server.
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt. If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 2005-2006 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version CVS: $Id: protoport.php 214593 2006-06-11 00:25:17Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ * @since File available since Release 1.2
+ */
+
+/*
+ * If the package version number is found in the left hand
+ * portion of the if() expression below, that means this file has
+ * come from the PEAR installer. Therefore, let's test the
+ * installed version of XML_RPC which should be in the include path.
+ *
+ * If the version has not been substituted in the if() expression,
+ * this file has likely come from a CVS checkout or a .tar file.
+ * Therefore, we'll assume the tests should use the version of
+ * XML_RPC that has come from there as well.
+ */
+if ('1.5.2' != '@'.'package_version'.'@') {
+ /**
+ * Get the needed class from the PEAR installation
+ */
+ require_once 'XML/RPC.php';
+} else {
+ /**
+ * Get the needed class from the parent directory
+ */
+ require_once '../RPC.php';
+}
+
+/**
+ * Compare the test result to the expected result
+ *
+ * If the test fails, echo out the results.
+ *
+ * @param array $expect the array of object properties you expect
+ * from the test
+ * @param object $actual the object results from the test
+ * @param string $test_name the name of the test
+ *
+ * @return void
+ */
+function compare($expect, $actual, $test_name) {
+ $actual = get_object_vars($actual);
+ if (count(array_diff($actual, $expect))) {
+ echo "$test_name failed.\nExpect: ";
+ print_r($expect);
+ echo "Actual: ";
+ print_r($actual);
+ echo "\n";
+ }
+}
+
+if (php_sapi_name() != 'cli') {
+ echo "<pre>\n";
+}
+
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 80,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'theserver');
+compare($x, $c, 'defaults');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 80,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'http://theserver');
+compare($x, $c, 'defaults with http');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 443,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'https://theserver');
+compare($x, $c, 'defaults with https');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 443,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'ssl://theserver');
+compare($x, $c, 'defaults with ssl');
+
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 65,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'theserver', 65);
+compare($x, $c, 'port 65');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 65,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'http://theserver', 65);
+compare($x, $c, 'port 65 with http');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 65,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'https://theserver', 65);
+compare($x, $c, 'port 65 with https');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 65,
+ 'proxy' => '',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65);
+compare($x, $c, 'port 65 with ssl');
+
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 80,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'theserver', 0,
+ 'theproxy');
+compare($x, $c, 'defaults proxy');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 80,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 8080,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'http://theserver', 0,
+ 'http://theproxy');
+compare($x, $c, 'defaults with http proxy');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 443,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'ssl://',
+ 'proxy_port' => 443,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'https://theserver', 0,
+ 'https://theproxy');
+compare($x, $c, 'defaults with https proxy');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 443,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'ssl://',
+ 'proxy_port' => 443,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'ssl://theserver', 0,
+ 'ssl://theproxy');
+compare($x, $c, 'defaults with ssl proxy');
+
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 65,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 6565,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'theserver', 65,
+ 'theproxy', 6565);
+compare($x, $c, 'port 65 proxy 6565');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 65,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'http://',
+ 'proxy_port' => 6565,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'http://theserver', 65,
+ 'http://theproxy', 6565);
+compare($x, $c, 'port 65 with http proxy 6565');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 65,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'ssl://',
+ 'proxy_port' => 6565,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'https://theserver', 65,
+ 'https://theproxy', 6565);
+compare($x, $c, 'port 65 with https proxy 6565');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 65,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'ssl://',
+ 'proxy_port' => 6565,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65,
+ 'ssl://theproxy', 6565);
+compare($x, $c, 'port 65 with ssl proxy 6565');
+
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'ssl://',
+ 'port' => 443,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'ssl://',
+ 'proxy_port' => 443,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'theserver', 443,
+ 'theproxy', 443);
+compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');
+
+$x = array(
+ 'path' => 'thepath',
+ 'server' => 'theserver',
+ 'protocol' => 'http://',
+ 'port' => 80,
+ 'proxy' => 'theproxy',
+ 'proxy_protocol' => 'ssl://',
+ 'proxy_port' => 6565,
+ 'proxy_user' => '',
+ 'proxy_pass' => '',
+ 'errno' => 0,
+ 'errstring' => '',
+ 'debug' => 0,
+ 'username' => '',
+ 'password' => '',
+);
+$c = new XML_RPC_Client('thepath', 'theserver', 0,
+ 'ssl://theproxy', 6565);
+compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');
+
+echo "\nIf no other output was produced, these tests passed.\n";
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/tests/test_Dump.php
^
|
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * If the package version number is found in the left hand
+ * portion of the if() expression below, that means this file has
+ * come from the PEAR installer. Therefore, let's test the
+ * installed version of XML_RPC which should be in the include path.
+ *
+ * If the version has not been substituted in the if() expression,
+ * this file has likely come from a CVS checkout or a .tar file.
+ * Therefore, we'll assume the tests should use the version of
+ * XML_RPC that has come from there as well.
+ */
+if ('1.5.2' != '@'.'package_version'.'@') {
+ /**
+ * Get the needed class from the PEAR installation
+ */
+ require_once 'XML/RPC/Dump.php';
+} else {
+ /**
+ * Get the needed class from the parent directory
+ */
+ require_once '../Dump.php';
+}
+
+$val = new XML_RPC_Value(array(
+ 'title' =>new XML_RPC_Value('das ist der Titel', 'string'),
+ 'startDate'=>new XML_RPC_Value(mktime(0,0,0,13,11,2004), 'dateTime.iso8601'),
+ 'endDate' =>new XML_RPC_Value(mktime(0,0,0,15,11,2004), 'dateTime.iso8601'),
+ 'error' =>'string',
+ 'arkey' => new XML_RPC_Value( array(
+ new XML_RPC_Value('simple string'),
+ new XML_RPC_Value(12345, 'int')
+ ), 'array')
+ )
+ ,'struct');
+
+XML_RPC_Dump($val);
+
+echo '==============' . "\r\n";
+$val2 = new XML_RPC_Value(44353, 'int');
+XML_RPC_Dump($val2);
+
+echo '==============' . "\r\n";
+$val3 = new XML_RPC_Value('this should be a string', 'string');
+XML_RPC_Dump($val3);
+
+echo '==============' . "\r\n";
+$val4 = new XML_RPC_Value(true, 'boolean');
+XML_RPC_Dump($val4);
|
[-]
[+]
|
Added |
XML_RPC-1.5.2.tgz/XML_RPC-1.5.2/tests/types.php
^
|
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * Tests how the XML_RPC server handles a bunch of different parameter
+ * data types.
+ *
+ * If you are running this test from a CVS checkout, you must rename the working
+ * directory from "XML_RPC" to "XML".
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to version 3.01 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_01.txt. If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 2005-2006 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version CVS: $Id: types.php 214593 2006-06-11 00:25:17Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ * @since File available since Release 1.4.4
+ */
+
+/*
+ * If the package version number is found in the left hand
+ * portion of the if() expression below, that means this file has
+ * come from the PEAR installer. Therefore, let's test the
+ * installed version of XML_RPC which should be in the include path.
+ *
+ * If the version has not been substituted in the if() expression,
+ * this file has likely come from a CVS checkout or a .tar file.
+ * Therefore, we'll assume the tests should use the version of
+ * XML_RPC that has come from there as well.
+ */
+if ('1.5.2' != '@'.'package_version'.'@') {
+ /**
+ * Get the needed class from the PEAR installation
+ */
+ require_once 'XML/RPC/Server.php';
+} else {
+ if (substr(dirname(__FILE__), -9, -6) != 'XML') {
+ echo "The parent directory must be named 'XML'.\n";
+ exit;
+ }
+
+ ini_set('include_path', '../../'
+ . PATH_SEPARATOR . '.' . PATH_SEPARATOR
+ . ini_get('include_path')
+ );
+
+ /**
+ * Get the needed class from the parent directory
+ */
+ require_once '../Server.php';
+}
+
+$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
+<?xml version="1.0"?>
+<methodCall>
+ <methodName>allgot</methodName>
+ <params>
+ <param><value>default to string</value></param>
+ <param><value><string>inside string</string></value></param>
+ <param><value><int>8</int></value></param>
+ <param><value><datetime.iso8601>20050809T01:33:44</datetime.iso8601></value></param>
+
+ <param>
+ <value>
+ <array>
+ <data>
+ <value>
+ <string>a</string>
+ </value>
+ <value>
+ <string>b</string>
+ </value>
+ </data>
+ </array>
+ </value>
+ </param>
+
+ <param>
+ <value>
+ <struct>
+ <member>
+ <name>a</name>
+ <value>
+ <string>ay</string>
+ </value>
+ </member>
+ <member>
+ <name>b</name>
+ <value>
+ <string>be</string>
+ </value>
+ </member>
+ </struct>
+ </value>
+ </param>
+
+ </params>
+ </methodCall>
+EOPOST;
+
+$expect = <<<EOEXP
+<?xml version="1.0" encoding="UTF-8"?>
+<methodResponse>
+<params>
+<param>
+<value><string>param 0: 'default to string'
+param 1: 'inside string'
+param 2: '8'
+param 3: '20050809T01:33:44'
+param 4: array (
+ 0 => 'a',
+ 1 => 'b',
+)
+param 5: array (
+ 'a' => 'ay',
+ 'b' => 'be',
+)
+</string></value>
+</param>
+</params>
+</methodResponse>
+EOEXP;
+
+include './allgot.inc';
|
[-]
[+]
|
Changed |
XML_RPC-1.5.2.tgz/package.xml
^
|
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE package SYSTEM "http://pear.php.net/dtd/package-1.0">
-<package version="1.0" packagerversion="1.4.9">
+<package version="1.0" packagerversion="1.7.2">
<name>XML_RPC</name>
<summary>PHP implementation of the XML-RPC protocol</summary>
<description>A PEAR-ified version of Useful Inc's XML-RPC for PHP.
@@ -22,12 +22,11 @@
</maintainer>
</maintainers>
<release>
- <version>1.5.1</version>
- <date>2006-10-28</date>
+ <version>1.5.2</version>
+ <date>2009-08-18</date>
<license>PHP License</license>
<state>stable</state>
- <notes>* Turn passing payload through mb_convert_encoding() off by default. Use new XML_RPC_Message::setConvertPayloadEncoding() and XML_RPC_Server::setConvertPayloadEncoding() to turn it on. Bug 8632.
-* Have XML_RPC_Value::scalarval() return FALSE if value is not a scalar. Bug 8251.
+ <notes>* Change license in empty-value-struct.php from PHP 3.0 to 3.01.
</notes>
<deps>
<dep type="php" rel="ge" version="4.2.0"/>
@@ -66,6 +65,14 @@
</release>
<changelog>
<release>
+ <version>1.5.1</version>
+ <date>2006-10-28</date>
+ <state>stable</state>
+ <notes>* Turn passing payload through mb_convert_encoding() off by default. Use new XML_RPC_Message::setConvertPayloadEncoding() and XML_RPC_Server::setConvertPayloadEncoding() to turn it on. Bug 8632.
+* Have XML_RPC_Value::scalarval() return FALSE if value is not a scalar. Bug 8251.
+ </notes>
+ </release>
+ <release>
<version>1.5.0</version>
<date>2006-07-11</date>
<state>stable</state>
|
[-]
[+]
|
Changed |
XML_RPC-1.5.2.tgz/package2.xml
^
|
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.4.9" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+<package packagerversion="1.7.2" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
<name>XML_RPC</name>
<channel>pear.php.net</channel>
<summary>PHP implementation of the XML-RPC protocol</summary>
@@ -18,10 +18,10 @@
<email>danielc@php.net</email>
<active>yes</active>
</lead>
- <date>2006-10-28</date>
- <time>13:06:09</time>
+ <date>2009-08-18</date>
+ <time>12:03:27</time>
<version>
- <release>1.5.1</release>
+ <release>1.5.2</release>
<api>1.5.0</api>
</version>
<stability>
@@ -29,36 +29,35 @@
<api>stable</api>
</stability>
<license uri="http://www.php.net/license/3_01.txt">PHP License</license>
- <notes>* Turn passing payload through mb_convert_encoding() off by default. Use new XML_RPC_Message::setConvertPayloadEncoding() and XML_RPC_Server::setConvertPayloadEncoding() to turn it on. Bug 8632.
-* Have XML_RPC_Value::scalarval() return FALSE if value is not a scalar. Bug 8251.</notes>
+ <notes>* Change license in empty-value-struct.php from PHP 3.0 to 3.01.</notes>
<contents>
<dir name="/">
- <file md5sum="12e82943a83395bfdc00505dfe1c4f16" name="tests/allgot.inc" role="test" />
- <file md5sum="4362050edd0f6eb280e93b43c836c711" name="tests/empty-value-struct.php" role="test">
+ <file md5sum="b979879ced3e9139075199c23f399b37" name="tests/allgot.inc" role="test" />
+ <file md5sum="ce9c893e0d983a4267ee3982a29e042f" name="tests/empty-value-struct.php" role="test">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file md5sum="2d37d500c19606e4ff92364df745e689" name="tests/empty-value.php" role="test">
+ <file md5sum="8dc0a7a8af113b33503a366b13bbc33b" name="tests/empty-value.php" role="test">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file md5sum="a0ab20aef0c7c3af4ed02b5a6b7ef7fc" name="tests/extra-lines.php" role="test">
+ <file md5sum="e01dbcc3faa2cfa65a3b90a5be2a1506" name="tests/extra-lines.php" role="test">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file md5sum="5b4852b96c0cd4f1e869effef8003e06" name="tests/protoport.php" role="test">
+ <file md5sum="5923b1ce20e8e3c39f65bfa354b145af" name="tests/protoport.php" role="test">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file md5sum="9e78b8f4a5cf3a68c6d1b94fb8e621d8" name="tests/test_Dump.php" role="test">
+ <file md5sum="a977c7cd64fe0d953453a896445509ee" name="tests/test_Dump.php" role="test">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file md5sum="1fdd79c28b047409b327063abd144dd0" name="tests/types.php" role="test">
+ <file md5sum="1c115eff01051b8eb33ec6317bc92229" name="tests/types.php" role="test">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file baseinstalldir="XML/RPC" md5sum="91b1ae15a18db161b6ebd52a9a4ed6ae" name="Dump.php" role="php">
+ <file baseinstalldir="XML/RPC" md5sum="8bfb580715bc01594c0acf03ef2ca870" name="Dump.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file baseinstalldir="XML" md5sum="c7b9a2b4bff7e860ca3658775672ffa4" name="RPC.php" role="php">
+ <file baseinstalldir="XML" md5sum="63802e7825cd1d7b89703fad35fbe762" name="RPC.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
- <file baseinstalldir="XML/RPC" md5sum="46018f4943f7b9a67f4611d242821dab" name="Server.php" role="php">
+ <file baseinstalldir="XML/RPC" md5sum="aa1f6d7e0ececf5788a905a63071eafa" name="Server.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
</dir>
@@ -86,6 +85,20 @@
<changelog>
<release>
<version>
+ <release>1.5.1</release>
+ <api>1.5.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2006-10-28</date>
+ <license uri="http://www.php.net/license/3_01.txt">PHP License</license>
+ <notes>* Turn passing payload through mb_convert_encoding() off by default. Use new XML_RPC_Message::setConvertPayloadEncoding() and XML_RPC_Server::setConvertPayloadEncoding() to turn it on. Bug 8632.
+* Have XML_RPC_Value::scalarval() return FALSE if value is not a scalar. Bug 8251.</notes>
+ </release>
+ <release>
+ <version>
<release>1.5.0</release>
<api>1.5.0</api>
</version>
|
|
Added |
XML_Util-1.2.1.tgz
^
|
[-]
[+]
|
Changed |
install-pear.php
^
|
@@ -1,8 +1,13 @@
<?php
-/* $Id: install-pear.php,v 1.4 2008/05/18 06:45:15 remi Exp $ */
+/* $Id: install-pear.php,v 1.5 2009/05/30 08:19:19 remi Exp $ */
+
+error_reporting(1803);
+
+if (ini_get('date.timezone') === '' && function_exists('date_default_timezone_set')) {
+ date_default_timezone_set('UTC');
+}
-error_reporting(E_ALL);
$pear_dir = dirname(__FILE__);
ini_set('include_path', '');
if (function_exists('mb_internal_encoding')) {
@@ -38,8 +43,17 @@
if (ereg('package-(.*)\.xml$', $bn, $matches) ||
ereg('([A-Za-z0-9_:]+)-.*\.(tar|tgz)$', $bn, $matches)) {
$install_files[$matches[1]] = $arg;
+ } elseif ($arg == '-a') {
+ $cache_dir = $argv[$i+1];
+ $i++;
} elseif ($arg == '--force') {
$force = true;
+ } elseif ($arg == '-dp') {
+ $prefix = $argv[$i+1];
+ $i++;
+ } elseif ($arg == '-ds') {
+ $suffix = $argv[$i+1];
+ $i++;
} elseif ($arg == '-d') {
$with_dir = $argv[$i+1];
$i++;
@@ -47,11 +61,20 @@
$bin_dir = $argv[$i+1];
$i++;
} elseif ($arg == '-c') {
- $cfg_dir = $argv[$i+1];
- $i++;
+ $cfg_dir = $argv[$i+1];
+ $i++;
+ } elseif ($arg == '-w') {
+ $www_dir = $argv[$i+1];
+ $i++;
} elseif ($arg == '-p') {
$php_bin = $argv[$i+1];
$i++;
+ } elseif ($arg == '-o') {
+ $download_dir = $argv[$i+1];
+ $i++;
+ } elseif ($arg == '-t') {
+ $temp_dir = $argv[$i+1];
+ $i++;
} elseif ($arg == '--debug') {
$debug = 1;
} elseif ($arg == '--extremedebug') {
@@ -83,11 +106,31 @@
$config->set('bin_dir', $bin_dir, 'default');
}
+// Cache files
+if (!empty($cache_dir)) {
+ $config->set('cache_dir', $cache_dir, 'default');
+}
+
// Config files
if (!empty($cfg_dir)) {
$config->set('cfg_dir', $cfg_dir, 'default');
}
+// Web files
+if (!empty($www_dir)) {
+ $config->set('www_dir', $www_dir, 'default');
+}
+
+// Downloaded files
+if (!empty($download_dir)) {
+ $config->set('download_dir', $download_dir, 'default');
+}
+
+// Temporary files
+if (!empty($temp_dir)) {
+ $config->set('temp_dir', $temp_dir, 'default');
+}
+
// User supplied a dir prefix
if (!empty($with_dir)) {
$ds = DIRECTORY_SEPARATOR;
@@ -95,6 +138,12 @@
$config->set('doc_dir', $with_dir . $ds . 'doc', 'default');
$config->set('data_dir', $with_dir . $ds . 'data', 'default');
$config->set('test_dir', $with_dir . $ds . 'test', 'default');
+ if (empty($www_dir)) {
+ $config->set('www_dir', $with_dir . $ds . 'htdocs', 'default');
+ }
+ if (empty($cfg_dir)) {
+ $config->set('cfg_dir', $with_dir . $ds . 'cfg', 'default');
+ }
if (!is_writable($config->get('cache_dir'))) {
include_once 'System.php';
$cdir = System::mktemp(array('-d', 'pear'));
@@ -106,9 +155,32 @@
$config->set('cache_dir', $cdir);
}
}
+
+// PHP executable
if (!empty($php_bin)) {
$config->set('php_bin', $php_bin);
}
+
+// PHP prefix
+if (isset($prefix)) {
+ if ($prefix != 'a') {
+ if ($prefix[0] == 'a') {
+ $prefix = substr($prefix, 1);
+ }
+ $config->set('php_prefix', $prefix, 'system');
+ }
+}
+
+// PHP suffix
+if (isset($suffix)) {
+ if ($suffix != 'a') {
+ if ($suffix[0] == 'a') {
+ $suffix = substr($suffix, 1);
+ }
+ $config->set('php_suffix', $suffix, 'system');
+ }
+}
+
/* Print PEAR Conf (useful for debuging do NOT REMOVE) */
if ($debug) {
sort($keys);
|