Project

General

Profile

« Previous | Next » 

Revision 2125

Added by darkviper almost 9 years ago

! /framework/class.Login.php
! /account/ ~login_form.php ~login.php
! /admin/login/index.php
fixed some possible intruder vectors and complete 2.8.4 adaption

View differences:

class.Login.php
14 14
 * @lastmodified    $Date$
15 15
 *
16 16
 */
17
/* -------------------------------------------------------- */
18
// Must include code to stop this file being accessed directly
19
if(!defined('WB_PATH')) {
20
	require_once(dirname(__FILE__).'/globalExceptionHandler.php');
21
	throw new IllegalFileException();
22
}
23
/* -------------------------------------------------------- */
24 17
define('LOGIN_CLASS_LOADED', true);
25 18

  
26 19
// Get WB version
27 20
require_once(ADMIN_PATH.'/interface/version.php');
28 21

  
29 22
class Login extends admin {
30
	public function __construct($config_array) {
31
		// Get language vars
32
		global $MESSAGE, $database;
33
		parent::__construct();
34
		// Get configuration values
35
		while(list($key, $value) = each($config_array)) {
36
			$this->{(strtolower($key))} = $value;
37
		}
38
		if(!isset($this->redirect_url)) { $this->redirect_url = ''; }
39
		// Get the supplied username and password
40
		if ($this->get_post('username_fieldname') != ''){
41
			$username_fieldname = $this->get_post('username_fieldname');
42
			$password_fieldname = $this->get_post('password_fieldname');
43
		} else {
44
			$username_fieldname = 'username';
45
			$password_fieldname = 'password';
46
		}
47 23

  
48
        if( is_array($this->get_post($username_fieldname) ) ) {
49
            $_POST[$username_fieldname]=implode(',',$this->get_post($username_fieldname));            
50
        }
51
		$this->username = htmlspecialchars (strtolower( $this->get_post($username_fieldname) ), ENT_QUOTES);
24
    const PASS_CHARS = '\w!#$%&*+\-.:=?@\|';
25
    const USER_CHARS = 'a-z0-9&\-.=@_';
52 26

  
53
        if( is_array($this->get_post($password_fieldname) ) ) {
54
            $_POST[$password_fieldname]=implode(',',$this->get_post($password_fieldname));            
55
        }
56
		$this->password = $this->get_post($password_fieldname);
27
    protected $oReg    = null;
28
    protected $oDb     = null;
29
    protected $oTrans  = null;
30
    protected $message = '';
57 31

  
58
		// Figure out if the "remember me" option has been checked
59
		if($this->get_post('remember') == 'true') {
60
			$this->remember = $this->get_post('remember');
61
		} else {
62
			$this->remember = false;
63
		}
64
		// Get the length of the supplied username and password
65
		if($this->get_post($username_fieldname) != '') {
66
			$this->username_len = strlen($this->username);
67
			$this->password_len = strlen($this->password);
68
		}
32
    public function __construct($config_array)
33
    {
34
        $this->oReg   = WbAdaptor::getInstance();
35
        $this->oDb    = $this->oReg->Db;
36
        $this->oTrans = $this->oReg->Trans;
69 37

  
70
		$aServerUrl = $this->mb_parse_url(WB_URL);
71

  
72
        $sServerUrl = $_SERVER['SERVER_NAME'];        
73
        $sServerScheme = isset($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : isset($aServerUrl['scheme']) ? $aServerUrl['scheme'] : ' http';        
74
        $sServerPath = $_SERVER['SCRIPT_NAME'];        
75
		// If the url is blank, set it to the default url
76
		$this->url = $this->get_post('url');
38
        parent::__construct();
39
    // Get configuration values
40
        while(list($key, $value) = each($config_array)) {
41
            $this->{(strtolower($key))} = $value;
42
        }
43
    // calculate redirect URL
44
        if(!isset($this->redirect_url)) { $this->redirect_url = ''; }
45
        $aServerUrl = $this->mb_parse_url($this->oReg->AppUrl);
46
        $sServerUrl = $_SERVER['SERVER_NAME'];
47
        $sServerScheme =
48
            isset($_SERVER['REQUEST_SCHEME'])
49
            ? $_SERVER['REQUEST_SCHEME']
50
            : isset($aServerUrl['scheme']) ? $aServerUrl['scheme'] : ' http';
51
        $sServerPath = $_SERVER['SCRIPT_NAME'];
52
        // If the url is blank, set it to the default url
53
        $this->url = $this->get_post('url');
54
        if (preg_match('/%0d|%0a|\s/i', $this->url)) {
55
            throw new Exception('Warning: possible intruder detected on login');
56
        }
77 57
        $aUrl = $this->mb_parse_url( $this->url );
78
        $this->url = isset($aRedirecthUrl['host']) &&($sServerUrl==$aUrl['host']) ? $this->url:ADMIN_URL.'/start/index.php';        
79
		if ($this->redirect_url!='') {
58
        $this->url =
59
            isset($aRedirecthUrl['host']) &&($sServerUrl == $aUrl['host'])
60
            ? $this->url
61
            : $this->oReg->AcpUrl.'start/index.php';
62
        if ($this->redirect_url!='') {
80 63
            $aRedirecthUrl = $this->mb_parse_url( $this->redirect_url );
81
            $this->redirect_url = isset($aRedirecthUrl['host']) &&($sServerUrl==$aRedirecthUrl['host']) ? $this->redirect_url:$sServerScheme.'://'.$sServerUrl;        
82
			$this->url = $this->redirect_url;
83
		}
84
		if(strlen($this->url) < 2) {
64
            $this->redirect_url =
65
                isset($aRedirecthUrl['host']) &&($sServerUrl==$aRedirecthUrl['host'])
66
                ? $this->redirect_url
67
                : $sServerScheme.'://'.$sServerUrl;
68
            $this->url = $this->redirect_url;
69
        }
70
        if(strlen($this->url) < 2) {
85 71
            $aDefaultUrl = $this->mb_parse_url( $this->default_url );
86
            $this->default_url = isset($aDefaultUrl['host']) &&($sServerUrl==$aDefaultUrl['host']) ? $this->default_url:$sServerScheme.'://'.$sServerUrl;        
87
			$this->url = $this->default_url;
88
		}
72
            $this->default_url =
73
                isset($aDefaultUrl['host']) &&($sServerUrl==$aDefaultUrl['host'])
74
                ? $this->default_url
75
                : $sServerScheme.'://'.$sServerUrl;
76
            $this->url = $this->default_url;
77
        }
78
    // get username & password and validate it
79
        $username_fieldname = (string)$this->get_post('username_fieldname');
80
        $username_fieldname = (preg_match('/^_?[a-z][\w]+$/i', $username_fieldname) ? $username_fieldname : 'username');
81
        $sUsername = strtolower(trim((string)$this->get_post($username_fieldname)));
82
        $this->username = (preg_match(
83
            '/^['.self::USER_CHARS.']{'.$this->min_username_len.','.$this->max_username_len.'}$/is',
84
            $sUsername
85
        ) ? $sUsername : '');
86
        $password_fieldname = (string)$this->get_post('password_fieldname');
87
        $password_fieldname = (preg_match('/^_?[a-z][\w]+$/i', $password_fieldname) ? $password_fieldname : 'password');
89 88

  
90
		if($this->is_authenticated() == true) {
91
			// User already logged-in, so redirect to default url
92
				$this->send_header($this->url);
93
		} elseif($this->is_remembered() == true) {
94
			// User has been "remembered"
95
			// Get the users password
96
			// $database = new database();
97
			$sql  = 'SELECT * FROM `'.$this->users_table.'` ';
98
			$sql .= 'WHERE `user_id`=\''.$this->get_safe_remember_key().'\'';
99
			$query_details = $database->query($sql);
100
			$fetch_details = $query_details->fetchRow(MYSQL_ASSOC);
101
			$this->username = $fetch_details['username'];
102
			$this->password = $fetch_details['password'];
103
			// Check if the user exists (authenticate them)
104
			if($this->authenticate()) {
105
				// Authentication successful
106
				$this->send_header($this->url);
107
			} else {
108
				$this->message = $MESSAGE['LOGIN_AUTHENTICATION_FAILED'];
109
				$this->increase_attemps();
110
			}
111
		} elseif($this->username == '' AND $this->password == '') {
112
			$this->message = $MESSAGE['LOGIN_BOTH_BLANK'];
113
			$this->display_login();
114
		} elseif($this->username == '') {
115
			$this->message = $MESSAGE['LOGIN_USERNAME_BLANK'];
116
			$this->increase_attemps();
117
		} elseif($this->password == '') {
118
			$this->message = $MESSAGE['LOGIN_PASSWORD_BLANK'];
119
			$this->increase_attemps();
120
		} elseif($this->username_len < $config_array['MIN_USERNAME_LEN']) {
121
			$this->message = $MESSAGE['LOGIN_USERNAME_TOO_SHORT'];
122
			$this->increase_attemps();
123
		} elseif($this->password_len < $config_array['MIN_PASSWORD_LEN']) {
124
			$this->message = $MESSAGE['LOGIN_PASSWORD_TOO_SHORT'];
125
			$this->increase_attemps();
126
		} elseif($this->username_len > $config_array['MAX_USERNAME_LEN']) {
127
			$this->message = $MESSAGE['LOGIN_USERNAME_TOO_LONG'];
128
			$this->increase_attemps();
129
		} elseif($this->password_len > $config_array['MAX_PASSWORD_LEN']) {
130
			$this->message = $MESSAGE['LOGIN_PASSWORD_TOO_LONG'];
131
			$this->increase_attemps();
132
		} else {
133
			// Check if the user exists (authenticate them)
134
			$this->password = md5($this->password);
135
			if($this->authenticate()) {
136
				// Authentication successful
137
				$this->send_header($this->url);
138
			} else {
139
				$this->message = $MESSAGE['LOGIN_AUTHENTICATION_FAILED'];
140
				$this->increase_attemps();
141
			}
142
		}
143
	}
89
        if ($this->username) {
90
/** @TODO implement crypting */
91
            $this->password = md5(trim((string)$this->get_post($password_fieldname)));
92
            // Figure out if the "remember me" option has been checked
93
            $this->remember = (@$_POST['remember'] == 'true' ? true : false);
94
        // try to authenticate
95
            $bSuccess = false;
96
            if (!($bSuccess = $this->is_authenticated())) {
97
                if ($this->is_remembered()) {
98
                    $sql = 'SELECT * FROM `'.$this->oDb->TablePrefix.'users` '
99
                         . 'WHERE `user_id`='.$this->get_safe_remember_key();
100
                    if (($oUsers = $this->oDb->doQuery($sql))) {
101
                        if (($aUser = $oUsers->fetchArray())) {
102
                            $this->username = $aUser['username'];
103
                            $this->password = $aUser['password'];
104
                            // Check if the user exists (authenticate them)
105
                            $bSuccess = $this->authenticate();
106
                        }
107
                    }
108
                } else {
109
                    // Check if the user exists (authenticate them)
110
                    $bSuccess = $this->authenticate();
111
                }
112
            }
113
            if ($bSuccess) {
114
                // Authentication successful
115
                $this->send_header($this->url);
116
            } else {
117
                $this->message = $this->oTrans->MESSAGE_LOGIN_AUTHENTICATION_FAILED;
118
                $this->increase_attemps();
119
            }
120
        } else {
121
            $this->display_login();
122
        }
123
    }
144 124

  
145
	// Authenticate the user (check if they exist in the database)
146
	function authenticate() {
147
		global $database;
148
		// Get user information
149
		// $database = new database();
150
		// $query = 'SELECT * FROM `'.$this->users_table.'` WHERE MD5(`username`) = "'.md5($this->username).'" AND `password` = "'.$this->password.'" AND `active` = 1';
151
 		$loginname = ( preg_match('/[\;\=\&\|\<\> ]/',$this->username) ? '' : $this->username );
152
		$sql  = 'SELECT * FROM `'.$this->users_table.'` ';
153
		$sql .= 'WHERE `username`=\''.$loginname.'\' AND `password`=\''.$this->password.'\' AND `active`=1';
154
		$results = $database->query($sql);
155
		$results_array = $results->fetchRow(MYSQL_ASSOC);
156
		$num_rows = $results->numRows();
157
		if($num_rows == 1) {
158
			$user_id = $results_array['user_id'];
159
			$this->user_id = $user_id;
160
			$_SESSION['USER_ID'] = $user_id;
161
			$_SESSION['GROUP_ID'] = $results_array['group_id'];
162
			$_SESSION['GROUPS_ID'] = $results_array['groups_id'];
163
			$_SESSION['USERNAME'] = $results_array['username'];
164
			$_SESSION['DISPLAY_NAME'] = $results_array['display_name'];
165
			$_SESSION['EMAIL'] = $results_array['email'];
166
			$_SESSION['HOME_FOLDER'] = $results_array['home_folder'];
167
			// Run remember function if needed
168
			if($this->remember == true) {
169
				$this->remember($this->user_id);
170
			}
171
			// Set language
172
			if($results_array['language'] != '') {
173
				$_SESSION['LANGUAGE'] = $results_array['language'];
174
			}
175
			// Set timezone
176
			if($results_array['timezone'] != '-72000') {
177
				$_SESSION['TIMEZONE'] = $results_array['timezone'];
178
			} else {
179
				// Set a session var so apps can tell user is using default tz
180
				$_SESSION['USE_DEFAULT_TIMEZONE'] = true;
181
			}
182
			// Set date format
183
			if($results_array['date_format'] != '') {
184
				$_SESSION['DATE_FORMAT'] = $results_array['date_format'];
185
			} else {
186
				// Set a session var so apps can tell user is using default date format
187
				$_SESSION['USE_DEFAULT_DATE_FORMAT'] = true;
188
			}
189
			// Set time format
190
			if($results_array['time_format'] != '') {
191
				$_SESSION['TIME_FORMAT'] = $results_array['time_format'];
192
			} else {
193
				// Set a session var so apps can tell user is using default time format
194
				$_SESSION['USE_DEFAULT_TIME_FORMAT'] = true;
195
			}
125
    // Authenticate the user (check if they exist in the database)
126
    function authenticate()
127
    {
128
        // Get user information
129
        $loginname = ( preg_match('/^['.self::USER_CHARS.']+$/s',$this->username) ? $this->username : '0');
130
        $aSettings = array();
131
        $aSettings['SYSTEM_PERMISSIONS']   = array();
132
        $aSettings['MODULE_PERMISSIONS']   = array();
133
        $aSettings['TEMPLATE_PERMISSIONS'] = array();
134
        $bRetval = false;
196 135

  
197
			// Get group information
198
			$_SESSION['SYSTEM_PERMISSIONS'] = array();
199
			$_SESSION['MODULE_PERMISSIONS'] = array();
200
			$_SESSION['TEMPLATE_PERMISSIONS'] = array();
201
			$_SESSION['GROUP_NAME'] = array();
202

  
203
            $aGroupsIds = ((explode(',', $this->get_session('GROUPS_ID'))));
204
            $bOnlyAdminGroup = $this->ami_group_member('1') && (sizeof($aGroupsIds) == 1);
205
			$first_group = true;
206

  
207
			foreach ( $aGroupsIds  as $cur_group_id)
208
            {
209
				$sql = 'SELECT * FROM `'.$this->groups_table.'` WHERE `group_id`=\''.$cur_group_id.'\'';
210
				if($results = $database->query($sql)) {
211
    				$results_array = $results->fetchRow(MYSQL_ASSOC);
212
    				$_SESSION['GROUP_NAME'][$cur_group_id] = $results_array['name'];
213
				}
214

  
215
				// Set system permissions
216
				if( ($results_array['system_permissions'] != '') ) {
217
                    switch ($cur_group_id) :
218
                        case 1:
219
                            if( $this->user_id == 1) {
220
               					$_SESSION['SYSTEM_PERMISSIONS'] = array_merge($_SESSION['SYSTEM_PERMISSIONS'], explode(',', $results_array['system_permissions']));
136
        $sql = 'SELECT * FROM `'.$this->oDb->TablePrefix.'users` '
137
             . 'WHERE `username`=\''.$this->oDb->escapeString($loginname).'\'';
138
        if (($oUser = $this->oDb->doQuery($sql))) {
139
            if (($aUser = $oUser->fetchArray())) {
140
                if (
141
                    $aUser['password'] == $this->password &&
142
                    $aUser['active'] == 1
143
                ) {
144
                // valide authentcation !!
145
                    $user_id                   = $aUser['user_id'];
146
                    $this->user_id             = $user_id;
147
                    $aSettings['USER_ID']      = $user_id;
148
                    $aSettings['GROUP_ID']     = $aUser['group_id'];
149
                    $aSettings['GROUPS_ID']    = $aUser['groups_id'];
150
                    $aSettings['USERNAME']     = $aUser['username'];
151
                    $aSettings['DISPLAY_NAME'] = $aUser['display_name'];
152
                    $aSettings['EMAIL']        = $aUser['email'];
153
                    $aSettings['HOME_FOLDER']  = $aUser['home_folder'];
154
                    // Run remember function if needed
155
                    if($this->remember == true) {
156
                        $this->remember($this->user_id);
157
                    }
158
                    // Set language
159
                    if($aUser['language'] != '') {
160
                        $aSettings['LANGUAGE'] = $aUser['language'];
161
                    }
162
                    // Set timezone
163
                    if($aUser['timezone'] != '-72000') {
164
                        $aSettings['TIMEZONE'] = $aUser['timezone'];
165
                    } else {
166
                        // Set a session var so apps can tell user is using default tz
167
                        $aSettings['USE_DEFAULT_TIMEZONE'] = true;
168
                    }
169
                    // Set date format
170
                    if($aUser['date_format'] != '') {
171
                        $aSettings['DATE_FORMAT'] = $aUser['date_format'];
172
                    } else {
173
                        // Set a session var so apps can tell user is using default date format
174
                        $aSettings['USE_DEFAULT_DATE_FORMAT'] = true;
175
                    }
176
                    // Set time format
177
                    if($aUser['time_format'] != '') {
178
                        $aSettings['TIME_FORMAT'] = $aUser['time_format'];
179
                    } else {
180
                        // Set a session var so apps can tell user is using default time format
181
                        $aSettings['USE_DEFAULT_TIME_FORMAT'] = true;
182
                    }
183
                    // Get group information
184
                    $aSettings['GROUP_NAME'] = array();
185
                    $bOnlyAdminGroup = $this->ami_group_member('1') && (sizeof($aGroupsIds) == 1);
186
                    $sql = 'SELECT * FROM `'.$this->oDb->TablePrefix.'groups` '
187
                         . 'WHERE `group_id` IN (\''.$aUser['groups_id'].',0\') '
188
                         . 'ORDER BY `group_id`';
189
                    if (($oGroups = $this->oDb->doQuery($sql))) {
190
                        while (($aGroup = $oGroups->fetchArray())) {
191
                            $aSettings['GROUP_NAME'][$aGroup['group_id']] = $aGroup['name'];
192
                        // collect system_permissions (additively)
193
                            $aSettings['SYSTEM_PERMISSIONS'] = array_merge(
194
                                $aSettings['SYSTEM_PERMISSIONS'],
195
                                explode(',', $aGroup['system_permissions'])
196
                            );
197
                        // collect module_permission (subtractive)
198
                            if (!sizeof($aSettings['MODULE_PERMISSIONS'])) {
199
                                $aSettings['MODULE_PERMISSIONS'] = explode(',', $aGroup['module_permissions']);
221 200
                            } else {
222
                                $_SESSION['SYSTEM_PERMISSIONS'] = explode(',', $results_array['system_permissions']);
201
                                $aSettings['MODULE_PERMISSIONS'] = array_intersect(
202
                                    $aSettings['MODULE_PERMISSIONS'],
203
                                    preg_split('/\s*[,;\|\+]/', $aGroup['module_permissions'], -1, PREG_SPLIT_NO_EMPTY)
204
                                );
223 205
                            }
206
                        // collect template_permission (subtractive)
207
                            if (!sizeof($aSettings['TEMPLATE_PERMISSIONS'])) {
208
                                $aSettings['TEMPLATE_PERMISSIONS'] = explode(',', $aGroup['template_permissions']);
209
                            } else {
210
                                $aSettings['TEMPLATE_PERMISSIONS'] = array_intersect(
211
                                    $aSettings['TEMPLATE_PERMISSIONS'],
212
                                    preg_split('/\s*[,;\|\+]/', $aGroup['template_permissions'], -1, PREG_SPLIT_NO_EMPTY)
213
                                );
214
                            }
215
                        }
216
                    }
217
                    // Update the users table with current ip and timestamp
218
                    $sRemoteAddress = @$_SERVER['REMOTE_ADDR'] ?: 'unknown';
219
                    $sql = 'UPDATE `'.$this->oDb->TablePrefix.'users` '
220
                         . 'SET `login_when`='.time().', '
221
                         .     '`login_ip`=\''.$sRemoteAddress.'\' '
222
                         . 'WHERE `user_id`=\''.$user_id.'\'';
223
                    $this->oDb->doQuery($sql);
224
                    $bRetval = true;
225
                }
226
            }
227
        }
228
        // merge settings into $_SESSION and overwrite older one values
229
        $_SESSION = array_merge($_SESSION, $aSettings);
230
        // Return if the user exists or not
231
        return $bRetval;
232
    }
224 233

  
225
                            break;
226
                        default:
227
        					$_SESSION['SYSTEM_PERMISSIONS'] = array_merge($_SESSION['SYSTEM_PERMISSIONS'], explode(',', $results_array['system_permissions']));
228
                    endswitch;
229
				}
234
    // Increase the count for login attemps
235
    function increase_attemps()
236
    {
237
        $_SESSION['ATTEMPS'] = (isset($_SESSION['ATTEMPS']) ? $_SESSION['ATTEMPS']++ : 0);
238
        $this->display_login();
239
    }
230 240

  
231
				// Set module permissions
232
				if( $results_array['module_permissions'] != '' ) {
233
					if ($first_group) {
234
                  	$_SESSION['MODULE_PERMISSIONS'] = explode(',', $results_array['module_permissions']);
235
                  } else {
236
                  	$_SESSION['MODULE_PERMISSIONS'] = array_intersect($_SESSION['MODULE_PERMISSIONS'], explode(',', $results_array['module_permissions']));
237
					}
238
				}
239
				// Set template permissions
240
				if($results_array['template_permissions'] != '') {
241
					if ($first_group) {
242
                      	$_SESSION['TEMPLATE_PERMISSIONS'] = explode(',', $results_array['template_permissions']);
243
                      } else {
244
                      	$_SESSION['TEMPLATE_PERMISSIONS'] = array_intersect($_SESSION['TEMPLATE_PERMISSIONS'], explode(',', $results_array['template_permissions']));
245
					}
246
				}
247
				$first_group = false;
248
			}
241
    // Function to set a "remembering" cookie for the user - removed
242
    function remember($user_id)
243
    {
244
        return true;
245
    }
249 246

  
250
//            if( $$bOnlyAdminGroup ) {
251
//    			$_SESSION['MODULE_PERMISSIONS'] = array();
252
//    			$_SESSION['TEMPLATE_PERMISSIONS'] = array();
253
//            }
247
    // Function to check if a user has been remembered - removed
248
    function is_remembered()
249
    {
250
        return false;
251
    }
254 252

  
255
			// Update the users table with current ip and timestamp
256
			$get_ts = time();
257
			$get_ip = $_SERVER['REMOTE_ADDR'];
258
			$sql  = 'UPDATE `'.$this->users_table.'` ';
259
			$sql .= 'SET `login_when`=\''.$get_ts.'\', `login_ip`=\''.$get_ip.'\' ';
260
			$sql .= 'WHERE `user_id`=\''.$user_id.'\'';
261
			$database->query($sql);
262
		}else {
263
		  $num_rows = 0;
264
		}
265
		// Return if the user exists or not
266
		return $num_rows;
267
	}
253
    // Display the login screen
254
    function display_login()
255
    {
256
        // If attemps more than allowed, warn the user
257
        if($this->get_session('ATTEMPS') > $this->max_attemps) {
258
            $this->warn();
259
        }
260
        // Show the login form
261
        if($this->frontend != true) {
262
            $template = new Template(dirname($this->correct_theme_source($this->template_file)));
263
            $template->set_file('page', $this->template_file);
264
            $template->set_block('page', 'mainBlock', 'main');
265
            $template->set_var('DISPLAY_REMEMBER_ME', ($this->remember_me_option ? '' : 'display: none;'));
266
            $template->set_var($this->oTrans->getLangArray());
267
            $template->set_var(
268
                array(
269
                    'TITLE_LOGOUT'           => $this->oTrans->MENU_LOGIN,
270
                    'TITLE_VIEW'             => $this->oTrans->TEXT_WEBSITE,
271
                    'SECTION_NAME'           => $this->oTrans->MENU_LOGIN,
272
                    'SECTION_LOGIN'          => $this->oTrans->MENU_LOGIN,
273
                    'ACTION_URL'             => $this->login_url,
274
                    'URL'                    => $this->default_url,
275
                    'ATTEMPS'                => $this->get_session('ATTEMPS'),
276
                    'USERNAME'               => $this->username,
277
                    'USERNAME_FIELDNAME'     => $this->username_fieldname,
278
                    'PASSWORD_FIELDNAME'     => $this->password_fieldname,
279
                    'MESSAGE'                => $this->message,
280
                    'WEBSITE_TITLE'          => $this->oReg->WebsiteTitle,
281
                    'INTERFACE_DIR_URL'      => $this->oReg->AcpUrl.'interface',
282
                    'MAX_USERNAME_LEN'       => $this->max_username_len,
283
                    'MAX_PASSWORD_LEN'       => $this->max_password_len,
284
                    'ADMIN_URL'              => $this->oReg->AcpUrl,
285
                    'WB_URL'                 => $this->oReg->AppUrl,
286
                    'URL_VIEW'               => $this->oReg->AppUrl,
287
                    'THEME_URL'              => $this->oReg->ThemeUrl,
288
                    'VERSION'                => $this->oReg->Version,
289
                    'SP'                     => (isset($this->oReg->Sp) ? $this->oReg->Sp : ''),
290
                    'REVISION'               => $this->oReg->Revision,
291
                    'LANGUAGE'               => strtolower($this->oReg->Language),
292
                    'FORGOTTEN_DETAILS_APP'  => $this->forgotten_details_app,
293
                    'PAGES_DIRECTORY'        => $this->oReg->PagesDir,
294
                    'LOGIN_DISPLAY_HIDDEN'   => !$this->is_authenticated() ? 'hidden' : '',
295
                    'LOGIN_DISPLAY_NONE'     => !$this->is_authenticated() ? 'none' : '',
296
                    'LOGIN_LINK'             => $_SERVER['SCRIPT_NAME'],
297
                    'LOGIN_ICON'             => 'login',
298
                    'START_ICON'             => 'blank',
299
                    'URL_HELP'               => 'http://wiki.websitebaker.org/',
300
                )
301
            );
302
            $template->set_var('CHARSET', (isset($this->oReg->DefaultCharset) ? $this->oReg->DefaultCharset : 'utf-8'));
303
            $template->parse('main', 'mainBlock', false);
304
            $template->pparse('output', 'page');
305
        }
306
    }
307
    // sanities the REMEMBER_KEY cookie to avoid SQL injection
308
    function get_safe_remember_key()
309
    {
310
        $iMatches = 0;
311
        if (isset($_COOKIE['REMEMBER_KEY'])) {
312
            $sRetval = preg_replace(
313
                '/^([0-9]{11})_([0-9a-f]{11})$/i',
314
                '\1\2',
315
                $_COOKIE['REMEMBER_KEY'], -1, $iMatches
316
            );
317
        }
318
        return ($iMatches ? $sRetval : '');
319
    }
320
    // Warn user that they have had to many login attemps
321
    function warn()
322
    {
323
        $this->send_header($this->warning_url);
324
        exit;
325
    }
268 326

  
269
	// Increase the count for login attemps
270
	function increase_attemps() {
271
		if(!isset($_SESSION['ATTEMPS'])) {
272
			$_SESSION['ATTEMPS'] = 0;
273
		} else {
274
			$_SESSION['ATTEMPS'] = $this->get_session('ATTEMPS')+1;
275
		}
276
		$this->display_login();
277
	}
278

  
279
	// Function to set a "remembering" cookie for the user - removed
280
	function remember($user_id) {
281
		return true;
282
	}
283

  
284
	// Function to check if a user has been remembered - removed
285
	function is_remembered()
286
	{
287
		return false;
288
	}
289

  
290
	// Display the login screen
291
	function display_login() {
292
		// Get language vars
293
		global $MESSAGE, $MENU, $TEXT;
294
		// If attemps more than allowed, warn the user
295
		if($this->get_session('ATTEMPS') > $this->max_attemps) {
296
			$this->warn();
297
		}
298
		// Show the login form
299
		if($this->frontend != true) {
300
			//require_once(WB_PATH.'/include/phplib/template.inc');
301
			// $template = new Template($this->template_dir);
302
			// Setup template object, parse vars to it, then parse it
303
			$template = new Template(dirname($this->correct_theme_source($this->template_file)));
304
			$template->set_file('page', $this->template_file);
305
			$template->set_block('page', 'mainBlock', 'main');
306
			if($this->remember_me_option != true) {
307
				$template->set_var('DISPLAY_REMEMBER_ME', 'display: none;');
308
			} else {
309
				$template->set_var('DISPLAY_REMEMBER_ME', '');
310
			}
311
			$template->set_var(array(
312
				'ACTION_URL' => $this->login_url,
313
				'URL' => $this->default_url,
314
				'ATTEMPS' => $this->get_session('ATTEMPS'),
315
				'USERNAME' => $this->username,
316
				'USERNAME_FIELDNAME' => $this->username_fieldname,
317
				'PASSWORD_FIELDNAME' => $this->password_fieldname,
318
				'MESSAGE' => $this->message,
319
				'WEBSITE_TITLE' => WEBSITE_TITLE,
320
				'TEXT_ADMINISTRATION' => $TEXT['ADMINISTRATION'],
321
				'INTERFACE_DIR_URL' =>  ADMIN_URL.'/interface',
322
				'MAX_USERNAME_LEN' => $this->max_username_len,
323
				'MAX_PASSWORD_LEN' => $this->max_password_len,
324
				'ADMIN_URL' => ADMIN_URL,
325
				'WB_URL' => WB_URL,
326
				'URL_VIEW' => WB_URL,
327
				'THEME_URL' => THEME_URL,
328
				'VERSION' => VERSION,
329
				'SP' => (defined('SP') ? SP : ''),
330
				'REVISION' => REVISION,
331
				'LANGUAGE' => strtolower(LANGUAGE),
332
				'FORGOTTEN_DETAILS_APP' => $this->forgotten_details_app,
333
				'TEXT_FORGOTTEN_DETAILS' => $TEXT['FORGOTTEN_DETAILS'],
334
				'TEXT_USERNAME' => $TEXT['USERNAME'],
335
				'TEXT_PASSWORD' => $TEXT['PASSWORD'],
336
				'TEXT_REMEMBER_ME' => $TEXT['REMEMBER_ME'],
337
				'TEXT_LOGIN' => $TEXT['LOGIN'],
338
				'TITLE_LOGOUT' => $MENU['LOGIN'],
339
				'TEXT_RESET' => $TEXT['RESET'],
340
				'TEXT_HOME' => $TEXT['HOME'],
341
				'TITLE_VIEW' => $TEXT['WEBSITE'],
342
				'PAGES_DIRECTORY' => PAGES_DIRECTORY,
343
				'SECTION_NAME' => $MENU['LOGIN'],
344
				'SECTION_LOGIN' => $MENU['LOGIN'],
345
				'LOGIN_DISPLAY_HIDDEN' => !$this->is_authenticated() ? 'hidden' : '',
346
				'LOGIN_DISPLAY_NONE' => !$this->is_authenticated() ? 'none' : '',
347
				'LOGIN_LINK' => $_SERVER['SCRIPT_NAME'],
348
				'LOGIN_ICON' => 'login',
349
				'START_ICON' => 'blank',
350
				'URL_HELP' => 'http://www.websitebaker.org/',
351
				)
352
			);
353
			if(defined('DEFAULT_CHARSET')) {
354
				$charset=DEFAULT_CHARSET;
355
			} else {
356
				$charset='utf-8';
357
			}
358

  
359
			$template->set_var('CHARSET', $charset);
360

  
361
			$template->parse('main', 'mainBlock', false);
362
			$template->pparse('output', 'page');
363
		}
364
	}
365

  
366
	// sanities the REMEMBER_KEY cookie to avoid SQL injection
367
	function get_safe_remember_key() {
368
		if (!((strlen($_COOKIE['REMEMBER_KEY']) == 23) && (substr($_COOKIE['REMEMBER_KEY'], 11, 1) == '_'))) return '';
369
		// create a clean cookie (XXXXXXXXXXX_YYYYYYYYYYY) where X:= numeric, Y:= hash
370
		$clean_cookie = sprintf('%011d', (int) substr($_COOKIE['REMEMBER_KEY'], 0, 11)) . substr($_COOKIE['REMEMBER_KEY'], 11);
371
		return ($clean_cookie == $_COOKIE['REMEMBER_KEY']) ? $this->add_slashes($clean_cookie) : '';
372
	}
373

  
374
	// Warn user that they have had to many login attemps
375
	function warn() {
376
//		header('Location: '.$this->warning_url);
377
		$this->send_header($this->warning_url);
378
		exit(0);
379
	}
380

  
381 327
}

Also available in: Unified diff