[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