From dd2984573c073f816b71d3f250bc137f5adb7162 Mon Sep 17 00:00:00 2001 From: Carsten Wolff Date: Thu, 30 Jun 2005 18:54:11 +0000 Subject: [PATCH] another shot at datetime.iso8601: - accept both simple and extended format from input - output simple format, if + either the client is vbXMLRPC + or the client sends a HTTP-header "isoDate: simple" --- phpgwapi/inc/class.xmlrpc_server.inc.php | 38 +++++++++++++----- xmlrpc.php | 49 ++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 xmlrpc.php diff --git a/phpgwapi/inc/class.xmlrpc_server.inc.php b/phpgwapi/inc/class.xmlrpc_server.inc.php index bcd665a828..30f4547976 100644 --- a/phpgwapi/inc/class.xmlrpc_server.inc.php +++ b/phpgwapi/inc/class.xmlrpc_server.inc.php @@ -22,12 +22,14 @@ // contains useful functions for xmlrpc methods class xmlrpc_server_shared { + var $simpledate = False; + // convert a date-array or timestamp into a datetime.iso8601 string function date2iso8601($date) { if (!is_array($date)) { - if(strstr($_SERVER['HTTP_USER_AGENT'],"vbXMLRPC")) + if($this->simpledate) { return date('Ymd\TH:i:s',$date); } @@ -35,7 +37,7 @@ } $formatstring = "%04d-%02d-%02dT%02d:%02d:%02d"; - if(strstr($_SERVER['HTTP_USER_AGENT'],"vbXMLRPC")) + if($this->simpledate) { $formatstring = "%04d%02d%02dT%02d:%02d:%02d"; } @@ -47,16 +49,28 @@ // convert a datetime.iso8601 string into a datearray or timestamp function iso86012date($isodate,$timestamp=False) { - if (($arr = split('[-:T]',$isodate)) && count($arr) == 6) + $arr = array(); + + if (ereg('^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})$',$isodate,$arr)) { - foreach(array('year','month','mday','hour','min','sec') as $n => $name) - { - $date[$name] = (int)$arr[$n]; - } - return $timestamp ? mktime($date['hour'],$date['min'],$date['sec'], - $date['month'],$date['mday'],$date['year']) : $date; + // $isodate is simple ISO8601, remove the difference between split and ereg + array_shift($arr); } - return False; + elseif (($arr = split('[-:T]',$isodate)) && count($arr) == 6) + { + // $isodate is extended ISO8601, do nothing + } + else + { + return False; + } + + foreach(array('year','month','mday','hour','min','sec') as $n => $name) + { + $date[$name] = (int)$arr[$n]; + } + return $timestamp ? mktime($date['hour'],$date['min'],$date['sec'], + $date['month'],$date['mday'],$date['year']) : $date; } // translate cat-ids to array with id-name pairs @@ -142,6 +156,10 @@ } return $cats; } + + function setSimpleDate($enable=True) { + $this->simpledate = $enable; + } } if(empty($GLOBALS['phpgw_info']['server']['xmlrpc_type'])) diff --git a/xmlrpc.php b/xmlrpc.php new file mode 100644 index 0000000000..0be473e300 --- /dev/null +++ b/xmlrpc.php @@ -0,0 +1,49 @@ + * + * -------------------------------------------- * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 2 of the License, or (at your * + * option) any later version. * + \**************************************************************************/ + + /* $Id$ */ + /* $Source$ */ + + $GLOBALS['phpgw_info'] = array(); + $GLOBALS['phpgw_info']['flags'] = array( + 'currentapp' => 'login', + 'noheader' => True, + 'disable_Template_class' => True + ); + include('header.inc.php'); + + $server = CreateObject('phpgwapi.xmlrpc_server'); + /* uncomment here if you want to show all of the testing functions for compatibility */ + //include(PHPGW_API_INC . '/xmlrpc.interop.php'); + + /* Note: this command only available under Apache */ + $headers = getallheaders(); + //print_r($headers); + $isodate = $headers['isoDate'] ? $headers['isoDate'] : $headers['isodate']; + $isodate = ($isodate == 'simple' || strstr($_SERVER['HTTP_USER_AGENT'],"vbXMLRPC")) ? True : False; + $server->setSimpleDate($isodate); + $auth_header = $headers['Authorization'] ? $headers['Authorization'] : $headers['authorization']; + + if(eregi('Basic *([^ ]*)',$auth_header,$auth)) + { + list($sessionid,$kp3) = explode(':',base64_decode($auth[1])); + //echo "auth='$auth[1]', sessionid='$sessionid', kp3='$kp3'\n"; + } + else + { + $sessionid = get_var('sessionid',array('COOKIE','GET')); + $kp3 = get_var('kp3',array('COOKIE','GET')); + } + $server->authed = $GLOBALS['phpgw']->session->verify($sessionid,$kp3); + + $server->service($_SERVER['HTTP_RAW_POST_DATA']); +?>