getIdentityFromLdap() - Connected to LDAP")); ldap_set_option($ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldap_conn, LDAP_OPT_REFERRALS, 0); $ldap_bind = ldap_bind($ldap_conn, IMAP_FROM_LDAP_USER, IMAP_FROM_LDAP_PASSWORD); if ($ldap_bind) { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromLdap() - Authenticated in LDAP")); $filter = str_replace('#username', $username, str_replace('#domain', $domain, IMAP_FROM_LDAP_QUERY)); ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromLdap() - Searching From with filter: %s", $filter)); $search = ldap_search($ldap_conn, IMAP_FROM_LDAP_BASE, $filter, unserialize(IMAP_FROM_LDAP_FIELDS)); $items = ldap_get_entries($ldap_conn, $search); if ($items['count'] > 0) { $ret_value = $identity; ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromLdap() - Found entry in LDAP. Generating From")); // We get the first object. It's your responsability to make the query unique foreach (unserialize(IMAP_FROM_LDAP_FIELDS) as $field) { $ret_value = str_replace('#'.$field, $items[0][$field][0], $ret_value); } if ($encode) { $ret_value = encodeFrom($ret_value); } } else { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromLdap() - No entry found in LDAP")); } } else { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromLdap() - Not authenticated in LDAP server")); } } else { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromLdap() - Not connected to LDAP server")); } } catch(Exception $ex) { ZLog::Write(LOGLEVEL_WARN, sprintf("BackendIMAP->getIdentityFromLdap() - Error getting From value from LDAP server: %s", $ex)); } if ($ldap_conn != null) { ldap_close($ldap_conn); } return $ret_value; } /** * Generate the "From" value stored in a SQL Database * * @access private * @params string $username username value * @params string $domain domain value * @return string */ function getIdentityFromSql($username, $domain, $identity, $encode = true) { $ret_value = $username; $dbh = $sth = $record = null; try { $dbh = new PDO(IMAP_FROM_SQL_DSN, IMAP_FROM_SQL_USER, IMAP_FROM_SQL_PASSWORD, unserialize(IMAP_FROM_SQL_OPTIONS)); ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromSql() - Connected to SQL Database")); $sql = str_replace('#username', $username, str_replace('#domain', $domain, IMAP_FROM_SQL_QUERY)); ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromSql() - Searching From with filter: %s", $sql)); $sth = $dbh->prepare($sql); $sth->execute(); $record = $sth->fetch(PDO::FETCH_ASSOC); if ($record) { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromSql() - Found entry in SQL Database. Generating From")); $ret_value = $identity; foreach (unserialize(IMAP_FROM_SQL_FIELDS) as $field) { $ret_value = str_replace('#'.$field, $record[$field], $ret_value); } if ($encode) { $ret_value = encodeFrom($ret_value); } } else { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromSql() - No entry found in SQL Database")); } } catch(PDOException $ex) { ZLog::Write(LOGLEVEL_WARN, sprintf("BackendIMAP->getIdentityFromSql() - Error getting From value from SQL Database: %s", $ex)); } $dbh = $sth = $record = null; return $ret_value; } /** * Generate the "From" value from the local posix passwd database * * @access private * @params string $username username value * @params string $domain domain value * @return string */ function getIdentityFromPasswd($username, $domain, $identity, $encode = true) { $ret_value = $username; try { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromPasswd() - Fetching info for user %s", $username)); $local_user = posix_getpwnam($username); if ($local_user) { $tmp = $local_user['gecos']; $tmp = explode(',', $tmp); $name = $tmp[0]; unset($tmp); switch ($identity) { case 'FROM': if (strlen($domain) > 0) { $ret_value = sprintf("%s <%s@%s>", $name, $username, $domain); } else { ZLog::Write(LOGLEVEL_WARN, sprintf("BackendIMAP->getIdentityFromPasswd() - No domain passed. Cannot construct From address.")); } break; case 'FULLNAME': $ret_value = sprintf("%s", $name); break; } if ($encode) { $ret_value = encodeFrom($ret_value); } } else { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getIdentityFromPasswd() - No entry found in Password database")); } } catch(Exception $ex) { ZLog::Write(LOGLEVEL_WARN, sprintf("BackendIMAP->getIdentityFromPasswd() - Error getting From value from passwd database: %s", $ex)); } return $ret_value; } /** * Encode the From value as Base64 * * @access private * @param string $from From value * @return string */ function encodeFrom($from) { $items = explode("<", $from); $name = trim($items[0]); return "=?UTF-8?B?" . base64_encode($name) . "?= <" . $items[1]; }