Subversion Repositories Applications.papyrus

Rev

Rev 1713 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1173 jp_milcent 1
<?php
2
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
3
 
4
/**
5
 * Auth Controller
6
 *
7
 * PHP versions 4 and 5
8
 *
9
 * LICENSE: This source file is subject to version 3.01 of the PHP license
10
 * that is available through the world-wide-web at the following URI:
11
 * http://www.php.net/license/3_01.txt.  If you did not receive a copy of
12
 * the PHP License and are unable to obtain it through the web, please
13
 * send a note to license@php.net so we can mail you a copy immediately.
14
 *
15
 * @category   Authentication
16
 * @package    Auth
17
 * @author     Yavor Shahpasov <yavo@netsmart.com.cy>
18
 * @author     Adam Ashley <aashley@php.net>
19
 * @copyright  2001-2006 The PHP Group
20
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
2150 mathias 21
 * @version    CVS: $Id: Controller.php,v 1.11 2007/06/12 03:11:26 aashley Exp $
1173 jp_milcent 22
 * @link       http://pear.php.net/package/Auth
23
 * @since      File available since Release 1.3.0
24
 */
25
 
26
/**
1713 jp_milcent 27
 * Controlls access to a group of php access
28
 * and redirects to a predefined login page as
1173 jp_milcent 29
 * needed
30
 *
31
 * In all pages
32
 * <code>
33
 * include_once('Auth.php');
34
 * include_once('Auth/Controller.php');
35
 * $_auth = new Auth('File', 'passwd');
36
 * $authController = new Auth_Controller($_auth, 'login.php', 'index.php');
37
 * $authController->start();
38
 * </code>
39
 *
40
 * In login.php
41
 * <code>
42
 * include_once('Auth.php');
43
 * include_once('Auth/Controller.php');
44
 * $_auth = new Auth('File', 'passwd');
45
 * $authController = new Auth_Controller($_auth, 'login.php', 'index.php');
46
 * $authController->start();
47
 * if( $authController->isAuthorised() ){
48
 *   $authController->redirectBack();
1713 jp_milcent 49
 * }
1173 jp_milcent 50
 * </code>
51
 *
52
 * @category   Authentication
53
 * @author     Yavor Shahpasov <yavo@netsmart.com.cy>
54
 * @author     Adam Ashley <aashley@php.net>
55
 * @copyright  2001-2006 The PHP Group
56
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
2150 mathias 57
 * @version    Release: 1.5.4  File: $Revision: 1.11 $
1173 jp_milcent 58
 * @link       http://pear.php.net/package/Auth
59
 * @since      Class available since Release 1.3.0
60
 */
61
class Auth_Controller
62
{
63
 
64
    // {{{ properties
65
 
1713 jp_milcent 66
    /**
1173 jp_milcent 67
     * The Auth instance this controller is managing
68
     *
69
     * @var object Auth
70
     */
71
    var $auth = null;
1713 jp_milcent 72
 
1173 jp_milcent 73
    /**
74
     * The login URL
75
     * @var string
76
     * */
77
    var $login = null;
1713 jp_milcent 78
 
1173 jp_milcent 79
    /**
80
     * The default index page to use when the caller page is not set
81
     *
1713 jp_milcent 82
     * @var string
1173 jp_milcent 83
     */
84
    var $default = null;
1713 jp_milcent 85
 
86
    /**
87
     * If this is set to true after a succesfull login the
88
     * Auth_Controller::redirectBack() is invoked automatically
1173 jp_milcent 89
     *
90
     * @var boolean
91
     */
92
    var $autoRedirectBack = false;
93
 
94
    // }}}
95
    // {{{ Auth_Controller() [constructor]
1713 jp_milcent 96
 
1173 jp_milcent 97
    /**
98
     * Constructor
99
     *
100
     * @param Auth An auth instance
101
     * @param string The login page
102
     * @param string The default page to go to if return page is not set
103
     * @param array Some rules about which urls need to be sent to the login page
104
     * @return void
105
     * @todo Add a list of urls which need redirection
106
     */
107
    function Auth_Controller(&$auth_obj, $login='login.php', $default='index.php', $accessList=array())
108
    {
109
        $this->auth =& $auth_obj;
110
        $this->_loginPage = $login;
111
        $this->_defaultPage = $default;
112
        @session_start();
113
        if (!empty($_GET['return']) && $_GET['return'] && !strstr($_GET['return'], $this->_loginPage)) {
114
            $this->auth->setAuthData('returnUrl', $_GET['return']);
115
        }
116
 
117
        if(!empty($_GET['authstatus']) && $this->auth->status == '') {
118
            $this->auth->status = $_GET['authstatus'];
119
        }
120
    }
121
 
122
    // }}}
123
    // {{{ setAutoRedirectBack()
1713 jp_milcent 124
 
125
    /**
1173 jp_milcent 126
     * Enables auto redirection when login is done
1713 jp_milcent 127
     *
1173 jp_milcent 128
     * @param bool Sets the autoRedirectBack flag to this
129
     * @see Auth_Controller::autoRedirectBack
130
     * @return void
131
     */
132
    function setAutoRedirectBack($flag = true)
133
    {
134
        $this->autoRedirectBack = $flag;
135
    }
136
 
137
    // }}}
138
    // {{{ redirectBack()
1713 jp_milcent 139
 
1173 jp_milcent 140
    /**
141
     * Redirects Back to the calling page
142
     *
143
     * @return void
144
     */
145
    function redirectBack()
146
    {
147
        // If redirectback go there
148
        // else go to the default page
1713 jp_milcent 149
 
1173 jp_milcent 150
        $returnUrl = $this->auth->getAuthData('returnUrl');
151
        if(!$returnUrl) {
152
            $returnUrl = $this->_defaultPage;
153
        }
1713 jp_milcent 154
 
1173 jp_milcent 155
        // Add some entropy to the return to make it unique
156
        // avoind problems with cached pages and proxies
157
        if(strpos($returnUrl, '?') === false) {
158
            $returnUrl .= '?';
159
        }
160
        $returnUrl .= uniqid('');
161
 
162
        // Track the auth status
163
        if($this->auth->status != '') {
164
            $url .= '&authstatus='.$this->auth->status;
1713 jp_milcent 165
        }
1173 jp_milcent 166
        header('Location:'.$returnUrl);
167
        print("You could not be redirected to <a href=\"$returnUrl\">$returnUrl</a>");
168
    }
169
 
170
    // }}}
171
    // {{{ redirectLogin()
1713 jp_milcent 172
 
1173 jp_milcent 173
    /**
174
      * Redirects to the login Page if not authorised
1713 jp_milcent 175
      *
1173 jp_milcent 176
      * put return page on the query or in auth
177
      *
178
      * @return void
179
      */
180
    function redirectLogin()
181
    {
182
        // Go to the login Page
1713 jp_milcent 183
 
1173 jp_milcent 184
        // For Auth, put some check to avoid infinite redirects, this should at least exclude
185
        // the login page
1713 jp_milcent 186
 
1173 jp_milcent 187
        $url = $this->_loginPage;
188
        if(strpos($url, '?') === false) {
189
            $url .= '?';
190
        }
191
 
192
        if(!strstr($_SERVER['PHP_SELF'], $this->_loginPage)) {
193
            $url .= 'return='.urlencode($_SERVER['PHP_SELF']);
194
        }
195
 
196
        // Track the auth status
197
        if($this->auth->status != '') {
198
            $url .= '&authstatus='.$this->auth->status;
199
        }
200
 
201
        header('Location:'.$url);
202
        print("You could not be redirected to <a href=\"$url\">$url</a>");
203
    }
204
 
205
    // }}}
206
    // {{{ start()
1713 jp_milcent 207
 
1173 jp_milcent 208
    /**
209
      * Starts the Auth Procedure
210
      *
211
      * If the page requires login the user is redirected to the login page
212
      * otherwise the Auth::start is called to initialize Auth
213
      *
214
      * @return void
215
      * @todo Implement an access list which specifies which urls/pages need login and which do not
216
      */
217
    function start()
218
    {
219
        // Check the accessList here
220
        // ACL should be a list of urls with allow/deny
221
        // If allow set allowLogin to false
222
        // Some wild card matching should be implemented ?,*
223
        if(!strstr($_SERVER['PHP_SELF'], $this->_loginPage) && !$this->auth->checkAuth()) {
224
            $this->redirectLogin();
225
        } else {
226
            $this->auth->start();
227
            // Logged on and on login page
228
            if(strstr($_SERVER['PHP_SELF'], $this->_loginPage) && $this->auth->checkAuth()){
1713 jp_milcent 229
                $this->autoRedirectBack ?
1173 jp_milcent 230
                    $this->redirectBack() :
231
                    null ;
232
            }
233
        }
1713 jp_milcent 234
 
235
 
1173 jp_milcent 236
    }
237
 
238
    // }}}
239
    // {{{ isAuthorised()
1713 jp_milcent 240
 
1173 jp_milcent 241
    /**
242
      * Checks is the user is logged on
243
      * @see Auth::checkAuth()
244
      */
245
    function isAuthorised()
246
    {
247
        return($this->auth->checkAuth());
248
    }
249
 
250
    // }}}
251
    // {{{ checkAuth()
252
 
253
    /**
254
      * Proxy call to auth
255
      * @see Auth::checkAuth()
256
      */
257
    function checkAuth()
258
    {
259
        return($this->auth->checkAuth());
260
    }
261
 
262
    // }}}
263
    // {{{ logout()
264
 
265
    /**
266
      * Proxy call to auth
267
      * @see Auth::logout()
268
      */
269
    function logout()
270
    {
271
        return($this->auth->logout());
272
    }
273
 
274
    // }}}
275
    // {{{ getUsername()
276
 
277
    /**
278
      * Proxy call to auth
279
      * @see Auth::getUsername()
280
      */
281
    function getUsername()
282
    {
283
        return($this->auth->getUsername());
284
    }
285
 
286
    // }}}
287
    // {{{ getStatus()
288
 
289
    /**
290
      * Proxy call to auth
291
      * @see Auth::getStatus()
292
      */
293
    function getStatus()
294
    {
295
        return($this->auth->getStatus());
296
    }
297
 
298
    // }}}
299
 
300
}
301
 
302
?>