diff --git a/phpgwapi/inc/class.interserver.inc.php b/phpgwapi/inc/class.interserver.inc.php new file mode 100644 index 0000000000..6c9ea9a43e --- /dev/null +++ b/phpgwapi/inc/class.interserver.inc.php @@ -0,0 +1,553 @@ + * + * Maintain list and provide send interface to remote phpgw servers * + * Copyright (C) 2001 Miles Lott * + * -------------------------------------------------------------------------* + * This library is part of the phpGroupWare API * + * http://www.phpgroupware.org/api * + * ------------------------------------------------------------------------ * + * This library is free software; you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as published by * + * the Free Software Foundation; either version 2.1 of the License, * + * or any later version. * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU Lesser General Public License for more details. * + * You should have received a copy of the GNU Lesser General Public License * + * along with this library; if not, write to the Free Software Foundation, * + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + \**************************************************************************/ + + /* $Id$ */ + + class interserver + { + var $db; + var $accounts; + var $table = 'phpgw_interserv'; + var $total = 0; + + var $servers = array(); + var $serverid = 0; + var $security = ''; + var $mode = ''; + var $authed = False; + var $urlparts = array( + 'xmlrpc' => '/phpgroupware/xmlrpc.php', + 'soap' => '/phpgroupware/soap.php' + ); + + /* + 0/none == no access + 1/apps == read app data only + 99/all == read accounts and other api data + Two servers must have each other setup as 'all' for full coop + */ + var $trust_levels = array( + 'none' => 0, + 'apps' => 1, + 'all' => 99 + ); + + var $trust_relationships = array( + 'we request' => 0, + 'they request' => 1, + 'bi-directional' => 2 + ); + + var $security_types = array( + 'standard' => '', + 'ssl' => 'ssl' + ); + + var $server_modes = array( + 'XML-RPC' => 'xmlrpc', + 'SOAP' => 'soap' + ); + + function interserver($serverid='') + { + $this->db = $GLOBALS['phpgw']->db; + if($serverid) + { + $this->serverid = intval($serverid); + $this->setup(); + } + } + + function debug($str,$debug=False) + { + if($debug) + { + $this->_debug($str); + } + } + + function _debug($err='') + { + if(!$err) + { + return; + } + echo $err . ' '; + } + + function setup() + { + $this->read_repository(); + if($this->server['trust_level']) + { + $this->accounts = CreateObject('phpgwapi.accounts'); + $this->accounts->server = $this->serverid; + } + $this->security = $this->server->security; + $this->mode = $this->server->mode; + } + + /* send command to remote server */ + function send($method_name, $args, $url, $debug=True) + { + $cmd = '$return = $this->_send_' . $this->mode . '_' . $this->security . '($method_name, $args, $url, $debug);'; + eval($cmd); + if($return) + { + return $return; + } + } + + function _split_url($url) + { + preg_match('/^(.*?\/\/.*?)(\/.*)/',$url,$matches); + $hostport = $matches[1]; + $uri = $matches[2]; + return array($uri,$hostport); + } + + function _send_xmlrpc_ssl($method_name, $args, $url, $debug=True) + { + if(!function_exists(curl_init)) + { + $this->debug('No curl functions available - use of ssl is invalid',$debug); + return False; + } + /* curl Method borrowed from: + http://sourceforge.net/tracker/index.php?func=detail&aid=427359&group_id=23199&atid=377731 + */ + list($uri,$hostport) = $this->_split_url($url); + $this->debug("opening curl to $url", $debug); + + if(gettype($args) != 'array') + { + $arr = array(CreateObject('phpgwapi.xmlrpcval',$args,'string')); + } + else + { + while(list($key,$val) = @each($args)) + { + $arr[$key] = CreateObject('phpgwapi.xmlrpcval',$val, 'string'); + } + } + $f = CreateObject('phpgwapi.xmlrpcmsg',$method_name,$arr); + $content_len = strlen($f->serialize()); + + $cliversion = $GLOBALS['phpgw_info']['server']['versions']['phpgwapi']; + $http_request = 'POST ' . $uri . ' HTTP/1.0' . "\r\n" + . 'User-Agent: phpGroupware/' . $cliversion . '(PHP) ' . "\r\n" + . 'X-PHPGW-Server: ' . $method_name . ' ' . "\r\n" + . 'Content-Type: text/xml' . "\r\n" + . 'Content-Length: ' . $content_len . "\r\n\r\n" + . $f->serialize(); + + $this->debug("sending http request:\n" . $http_request . "\n", $debug); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$hostport); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $http_request); + curl_setopt($ch, CURLOPT_HEADER, 0); + $response_buf = curl_exec($ch); + curl_close($ch); + + $this->debug("got response:.\n$response_buf\n\n", $debug); + + $retval = ''; + if (strlen($response_buf)) + { + $xml_begin = substr($response_buf, strpos($response_buf, "debug('Error: no xml start found from'.$hostport.'!'); + } + } + else + { + $this->debug('Error: no response from '.$hostport.'!'); + } + + return $retval; + } + + function _send_xmlrpc_($method_name, $args, $url, $debug=True) + { + list($uri,$hostport) = $this->_split_url($url); + if(gettype($args) != 'array') + { + $arr = array(CreateObject('phpgwapi.xmlrpcval',$args,'string')); + } + else + { + while(list($key,$val) = @each($args)) + { + $arr[$key] = CreateObject('phpgwapi.xmlrpcval',$val, 'string'); + } + } + $f = CreateObject('phpgwapi.xmlrpcmsg', $method, $arr); + //echo "
" . htmlentities($f->serialize()) . "
\n"; + $c = CreateObject('phpgwapi.xmlrpc_client',$this->urlparts['xmlrpc'], $uri, 80); + $c->setDebug(0); + $r = $c->send($f); + if (!$r) + { + $this->debug('send failed'); + } + $v = $r->value(); + if (!$r->faultCode()) + { + $this->debug('
I got this value back
' . htmlentities($r->serialize()) . '

',$debug); + } + else + { + $this->debug('Fault Code: ' . $r->faultCode() . ' Reason "' . $r->faultString() . '"
',$debug); + } + + return $v; + } + + function _send_soap_ssl($method_name, $args, $url, $debug=True) + { + /* Not working */ + return; + preg_match('/^(.*?\/\/.*?)(\/.*)/',$url,$matches); + $hostport = $matches[1]; + $uri = $matches[2]; + + $this->debug("opening curl to $url", $debug); + + if(gettype($args) != 'array') + { + $args[] = $args; + } + else + { + while(list($key,$val) = @each($args)) + { + $arr[$key] = CreateObject('phpgwapi.xmlrpcval',$val, 'string'); + } + } + $f = CreateObject('phpgwapi.xmlrpcmsg',$method_name,array($arr)); + $content_len = strlen($f->serialize()); + + $cliversion = $GLOBALS['phpgw_info']['server']['versions']['phpgwapi']; + $http_request = 'POST ' . $uri . ' HTTP/1.0' . "\r\n" + . 'User-Agent: phpGroupware/' . $cliversion . '(PHP) ' . "\r\n" + . 'X-PHPGW-Server: ' . $method_name . ' ' . "\r\n" + . 'Content-Type: text/xml' . "\r\n" + . 'Content-Length: ' . $content_len . "\r\n" . "\r\n" + . $f->serialize(); + + $this->debug("sending http request:\n" . $http_request . "\n", $debug); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$hostport); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $http_request); + curl_setopt($ch, CURLOPT_HEADER, 0); + $response_buf = curl_exec($ch); + curl_close($ch); + + $this->debug("got response:.\n$response_buf\n\n", $debug); + + $retval = ''; + if (strlen($response_buf)) + { + $xml_begin = substr($response_buf, strpos($response_buf, "debug('Error: no xml start found from'.$hostport.'!'); + } + } + else + { + $this->debug('Error: no response from '.$hostport.'!'); + } + + return $retval; + } + + function _send_soap_($method_name, $args, $url, $debug=True) + { + /* Not working */ + return; + while(list($key,$val) = @each($args)) + { + $arr[$key] = CreateObject('phpgwapi.soapval',$val, 'string'); + } + $soap_message = CreateObject('phpgwapi.soapmsg', + $method, + $method_params[$method], + $server['methodNamespace'] + ); + /* print_r($soap_message);exit; */ + $soap = CreateObject('phpgwapi.soap_client',$server['endpoint']); + /* print_r($soap);exit; */ + if($return = $soap->send($soap_message,$server['soapaction'])) + { + return $return; + } + } + + /* Following are for server list management and query */ + function read_repository($serverid='') + { + $sql = "SELECT * FROM $this->table WHERE server_id=" . intval($serverid); + $this->db->query($sql,__LINE__,__FILE__); + if($this->db->next_record()) + { + $this->server['server_name'] = $this->db->f('server_name'); + $this->server['server_url'] = $this->db->f('server_url'); + $this->server['server_mode'] = $this->db->f('server_mode'); + $this->server['server_security'] = $this->db->f('server_security'); + $this->server['trust_level'] = $this->db->f('trust_level'); + $this->server['trust_rel'] = $this->db->f('trust_rel'); + $this->server['username'] = $this->db->f('username'); + $this->server['password'] = $this->db->f('password'); + $this->server['admin_name'] = $this->db->f('admin_name'); + $this->server['admin_email'] = $this->db->f('admin_email'); + } + return $this->server; + } + + function save_repository($serverid='') + { + if(!$serverid) + { + $serverid = $this->serverid; + } + if($serverid && gettype($this->server) == 'array') + { + $sql = "UPDATE $this->table SET " + . "server_name='" . $this->server['server_name'] . "'," + . "server_url='" . $this->server['server_url'] . "'," + . "server_mode='" . $this->server['server_mode'] . "'," + . "server_security='" . $this->server['server_security'] . "'," + . "trust_level=" . intval($this->server['trust_level']) . "," + . "trust_rel=" . intval($this->server['trust_rel']) . "," + . "username='" . $this->server['username'] . "'," + . "password='" . $this->server['password'] . "'," + . "admin_name='" . $this->server['admin_name'] . "'," + . "admin_email='" . $this->server['admin_email'] . "' " + . "WHERE server_id=" . intval($serverid); + $this->db->query($sql,__LINE__,__FILE__); + return True; + } + return False; + } + + function create($server_info='') + { + if(gettype($server_info) != 'array') + { + return False; + } + $sql = "INSERT INTO $this->table (server_name,server_url,server_mode,server_security," + . "trust_level,trust_rel,username,password,admin_name,admin_email) " + . "VALUES('" . $server_info['server_name'] . "','" . $server_info['server_url'] . "','" + . $server_info['server_mode'] . "','" . $server_info['server_security'] . "'," + . intval($server_info['trust_level']) . "," . intval($server_info['trust_rel']) . ",'" + . $server_info['username'] . "','" . $server_info['password'] . "','" + . $server_info['admin_name'] . "','" . $server_info['admin_email'] . "')"; + $this->db->query($sql,__LINE__,__FILE__); + + $sql = "SELECT server_id FROM $this->table WHERE server_name='" . $server_info['server_name'] . "'"; + $this->db->query($sql,__LINE__,__FILE__); + if($this->db->next_record()) + { + $server_info['server_id'] = $this->db->f(0); + $this->serverid = $server_info['server_id']; + $this->server = $server_info; + return $this->serverid; + } + return False; + } + + function delete($serverid='') + { + if(!$serverid) + { + $serverid = $this->serverid; + } + if($serverid) + { + $sql = "DELETE FROM $this->table WHERE server_id=$serverid"; + $this->db->query($sql,__LINE__,__FILE__); + return True; + } + return False; + } + + function get_list($start='',$sort='',$order='',$query='',$offset='') + { + $sql = "SELECT * FROM $this->table"; + $this->db->query($sql,__LINE__,__FILE__); + while ($this->db->next_record()) + { + $this->servers[$this->db->f('server_name')]['server_id'] = $this->db->f('server_id'); + $this->servers[$this->db->f('server_name')]['server_name'] = $this->db->f('server_name'); + $this->servers[$this->db->f('server_name')]['server_url'] = $this->db->f('server_url'); + $this->servers[$this->db->f('server_name')]['server_mode'] = $this->db->f('server_mode'); + $this->servers[$this->db->f('server_name')]['server_security'] = $this->db->f('server_security'); + $this->servers[$this->db->f('server_name')]['trust_level'] = $this->db->f('trust_level'); + $this->servers[$this->db->f('server_name')]['trust_rel'] = $this->db->f('trust_rel'); + $this->servers[$this->db->f('server_name')]['admin_name'] = $this->db->f('admin_name'); + $this->servers[$this->db->f('server_name')]['admin_email'] = $this->db->f('admin_email'); + } + $this->total = $this->db->num_rows(); + return $this->servers; + } + + function formatted_list($server_id=0,$java=False) + { + if ($java) + { + $jselect = ' onChange="this.form.submit();"'; + } + $select = "\n" .''."\n"; + $select .= '' . "\n"; + if(!$foundservers) + { + $select = ''; + } + + return $select; + } + + function name2id($server_name='') + { + if(!$server_name) + { + $server_name = $this->server['server_name']; + } + if($server_name) + { + $sql = "SELECT server_id FROM $this->table WHERE server_name='$server_name'"; + $this->db->query($sql,__LINE__,__FILE__); + if($this->db->next_record()) + { + $serverid = $this->db->f(0); + return $serverid; + } + } + return False; + } + + function id2name($serverid='') + { + if(!$serverid) + { + $serverid = $this->serverid; + } + if($serverid) + { + $sql = "SELECT server_name FROM $this->table WHERE serverid=$serverid"; + $this->db->query($sql,__LINE__,__FILE__); + if($this->db->next_record()) + { + $server_name = $this->db->f(0); + return $server_name; + } + } + return False; + } + + function exists($serverdata='') + { + if(!$serverdata) + { + return False; + } + if(gettype($serverdata) == 'integer') + { + $serverid = $serverdata; + settype($server_name,'string'); + $server_name = $this->id2name($serverid); + } + else + { + $server_name = $serverdata; + } + $sql = "SELECT server_id FROM $this->table WHERE server_name='$server_name'"; + $this->db->query($sql,__LINE__,__FILE__); + if($this->db->next_record()) + { + return True; + } + return False; + } + + function auth($serverdata='') + { + if(!$serverdata || gettype($serverdata) != 'array') + { + return False; + } + $server_name = $serverdata['server_name']; + $username = $serverdata['username']; + $password = $serverdata['password']; + + $sql = "SELECT server_id,trust_rel FROM $this->table WHERE server_name='$server_name'"; + $this->db->query($sql,__LINE__,__FILE__); + if($this->db->next_record()) + { + if ($username == $GLOBALS['phpgw_info']['server']['site_username'] && + $password == $GLOBALS['phpgw_info']['server']['site_password'] && + $this->db->f('trust_rel') >= 1) + { + $this->authed = True; + $sessionid = $GLOBALS['phpgw']->session->create('anonymous','anonymous1'); + return $sessionid; + } + } + return False; + } + } +?> diff --git a/phpgwapi/inc/xml_functions.inc.php b/phpgwapi/inc/xml_functions.inc.php index 1387bbbc9d..fbe4223e47 100644 --- a/phpgwapi/inc/xml_functions.inc.php +++ b/phpgwapi/inc/xml_functions.inc.php @@ -651,6 +651,34 @@ return $r; } + $GLOBALS['_xmlrpcs_auth_sig'] = array(array(xmlrpcString,xmlrpcString,xmlrpcString,xmlrpcString)); + $GLOBALS['_xmlrpcs_auth_doc'] = 'Verify server authentication'; + function _xmlrpcs_auth($server,$m) + { + $server_name = $m->getParam(0); + $username = $m->getParam(1); + $password = $m->getParam(2); + $serverdata['server_name'] = $server_name->scalarval(); + $serverdata['username'] = $username->scalarval(); + $serverdata['password'] = $password->scalarval(); + + $is = CreateObject('phpgwapi.interserver'); + $sessionid = $is->auth($serverdata); + + if($sessionid) + { + $rtrn[] = CreateObject('phpgwapi.xmlrpcval','HELO','string'); + $rtrn[] = CreateObject('phpgwapi.xmlrpcval',$sessionid,'string'); + } + else + { + $rtrn[] = CreateObject('phpgwapi.xmlrpcval','GOAWAY','string'); + $rtrn[] = CreateObject('phpgwapi.xmlrpcval','XOXO','string'); + } + $r = CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$rtrn,'struct')); + return $r; + } + $GLOBALS['_xmlrpcs_dmap'] = array( 'system.listMethods' => array( 'function' => '_xmlrpcs_listMethods', @@ -671,6 +699,11 @@ 'function' => '_xmlrpcs_listApps', 'signature' => $GLOBALS['_xmlrpcs_listApps_sig'], 'docstring' => $GLOBALS['_xmlrpcs_listApps_doc'] + ), + 'system.auth' => array( + 'function' => '_xmlrpcs_auth', + 'signature' => $GLOBALS['_xmlrpcs_auth_sig'], + 'docstring' => $GLOBALS['_xmlrpcs_auth_doc'] ) );