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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
<?php
/**
* Functions required to start a Gollem session.
*
* $Horde: gollem/lib/Session.php,v 1.34.2.4 2006/01/01 21:28:48 jan Exp $
*
* Copyright 1999-2006 Chuck Hagenbuch <chuck@horde.org>
* Copyright 2000-2006 Max Kalika <max@horde.org>
* Copyright 2004-2006 Michael Slusarz <slusarz@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.
*
* @author Chuck Hagenbuch <chuck@horde.org>
* @author Max Kalika <max@horde.org>
* @author Michael Slusarz <slusarz@horde.org>
* @package Gollem
*/
class Gollem_Session {
/**
* Take information posted from a login attempt and try setting up
* an initial Gollem session. Handle Horde authentication, if
* required, and only do enough work to see if the user can log
* in. This function should only be called once, when the user first logs
* into Gollem.
*
* Creates the $gollem session variable with the following entries:
* 'backend_key' -- The current backend
* 'be_list' -- The cached list of available backends
* 'selectlist' -- Stores file selections from the API call
*
* Each backend is stored by its name in the 'backends' array. Each
* backend contains the following entries:
* 'attributes' -- See config/backends.php
* 'autologin' -- Whether this backend supports autologin
* 'clipboard' -- The clipboard for the current backend
* 'createhome' -- See config/backends.php
* 'dir' -- The current directory
* 'driver' -- See config/backends.php
* 'filter' -- See config/backends.php
* 'hasquota' -- Does VFS have quota support?
* 'home' -- The user's home directory
* 'hordeauth' -- See config/backends.php
* 'hostspec' -- See config/backends.php
* 'label' -- The label to use
* 'name' -- See config/backends.php
* 'params' -- See config/backends.php
* 'preferred' -- See config/backends.php
* 'root' -- The root directory
*
* @param string $key The backend key to initialize.
* @param string $user The username to use for authentication.
* @param string $pass The password to use for authentication.
* @param array $args Any additional parameters the backend needs.
*
* @return boolean True on success, false on failure.
*/
function createSession($key, $user = null, $pass = null, $args = array())
{
global $conf;
/* Make sure we have a key and that it is valid. */
if (empty($key) || (substr($key, 0, 1) == '_')) {
return false;
}
/* We might need to override some of the defaults with
* environment-wide settings. Do NOT use the global $backends
* variable as it may not exist. */
require GOLLEM_BASE . '/config/backends.php';
if (empty($backends[$key])) {
$entry = sprintf('Invalid server key from client [%s]', $_SERVER['REMOTE_ADDR']);
Horde::logMessage($entry, __FILE__, __LINE__, PEAR_LOG_INFO);
return false;
}
/* Create gollem session object if it doesn't already exist. */
if (!isset($_SESSION['gollem'])) {
$_SESSION['gollem'] = array();
$_SESSION['gollem']['backends'] = array();
$_SESSION['gollem']['selectlist'] = array();
}
$_SESSION['gollem']['backends'][$key] = $backends[$key];
$GLOBALS['gollem_be'] = &$_SESSION['gollem']['backends'][$key];
$ptr = &$_SESSION['gollem']['backends'][$key];
$ptr['params'] = array_merge($ptr['params'], $args);
/* Set the current backend as active. */
$_SESSION['gollem']['backend_key'] = $key;
/* Set username now. Don't set the current username if the backend
* already has a username defined. */
if (empty($ptr['params']['username'])) {
$ptr['params']['username'] = (is_null($user)) ? Auth::getBareAuth() : $user;
}
/* Set password now. The password should always be encrypted within
* the session. */
if (!empty($ptr['params']['password'])) {
$pass = $ptr['params']['password'];
}
if (!is_null($pass)) {
$ptr['params']['password'] = Secret::write(Secret::getKey('gollem'), $pass);
}
/* Try to authenticate with the given information. */
$auth_gollem = &Auth::singleton(array('gollem', 'gollem'));
if ($auth_gollem->authenticate(null, null, true) !== true) {
unset($_SESSION['gollem']['backends'][$key]);
$_SESSION['gollem']['backend_key'] = null;
return false;
}
// Make sure we have a 'root' parameter.
if (empty($ptr['root'])) {
$ptr['root'] = '/';
}
$ptr['root'] = Gollem::realPath($ptr['root']);
// Make sure we have a 'home' parameter.
if (empty($ptr['home'])) {
$ptr['home'] = (!empty($ptr['params']['home'])) ? $ptr['params']['home'] : $GLOBALS['gollem_vfs']->getCurrentDirectory();
if (empty($ptr['home'])) {
$ptr['home'] = $ptr['root'];
}
}
// Make sure the home parameter lives under root if it is a relative
// directory.
if (strpos($ptr['home'], '/') !== 0) {
$ptr['home'] = $ptr['root'] . '/' . $ptr['home'];
}
$ptr['home'] = Gollem::realPath($ptr['home']);
$ptr['dir'] = $ptr['home'];
// Verify that home is below root.
if (!Gollem::verifyDir($ptr['home'])) {
$error_msg = 'Backend Configuration Error: Home directory not below root.';
$auth_gollem->gollemSetAuthErrorMsg($error_msg);
Horde::logMessage(PEAR::raiseError($error_msg), __FILE__, __LINE__, PEAR_LOG_ERR);
unset($_SESSION['gollem']['backends'][$key]);
$_SESSION['gollem']['backend_key'] = null;
return false;
}
/* Create the home directory if it doesn't already exist. */
if (($ptr['home'] != '/') && !empty($ptr['createhome'])) {
$pos = strrpos($ptr['home'], '/');
$cr_dir = substr($ptr['home'], 0, $pos);
$cr_file = substr($ptr['home'], $pos + 1);
if (!$GLOBALS['gollem_vfs']->exists($cr_dir, $cr_file)) {
$res = Gollem::createFolder($cr_dir, $cr_file);
if (is_a($res, 'PEAR_Error')) {
$error_msg = 'Backend Configuration Error: Could not create home directory ' . $ptr['home'] . '.';
$auth_gollem->gollemSetAuthErrorMsg($error_msg);
Horde::logMessage(PEAR::raiseError($error_msg), __FILE__, __LINE__, PEAR_LOG_ERR);
unset($_SESSION['gollem']['backends'][$key]);
$_SESSION['gollem']['backend_key'] = null;
return false;
}
}
}
/* Does this driver support autologin? */
$ptr['autologin'] = Gollem::canAutoLogin(true);
/* Does VFS support quotas?
* TODO: Remove once Horde 3.1+ is mandatory. */
if (!isset($_SESSION['gollem']['hasquota'])) {
$_SESSION['gollem']['hasquota'] = (method_exists($GLOBALS['gollem_vfs'], 'getQuota'));
}
/* Cache the backend_list in the session. */
if (empty($_SESSION['gollem']['be_list'])) {
Gollem::loadBackendList();
$_SESSION['gollem']['be_list'] = $GLOBALS['gollem_backends'];
}
/* Initialize clipboard. */
if (!isset($_SESSION['gollem']['clipboard'])) {
$_SESSION['gollem']['clipboard'] = array();
}
/* Call Gollem::changeDir() to make sure the label is set. */
Gollem::changeDir();
return true;
}
/**
* Change the currently active backend.
*
* @param string $key The ID of the backend to set as active.
*/
function changeBackend($key)
{
$_SESSION['gollem']['backend_key'] = $key;
$GLOBALS['gollem_be'] = &$_SESSION['gollem']['backends'][$key];
}
}
|