5.2.20
04/05/20
Last Modified 01/16/06 by Walter Tasin
Horde/ImapSelectByRealm Reload Page

Attachments

 horde-conf.png

IMAP-Server-Auswahl über den Usernamen

Einführung

Wenn ein Webportal zur Authentifizierung gegen zwei unterschiedliche IMAP-Server verwendet wird, so wird meist der realm-Wert in imp/config/servers.php verwendet, um Konflikte im Benutzernamen ausschließen zu können.
Damit ist es aber nötig, den Server gegen den authentifiziert wird explizit auszuwählen (z. B. über eine Listbox oder direkte Eingabe in ein Textfeld).
Dieses Dokument beschreibt, wie die Serverauswahl über den Benutzernamen durchgeführt werden kann.

Voraussetzungen

  • Als Authentifizierungsmechanismus wird IMP verwendet.
  • Es wird ein Mailserver verwendet, der einen Benutzernamen ohne Domänenzusatz
    zur Authentifizierung verwendet. (z. B. UW-IMAP)
  • Es sind in imp/config/servers.php mehrere Server eingetragen.
    der Defaultserver verwendet als realm den Leerstring.
    Bemerkung: Als Defaultserver wird entweder der erste Server der Liste oder der Servereintrag mit gesetztem preferred-Wert erkannt.
  • Als realm-Werte werden nur Kleinbuchstaben verwendet
    z. B. server1.example.com

Beispielauszug einer imp/config/servers.php

/* Example configurations: */

$servers['imap'] = array(
    'name' => 'IMAP Server',
    'server' => 'imap.example.com',
    'hordeauth' => true,
    'protocol' => 'imap/notls',
    'port' => 143,
    'maildomain' => 'example.com',
    'smtphost' => 'smtp.example.com',
    'smtpport' => 25,
    'realm' => '',
    'preferred' => '',
);

$servers['imap1'] = array(
    'name' => 'IMAP Server 1',
    'server' => 'imap1.example.com',
    'hordeauth' => true,
    'protocol' => 'imap/ssl/novalidate-cert',
    'port' => 993,
    'maildomain' => 'example.com',
    'smtphost' => 'smtp.example.com',
    'smtpport' => 25,
    'realm' => 'imap1.example.com',
    'preferred' => '',
);

Die für die Betrachtung relevanten Felder sind: realm, hordeauth und ggf. preferred zur Kennzeichnung des Defaultservers.

Funktion des realm-Wertes

Meldet sich der Anwender mueller am Server imap.example.com an, so verwendet Horde den Usernamen mueller für das Portal. (Verwendung des Defaultservers mit realm => '')
Wird stattdessen der Server imap1.example.com verwendet, so verwendet Horde den Usernamen mit realm-Wert mueller@imap1.example.com, um einen Benutzerkonflikt ausschließen zu können.

Normalerweise wird der Server über eine Listbox ausgewählt, um den Server jedoch direkt über den Usernamen den Horde intern verwendet (z. B. mueller@imap1.example.com) adressieren zu können, wird folgender Hook implementiert.

Der Preauthenticate-Hook

Um eine solche Anmeldung zu ermöglichen, muss folgende Funktion in config/hooks.php hinzugefügt werden:

if (!function_exists('_horde_hook_preauthenticate')) {
    function _horde_hook_preauthenticate($userID, $credential, $realm)
    {
        require dirname(__FILE__) . '/../imp/config/servers.php';

        // Convert all to lower chars (even the possible domain part)
        $userID=strtolower($userID);
        // Strip domain part from user, if it exists.
        if (($domainpart = strpos($userID, '@'))) {
          $server=substr($userID, $domainpart+1);
          $userID=substr($userID, 0, $domainpart);
          // Change the values only if a domain part was found ...
          if (!empty($server)) {
            foreach ($servers as $serverkey => $curServer) {
              if (!empty($curServer['realm']) && $server == $curServer['realm']) {
                // We found an entry, now set IMAP server values.
                foreach (array('server', 'folders', 'namespace',
                  'protocol', 'port', 'smtphost', 'smtpport', 'maildomain') as $key) {
                  if (isset($servers[$serverkey][$key])) {
                    $_SESSION['imp'][$key] = $servers[$serverkey][$key];
                  }
                }
                // Now use only the stripped version of the userID to logon to the server
                $_SESSION['imp']['user'] = $userID;
                // Setup the correct base_protocol
                $_SESSION['imp']['base_protocol'] = $_SESSION['imp']['protocol'];
                if (($pos = strpos($_SESSION['imp']['protocol'], '/'))) {
                  $_SESSION['imp']['base_protocol'] = substr($_SESSION['imp']['protocol'], 0, $pos);
                }
              }
            }
          }
        }
        return true;
    }
}

Zuletzt muss noch die Funktion in config/conf.php aktiviert werden:

  • Dies geschieht am besten über die Konfiguration der Administrationsoberfläche von Horde.

horde-conf.png

  • oder über direkte Manipulation der Datei config/conf.php.

...
$conf['hooks']['preauthenticate'] = true;
...