diff --git a/addressbook/inc/class.remote.inc.php b/addressbook/inc/class.remote.inc.php new file mode 100644 index 0000000000..b5427e94ad --- /dev/null +++ b/addressbook/inc/class.remote.inc.php @@ -0,0 +1,134 @@ + * + * -------------------------------------------- * + * 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$ */ + + class remote + { + var $servers = array( + 'BigFoot' => array( + 'host' => 'ldap.bigfoot.com', + 'basedn' => '', + 'search' => 'cn', + 'attrs' => 'mail,cn,o,surname,givenname', + 'enabled' => True + ), + ); + var $serverid = ''; + + var $ldap = 0; + + function remote($serverid='BigFoot') + { + $GLOBALS['phpgw']->db->query("SELECT * FROM phpgw_addressbook_servers",__LINE__,__FILE__); + while ($GLOBALS['phpgw']->db->next_record()) + { + if ($GLOBALS['phpgw']->db->f('name')) + { + $this->servers[$GLOBALS['phpgw']->db->f('name')] = array( + 'host' => $GLOBALS['phpgw']->db->f('host'), + 'basedn' => $GLOBALS['phpgw']->db->f('basedn'), + 'search' => $GLOBALS['phpgw']->db->f('search'), + 'attrs' => $GLOBALS['phpgw']->db->f('attrs'), + 'enabled' => $GLOBALS['phpgw']->db->f('enabled') + ); + } + } + $this->serverid = $serverid; + $this->ldap = $this->_connect($this->serverid); + //$this->search(); + } + + function _connect($serverid='BigFoot') + { + if (!$ds = ldap_connect($this->servers[$serverid]['host'])) + { + printf("Error: Can't connect to LDAP server %s!
",$this->servers[$serverid]['host']); + return False; + } + @ldap_bind($ds); + + return $ds; + } + + function search($query='') + { + if(!$query) + { + return; + } + + if(isset($this->servers[$this->serverid]['attrs'])) + { + $attrs = explode(',',$this->servers[$this->serverid]['attrs']); + $found = ldap_search($this->ldap,$this->servers[$this->serverid]['basedn'],$this->servers[$this->serverid]['search'] . '=*' . $query . '*',$attrs); + } + else + { + $found = ldap_search($this->ldap,$this->servers[$this->serverid]['basedn'],$this->servers[$this->serverid]['search'] . '=*' . $query . '*'); + } + + $ldap_fields = @ldap_get_entries($this->ldap, $found); + + $out = $this->clean($ldap_fields); + $out = $this->convert($out); + + return $out; + } + + function clean($value) + { + if(!is_int($value) && ($value != 'count')) + { + if(is_array($value)) + { + while(list($x,$y) = @each($value)) + { + /* Fill a new output array, but do not include things like array( 0 => mail) */ + if(isset($this->servers[$this->serverid]['attrs']) && + !@in_array($y,explode(',',$this->servers[$this->serverid]['attrs']))) + { + $out[$x] = $this->clean($y); + } + } + unset($out['count']); + return $out; + } + else + { + return $value; + } + } + } + + function convert($in='') + { + if(is_array($in)) + { + while(list($key,$value) = each($in)) + { + $out[] = array( + 'fn' => $value['cn'][0], + 'n_family' => $value['sn'][0] ? $value['sn'][0] : $value['surname'][0], + 'email' => $value['mail'][0], + 'owner' => $GLOBALS['phpgw_info']['user']['account_id'] + ); + } + return $out; + } + else + { + return $in; + } + } + } +?> diff --git a/addressbook/inc/class.uiaddressbook.inc.php b/addressbook/inc/class.uiaddressbook.inc.php index 53a5da5a8d..341a0ab597 100644 --- a/addressbook/inc/class.uiaddressbook.inc.php +++ b/addressbook/inc/class.uiaddressbook.inc.php @@ -36,11 +36,13 @@ 'index' => True, 'view' => True, 'add' => True, + 'addfromremote' => True, 'add_email' => True, 'copy' => True, 'edit' => True, 'delete' => True, - 'preferences' => True + 'preferences' => True, + 'remote_search' => True ); var $extrafields = array( @@ -192,6 +194,34 @@ return $cats_link; } + function remote_search_option() + { + $remote = CreateObject('addressbook.remote'); + $servers = $remote->servers; + $search_remote = ''; + + /* show search box and server dropdown */ + while(list($server,$data) = @each($servers)) + { + $search_remote .= ' ' . "\n"; + } + + return $search_remote; + } + + function remote_search() + { +// _debug_array($GLOBALS['HTTP_POST_VARS']); + $remote = CreateObject('addressbook.remote',$GLOBALS['HTTP_POST_VARS']['serverid']); + $entries = $remote->search($GLOBALS['HTTP_POST_VARS']['remote_query']); + $this->index($entries); + } + /* this cleans up the fieldnames for display */ function display_name($column) { @@ -257,7 +287,7 @@ /* Former index.php */ - function index() + function index($entries='') { $GLOBALS['phpgw']->common->phpgw_header(); echo parse_navbar(); @@ -411,12 +441,12 @@ $userid = $GLOBALS['phpgw_info']['user']['account_id']; } - if($nosearch && !$this->query) + if($nosearch && !$this->query && !$entries) { $entries = array(); $total_records = 0; } - else + elseif(!$entries) { /* read the entry list */ $entries = $this->bo->read_entries(array( @@ -429,29 +459,39 @@ 'order' => $this->order )); $total_records = $this->bo->total; + $this->template->set_var('lang_view',lang('View')); + } + else + { + $total_records = count($entries); + $this->template->set_var('lang_view',lang('Add')); + $showadd = True; } - - /* global here so nextmatchs accepts our setting of $query and $filter */ -// $GLOBALS['query'] = $this->query; -// $GLOBALS['filter'] = $this->filter; $search_filter = $GLOBALS['phpgw']->nextmatchs->show_tpl('/index.php', $this->start, $total_records,'&menuaction=addressbook.uiaddressbook.index&fcat_id='.$this->cat_id,'75%', $GLOBALS['phpgw_info']['theme']['th_bg'],1,1,1,1,$this->cat_id); -// $query = $filter = ''; + + $search_remote = $this->remote_search_option(); $lang_showing = $GLOBALS['phpgw']->nextmatchs->show_hits($total_records,$this->start); /* set basic vars and parse the header */ $this->template->set_var('font',$GLOBALS['phpgw_info']['theme']['font']); - $this->template->set_var('lang_view',lang('View')); + $this->template->set_var('row_on',$GLOBALS['phpgw_info']['theme']['row_on']); +// $this->template->set_var('lang_view',lang('View')); $this->template->set_var('lang_vcard',lang('VCard')); $this->template->set_var('lang_edit',lang('Edit')); $this->template->set_var('lang_owner',lang('Owner')); + $this->template->set_var('lang_go',lang('Go')); $this->template->set_var('searchreturn',$noprefs . ' ' . $searchreturn); + $this->template->set_var('remote_search',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.remote_search')); + $this->template->set_var('remote_query',$GLOBALS['HTTP_POST_VARS']['remote_query']); + $this->template->set_var('lang_remote_search',lang('Remote Search')); $this->template->set_var('lang_showing',$lang_showing); $this->template->set_var('search_filter',$search_filter); + $this->template->set_var('search_remote',$search_remote); $this->template->set_var('cats',lang('Category')); $this->template->set_var('cats_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); /* $this->template->set_var('cats_link',$this->cat_option($this->cat_id)); */ @@ -531,15 +571,16 @@ $this->template->parse('columns','column',True); } - if(1) + if(!$showadd) { $this->template->set_var('row_view_link',$GLOBALS['phpgw']->link('/index.php', 'menuaction=addressbook.uiaddressbook.view&ab_id=' . $entries[$i]['id'])); } else { - $this->template->set_var('row_view_link',''); - $this->template->set_var('lang_view',lang('Private')); + $this->template->set_var('row_view_link',$GLOBALS['phpgw']->link('/index.php', + 'menuaction=addressbook.uiaddressbook.addfromremote&fields=' . urlencode(serialize($entries[$i])))); +// $this->template->set_var('lang_view',lang('Add')); } $this->template->set_var('row_vcard_link',$GLOBALS['phpgw']->link('/index.php', @@ -622,6 +663,16 @@ Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.edit&ab_id=' . $ab_id)); } + function addfromremote() + { + $fields = get_var('fields',array('GET')); + $fields = stripslashes(urldecode($fields)); + $fields = unserialize($fields); + $fields['note'] = "\nCopied from remote search."; + $ab_id = $this->bo->add_entry($fields); + Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.edit&ab_id=' . $ab_id)); + } + function add() { if($GLOBALS['HTTP_POST_VARS']['submit']) @@ -646,7 +697,7 @@ $GLOBALS['phpgw']->common->phpgw_header(); echo parse_navbar(); - $this->addressbook_form('','menuaction=addressbook.uiaddressbook.add','Add','',$customfields,$this->cat_id); + $this->addressbook_form('','menuaction=addressbook.uiaddressbook.add','Add','',$customfields,$this->cat_id,True); $this->template->set_var('lang_ok',lang('ok')); $this->template->set_var('lang_clear',lang('clear'));