fixed & enhanced xmlrpc support:

- new identical (for all apps) function names: search, read, write, delete, categories
- dates (geb.date, last_mod) iso8601 encoded
- cats are encoded as cat-id / name pairs and are automaticaly created / updated
This commit is contained in:
Ralf Becker 2004-03-10 07:53:37 +00:00
parent c5dd013f18
commit 00212a8fc9

View File

@ -48,7 +48,11 @@
'update_entry' => array( 'update_entry' => array(
'in' => array('int','struct'), 'in' => array('int','struct'),
'out' => array() 'out' => array()
) ),
'categories' => array(
'in' => array('int'),
'out' => array('struct')
),
); );
var $debug = False; var $debug = False;
@ -81,6 +85,9 @@
$this->read_sessiondata(); $this->read_sessiondata();
$this->use_session = True; $this->use_session = True;
} }
// are we called via xmlrpc?
$this->xmlrpc = is_object($GLOBALS['server']) && $GLOBALS['server']->last_method;
/* _debug_array($_POST); */ /* _debug_array($_POST); */
$_start = get_var('start',array('POST','GET')); $_start = get_var('start',array('POST','GET'));
$_query = get_var('query',array('POST','GET'),'_UNSET_'); $_query = get_var('query',array('POST','GET'),'_UNSET_');
@ -227,22 +234,109 @@
return $cleaned; return $cleaned;
} }
// return array with all addressbook categories (for xmlrpc)
function categories($complete = False)
{
return $this->xmlrpc ? $GLOBALS['server']->categories($complete) : False;
}
// translate array of internal datas to xmlrpc, eg. format bday as iso8601
function data2xmlrpc($datas)
{
if (is_array($datas))
{
foreach($datas as $n => $data)
{
// translate birthday to a iso8601 date
if (isset($data['bday']))
{
if (strlen($data['bday']) > 2)
{
list($m,$d,$y) = explode('/',$data['bday']);
}
else
{
$y = $m = $d = 0;
}
$datas[$n]['bday'] = $GLOBALS['server']->date2iso8601(array('year'=>$y,'month'=>$m,'mday'=>$d));
}
// translate modification time
if (isset($data['last_mod']))
{
$datas[$n]['last_mod'] = $GLOBALS['server']->date2iso8601($data['last_mod']);
}
// translate categories-id-list to array with id-name pairs
if (isset($data['cat_id']))
{
$datas[$n]['cat_id'] = $GLOBALS['server']->cats2xmlrpc(explode(',',$data['cat_id']));
}
}
}
return $datas;
}
// retranslate from xmlrpc / iso8601 to internal format
function xmlrpc2data($data)
{
if (isset($data['bday']))
{
$arr = $GLOBALS['server']->iso86012date($data['bday']);
$data['bday'] = $y && $m && $d ? sprintf('%d/%02d/%04d',$arr['month'],$arr['mday'],$arr['year']) : '';
}
if (isset($data['last_mod']))
{
$data['last_mod'] = $GLOBALS['server']->iso86012date($data['last_mod'],True);
}
if (isset($data['cat_id']))
{
$cats = $GLOBALS['server']->xmlrpc2cats($data['cat_id']);
$data['cat_id'] = count($cats) > 1 ? ','.implode(',',$cats).',' : (int)$cats[0];
}
return $data;
}
function read_entries($data) function read_entries($data)
{ {
if ($this->xmlrpc && !isset($data['fields']))
{
$data['fields'] = array_keys(array_merge($this->so->contacts->non_contact_fields,$this->so->contacts->stock_contact_fields));
}
$entries = $this->so->read_entries($data); $entries = $this->so->read_entries($data);
$this->total = $this->so->contacts->total_records; $this->total = $this->so->contacts->total_records;
if (!is_array($entries))
{
$entries = array();
}
$entries = $this->strip_html($entries);
if ($this->xmlrpc)
{
$entries = $this->data2xmlrpc($entries);
}
if($this->debug) { echo '<br>Total records="' . $this->total . '"'; } if($this->debug) { echo '<br>Total records="' . $this->total . '"'; }
return(is_array($entries) ? $this->strip_html($entries) : array()); return $entries;
} }
function read_entry($data) function read_entry($data)
{ {
if ($this->xmlrpc && !isset($data['fields']))
{
$data['fields'] = array_keys(array_merge($this->so->contacts->non_contact_fields,$this->so->contacts->stock_contact_fields));
}
if($this->check_perms($data,PHPGW_ACL_READ)) if($this->check_perms($data,PHPGW_ACL_READ))
{ {
$entry = $this->so->read_entry($data['id'],$data['fields']); $entry = $this->so->read_entry($data['id'],$data['fields']);
return $this->strip_html($entry); $entry = $this->strip_html($entry);
if ($this->xmlrpc)
{
$entry = $this->data2xmlrpc($entry);
}
return $entry;
} }
return array(0 => array('No access' => 'No access')); if ($this->xmlrpc)
{
$GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
}
return False;
} }
function read_last_entry($fields) function read_last_entry($fields)
@ -250,9 +344,18 @@
if($this->check_perms($fields,PHPGW_ACL_READ)) if($this->check_perms($fields,PHPGW_ACL_READ))
{ {
$entry = $this->so->read_last_entry($fields); $entry = $this->so->read_last_entry($fields);
return $this->strip_html($entry); $entry = $this->strip_html($entry);
if ($this->xmlrpc)
{
$entry = $this->data2xmlrpc($entry);
}
return $entry;
} }
return array(0 => array('No access' => 'No access')); if ($this->xmlrpc)
{
$GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
}
return False;
} }
function add_vcard($uploadedfile='') function add_vcard($uploadedfile='')
@ -323,7 +426,17 @@
{ {
$fields['access'] = 'public'; $fields['access'] = 'public';
} }
return $this->so->add_entry($fields); if ($this->xmlrpc)
{
$fields = $this->xmlrpc2data($fields);
}
$id = $this->so->add_entry($fields);
if ($this->xmlrpc && !$id)
{
$GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
}
return $id;
} }
function get_lastid() function get_lastid()
@ -333,11 +446,24 @@
function update_entry($fields) function update_entry($fields)
{ {
if (!$fields['id'] && !$fields['ab_id'])
{
$this->add_entry($fields);
}
$ok = False;
if($this->check_perms($fields,PHPGW_ACL_EDIT)) if($this->check_perms($fields,PHPGW_ACL_EDIT))
{ {
return $this->so->update_entry($fields); if ($this->xmlrpc)
{
$fields = $this->xmlrpc2data($fields);
}
$ok = $this->so->update_entry($fields);
} }
return False; if ($this->xmlrpc && !$ok)
{
$GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
}
return $ok;
} }
function delete_entry($addr) function delete_entry($addr)
@ -357,12 +483,14 @@
$id = isset($addr['id']) ? $addr['id'] : $addr['ab_id']; $id = isset($addr['id']) ? $addr['id'] : $addr['ab_id'];
} }
} }
if($this->check_perms($id,PHPGW_ACL_DELETE)) if($this->check_perms($id,PHPGW_ACL_DELETE))
{ {
return $this->so->delete_entry($id); $this->so->delete_entry($id);
}
elseif ($this->xmlrpc)
{
$GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
} }
return False;
} }
/*! /*!
@ -375,6 +503,16 @@
*/ */
function check_perms($addr,$rights) function check_perms($addr,$rights)
{ {
if (!is_array($addr) || !isset($addr['rights']) && !isset($addr['owner']))
{
$id = (int) (!is_array($addr) ? $addr : (isset($addr['id']) ? $addr['id'] : $addr['ab_id']));
$addr = $this->so->read_entry($id,array('owner'));
if (!$addr && $this->xmlrpc)
{
$GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['not_exist'],$GLOBALS['xmlrpcstr']['not_exist']);
}
$addr = $addr[0];
}
$ret = $this->so->contacts->check_perms(False,$rights,$addr); $ret = $this->so->contacts->check_perms(False,$rights,$addr);
//echo "<p>boaddressbook::check_perms(".print_r($addr,True).",$rights) = ".($ret?'True':'False')."</p>\n"; //echo "<p>boaddressbook::check_perms(".print_r($addr,True).",$rights) = ".($ret?'True':'False')."</p>\n";
return $ret; return $ret;
@ -456,6 +594,11 @@
'signature' => array(array(xmlrpcStruct,xmlrpcStruct)), 'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
'docstring' => lang('Update a single entry by passing the fields.') 'docstring' => lang('Update a single entry by passing the fields.')
), ),
'write' => array( // alias for consistent nameing
'function' => 'update_entry',
'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
'docstring' => lang('Write (update or add) a single entry by passing the fields.')
),
'delete' => array( 'delete' => array(
'function' => 'delete_entry', 'function' => 'delete_entry',
'signature' => array(array(xmlrpcInt,xmlrpcInt)), 'signature' => array(array(xmlrpcInt,xmlrpcInt)),
@ -464,7 +607,17 @@
'read_list' => array( 'read_list' => array(
'function' => 'read_entries', 'function' => 'read_entries',
'signature' => array(array(xmlrpcStruct,xmlrpcStruct)), 'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
'docstring' => lang('Read a list of entries.') 'docstring' => lang('Read a list / search for entries.')
),
'search' => array( // alias for consitent nameing
'function' => 'read_entries',
'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
'docstring' => lang('Read a list / search for entries.')
),
'categories' => array(
'function' => 'categories',
'signature' => array(array(xmlrpcBool,xmlrpcStruct)),
'docstring' => lang('List all categories')
), ),
'list_methods' => array( 'list_methods' => array(
'function' => 'list_methods', 'function' => 'list_methods',