2001-08-08 01:04:05 +02:00
< ? php
// by Edd Dumbill (C) 1999-2001
// <edd@usefulinc.com>
// xmlrpc.inc,v 1.18 2001/07/06 18:23:57 edmundd
2003-08-28 16:31:11 +02:00
// License is granted to use or modify this software ("XML-RPC for PHP")
2001-08-08 01:04:05 +02:00
// 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
2006-02-07 14:34:02 +01:00
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2001-08-08 01:04:05 +02:00
// 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.
2001-12-04 14:46:53 +01:00
/* $Id$ */
2001-08-08 01:04:05 +02:00
if ( ! function_exists ( 'xml_parser_create' ))
{
2003-08-28 16:31:11 +02:00
// Win 32 fix. From: "Leo West" <lwest@imaginet.fr>
2001-08-08 01:04:05 +02:00
if ( $WINDIR )
{
dl ( 'php3_xml.dll' );
}
else
{
dl ( 'xml.so' );
}
}
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'xmlrpc_valid_parents' ] = array (
'BOOLEAN' => array ( 'VALUE' ),
'I4' => array ( 'VALUE' ),
'INT' => array ( 'VALUE' ),
'STRING' => array ( 'VALUE' ),
'DOUBLE' => array ( 'VALUE' ),
'DATETIME.ISO8601' => array ( 'VALUE' ),
'BASE64' => array ( 'VALUE' ),
'ARRAY' => array ( 'VALUE' ),
'STRUCT' => array ( 'VALUE' ),
'PARAM' => array ( 'PARAMS' ),
'METHODNAME' => array ( 'METHODCALL' ),
'PARAMS' => array ( 'METHODCALL' , 'METHODRESPONSE' ),
'MEMBER' => array ( 'STRUCT' ),
'NAME' => array ( 'MEMBER' ),
'DATA' => array ( 'ARRAY' ),
'FAULT' => array ( 'METHODRESPONSE' ),
'VALUE' => array ( 'MEMBER' , 'DATA' , 'PARAM' , 'FAULT' ),
);
2001-08-09 04:54:56 +02:00
define ( 'xmlrpcI4' , 'i4' );
define ( 'xmlrpcInt' , 'int' );
define ( 'xmlrpcBoolean' , 'boolean' );
define ( 'xmlrpcDouble' , 'double' );
define ( 'xmlrpcString' , 'string' );
define ( 'xmlrpcDateTime' , 'dateTime.iso8601' );
define ( 'xmlrpcBase64' , 'base64' );
define ( 'xmlrpcArray' , 'array' );
define ( 'xmlrpcStruct' , 'struct' );
$GLOBALS [ 'xmlrpcTypes' ] = array (
xmlrpcI4 => 1 ,
xmlrpcInt => 1 ,
xmlrpcBoolean => 1 ,
xmlrpcString => 1 ,
xmlrpcDouble => 1 ,
xmlrpcDateTime => 1 ,
xmlrpcBase64 => 1 ,
xmlrpcArray => 2 ,
xmlrpcStruct => 3
2001-08-08 01:04:05 +02:00
);
2001-08-09 04:54:56 +02:00
$GLOBALS [ 'xmlEntities' ] = array (
2001-08-08 01:04:05 +02:00
'amp' => '&' ,
'quot' => '"' ,
'lt' => '<' ,
'gt' => '>' ,
'apos' => " ' "
);
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'xmlrpcerr' ][ 'unknown_method' ] = 1 ;
$GLOBALS [ 'xmlrpcstr' ][ 'unknown_method' ] = 'Unknown method' ;
$GLOBALS [ 'xmlrpcerr' ][ 'invalid_return' ] = 2 ;
$GLOBALS [ 'xmlrpcstr' ][ 'invalid_return' ] = 'Invalid return payload: enable debugging to examine incoming payload' ;
$GLOBALS [ 'xmlrpcerr' ][ 'incorrect_params' ] = 3 ;
$GLOBALS [ 'xmlrpcstr' ][ 'incorrect_params' ] = 'Incorrect parameters passed to method' ;
$GLOBALS [ 'xmlrpcerr' ][ 'introspect_unknown' ] = 4 ;
$GLOBALS [ 'xmlrpcstr' ][ 'introspect_unknown' ] = " Can't introspect: method unknown " ;
$GLOBALS [ 'xmlrpcerr' ][ 'http_error' ] = 5 ;
$GLOBALS [ 'xmlrpcstr' ][ 'http_error' ] = " Didn't receive 200 OK from remote server. " ;
$GLOBALS [ 'xmlrpcerr' ][ 'no_data' ] = 6 ;
$GLOBALS [ 'xmlrpcstr' ][ 'no_data' ] = 'No data received from server.' ;
$GLOBALS [ 'xmlrpcerr' ][ 'no_ssl' ] = 7 ;
$GLOBALS [ 'xmlrpcstr' ][ 'no_ssl' ] = 'No SSL support compiled in.' ;
$GLOBALS [ 'xmlrpcerr' ][ 'curl_fail' ] = 8 ;
$GLOBALS [ 'xmlrpcstr' ][ 'curl_fail' ] = 'CURL error' ;
$GLOBALS [ 'xmlrpcerr' ][ 'multicall_notstruct' ] = 9 ;
$GLOBALS [ 'xmlrpcstr' ][ 'multicall_notstruct' ] = 'system.multicall expected struct' ;
$GLOBALS [ 'xmlrpcerr' ][ 'multicall_nomethod' ] = 10 ;
$GLOBALS [ 'xmlrpcstr' ][ 'multicall_nomethod' ] = 'missing methodName' ;
$GLOBALS [ 'xmlrpcerr' ][ 'multicall_notstring' ] = 11 ;
$GLOBALS [ 'xmlrpcstr' ][ 'multicall_notstring' ] = 'methodName is not a string' ;
$GLOBALS [ 'xmlrpcerr' ][ 'multicall_recursion' ] = 12 ;
$GLOBALS [ 'xmlrpcstr' ][ 'multicall_recursion' ] = 'recursive system.multicall forbidden' ;
$GLOBALS [ 'xmlrpcerr' ][ 'multicall_noparams' ] = 13 ;
$GLOBALS [ 'xmlrpcstr' ][ 'multicall_noparams' ] = 'missing params' ;
$GLOBALS [ 'xmlrpcerr' ][ 'multicall_notarray' ] = 14 ;
$GLOBALS [ 'xmlrpcstr' ][ 'multicall_notarray' ] = 'params is not an array' ;
$GLOBALS [ 'xmlrpcerr' ][ 'invalid_request' ] = 15 ;
$GLOBALS [ 'xmlrpcstr' ][ 'invalid_request' ] = 'Invalid request payload' ;
$GLOBALS [ 'xmlrpcerr' ][ 'no_curl' ] = 16 ;
$GLOBALS [ 'xmlrpcstr' ][ 'no_curl' ] = 'No CURL support compiled in.' ;
$GLOBALS [ 'xmlrpcerr' ][ 'server_error' ] = 17 ;
$GLOBALS [ 'xmlrpcstr' ][ 'server_error' ] = 'Internal server error' ;
$GLOBALS [ 'xmlrpcerr' ][ 'no_access' ] = 18 ;
2001-12-28 19:41:33 +01:00
$GLOBALS [ 'xmlrpcstr' ][ 'no_access' ] = 'Access denied' ;
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'xmlrpcerr' ][ 'not_existent' ] = 19 ;
2004-03-07 10:55:43 +01:00
$GLOBALS [ 'xmlrpcstr' ][ 'not_existent' ] = 'Entry does not (longer) exist!' ;
2001-08-08 01:04:05 +02:00
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'xmlrpcerr' ][ 'cannot_decompress' ] = 103 ;
$GLOBALS [ 'xmlrpcstr' ][ 'cannot_decompress' ] = 'Received from server compressed HTTP and cannot decompress' ;
$GLOBALS [ 'xmlrpcerr' ][ 'decompress_fail' ] = 104 ;
$GLOBALS [ 'xmlrpcstr' ][ 'decompress_fail' ] = 'Received from server invalid compressed HTTP' ;
$GLOBALS [ 'xmlrpcerr' ][ 'dechunk_fail' ] = 105 ;
$GLOBALS [ 'xmlrpcstr' ][ 'dechunk_fail' ] = 'Received from server invalid chunked HTTP' ;
$GLOBALS [ 'xmlrpcerr' ][ 'server_cannot_decompress' ] = 106 ;
$GLOBALS [ 'xmlrpcstr' ][ 'server_cannot_decompress' ] = 'Received from client compressed HTTP request and cannot decompress' ;
$GLOBALS [ 'xmlrpcerr' ][ 'server_decompress_fail' ] = 107 ;
$GLOBALS [ 'xmlrpcstr' ][ 'server_decompress_fail' ] = 'Received from client invalid compressed HTTP request' ;
2001-08-09 04:54:56 +02:00
$GLOBALS [ 'xmlrpc_defencoding' ] = 'UTF-8' ;
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'xmlrpc_internalencoding' ] = 'ISO-8859-1' ;
2001-08-08 01:04:05 +02:00
2001-08-09 04:54:56 +02:00
$GLOBALS [ 'xmlrpcName' ] = 'XML-RPC for PHP' ;
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'xmlrpcVersion' ] = '2.0' ;
2001-08-08 01:04:05 +02:00
// let user errors start at 800
2006-02-07 14:34:02 +01:00
$GLOBALS [ 'xmlrpcerruser' ] = 800 ;
2001-08-08 01:04:05 +02:00
// let XML parse errors start at 100
2001-08-09 04:54:56 +02:00
$GLOBALS [ 'xmlrpcerrxml' ] = 100 ;
2001-08-08 01:04:05 +02:00
// formulate backslashes for escaping regexp
2001-08-09 04:54:56 +02:00
$GLOBALS [ 'xmlrpc_backslash' ] = chr ( 92 ) . chr ( 92 );
2001-08-08 01:04:05 +02:00
2001-11-29 23:07:28 +01:00
/*!
@ function xmlrpcfault
@ abstract Error reporting for XML - RPC
@ discussion Author : jengo < br >
Returns XML - RPC fault and stops this execution of the application . < br >
Syntax : void xmlrpcfault ( string ) < br >
Example1 : xmlrpcfault ( 'Session could not be verifed' ); < br >
@ param $string Error message to be returned .
*/
function xmlrpcfault ( $string )
{
$r = CreateObject ( 'phpgwapi.xmlrpcresp' ,
CreateObject ( 'phpgwapi.xmlrpcval' ),
$GLOBALS [ 'xmlrpcerr' ][ 'unknown_method' ],
$string
);
$payload = '<?xml version="1.0"?>' . " \n " . $r -> serialize ();
Header ( 'Content-type: text/xml' );
2007-09-29 11:17:42 +02:00
Header ( 'Content-length: ' . bytes ( $payload ));
2001-11-29 23:07:28 +01:00
print $payload ;
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'egw' ] -> common -> phpgw_exit ( False );
2001-11-29 23:07:28 +01:00
}
2001-08-08 01:04:05 +02:00
// used to store state during parsing
// quick explanation of components:
// ac - used to accumulate values
// isf - used to indicate a fault
2003-08-28 16:31:11 +02:00
// lv - used to indicate "looking for a value": implements
2001-08-08 01:04:05 +02:00
// the logic to allow values with no types to be strings
// params - used to store parameters in method calls
// method - used to store method name
2005-08-14 22:36:46 +02:00
// stack - array with genealogy of xml elements names:
// used to validate nesting of xmlrpc elements
$GLOBALS [ '_xh' ] = null ;
/**
* To help correct communication of non - ascii chars inside strings , regardless
* of the charset used when sending requests , parsing them , sending responses
* and parsing responses , convert all non - ascii chars present in the message
* into their equivalent 'charset entity' . Charset entities enumerated this way
* are independent of the charset encoding used to transmit them , and all XML
* parsers are bound to understand them .
2009-07-18 14:46:20 +02:00
*
2007-05-04 14:22:04 +02:00
* @ author Eugene Pivnev
2005-08-14 22:36:46 +02:00
*/
2006-06-15 13:38:21 +02:00
function xmlrpc_encode_entities ( $data )
2005-08-14 22:36:46 +02:00
{
2009-07-18 14:46:20 +02:00
return htmlspecialchars ( $data , ENT_QUOTES , $GLOBALS [ 'egw' ] -> translation -> system_charset ?
2007-05-18 18:10:14 +02:00
$GLOBALS [ 'egw' ] -> translation -> system_charset : 'latin1' );
}
if ( ! function_exists ( 'htmlspecialchars_decode' )) // php < 5.1
{
function htmlspecialchars_decode ( $text , $quote_style = ENT_COMPAT )
{
return strtr ( $text , array_flip ( get_html_translation_table ( HTML_SPECIALCHARS , $quote_style )));
}
2005-08-14 22:36:46 +02:00
}
2001-08-08 01:04:05 +02:00
function xmlrpc_entity_decode ( $string )
{
2007-05-18 18:10:14 +02:00
return htmlspecialchars_decode ( $data , ENT_QUOTES );
2001-08-08 01:04:05 +02:00
}
function xmlrpc_lookup_entity ( $ent )
{
2001-08-09 04:54:56 +02:00
if ( isset ( $GLOBALS [ 'xmlEntities' ][ strtolower ( $ent )]))
2001-08-08 01:04:05 +02:00
{
2001-08-09 04:54:56 +02:00
return $GLOBALS [ 'xmlEntities' ][ strtolower ( $ent )];
2001-08-08 01:04:05 +02:00
}
if ( ereg ( " ^#([0-9]+) $ " , $ent , $regs ))
{
return chr ( $regs [ 1 ]);
}
return '?' ;
}
function xmlrpc_se ( $parser , $name , $attrs )
{
2005-08-14 22:36:46 +02:00
// if invalid xmlrpc already detected, skip all processing
if ( $GLOBALS [ '_xh' ][ $parser ][ 'isf' ] < 2 )
{
// check for correct element nesting
// top level element can only be of 2 types
if ( count ( $GLOBALS [ '_xh' ][ $parser ][ 'stack' ]) == 0 )
{
if ( $name != 'METHODRESPONSE' && $name != 'METHODCALL' )
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
$GLOBALS [ '_xh' ][ $parser ][ 'isf' ] = 2 ;
$GLOBALS [ '_xh' ][ $parser ][ 'isf_reason' ] = 'missing top level xmlrpc element' ;
return ;
2001-08-08 01:04:05 +02:00
}
2005-08-14 22:36:46 +02:00
}
else
{
// not top level element: see if parent is OK
if ( ! in_array ( $GLOBALS [ '_xh' ][ $parser ][ 'stack' ][ 0 ], $GLOBALS [ 'xmlrpc_valid_parents' ][ $name ]))
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
$GLOBALS [ '_xh' ][ $parser ][ 'isf' ] = 2 ;
$GLOBALS [ '_xh' ][ $parser ][ 'isf_reason' ] = " xmlrpc element $name cannot be child of { $GLOBALS [ '_xh' ][ $parser ][ 'stack' ][ 0 ] } " ;
return ;
2001-08-08 01:04:05 +02:00
}
2005-08-14 22:36:46 +02:00
}
2001-08-08 01:04:05 +02:00
2005-08-14 22:36:46 +02:00
switch ( $name )
{
case 'STRUCT' :
case 'ARRAY' :
// create an empty array to hold child values, and push it onto appropriate stack
$cur_val = array ();
$cur_val [ 'values' ] = array ();
$cur_val [ 'type' ] = $name ;
@ array_unshift ( $GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ], $cur_val );
break ;
case 'DATA' :
case 'METHODCALL' :
case 'METHODRESPONSE' :
case 'PARAMS' :
// valid elements that add little to processing
break ;
case 'METHODNAME' :
case 'NAME' :
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] = '' ;
break ;
case 'FAULT' :
$GLOBALS [ '_xh' ][ $parser ][ 'isf' ] = 1 ;
break ;
case 'VALUE' :
$GLOBALS [ '_xh' ][ $parser ][ 'vt' ] = 'value' ; // indicator: no value found yet
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] = '' ;
$GLOBALS [ '_xh' ][ $parser ][ 'lv' ] = 1 ;
break ;
case 'I4' :
case 'INT' :
case 'STRING' :
case 'BOOLEAN' :
case 'DOUBLE' :
case 'DATETIME.ISO8601' :
case 'BASE64' :
if ( $GLOBALS [ '_xh' ][ $parser ][ 'vt' ] != 'value' )
{
//two data elements inside a value: an error occurred!
$GLOBALS [ '_xh' ][ $parser ][ 'isf' ] = 2 ;
$GLOBALS [ '_xh' ][ $parser ][ 'isf_reason' ] = " $name element following a { $GLOBALS [ '_xh' ][ $parser ][ 'vt' ] } element inside a single value " ;
return ;
}
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] = '' ; // reset the accumulator
break ;
case 'MEMBER' :
$GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ][ 0 ][ 'name' ] = '' ; // set member name to null, in case we do not find in the xml later on
//$GLOBALS['_xh'][$parser]['ac']='';
// Drop trough intentionally
case 'PARAM' :
// clear value, so we can check later if no value will passed for this param/member
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = null ;
break ;
default :
/// INVALID ELEMENT: RAISE ISF so that it is later recognized!!!
$GLOBALS [ '_xh' ][ $parser ][ 'isf' ] = 2 ;
$GLOBALS [ '_xh' ][ $parser ][ 'isf_reason' ] = " found not-xmlrpc xml element $name " ;
break ;
}
// Save current element name to stack, to validate nesting
@ array_unshift ( $GLOBALS [ '_xh' ][ $parser ][ 'stack' ], $name );
if ( $name != 'VALUE' )
{
$GLOBALS [ '_xh' ][ $parser ][ 'lv' ] = 0 ;
}
2001-08-08 01:04:05 +02:00
}
}
function xmlrpc_ee ( $parser , $name )
{
2005-08-14 22:36:46 +02:00
if ( $GLOBALS [ '_xh' ][ $parser ][ 'isf' ] < 2 )
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
// push this element name from stack
// NB: if XML validates, correct opening/closing is guaranteed and
// we do not have to check for $name == $curr_elem.
// we also checked for proper nesting at start of elements...
$curr_elem = array_shift ( $GLOBALS [ '_xh' ][ $parser ][ 'stack' ]);
switch ( $name )
{
case 'STRUCT' :
case 'ARRAY' :
// fetch out of stack array of values, and promote it to current value
$curr_val = array_shift ( $GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ]);
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = $curr_val [ 'values' ];
$GLOBALS [ '_xh' ][ $parser ][ 'vt' ] = strtolower ( $name );
break ;
case 'NAME' :
$GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ][ 0 ][ 'name' ] = $GLOBALS [ '_xh' ][ $parser ][ 'ac' ];
break ;
case 'BOOLEAN' :
case 'I4' :
case 'INT' :
case 'STRING' :
case 'DOUBLE' :
case 'DATETIME.ISO8601' :
case 'BASE64' :
$GLOBALS [ '_xh' ][ $parser ][ 'vt' ] = strtolower ( $name );
if ( $name == 'STRING' )
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = $GLOBALS [ '_xh' ][ $parser ][ 'ac' ];
}
elseif ( $name == 'DATETIME.ISO8601' )
{
$GLOBALS [ '_xh' ][ $parser ][ 'vt' ] = xmlrpcDateTime ;
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = $GLOBALS [ '_xh' ][ $parser ][ 'ac' ];
}
elseif ( $name == 'BASE64' )
{
///@todo check for failure of base64 decoding / catch warnings
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = base64_decode ( $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]);
}
elseif ( $name == 'BOOLEAN' )
{
// special case here: we translate boolean 1 or 0 into PHP
// constants true or false
// NB: this simple checks helps a lot sanitizing input, ie no
// security problems around here
if ( $GLOBALS [ '_xh' ][ $parser ][ 'ac' ] == '1' )
{
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = true ;
}
else
{
// log if receiveing something strange, even though we set the value to false anyway
if ( $GLOBALS [ '_xh' ][ $parser ][ 'ac' ] != '0' )
error_log ( 'XML-RPC: invalid value received in BOOLEAN: ' . $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]);
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = false ;
}
}
elseif ( $name == 'DOUBLE' )
{
// we have a DOUBLE
// we must check that only 0123456789-.<space> are characters here
if ( ! ereg ( " ^[+-]?[eE0123456789 \\ t \\ .]+ $ " , $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]))
{
// TODO: find a better way of throwing an error
// than this!
error_log ( 'XML-RPC: non numeric value received in DOUBLE: ' . $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]);
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = 'ERROR_NON_NUMERIC_FOUND' ;
}
else
{
// it's ok, add it on
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = ( double ) $GLOBALS [ '_xh' ][ $parser ][ 'ac' ];
}
2001-08-08 01:04:05 +02:00
}
else
{
2005-08-14 22:36:46 +02:00
// we have an I4/INT
// we must check that only 0123456789-<space> are characters here
if ( ! ereg ( " ^[+-]?[0123456789 \\ t]+ $ " , $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]))
{
// TODO: find a better way of throwing an error
// than this!
error_log ( 'XML-RPC: non numeric value received in INT: ' . $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]);
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = 'ERROR_NON_NUMERIC_FOUND' ;
}
else
{
// it's ok, add it on
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = ( int ) $GLOBALS [ '_xh' ][ $parser ][ 'ac' ];
}
2001-08-08 01:04:05 +02:00
}
2005-08-14 22:36:46 +02:00
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] = '' ; // is this necessary?
$GLOBALS [ '_xh' ][ $parser ][ 'lv' ] = 3 ; // indicate we've found a value
break ;
case 'VALUE' :
// This if() detects if no scalar was inside <VALUE></VALUE>
if ( $GLOBALS [ '_xh' ][ $parser ][ 'vt' ] == 'value' )
{
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = $GLOBALS [ '_xh' ][ $parser ][ 'ac' ];
$GLOBALS [ '_xh' ][ $parser ][ 'vt' ] = xmlrpcString ;
}
// build the xmlrpc val out of the data received, and substitute it
$temp =& CreateObject ( 'phpgwapi.xmlrpcval' , $GLOBALS [ '_xh' ][ $parser ][ 'value' ], $GLOBALS [ '_xh' ][ $parser ][ 'vt' ]);
// check if we are inside an array or struct:
// if value just built is inside an array, let's move it into array on the stack
if ( count ( $GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ]) && $GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ][ 0 ][ 'type' ] == 'ARRAY' )
{
$GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ][ 0 ][ 'values' ][] = $temp ;
}
else
{
$GLOBALS [ '_xh' ][ $parser ][ 'value' ] = $temp ;
}
break ;
case 'MEMBER' :
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] = '' ; // is this necessary?
// add to array in the stack the last element built,
// unless no VALUE was found
if ( $GLOBALS [ '_xh' ][ $parser ][ 'value' ])
$GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ][ 0 ][ 'values' ][ $GLOBALS [ '_xh' ][ $parser ][ 'valuestack' ][ 0 ][ 'name' ]] = $GLOBALS [ '_xh' ][ $parser ][ 'value' ];
else
error_log ( 'XML-RPC: missing VALUE inside STRUCT in received xml' );
break ;
case 'DATA' :
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] = '' ; // is this necessary?
break ;
case 'PARAM' :
// add to array of params the current value,
// unless no VALUE was found
if ( $GLOBALS [ '_xh' ][ $parser ][ 'value' ])
$GLOBALS [ '_xh' ][ $parser ][ 'params' ][] = $GLOBALS [ '_xh' ][ $parser ][ 'value' ];
else
error_log ( 'XML-RPC: missing VALUE inside PARAM in received xml' );
break ;
case 'METHODNAME' :
$GLOBALS [ '_xh' ][ $parser ][ 'method' ] = ereg_replace ( " ^[ \n \r \t ]+ " , '' , $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]);
break ;
case 'PARAMS' :
case 'FAULT' :
case 'METHODCALL' :
case 'METHORESPONSE' :
break ;
default :
// End of INVALID ELEMENT!
// shall we add an assert here for unreachable code???
break ;
}
2001-08-08 01:04:05 +02:00
}
}
function xmlrpc_cd ( $parser , $data )
{
2005-08-14 22:36:46 +02:00
//if(ereg("^[\n\r \t]+$", $data)) return;
2001-08-08 01:04:05 +02:00
// print "adding [${data}]\n";
2005-08-14 22:36:46 +02:00
// skip processing if xml fault already detected
if ( $GLOBALS [ '_xh' ][ $parser ][ 'isf' ] < 2 )
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
if ( $GLOBALS [ '_xh' ][ $parser ][ 'lv' ] != 3 )
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
// "lookforvalue==3" means that we've found an entire value
// and should discard any further character data
if ( $GLOBALS [ '_xh' ][ $parser ][ 'lv' ] == 1 )
{
// if we've found text and we're just in a <value> then
// say we've found a value
$GLOBALS [ '_xh' ][ $parser ][ 'lv' ] = 2 ;
}
if ( !@ isset ( $GLOBALS [ '_xh' ][ $parser ][ 'ac' ]))
{
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] = '' ;
}
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] .= $data ;
2001-08-08 01:04:05 +02:00
}
}
}
function xmlrpc_dh ( $parser , $data )
{
2005-08-14 22:36:46 +02:00
// skip processing if xml fault already detected
if ( $GLOBALS [ '_xh' ][ $parser ][ 'isf' ] < 2 )
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
if ( substr ( $data , 0 , 1 ) == '&' && substr ( $data , - 1 , 1 ) == ';' )
2001-08-08 01:04:05 +02:00
{
2005-08-14 22:36:46 +02:00
if ( $GLOBALS [ '_xh' ][ $parser ][ 'lv' ] == 1 )
{
$GLOBALS [ '_xh' ][ $parser ][ 'lv' ] = 2 ;
}
$GLOBALS [ '_xh' ][ $parser ][ 'ac' ] .= $data ;
2001-08-08 01:04:05 +02:00
}
}
}
// date helpers
function iso8601_encode ( $timet , $utc = 0 )
{
// return an ISO8601 encoded string
// really, timezones ought to be supported
// but the XML-RPC spec says:
//
// "Don't assume a timezone. It should be specified by the server in its
// documentation what assumptions it makes about timezones."
2006-02-07 14:34:02 +01:00
//
// these routines always assume localtime unless
2001-08-08 01:04:05 +02:00
// $utc is set to 1, in which case UTC is assumed
// and an adjustment for locale is made when encoding
if ( ! $utc )
{
2003-08-28 16:31:11 +02:00
$t = strftime ( " %Y%m%dT%H:%M:%S " , $timet );
2001-08-08 01:04:05 +02:00
}
else
{
2006-02-07 14:34:02 +01:00
if ( function_exists ( 'gmstrftime' ))
2001-08-08 01:04:05 +02:00
{
// gmstrftime doesn't exist in some versions
// of PHP
2005-08-14 22:36:46 +02:00
$t = gmstrftime ( " %Y%m%dT%H:%M:%S " , $timet );
2001-08-08 01:04:05 +02:00
}
else
{
2005-08-14 22:36:46 +02:00
$t = strftime ( '%Y%m%dT%H:%M:%S' , $timet - date ( 'Z' ));
2001-08-08 01:04:05 +02:00
}
}
return $t ;
}
function iso8601_decode ( $idate , $utc = 0 )
{
2005-08-14 22:36:46 +02:00
// return a time in the localtime, or UTC
$t = 0 ;
2001-08-08 01:04:05 +02:00
if ( ereg ( " ([0-9] { 4})([0-9] { 2})([0-9] { 2})T([0-9] { 2}):([0-9] { 2}):([0-9] { 2}) " , $idate , $regs ))
{
if ( $utc )
{
$t = gmmktime ( $regs [ 4 ], $regs [ 5 ], $regs [ 6 ], $regs [ 2 ], $regs [ 3 ], $regs [ 1 ]);
}
else
{
$t = mktime ( $regs [ 4 ], $regs [ 5 ], $regs [ 6 ], $regs [ 2 ], $regs [ 3 ], $regs [ 1 ]);
}
2006-02-07 14:34:02 +01:00
}
2001-08-08 01:04:05 +02:00
return $t ;
}
/****************************************************************
* xmlrpc_decode takes a message in PHP xmlrpc object format and *
* tranlates it into native PHP types . *
* *
* author : Dan Libby ( dan @ libby . com ) *
****************************************************************/
2003-08-28 16:31:11 +02:00
function phpgw_xmlrpc_decode ( $xmlrpc_val )
2001-08-08 01:04:05 +02:00
{
2003-08-28 16:31:11 +02:00
$kind = @ $xmlrpc_val -> kindOf ();
2005-08-14 22:36:46 +02:00
if ( $kind == 'scalar' )
2003-08-28 16:31:11 +02:00
{
return $xmlrpc_val -> scalarval ();
}
2005-08-14 22:36:46 +02:00
elseif ( $kind == 'array' )
2001-08-08 01:04:05 +02:00
{
2003-08-28 16:31:11 +02:00
$size = $xmlrpc_val -> arraysize ();
$arr = array ();
2001-08-08 01:04:05 +02:00
2003-08-28 16:31:11 +02:00
for ( $i = 0 ; $i < $size ; $i ++ )
2003-05-10 10:53:43 +02:00
{
2005-08-14 22:36:46 +02:00
$arr [] = phpgw_xmlrpc_decode ( $xmlrpc_val -> arraymem ( $i ));
2003-05-10 10:53:43 +02:00
}
2006-02-07 14:34:02 +01:00
return $arr ;
2003-08-28 16:31:11 +02:00
}
2005-08-14 22:36:46 +02:00
elseif ( $kind == 'struct' )
2003-08-28 16:31:11 +02:00
{
$xmlrpc_val -> structreset ();
$arr = array ();
2003-05-10 10:53:43 +02:00
2003-08-28 16:31:11 +02:00
while ( list ( $key , $value ) = $xmlrpc_val -> structeach ())
{
$arr [ $key ] = phpgw_xmlrpc_decode ( $value );
2001-08-08 01:04:05 +02:00
}
2003-08-28 16:31:11 +02:00
return $arr ;
2001-08-08 01:04:05 +02:00
}
}
/****************************************************************
* xmlrpc_encode takes native php types and encodes them into *
* xmlrpc PHP object format . *
* BUG : All sequential arrays are turned into structs . I don ' t *
* know of a good way to determine if an array is sequential *
* only . *
* *
* feature creep -- could support more types via optional type *
* argument . *
* *
* author : Dan Libby ( dan @ libby . com ) *
****************************************************************/
2003-08-28 16:31:11 +02:00
function phpgw_xmlrpc_encode ( $php_val )
2001-08-08 01:04:05 +02:00
{
2003-08-28 16:31:11 +02:00
$type = gettype ( $php_val );
$xmlrpc_val = CreateObject ( 'phpgwapi.xmlrpcval' );
2003-05-10 10:53:43 +02:00
2003-08-28 16:31:11 +02:00
switch ( $type )
{
2005-08-14 22:36:46 +02:00
case 'array' :
case 'object' :
2003-08-28 16:31:11 +02:00
$arr = array ();
2005-08-14 22:36:46 +02:00
while ( list ( $k , $v ) = each ( $php_val ))
2003-08-28 16:31:11 +02:00
{
$arr [ $k ] = phpgw_xmlrpc_encode ( $v );
}
$xmlrpc_val -> addStruct ( $arr );
break ;
2005-08-14 22:36:46 +02:00
case 'integer' :
2003-08-28 16:31:11 +02:00
$xmlrpc_val -> addScalar ( $php_val , xmlrpcInt );
break ;
2005-08-14 22:36:46 +02:00
case 'double' :
2003-08-28 16:31:11 +02:00
$xmlrpc_val -> addScalar ( $php_val , xmlrpcDouble );
break ;
2005-08-14 22:36:46 +02:00
case 'string' :
2003-08-28 16:31:11 +02:00
$xmlrpc_val -> addScalar ( $php_val , xmlrpcString );
break ;
// <G_Giunta_2001-02-29>
// Add support for encoding/decoding of booleans, since they are supported in PHP
2005-08-14 22:36:46 +02:00
case 'boolean' :
2003-08-28 16:31:11 +02:00
$xmlrpc_val -> addScalar ( $php_val , xmlrpcBoolean );
break ;
// </G_Giunta_2001-02-29>
2005-08-14 22:36:46 +02:00
case 'unknown type' :
2003-08-28 16:31:11 +02:00
default :
2005-08-14 22:36:46 +02:00
$xmlrpc_val = False ;
2003-08-28 16:31:11 +02:00
break ;
2001-08-08 01:04:05 +02:00
}
2003-08-28 16:31:11 +02:00
return $xmlrpc_val ;
2001-08-08 01:04:05 +02:00
}
2001-08-09 01:28:03 +02:00
2005-08-14 22:36:46 +02:00
/* The following functions are the system functions for login , logout , etc .
* They are added to the server map at the end of this file .
*/
2001-08-09 04:54:56 +02:00
$GLOBALS [ '_xmlrpcs_listMethods_sig' ] = array ( array ( xmlrpcArray , xmlrpcString ), array ( xmlrpcArray ));
$GLOBALS [ '_xmlrpcs_listMethods_doc' ] = 'This method lists all the methods that the XML-RPC server knows how to dispatch' ;
2001-08-09 01:28:03 +02:00
function _xmlrpcs_listMethods ( $server , $m )
{
$v = CreateObject ( 'phpgwapi.xmlrpcval' );
$dmap = $server -> dmap ;
$outAr = array ();
for ( reset ( $dmap ); list ( $key , $val ) = each ( $dmap ); )
{
$outAr [] = CreateObject ( 'phpgwapi.xmlrpcval' , $key , 'string' );
}
2001-08-09 04:54:56 +02:00
$dmap = $GLOBALS [ '_xmlrpcs_dmap' ];
2001-08-09 01:28:03 +02:00
for ( reset ( $dmap ); list ( $key , $val ) = each ( $dmap ); )
{
$outAr [] = CreateObject ( 'phpgwapi.xmlrpcval' , $key , 'string' );
}
$v -> addArray ( $outAr );
return CreateObject ( 'phpgwapi.xmlrpcresp' , $v );
}
2001-08-09 04:54:56 +02:00
$GLOBALS [ '_xmlrpcs_methodSignature_sig' ] = array ( array ( xmlrpcArray , xmlrpcString ));
$GLOBALS [ '_xmlrpcs_methodSignature_doc' ] = 'Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature)' ;
2001-08-09 01:28:03 +02:00
function _xmlrpcs_methodSignature ( $server , $m )
{
$methName = $m -> getParam ( 0 );
$methName = $methName -> scalarval ();
if ( ereg ( " ^system \ . " , $methName ))
{
2001-08-09 04:54:56 +02:00
$dmap = $GLOBALS [ '_xmlrpcs_dmap' ];
2001-08-09 01:28:03 +02:00
$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 [] = CreateObject ( 'phpgwapi.xmlrpcval' , $inSig [ $j ], 'string' );
}
$sigs [] = CreateObject ( 'phpgwapi.xmlrpcval' , $cursig , 'array' );
}
$r = CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' , $sigs , 'array' ));
}
else
{
$r = CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' , 'undef' , 'string' ));
}
}
else
{
2001-08-09 04:54:56 +02:00
$r = CreateObject ( 'phpgwapi.xmlrpcresp' , 0 , $GLOBALS [ 'xmlrpcerr' ][ 'introspect_unknown' ], $GLOBALS [ 'xmlrpcstr' ][ 'introspect_unknown' ]);
2001-08-09 01:28:03 +02:00
}
return $r ;
}
2001-08-09 04:54:56 +02:00
$GLOBALS [ '_xmlrpcs_methodHelp_sig' ] = array ( array ( xmlrpcString , xmlrpcString ));
$GLOBALS [ '_xmlrpcs_methodHelp_doc' ] = 'Returns help text if defined for the method passed, otherwise returns an empty string' ;
2001-08-09 01:28:03 +02:00
function _xmlrpcs_methodHelp ( $server , $m )
{
$methName = $m -> getParam ( 0 );
$methName = $methName -> scalarval ();
if ( ereg ( " ^system \ . " , $methName ))
{
2001-08-09 04:54:56 +02:00
$dmap = $GLOBALS [ '_xmlrpcs_dmap' ];
$sysCall = 1 ;
2001-08-09 01:28:03 +02:00
}
else
{
2001-08-09 04:54:56 +02:00
$dmap = $server -> dmap ;
$sysCall = 0 ;
2001-08-09 01:28:03 +02:00
}
// print "<!-- ${methName} -->\n";
if ( isset ( $dmap [ $methName ]))
{
if ( $dmap [ $methName ][ 'docstring' ])
{
$r = CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' , $dmap [ $methName ][ 'docstring' ]), 'string' );
}
else
{
$r = CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' ), 'string' );
}
}
else
{
2001-08-09 04:54:56 +02:00
$r = CreateObject ( 'phpgwapi.xmlrpcresp' , 0 , $GLOBALS [ 'xmlrpcerr' ][ 'introspect_unknown' ], $GLOBALS [ 'xmlrpcstr' ][ 'introspect_unknown' ]);
2001-08-09 01:28:03 +02:00
}
return $r ;
}
2001-12-04 14:46:53 +01:00
2001-08-20 18:33:26 +02:00
$GLOBALS [ '_xmlrpcs_login_sig' ] = array ( array ( xmlrpcStruct , xmlrpcStruct ));
2004-08-09 15:46:03 +02:00
$GLOBALS [ '_xmlrpcs_login_doc' ] = 'eGroupWare client or server login via XML-RPC' ;
2001-08-20 01:55:58 +02:00
function _xmlrpcs_login ( $server , $m )
2001-08-13 18:24:03 +02:00
{
2001-08-20 18:33:26 +02:00
$rdata = $m -> getParam ( 0 );
$data = $rdata -> scalarval ();
2001-08-22 22:01:05 +02:00
if ( $data [ 'server_name' ])
{
$server_name = $data [ 'server_name' ] -> scalarval ();
}
2001-08-27 11:42:33 +02:00
if ( $data [ 'domain' ])
{
$domain = $data [ 'domain' ] -> scalarval ();
}
2005-08-14 22:36:46 +02:00
$username = $data [ 'username' ] -> scalarval ();
$password = $data [ 'password' ] -> scalarval ();
2001-08-13 18:24:03 +02:00
2001-08-27 11:42:33 +02:00
if ( $server_name )
2001-08-15 05:54:15 +02:00
{
2009-07-18 14:46:20 +02:00
list ( $sessionid , $kp3 ) = $GLOBALS [ 'egw' ] -> session -> create ( $username . '@' . $server_name , $password , " text " );
2001-08-15 05:54:15 +02:00
}
else
{
2001-08-27 11:42:33 +02:00
if ( $domain )
2001-08-20 18:33:26 +02:00
{
2001-08-27 11:42:33 +02:00
$user = $username . '@' . $domain ;
2001-08-20 18:33:26 +02:00
}
else
{
$user = $username ;
}
2005-08-14 22:36:46 +02:00
$GLOBALS [ 'login' ] = $user ;
$sessionid = $GLOBALS [ 'egw' ] -> session -> create ( $user , $password , " text " );
$kp3 = $GLOBALS [ 'egw' ] -> session -> kp3 ;
$domain = $GLOBALS [ 'egw' ] -> session -> account_domain ;
2001-08-15 05:54:15 +02:00
}
2001-08-20 01:55:58 +02:00
if ( $sessionid && $kp3 )
2001-08-13 18:24:03 +02:00
{
2001-08-27 11:42:33 +02:00
$rtrn [ 'domain' ] = CreateObject ( 'phpgwapi.xmlrpcval' , $domain , 'string' );
2001-08-20 18:33:26 +02:00
$rtrn [ 'sessionid' ] = CreateObject ( 'phpgwapi.xmlrpcval' , $sessionid , 'string' );
$rtrn [ 'kp3' ] = CreateObject ( 'phpgwapi.xmlrpcval' , $kp3 , 'string' );
2001-08-13 18:24:03 +02:00
}
else
{
2001-08-20 18:33:26 +02:00
$rtrn [ 'GOAWAY' ] = CreateObject ( 'phpgwapi.xmlrpcval' , 'XOXO' , 'string' );
2001-08-13 18:24:03 +02:00
}
2001-08-20 01:55:58 +02:00
return CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' , $rtrn , 'struct' ));
2001-08-13 18:24:03 +02:00
}
2001-08-20 18:33:26 +02:00
$GLOBALS [ '_xmlrpcs_logout_sig' ] = array ( array ( xmlrpcStruct , xmlrpcStruct ));
2004-08-09 15:46:03 +02:00
$GLOBALS [ '_xmlrpcs_logout_doc' ] = 'eGroupWare client or server logout via XML-RPC' ;
2001-08-20 02:28:36 +02:00
function _xmlrpcs_logout ( $server , $m )
{
2001-08-20 18:33:26 +02:00
$rdata = $m -> getParam ( 0 );
$data = $rdata -> scalarval ();
$sessionid = $data [ 'sessionid' ] -> scalarval ();
$kp3 = $data [ 'kp3' ] -> scalarval ();
2001-08-20 02:28:36 +02:00
2005-08-14 22:36:46 +02:00
$later = $GLOBALS [ 'egw' ] -> session -> destroy ( $sessionid , $kp3 );
2001-08-20 02:28:36 +02:00
2001-11-12 19:28:57 +01:00
if ( $later )
2001-08-20 02:28:36 +02:00
{
2001-08-20 18:33:26 +02:00
$rtrn [ 'GOODBYE' ] = CreateObject ( 'phpgwapi.xmlrpcval' , 'XOXO' , 'string' );
2001-08-20 02:28:36 +02:00
}
else
{
2001-08-20 18:33:26 +02:00
/* This never happens, yet */
$rtrn [ 'OOPS' ] = CreateObject ( 'phpgwapi.xmlrpcval' , 'WHAT?' , 'string' );
2001-08-20 02:28:36 +02:00
}
return CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' , $rtrn , 'struct' ));
}
2005-08-14 22:36:46 +02:00
$GLOBALS [ '_xmlrpcs_phpgw_api_version_sig' ] = array ( array ( xmlrpcString ));
$GLOBALS [ '_xmlrpcs_phpgw_api_version_doc' ] = 'Returns the eGroupWare API version' ;
function _xmlrpcs_phpgw_api_version ( $server , $m )
{
$version = $GLOBALS [ 'egw_info' ][ 'server' ][ 'versions' ][ 'phpgwapi' ];
return CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' , $version , 'string' ));
}
/*
$GLOBALS [ '_xmlrpcs_listApps_sig' ] = array ( array ( xmlrpcStruct , xmlrpcString ));
$GLOBALS [ '_xmlrpcs_listApps_doc' ] = 'Returns a list of installed phpgw apps' ;
function _xmlrpcs_listApps ( $server , $m )
{
$m -> getParam ( 0 );
2005-11-02 12:45:52 +01:00
$GLOBALS [ 'egw' ] -> db -> query ( " SELECT * FROM egw_applications WHERE app_enabled<3 " , __LINE__ , __FILE__ );
2005-08-14 22:36:46 +02:00
if ( $GLOBALS [ 'egw' ] -> db -> num_rows ())
{
while ( $GLOBALS [ 'egw' ] -> db -> next_record ())
{
$name = $GLOBALS [ 'egw' ] -> db -> f ( 'app_name' );
$title = $GLOBALS [ 'egw' ] -> db -> f ( 'app_title' );
$status = $GLOBALS [ 'egw' ] -> db -> f ( 'app_enabled' );
$version = $GLOBALS [ 'egw' ] -> db -> f ( 'app_version' );
$apps [ $name ] = CreateObject ( 'phpgwapi.xmlrpcval' ,
array (
'title' => CreateObject ( 'phpgwapi.xmlrpcval' , $title , 'string' ),
'name' => CreateObject ( 'phpgwapi.xmlrpcval' , $name , 'string' ),
'status' => CreateObject ( 'phpgwapi.xmlrpcval' , $status , 'string' ),
'version' => CreateObject ( 'phpgwapi.xmlrpcval' , $version , 'string' )
),
'struct'
);
}
}
return CreateObject ( 'phpgwapi.xmlrpcresp' , CreateObject ( 'phpgwapi.xmlrpcval' , $apps , 'struct' ));
}
*/
2006-03-08 20:34:02 +01:00
$GLOBALS [ '_xmlrpcs_egw_time_sig' ] = array ( array ( xmlrpcStruct ));
$GLOBALS [ '_xmlrpcs_egw_time_doc' ] = 'returns system-time and -timezone and if loged in user-time and timezone' ;
2005-08-14 22:36:46 +02:00
function _xmlrpcs_time ( $server , $m )
{
2006-03-08 20:34:02 +01:00
$return = array (
'system' => $GLOBALS [ 'server' ] -> date2iso8601 ( time ()),
'system_tz_offset' => ( int ) date ( 'Z' ),
);
if ( $GLOBALS [ 'server' ] -> authed )
{
$tz_offset_s = 3600 * ( int ) $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'tz_offset' ];
$return += array (
'user' => $GLOBALS [ 'server' ] -> date2iso8601 ( time () + $tz_offset_s ),
'user_tz_offset' => ( int ) date ( 'Z' ) + $tz_offset_s ,
);
}
2005-08-14 22:36:46 +02:00
return CreateObject (
'phpgwapi.xmlrpcresp' ,
2006-03-08 20:34:02 +01:00
$GLOBALS [ 'server' ] -> build_resp ( $return , true )
2005-08-14 22:36:46 +02:00
);
}
/* Add the system functions to the server map */
2001-08-09 17:51:06 +02:00
$GLOBALS [ '_xmlrpcs_dmap' ] = array (
2001-08-09 01:28:03 +02:00
'system.listMethods' => array (
'function' => '_xmlrpcs_listMethods' ,
2001-08-09 04:54:56 +02:00
'signature' => $GLOBALS [ '_xmlrpcs_listMethods_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_listMethods_doc' ]
2001-08-09 01:28:03 +02:00
),
2003-08-28 16:31:11 +02:00
'system.methodHelp' => array (
'function' => '_xmlrpcs_methodHelp' ,
'signature' => $GLOBALS [ '_xmlrpcs_methodHelp_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_methodHelp_doc' ]
),
2002-03-01 11:34:12 +01:00
'system.methodSignature' => array (
'function' => '_xmlrpcs_methodSignature' ,
'signature' => $GLOBALS [ '_xmlrpcs_methodSignature_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_methodSignature_doc' ]
),
'system.login' => array (
'function' => '_xmlrpcs_login' ,
'signature' => $GLOBALS [ '_xmlrpcs_login_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_login_doc' ]
),
'system.logout' => array (
'function' => '_xmlrpcs_logout' ,
'signature' => $GLOBALS [ '_xmlrpcs_logout_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_logout_doc' ]
2001-08-09 17:51:06 +02:00
),
2003-08-28 16:31:11 +02:00
'system.phpgw_api_version' => array (
'function' => '_xmlrpcs_phpgw_api_version' ,
'signature' => $GLOBALS [ '_xmlrpcs_phpgw_api_version_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_phpgw_api_version_doc' ]
2006-02-07 14:34:02 +01:00
),
2005-08-14 22:36:46 +02:00
/*
'system.listApps' => array (
'function' => '_xmlrpcs_listApps' ,
'signature' => $GLOBALS [ '_xmlrpcs_listApps_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_listApps_doc' ]
),
*/
'system.time' => array (
'function' => '_xmlrpcs_time' ,
2006-02-24 04:08:40 +01:00
'signature' => $GLOBALS [ '_xmlrpcs_egw_time_sig' ],
'docstring' => $GLOBALS [ '_xmlrpcs_egw_time_doc' ]
2005-08-14 22:36:46 +02:00
)
2001-08-09 01:28:03 +02:00
);
2001-08-09 04:54:56 +02:00
$GLOBALS [ '_xmlrpc_debuginfo' ] = '' ;
2001-08-09 01:28:03 +02:00
function xmlrpc_debugmsg ( $m )
{
2001-08-09 04:54:56 +02:00
$GLOBALS [ '_xmlrpc_debuginfo' ] .= $m . " \n " ;
2001-08-09 01:28:03 +02:00
}
2001-08-08 01:04:05 +02:00
?>