[Zope] PHP w/Zope

Milos Prudek milos.prudek@tiscali.cz
Mon, 07 Jan 2002 19:18:26 +0100


> You posted a question a couple weeks ago looking for a way for
> authenticated Zope users to access IMP without having to
> re-authenticate...I was sort of keeping an eye out for an answer to
> that, since I'd like to do either the same thing or the reverse (have an
> authenticated IMP user be able to access Zope (possibly management
> screens) without having to re-authenticate).
> 
> Did this PPHPDocument product allow for that sort of thing? and if so,
> do you have any tips or samples you could share?

I did get quite far with PHPDocument, but not far enough.

I was able to modify IMP's redirect.php to autologin. Then I made two
very slight modifications to allow redirect.php to run from PHPDocument
(see the source below, the lines marked as [mod for Zope]). It does not
give any errors, but it also does not give any results. Just an empty
page.

The reason, I believe, is because redirect.php writes raw http header
and that is something that PHPDocument cannot handle. 

I CC: this to PHPDocument author in case he would like to look at it.

THE SOURCE OF redirect.php:

<?php
/*
 * $Horde: imp/redirect.php,v 1.23.2.3 2002/01/02 17:05:32 jan Exp $
 *
 * Copyright 1999-2002 Charles J. Hagenbuch <chuck@horde.org>
 * Copyright 1999-2002 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.
 */

// [mod for Zope]
/* define('IMP_BASE', dirname(__FILE__)); */
define('IMP_BASE', '/home/httpd/html/horde/imp');

require_once IMP_BASE . '/lib/base.php';

$HTTP_POST_VARS['imapuser'] = 'milos';
$HTTP_POST_VARS['pass'] = 'secretsecret';
$HTTP_POST_VARS['server'] = 'localhost';
$HTTP_POST_VARS['actionID'] = '105';
$HTTP_POST_VARS['mailbox'] = 'INBOX';
$HTTP_POST_VARS['port'] = '143';
$HTTP_POST_VARS['maildomain'] = 'example.com';
$HTTP_POST_VARS['protocol'] = 'imap';
$HTTP_POST_VARS['realm'] = 'example.com';
$HTTP_POST_VARS['folders'] = 'mail%2F';
$HTTP_POST_VARS['new_lang'] = 'cz_CZ';
$HTTP_POST_VARS['button'] = 'P%F8ihl%E1%B9en%ED+do+syst%E9mu';

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

/* If we already have a session... */
if (isset($HTTP_SESSION_VARS['imp']) &&
is_array($HTTP_SESSION_VARS['imp'])) {
    /* Make sure that if a username was specified, it is the current
username */
    if ((!isset($HTTP_POST_VARS['imapuser']) ||
$HTTP_POST_VARS['imapuser'] == $HTTP_SESSION_VARS['imp']['user']) &&
        (!isset($HTTP_POST_VARS['pass']) || $HTTP_POST_VARS['pass'] ==
Secret::read(Secret::getKey('imp'), $HTTP_SESSION_VARS['imp']['pass'])))
{
        
        if ($actionID == IMP_LOGIN) {
            $actionID = NO_ACTION;
        }
        header('Location: ' .
Horde::applicationUrl('mailbox.php?actionID=' . $actionID, true));
        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 (isset($HTTP_POST_VARS['imapuser']) &&
isset($HTTP_POST_VARS['pass'])) {
    if (!isset($HTTP_POST_VARS['mailbox'])) {
        $HTTP_POST_VARS['mailbox'] = 'INBOX';
    }
    if (($reason = IMP::createSession()) === true) {
        $imp['_login'] = true;


        // [mod for Zope]
        $entry = sprintf('Login success for %s [%s] to {%s:%s}',
                         $imp['user'], '<dtml-var REMOTE_ADDR>',
$imp['server'], $imp['port']);
        Horde::logMessage($entry, __FILE__, __LINE__, LOG_NOTICE);


        if (Horde::getFormData('redirect_url')) {
            header('Location: ' . Horde::getFormData('redirect_url'));
            exit;
        }

        header('Location: ' .
Horde::applicationUrl('mailbox.php?actionID=' . $actionID, true));
        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. */
$uri = 'login.php';
if (!empty($HTTP_SERVER_VARS['QUERY_STRING'])) {
    $uri .= '?' . $HTTP_SERVER_VARS['QUERY_STRING'];
}
header('Location: ' . Horde::applicationUrl($uri, true));
exit;

?>

<dtml-var standard_html_footer>

--
Milos Prudek