[sork] Re: ldap.php

Jan Schneider jan at horde.org
Fri Apr 8 04:28:44 PDT 2005


Zitat von alain <alain.defrance at univ-evry.fr>:

> i'am using the latest file vacation/lib/Driver/ldap.php,v 1.6 2005/01/03
> 14:35:41
>
> and i've the follwing error message :
>
> *Fatal error*: Call to undefined function: mb_convert_encoding() in
> */usr/apache2/htdocs/horde/vacation/lib/Driver/ldap.php* on line *313

Wow, these function really shouldn't be used here. But the line numbers 
you have in your messages are *not* in the file version you reported.

> *is it a problem about php Version ? (PHP Version: 4.3.4, Horde:
> 3.0.3,Imp: H3 (4.0.2))
>
> if i comment the lines concerning function mb_convert i can display the
> vacation form, but when i submit the form i've another error :
>
> *Fatal error*: Call to undefined function: mb_detect_encoding() in
> */usr/apache2/htdocs/horde/vacation/lib/Driver/ldap.php* on line *230
>
> *if i comment the lines concerning mb_detect_encoding() then the form
> works fine...
>
> question :  what's the purspose of these encoding function, and how may
> i resolved the problem ????
>
> thanks for reading...
>
> Alain DEFRANCE
>
>> Hi,
>>
>>
>>
>>> i try to use /vacation/lib/Driver/ldap.php file but i'm a little lost
>>> with the correction :
>>>
>>> http://bugs.horde.org/ticket/?id=1648&action=
>>>
>>> is it possible to send me the good ldap.php file because even with the
>>> good correction i've still errors... ??
>>>
>>>
>> here it goes...
>>
>> what kind of errors do you have?
>>
>> Do you mind to post further conversations also to the sork list?
>>
>> regards,
>> Christian
>>
>>
>> ------------------------------------------------------------------------
>>
>> Index: lib/Driver/ldap.php
>> ===================================================================
>> RCS file: /repository/vacation/lib/Driver/ldap.php,v
>> retrieving revision 1.6
>> diff -r1.6 ldap.php
>> 50a51
>>
>>
>>>        $this->params = array_merge($this->params, $this->_params);
>>>
>>>
>> 141d141
>> <
>> 191c191,196
>> <         $message = mb_convert_encoding($message, 'UTF-8', 'ISO-8859-1');
>> ---
>>
>>
>>>        $messageEncoding = $this->_detectEncoding($message);
>>>
>>>        // encode if necessary
>>>        if ($messageEncoding != 'UTF-8') {
>>>            $message = mb_convert_encoding($message, 'UTF-8', 
>>> $messageEncoding);
>>>        }
>>>
>>>
>> 195c200
>> <         $newDetails[$this->_params[$realm]['active']] = 'Y';
>> ---
>>
>>
>>>        $newDetails[$this->_params[$realm]['active']] = 
>>> $this->_params[$realm]['enabled'];
>>>
>>>
>> 197,198d201
>> <         $attribs = array($this->_params[$realm]['vacation'], 
>> $this->_params[$realm]['active']);
>> <         $value = $this->_getVacation($userdn, $attribs);
>> 200a204,205
>>
>>
>>>            $this->_disconnect();
>>>            return false;
>>>
>>>
>> 202a208,209
>>
>>
>>>        $res_alias = $this->_setVacationAlias($user, $realm, $userdn);
>>>
>>>
>>>
>> 205a213,273
>>
>>
>>>        return $res_alias;
>>>    }
>>>
>>>    /**
>>>     * Try to detect the character encoding of a string.
>>>     *
>>>     * @access private
>>>     *
>>>     * @param string $string   Input string for detection
>>>     *
>>>     *
>>>     * @return string  Character encoding (see link below)
>>>     * @link http://www.php.net/manual/en/ref.mbstring.php
>>>     */
>>>    function _detectEncoding($string)
>>>    {
>>>        // try popular defaults first
>>>        if (!$encoding = mb_detect_encoding($string, 'UTF-8, 
>>> ISO-8859-1', true)) {
>>>            // no UTF-8 nor ISO-8859-1, try whatever it's defined as 'auto'
>>>            if (!$encoding = mb_detect_encoding($string, 'auto', true)) {
>>>                // still unrecognised encoding, use the charset for 
>>> the current language
>>>                $encoding = NLS::getCharset();
>>>            }
>>>        }
>>>        return $encoding;
>>>    }
>>>
>>>
>>>    /**
>>>     * Set/create vacation mail alias
>>>     *
>>>     * Some mta/ldap/vacation implementations requires an extra mail alias
>>>     * (ex. user at example.org -> user at example.org, 
>>> user at autoreply.exmaple.org)
>>>     *
>>>     * You should override this method in your extended ldap driver class,
>>>     * if you need this feature.
>>>     *
>>>     * @access private
>>>     *
>>>     * @param string $user   The username to enable vacation for
>>>     * @param string $realm  The realm for the current user
>>>     * @param string $userdn The LDAP DN for the current user
>>>     *
>>>     * @return boolean  true on success, otherwise false :)
>>>     */
>>>    function _setVacationAlias($user, $realm, $userdn)
>>>    {
>>>        return true;
>>>    }
>>>
>>>
>>>    /**
>>>     * Unset/remove vacation mail alias
>>>     *
>>>     * @access private
>>>     *
>>>     * @return boolean  true on success, otherwise false :)
>>>     * @see _setVacationAlias()
>>>     */
>>>    function _unsetVacationAlias($user, $realm, $userdn)
>>>    {
>>>
>>>
>> 208a277
>>
>>
>> 236,237c305
>> <         $attribs = array($this->_params[$realm]['vacation'], 
>> $this->_params[$realm]['active']);
>> <         $vac = $this->_getVacation($userdn, $attribs);
>> ---
>>
>>
>>>        $vac = $this->_getVacation($userdn, $realm);
>>>
>>>
>> 239c307
>> <         // Prepare the message. \n->\n\n and UTF-8 encode.
>> ---
>>
>>
>>>        // Prepare the message. \n->\n\n and UTF-8 decode.
>>>
>>>
>> 241c309
>> <         $vac['message'] = mb_convert_encoding($vac['message'], 
>> 'ISO-8859-1', 'UTF-8');
>> ---
>>
>>
>>>        $outputEncoding = NLS::getCharset();
>>>
>>>
>> 242a311,314
>>
>>
>>>        // decode if necessary
>>>        if ($outputEncoding != 'UTF-8') {
>>>            $vac['message'] = mb_convert_encoding($vac['message'], 
>>> $outputEncoding, 'UTF-8');
>>>        }
>>>
>>>
>> 246c318
>> <     function _getVacation($userdn, $attribs)
>> ---
>>
>>
>>>    function _getVacation($userdn, $realm)
>>>
>>>
>> 248c320,323
>> <         $sr = ldap_search($this->_ds, $userdn, 'uid=*', $attribs);
>> ---
>>
>>
>>>        // get the vacation message and the vacation status
>>>        $searchAttrs = array($this->_params[$realm]['vacation'], 
>>> $this->_params[$realm]['active']);
>>>        $sr = ldap_search($this->_ds, $userdn, 
>>> $this->_params[$realm]['uid'].'=*', $searchAttrs);
>>>
>>>
>>>
>> 253,254c328,330
>> <         $value = ldap_get_values($this->_ds, $entry, $attribs[0]);
>> <         if ($value['count'] == 0) {
>> ---
>>
>>
>>>        $retAttrs = ldap_get_attributes($this->_ds, $entry);
>>>        if (!$retAttrs) {
>>>
>>>
>> 257,260c333,340
>> <         $retval['message'] = $value[0];
>> <         $value = ldap_get_values($this->_ds, $entry, $attribs[1]);
>> <         if ($value['count'] == 0) {
>> <             return false;
>> ---
>>
>>
>>>        // set default values
>>>        $vacationInfo['message']  = '';
>>>        $vacationInfo['vacation'] = $this->_params[$realm]['disabled'];
>>>
>>>        // are there any returned attributes / values?
>>>        if (isset($retAttrs[$this->_params[$realm]['vacation']])) {
>>>            $vacationInfo['message'] = 
>>> $retAttrs[$this->_params[$realm]['vacation']][0];
>>>
>>>
>> 262,263c342,347
>> <         $retval['vacation'] = $value[0];
>> <         return $retval;
>> ---
>>
>>
>>>        if (isset($retAttrs[$this->_params[$realm]['active']])) {
>>>            $vacationInfo['vacation'] = 
>>> $retAttrs[$this->_params[$realm]['active']][0];
>>>        }
>>>
>>>        return $vacationInfo;
>>>
>>>
>> 305c389
>> <         $newDetails[$this->_params[$realm]['active']] = 'N';
>> ---
>>
>>
>>>        $newDetails[$this->_params[$realm]['active']] = 
>>> $this->_params[$realm]['disabled'];
>>>
>>>
>> 310a395,396
>>
>>
>>>        $res_alias = $this->_unsetVacationAlias($user, $realm, $userdn);
>>>
>>>
>>>
>> 313,314c399
>> <
>> <         return true;
>> ---
>>
>>
>>>        return $res_alias;
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> <?php
>>> /**
>>> * $Horde: vacation/lib/Driver/ldap.php,v 1.6 2005/01/03 14:35:41 jan Exp $
>>> *
>>> * Copyright 2001-2005 Eric Rostetter <eric.rostetter at physics.utexas.edu>
>>> *
>>> * See the enclosed file LICENSE for license information (BSD). If you
>>> * did not receive this file, see http://www.horde.org/bsdl.php.
>>> *
>>> * Vacation_Driver_ldap:: implements the Vacation_Driver API for 
>>> LDAP-compliant
>>> * mail servers (such as Exim).
>>> *
>>> * Parameters:
>>> * (required)
>>> *   host       - hostname of the LDAP server
>>> *   port       - port number of the LDAP service
>>> *   basedn     - base DN of the user directory
>>> *   uid        - attribute to use for uid
>>> *   vacation   - attribute to use for storing the vacation message
>>> *   active     - attribute which determines if the vacation message 
>>> is active
>>> * (optional)
>>> *   userdn     - another way of specifying the user DN (instead of
>>> *                constructing it from uid+basedn).
>>> *   version    - Protocol version for the LDAP server (PHP defaults
>>> *                to version 2. OpenLDAP >= 2.1.4 uses version 3, and
>>> *                so must be set explicitly).
>>> *
>>> * @author  Eric Rostetter <eric.rostetter at physics.utexas.edu>
>>> * @version $Revision: 1.6 $
>>> * @package Vacation
>>> */
>>> class Vacation_Driver_ldap extends Vacation_Driver {
>>>
>>>    /** Pointer to the ldap connection. */
>>>    var $_ds;
>>>
>>>    /** Hash containing connection parameters. */
>>>    var $_params;
>>>
>>>    /** The error string returned to the user if an error occurs. */
>>>    var $err_str;
>>>
>>>    /**
>>>     * Constructs a new ftp dot-forward Vacation_Driber object.
>>>     *
>>>     * @param array  $params    A hash containing connection parameters.
>>>     */
>>>    function Vacation_Driver_ldap($params = array())
>>>    {
>>>        $this->_params = $params;
>>>        $this->params = array_merge($this->params, $this->_params);
>>>    }
>>>
>>>    /**
>>>     * Do an ldap connect and bind as the guest user or as the 
>>> optional userdn.
>>>     *
>>>     * @param    $userdn      The optional dn to use when binding 
>>> non-anonymously.
>>>     * @param    $oldpassword The optional password for $userdn.
>>>     *
>>>     * @return   boolean   True or False based on success of connect 
>>> and bind.
>>>     *
>>>     */
>>>    function _connect($userdn = null, $password = null, $realm = 'default')
>>>    {
>>>        $this->_ds = ldap_connect($this->_params[$realm]['host'], 
>>> $this->_params[$realm]['port']);
>>>        if (!$this->_ds) {
>>>            return PEAR::raiseError(_("Could not connect to ldap server"));
>>>        }
>>>        if (array_key_exists('version', $this->_params[$realm])) {
>>>             ldap_set_option($this->_ds, LDAP_OPT_PROTOCOL_VERSION,
>>> 					$this->_params[$realm]['version']);
>>>        }
>>>
>>>        if (!is_null($userdn)) {
>>>            $result = @ldap_bind($this->_ds, $userdn, $password);
>>>        } else {
>>>            $result = @ldap_bind($this->_ds);
>>>        }
>>>
>>>        if (!$result) {
>>>            return PEAR::raiseError(_("Could not bind to ldap server"));
>>>        }
>>>
>>>        return true;
>>>    }
>>>
>>>    /**
>>>     * Close the ldap connection.
>>>     */
>>>    function _disconnect()
>>>    {
>>>        @ldap_close($this->_ds);
>>>    }
>>>
>>>    /**
>>>     * Check if the realm has a specific configuration.  If not, try to fall
>>>     * back on the default configuration.  If still not a valid 
>>> configuration
>>>     * then exit with an error.
>>>     *
>>>     * @param string    $realm      The realm of the user, or 
>>> "default" if none.
>>>     *                              Note: passed by reference so we 
>>> can change
>>>     *                              it's value!
>>>     *
>>>     */
>>>    function checkConfig(&$realm)
>>>    {
>>>        // If no realm passed in, or no host config for the realm passed in,
>>>        // then we fall back to the default realm
>>>        if (empty($realm) || empty($this->_params[$realm]['server'])) {
>>>            $realm = 'default';
>>>        }
>>>
>>>        // If still no host/port, then we have a misconfigured module.
>>>        if (empty($this->_params[$realm]['host']) ||
>>>            empty($this->_params[$realm]['port']) ) {
>>>            $this->err_str = _("The module is not properly configured!");
>>>            return false;
>>>        }
>>>        return true;
>>>    }
>>>
>>>    /**
>>>     * Lookup and return the user's dn.
>>>     *
>>>     * @param  $user     The username of the user.
>>>     * @param  $realm    The realm (domain) name of the user.
>>>     * @param  $basedn   The ldap basedn.
>>>     * @param  $uid      The ldap uid.
>>>     *
>>>     * @return string    The ldap dn for the user.
>>>     */
>>>    function _lookupdn($user, $realm)
>>>    {
>>>        // bind as guest
>>>        $this->_connect();
>>>
>>>        // construct search
>>>        $search = $this->_params[$realm]['uid'] . '=' . $user;
>>>        if (!empty($this->_params[$realm]['realm'])) {
>>>            $search .= '@' . $this->_params[$realm]['realm'];
>>>        }
>>>        // get userdn
>>>        $result = ldap_search($this->_ds, 
>>> $this->_params[$realm]['basedn'], $search);
>>>        $entry = ldap_first_entry($this->_ds, $result);
>>>        if ($entry === false) {
>>>            $this->_disconnect();
>>>            return PEAR::raiseError(_("User not found."));
>>>        }
>>>        $userdn = ldap_get_dn($this->_ds, $entry);
>>>
>>>        // disconnect from ldap server
>>>        $this->_disconnect();
>>>
>>>        return $userdn;
>>>    }
>>>
>>>    /**
>>>     * Set the vacation notice up.
>>>     * @param string    $user       The username to enable vacation for.
>>>     * @param string    $realm      The realm of the user.
>>>     * @param string    $target     The message to install.
>>>     * @return boolean  Returns true on success, false on error.
>>>     */
>>>    function setVacation($user, $realm, $pass, $message)
>>>    {
>>>        // Make sure the configuration file is correct
>>>        if (!$this->checkConfig($realm)) {
>>>            return false;
>>>        }
>>>
>>>        // get the user's dn
>>>        if (array_key_exists('userdn', $this->_params[$realm])) {
>>>            $userdn = $this->_params[$realm]['userdn'];
>>>        } else {
>>>            $userdn = $this->_lookupdn($user, $realm);
>>>            if (is_a($userdn, 'PEAR_Error')) {
>>>                return $userdn;
>>>            }
>>>        }
>>>
>>>        // connect as the user
>>>        $res = $this->_connect($userdn, $pass, $realm);
>>>        if (is_a($res, 'PEAR_Error')) {
>>>            $this->err_str = $res->getMessage();
>>>            $this->err_str .= ' - ' .  _("Check your password");
>>>            return false;
>>>        }
>>>
>>>        // Prepare the message. \n->\n\n and UTF-8 encode.
>>>        $message = str_replace("\r\n", "\\n", $message);
>>>        $messageEncoding = $this->_detectEncoding($message);
>>>
>>>        // encode if necessary
>>>        if ($messageEncoding != 'UTF-8') {
>>>            $message = mb_convert_encoding($message, 'UTF-8', 
>>> $messageEncoding);
>>>        }
>>>
>>>        // change the user's vacation.
>>>        $newDetails[$this->_params[$realm]['vacation']] = $message;
>>>        $newDetails[$this->_params[$realm]['active']] = 
>>> $this->_params[$realm]['enabled'];
>>>        $res = ldap_mod_replace($this->_ds, $userdn, $newDetails);
>>>        if (!$res) {
>>>            $res = PEAR::raiseError(ldap_error($this->_ds));
>>>            $this->_disconnect();
>>>            return false;
>>>        }
>>>
>>>        $res_alias = $this->_setVacationAlias($user, $realm, $userdn);
>>>
>>>        // disconnect from ldap server
>>>        $this->_disconnect();
>>>
>>>        return $res_alias;
>>>    }
>>>
>>>    /**
>>>     * Try to detect the character encoding of a string.
>>>     *
>>>     * @access private
>>>     *
>>>     * @param string $string   Input string for detection
>>>     *
>>>     *
>>>     * @return string  Character encoding (see link below)
>>>     * @link http://www.php.net/manual/en/ref.mbstring.php
>>>     */
>>>    function _detectEncoding($string)
>>>    {
>>>        // try popular defaults first
>>>        if (!$encoding = mb_detect_encoding($string, 'UTF-8, 
>>> ISO-8859-1', true)) {
>>>            // no UTF-8 nor ISO-8859-1, try whatever it's defined as 'auto'
>>>            if (!$encoding = mb_detect_encoding($string, 'auto', true)) {
>>>                // still unrecognised encoding, use the charset for 
>>> the current language
>>>                $encoding = NLS::getCharset();
>>>            }
>>>        }
>>>        return $encoding;
>>>    }
>>>
>>>
>>>    /**
>>>     * Set/create vacation mail alias
>>>     *
>>>     * Some mta/ldap/vacation implementations requires an extra mail alias
>>>     * (ex. user at example.org -> user at example.org, 
>>> user at autoreply.exmaple.org)
>>>     *
>>>     * You should override this method in your extended ldap driver class,
>>>     * if you need this feature.
>>>     *
>>>     * @access private
>>>     *
>>>     * @param string $user   The username to enable vacation for
>>>     * @param string $realm  The realm for the current user
>>>     * @param string $userdn The LDAP DN for the current user
>>>     *
>>>     * @return boolean  true on success, otherwise false :)
>>>     */
>>>    function _setVacationAlias($user, $realm, $userdn)
>>>    {
>>>        return true;
>>>    }
>>>
>>>
>>>    /**
>>>     * Unset/remove vacation mail alias
>>>     *
>>>     * @access private
>>>     *
>>>     * @return boolean  true on success, otherwise false :)
>>>     * @see _setVacationAlias()
>>>     */
>>>    function _unsetVacationAlias($user, $realm, $userdn)
>>>    {
>>>        return true;
>>>    }
>>>
>>>
>>>    function _getUserDetails($user, $realm = 'default', $pass)
>>>    {
>>>        // Make sure the configuration file is correct.
>>>        if (!$this->checkConfig($realm)) {
>>>            return false;
>>>        }
>>>
>>>        // Get the user's dn.
>>>        if (array_key_exists('userdn', $this->_params[$realm])) {
>>>            $userdn = $this->_params[$realm]['userdn'];
>>>        } else {
>>>            $userdn = $this->_lookupdn($user, $realm);
>>>            if (is_a($userdn, 'PEAR_Error')) {
>>>                return $userdn;
>>>            }
>>>        }
>>>
>>>        // Connect as the user.
>>>        $res = $this->_connect($userdn, $pass, $realm);
>>>        if (is_a($res, 'PEAR_Error')) {
>>>            $this->_disconnect();
>>>            if ($res->getMessage() == _("Could not bind to ldap server")) {
>>>                return PEAR::raiseError(_("Incorrect Password"));
>>>            }
>>>            return $res;
>>>        }
>>>
>>>        $vac = $this->_getVacation($userdn, $realm);
>>>
>>>        // Prepare the message. \n->\n\n and UTF-8 decode.
>>>        $vac['message'] = str_replace("\\\\n", "\r\n", $vac['message']);
>>>        $outputEncoding = NLS::getCharset();
>>>
>>>        // decode if necessary
>>>        if ($outputEncoding != 'UTF-8') {
>>>            $vac['message'] = mb_convert_encoding($vac['message'], 
>>> $outputEncoding, 'UTF-8');
>>>        }
>>>        return $vac;
>>>    }
>>>
>>>    function _getVacation($userdn, $realm)
>>>    {
>>>        // get the vacation message and the vacation status
>>>        $searchAttrs = array($this->_params[$realm]['vacation'], 
>>> $this->_params[$realm]['active']);
>>>        $sr = ldap_search($this->_ds, $userdn, 
>>> $this->_params[$realm]['uid'].'=*', $searchAttrs);
>>>
>>>        $entry = ldap_first_entry($this->_ds, $sr);
>>>        if (!$entry) {
>>>            return false;
>>>        }
>>>
>>>        $retAttrs = ldap_get_attributes($this->_ds, $entry);
>>>        if (!$retAttrs) {
>>>            return false;
>>>        }
>>>
>>>        // set default values
>>>        $vacationInfo['message']  = '';
>>>        $vacationInfo['vacation'] = $this->_params[$realm]['disabled'];
>>>
>>>        // are there any returned attributes / values?
>>>        if (isset($retAttrs[$this->_params[$realm]['vacation']])) {
>>>            $vacationInfo['message'] = 
>>> $retAttrs[$this->_params[$realm]['vacation']][0];
>>>        }
>>>
>>>        if (isset($retAttrs[$this->_params[$realm]['active']])) {
>>>            $vacationInfo['vacation'] = 
>>> $retAttrs[$this->_params[$realm]['active']][0];
>>>        }
>>>
>>>        return $vacationInfo;
>>>    }
>>>
>>>    /**
>>>     * Deactivate the vacation notice.
>>>     * NB: This does not delete the vacation message, just marks it as
>>>     * disabled.
>>>     *
>>>     * @param string    $user       The user to disable vacation 
>>> notices for.
>>>     * @param string    $realm      The realm of the user.
>>>     * @param string    $pass       The password of the user.
>>>     *
>>>     * @return boolean  Returns true on success, false on error.
>>>     */
>>>    function unsetVacation($user, $realm, $pass)
>>>    {
>>>        // Make sure the configuration file is correct.
>>>        if (!$this->checkConfig($realm)) {
>>>            return false;
>>>        }
>>>
>>>        // Get the user's dn.
>>>        if (isset($this->_params[$realm]['userdn'])) {
>>>            $userdn = $this->_params[$realm]['userdn'];
>>>        } else {
>>>            $userdn = $this->_lookupdn($user, $realm);
>>>            if (is_a($userdn, 'PEAR_Error')) {
>>>                return $userdn;
>>>            }
>>>        }
>>>
>>>        // Connect as the user.
>>>        $res = $this->_connect($userdn, $pass, $realm);
>>>        if (is_a($res, 'PEAR_Error')) {
>>>            $this->_disconnect();
>>>            if ($res->getMessage() == _("Could not bind to ldap server")) {
>>>                return PEAR::raiseError(_("Incorrect Password"));
>>>            }
>>>            return $res;
>>>        }
>>>
>>>        // Set the vacation message to inactive.
>>>        $newDetails[$this->_params[$realm]['active']] = 
>>> $this->_params[$realm]['disabled'];
>>>        $res = ldap_mod_replace($this->_ds, $userdn, $newDetails);
>>>        if (!$res) {
>>>            $res = PEAR::raiseError(ldap_error($this->_ds));
>>>        }
>>>
>>>        $res_alias = $this->_unsetVacationAlias($user, $realm, $userdn);
>>>
>>>        // Disconnect from LDAP server.
>>>        $this->_disconnect();
>>>        return $res_alias;
>>>    }
>>>
>>> }
>>>
>>>
>
> --
> Sork mailing list - Join the hunt: http://horde.org/bounties/#sork
> Frequently Asked Questions: http://horde.org/faq/
> To unsubscribe, mail: sork-unsubscribe at lists.horde.org
>
>



Jan.

-- 
Do you need professional PHP or Horde consulting?
http://horde.org/consulting/


More information about the sork mailing list