[PHP] Horde/IMP authenticatie-probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tachyon
  • Registratie: Januari 2000
  • Laatst online: 10-08 23:05

Tachyon

pop the glock

Topicstarter
Op ons intranet draait al een tijdje Horde/IMP om mensen webmail aan te kunnen bieden. Werkt prima.

Nu ben ik bezig met het opzetten van een nieuwe server onder Debian. Op de huidige machine draait RedHat 7.2 met een redelijk oude versie van IMP, namelijk 2.2.5.
Op www.horde.org staat dat 2.2.5 sterk wordt afgeraden vanwege allerlei security-issues, wat 1 van de redenen is om te upgraden naar een hogere versie van IMP, in casu 3.1.

Het probleem is nu dat het oude script wat we gebruikten om in te loggen bij IMP niet meer werkt. Dat script is destijds geschreven door een collega om ervoor te zorgen dat users niet 2x hoeven in te loggen, zowel op het intranet en vervolgens op IMP. Het doet niet veel meer dan een username en password uit onze database halen en doorsturen naar de inlogvelden van IMP.

Het script:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 ?php

    include "/www/domeinen/etin.intranet.nl/shared/mysql.inc";
    mysql_select_db("intranet",$conn);
    $naamquery=mysql_query("SELECT wachtwoord,mailnaam FROM medewerker WHERE user='".strtoupper($naam)."'",$conn);
    $wachtwoord=mysql_result($naamquery,0,"wachtwoord");
    $mailnaam=mysql_result($naamquery,0,"mailnaam");
    if ($waar=="intern"){
    header("location: /horde2/imp/index.php?imapuser=".$mailnaam."&pass=".$wachtwoord);
    }elseif($waar=="extern"){
    header("location: /horde2/imp/index.php?imapuser=".$mailnaam."&pass=".$wachtwoord);
    }

    include "/www/domeinen/etin.intranet.nl/shared/intranet.fnc";
    $user = getUser($REMOTE_ADDR);
    $void = logActie($user,"mailbox bekijken","mail");

?>


De foutmelding die IMP geeft is:
Aanmelding mislukt. Waarschijnlijk heeft u uw gebruikersnaam of wachtwoord verkeerd ingevoerd.
De usernaam staat mooi ingevuld, maar het passwordveld blijft leeg. Als ik daar dan vervolgens het password inklop gaat alles gewoon goed. Dus het lijkt erop dat de waarde van het password niet goed in het formulier terechtkomt :?

Ik heb al op de site van Horde/IMP gekeken, maar daar kan ik niets vinden, omdat er staat dat dit soort dingen buiten de applicatie zelf vallen (en dat is ook zo).

Volgens mij moet het probleem vrij eenvoudig te fixen zijn, maar ik ben zelf uber PHP-n00b, dus ik zou niet weten hoe. En je raadt het al, die collega is inmiddels vertrokken.... :+

If we do not change our direction, we will likely end up where we are heading.


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Kijk eens of het password veld op het inlogform nog steeds "pass" heet, zo niet, verander dan "pass" in de header() statements naar de goede naam.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Tachyon
  • Registratie: Januari 2000
  • Laatst online: 10-08 23:05

Tachyon

pop the glock

Topicstarter
Daar had ik al naar gekeken en voor zover ik kan zien, is dit het geval. Er wordt gesproken over een $imapuser en een $pass.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
/*
 * $Horde: imp/redirect.php,v 1.23.2.18 2003/06/14 15:13:38 chuck Exp $
 *
 * Copyright 1999-2003 Charles J. Hagenbuch <chuck@horde.org>
 * Copyright 1999-2003 Jon Parise <jon@horde.org>
 *
 * See the enclosed file COPYING for license information (GPL).  If you
 * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
 */

/**
 * Get the initial URL.
 *
 * @param integer $actionID  The action ID to perform on the initial page.
 *
 * @return string  The initial URL.
 */
function _getInitialUrl($actionID)
{
    global $prefs;

    $url = $prefs->getValue('initial_page');
    if ($url != 'folders.php') {
        $url = 'mailbox.php';
        $url = IMP::addParameter($url, 'actionID=' . $actionID);
        $url = IMP::addParameter($url, 'mailbox=' . urlencode(IMP::addPreambleString($prefs->getValue('initial_page'))));
        $url = IMP::addParameter($url, IMP::getComposeArgs());
    }

    return Horde::applicationUrl($url, true);
}


@define('IMP_BASE', dirname(__FILE__));
require_once IMP_BASE . '/lib/base.php';


if (Horde::getFormData('action') == 'compose') {
    $actionID = LOGIN_COMPOSE;
} else {
    $actionID = Horde::getFormData('actionID', IMP_LOGIN);
}

$imapuser = Horde::getFormData('imapuser');
$pass = Horde::getFormData('pass');

/* If we already have a session... */
if (array_key_exists('imp', $_SESSION) && is_array($_SESSION['imp'])) {
    /* Make sure that if a username was specified, it is the current username */
    if ((is_null($imapuser) || ($imapuser == $_SESSION['imp']['user'])) &&
        (is_null($pass) || ($pass == Secret::read(Secret::getKey('imp'), $_SESSION['imp']['pass'])))) {

        $imp = &$_SESSION['imp'];
        if (!empty($_SESSION['imp']['_login'])) {
            IMP::authenticate(OP_HALFOPEN);
            IMP::loginTasks();
        }

        if ($actionID == IMP_LOGIN) {
            $actionID = null;
        }

        header('Location: ' . _getInitialUrl($actionID));
        exit;
    } else {
        /* Disable the old session. */
        $imp = false;
        session_unregister('imp');
        header('Location: ' . Horde::applicationUrl(IMP::logoutUrl('login.php', 'failed'), true));
        exit;
    }
}

/* Create a new session if we're given the proper parameters. */
if (!is_null($imapuser) && !is_null($pass)) {

    if (!Horde::getFormData('mailbox')) {
        $_POST['mailbox'] = 'INBOX';
    }

    /* Destroy any existing session on login and make sure to use
       a new session ID, to avoid session fixation issues.
       This requires Horde 2.2.4 or higher. */
    if (in_array('getcleansession', get_class_methods('Horde')) &&
        ($registry->getMethod('auth/login') == 'imp')) {
        Horde::getCleanSession();
    }

    if (($reason = IMP::createSession()) === true) {   
        $imp['_login'] = true;
        $entry = sprintf('Login success for %s [%s] to {%s:%s}', $imp['uniquser'], $_SERVER['REMOTE_ADDR'], $imp['server'], $imp['port']);
        Horde::logMessage($entry, __FILE__, __LINE__, LOG_NOTICE);

        if (($horde_language = Horde::getFormData('new_lang'))) {
            $_SESSION['horde_language'] = $horde_language;
        }

        if (Horde::getFormData('url')) {
            $imp['direct_access'] = false;
        } else {
            $imp['direct_access'] = true;
        }

        IMP::loginTasks();

        if (Horde::getFormData('url')) {
            $url = Horde::getFormData('url');
            $url = IMP::addParameter($url, 'actionID=' . $actionID);
        } else {
            $url = _getInitialUrl($actionID);
        }
        header('Location: ' . $url);
        exit;
    } else {
        header('Location: ' . Horde::applicationUrl(IMP::logoutUrl('login.php', $reason), true));
        exit;
    }
}

/* No session, and no login attempt. Just go to the login page. */
require IMP_BASE . '/login.php';


Hierin wordt ook gesproken over een $actionID en nog wat gedoe met sessions wat ik niet begrijp.

If we do not change our direction, we will likely end up where we are heading.


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Roep het login form eens op in je browser en kijk wat die doorgeeft aan de server. Doe vervolgens hetzelfde in je script.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Lancer
  • Registratie: Januari 2002
  • Laatst online: 20-09 20:25

Lancer

What the......

Is het niet zo dat je nu in de Horde configuratie kunt aangeven dat je IMP moet gebruiken voor authenticatie voor het hele framework.

Ik draai zelf horde-cvs (met imp 4) daar is het i.i.g. wel zo. Ik zou ff de docu induiken. Volgens mij staat het in de install docu.

Je hebt je eigen script dus volgens mij niet meer nodig.

[ Voor 11% gewijzigd door Lancer op 09-01-2004 13:35 ]

Je kunt niet in een systeem meten zonder het systeem te beinvloeden.... (gevolg van de Heisenberg onzekerheidsrelatie)


Acties:
  • 0 Henk 'm!

  • Tachyon
  • Registratie: Januari 2000
  • Laatst online: 10-08 23:05

Tachyon

pop the glock

Topicstarter
Lancer schreef op 09 januari 2004 @ 13:35:
Is het niet zo dat je nu in de Horde configuratie kunt aangeven dat je IMP moet gebruiken voor authenticatie voor het hele framework.

Ik draai zelf horde-cvs (met imp 4) daar is het i.i.g. wel zo. Ik zou ff de docu induiken. Volgens mij staat het in de install docu.

Je hebt je eigen script dus volgens mij niet meer nodig.
Dat is ook zo en dat werkt ook :)
Het probleem is alleen dat op ons Intranet ook ingelogd moet worden. Dus in feite 3x. En juist die verbinding werkt niet (meer).
Gerco schreef op 09 januari 2004 @ 13:25:
Roep het login form eens op in je browser en kijk wat die doorgeeft aan de server. Doe vervolgens hetzelfde in je script.
Dat zal ik eens gaan proberen. Het probleem is een beetje dat er 3 verschillende bestanden gebruikt worden die allemaal met elkaar verbonden zijn: index.php, die verwijst vervolgens naar redirect.php, waar weer login.php wordt aangeroepen.

Om het makkelijk te maken denk ik... :+

Welke moet ik dan gebruiken om in mijn browser te openen en te zien wat die doorgeeft aan de server?

If we do not change our direction, we will likely end up where we are heading.


Acties:
  • 0 Henk 'm!

  • Lancer
  • Registratie: Januari 2002
  • Laatst online: 20-09 20:25

Lancer

What the......

Zoals ik het thuis gedaan heb is in motd.php van IMP met een stukje gecombineerde PHP en Javascript het PHP_AUTH_..... uitgelezen en met javascript ingevuld in de login velden gevolgd door een submit.

Je ziet dan wel het inlogvenster, maar je wordt automatisch ingelogd. De namen van de form velden ken je makkelijk met je browser achterhalen

Je kunt niet in een systeem meten zonder het systeem te beinvloeden.... (gevolg van de Heisenberg onzekerheidsrelatie)


Acties:
  • 0 Henk 'm!

  • Tachyon
  • Registratie: Januari 2000
  • Laatst online: 10-08 23:05

Tachyon

pop the glock

Topicstarter
Waarom juist in motd.php? Is dat niet iets van Message of the Day ofzo?

En ik wil het best proberen, maar zoals gezegd ben ik een PHP-n00b, kan eigenlijk helemaal niet programmeren in the first place... Maar dat is geen excuus natuurlijk...

Ik had gehoopt dat het met een simpele aanpassing van het bestaande script wel zou moeten kunnen, maar dat blijkt dus lastiger te zijn dan ik verwachtte. Misschien moet ik mijn ex-collega maar eens een mailtje sturen.

If we do not change our direction, we will likely end up where we are heading.


Acties:
  • 0 Henk 'm!

  • Lancer
  • Registratie: Januari 2002
  • Laatst online: 20-09 20:25

Lancer

What the......

Tachyon schreef op 09 januari 2004 @ 14:44:
Waarom juist in motd.php? Is dat niet iets van Message of the Day ofzo?
......
Yep, het is dan ook eigenlijk misbruik van dat script, maar het werkt wel. motd.php wordt geladen nadat de form op het scherm gezet is. Je kunt dan de authenticatie van de browser uitlezen en in de velden stoppen.

Mijn motd.php
PHP:
1
2
3
4
5
6
7
8
<?php
# Autologin script, based on HTTP authentication
echo "<script language=\"JavaScript\">";
echo "document.implogin.imapuser.value=\"".$_SERVER['PHP_AUTH_USER']."\";";
echo "document.implogin.pass.value=\"".$_SERVER['PHP_AUTH_PW']."\";";
echo "document.implogin.submit();";
echo "</script>";
?>


De precieze namen van de form velden kun je zien als je de browser vraagt de html source van de pagina te laten zien.

Nogmaals, het is een hack en niet bedoeld om het netjes op te lossen.

[ Voor 11% gewijzigd door Lancer op 10-01-2004 12:13 ]

Je kunt niet in een systeem meten zonder het systeem te beinvloeden.... (gevolg van de Heisenberg onzekerheidsrelatie)


Acties:
  • 0 Henk 'm!

  • Tachyon
  • Registratie: Januari 2000
  • Laatst online: 10-08 23:05

Tachyon

pop the glock

Topicstarter
He bedankt, dit ziet er bruikbaar en relatief simpel te implementeren uit. Ik ga het maandag gelijk proberen! :)

If we do not change our direction, we will likely end up where we are heading.

Pagina: 1