[horde] Setting up identities in hooks
Jan Schneider
jan at horde.org
Mon May 10 09:03:29 UTC 2010
Zitat von Diego Woitasen <diegows at xtech.com.ar>:
> 2010/5/8 Diego Woitasen <diegows at xtech.com.ar>
>
>> Hi,
>> I'm using Horde Groupware (Kolab). I need to setup user identities every
>> times the user logins. The informatino is stored in LDAP. I know that
>> config/hooks.php is the place to put the code, the code is executed but I
>> don't underdand why my modifications to identities and sent to /dev/null.
>>
>> The example code with LDAP that doesn't work.
>>
>> if (!function_exists('_horde_hook_postauthenticate')) {
>> function _horde_hook_postauthenticate($userID, $credential, $realm) {
>> require_once 'Horde/Identity.php';
>> $name = "$userID";
>> if (is_null($name)) {
>> $name = Auth::getAuth();
>> }
>>
>> Horde::logMessage('Setting up identities.');
>>
>> $identities = &Identity::singleton('none',"$name");
>> $identities->init();
>>
>> $id_data = array( "id" => "Uno", "fullname" => "Full Uno",
>> "from_addr" => "uno at kolab-demo.xtech.com.ar");
>> $identities->add($id_data);
>>
>> $id_data = array( "id" => "Dos", "fullname" => "Full Dos",
>> "from_addr" => "dos at kolab-demo.xtech.com.ar");
>> $identities->add($id_data);
>>
>> $id_data = array( "id" => "Tres", "fullname" => "Full Tres",
>> "from_addr" => "tres at kolab-demo.xtech.com.ar");
>> $identities->add($id_data);
>>
>> $identities->setDefault(0);
>>
>> $identities->save();
>>
>> return true;
>> }
>>
>> Any ideas?
>>
>> Thanks!
>>
>> --
>> Diego Woitasen
>> XTECH
>>
>
>
> I found the solution. The right hook to change identities is
> _imp_hook_postlogin. In _horde_
> hook_postauthenticate the preferences are not loaded yet, so you can't
> change anything.
>
> That's the code to change Identities based on information stored in LDAP.
> May be this is useful for somebody else.
>
> if (!function_exists('_imp_hook_postlogin')) {
> function _imp_hook_postlogin($actionID, $isLogin) {
> require_once 'Horde/Identity.php';
>
>
> $userdn = $GLOBALS['conf']['kolab']['ldap']['phpdn'];
> $userpw = $GLOBALS['conf']['kolab']['ldap']['phppw'];
> $host = $GLOBALS['conf']['kolab']['ldap']['server'];
> $base = $GLOBALS['conf']['kolab']['ldap']['basedn'];
> $name = Auth::getAuth();
>
> $identities = &Identity::singleton('none',"$name");
> $identities->_identities = array();
>
> if(!isset($userdn) or !isset($userpw) or !isset($host) or
> !isset($base)){
> horde::logMessage("_imp_hook_postlogin: LDAP config param
> missing",
> __FILE__, __LINE__);
> return true;
> }
>
> $ldap = ldap_connect($host);
> if(!$ldap){
> horde::logMessage("_imp_hook_postlogin: LDAP connect fail",
> __FILE__, __LINE__);
> return true;
> }
>
> if(!ldap_bind($ldap, $userdn, $userpw)){
> horde::logMessage("_imp_hook_postlogin: LDAP bind fail",
> __FILE__, __LINE__);
> return true;
> }
>
> $filter = '(|(mail=%s)(kolabDelegate=%s)(kolabDelegate=sendas-%s))';
> $filter = sprintf($filter, $name, $name, $name);
> $attrs = array("cn", "mail");
> $res = ldap_search($ldap, $base, $filter, $attrs);
> if(!$res){
> horde::logMessage("_imp_hook_postlogin: LDAP search fail",
> __FILE__, __LINE__);
> return true;
> }
>
> $info = ldap_get_entries($ldap, $res);
> for($i = 0; $i < $info["count"]; $i++){
> $id_data = array( "id" => $info[$i]["cn"][0],
> "fullname" => $info[$i]["cn"][0],
> "from_addr" => $info[$i]["mail"][0]);
> $pos = $identities->add($id_data);
> if($info[$i]["mail"][0] == $name)
> $identities->setDefault($pos);
>
> }
>
> $identities->init();
> $identities->save();
>
> return true;
> }
> }
Neither is correct. Identities are stored in the preferences, so you
should make this a preference hook.
Jan.
--
Do you need professional PHP or Horde consulting?
http://horde.org/consulting/
More information about the horde
mailing list