# HG changeset patch # User Dan # Date 1190089843 14400 # Node ID af0f6ec48de3df875f8f60a4a263bd533d757696 # Parent 0ae1b281a8842e5eae9a12c5c7a95a0e80a51592 Fully implemented password complexity enforcement; added encryption for passwords on registration form; some baby steps taken towards supporting international usernames - this is not working very well, we might need a hackish fix; TODO: implement password strength meter into installer UI and get international usernames 100% working diff -r 0ae1b281a884 -r af0f6ec48de3 includes/clientside/static/ajax.js --- a/includes/clientside/static/ajax.js Mon Sep 17 11:52:58 2007 -0400 +++ b/includes/clientside/static/ajax.js Tue Sep 18 00:30:43 2007 -0400 @@ -44,6 +44,16 @@ function ajaxEscape(text) { + /* + text = escape(text); + text = text.replace(/\+/g, '%2B', text); + */ + text = window.encodeURIComponent(text); + return text; +} + +function ajaxAltEscape(text) +{ text = escape(text); text = text.replace(/\+/g, '%2B', text); return text; diff -r 0ae1b281a884 -r af0f6ec48de3 includes/clientside/static/enano-lib-basic.js --- a/includes/clientside/static/enano-lib-basic.js Mon Sep 17 11:52:58 2007 -0400 +++ b/includes/clientside/static/enano-lib-basic.js Tue Sep 18 00:30:43 2007 -0400 @@ -282,6 +282,7 @@ 'dynano.js', 'flyin.js', 'paginate.js', + 'pwstrength.js', 'loader.js' ]; diff -r 0ae1b281a884 -r af0f6ec48de3 includes/clientside/static/misc.js --- a/includes/clientside/static/misc.js Mon Sep 17 11:52:58 2007 -0400 +++ b/includes/clientside/static/misc.js Tue Sep 18 00:30:43 2007 -0400 @@ -446,8 +446,11 @@ 'level' : ajax_auth_level_cache }; + window.console.debug(json_data); json_data = toJSONString(json_data); - json_data = ajaxEscape(json_data); + window.console.debug(json_data); + json_data = ajaxAltEscape(json_data); + window.console.debug(json_data); var loading_win = '
Logging in...
\ diff -r 0ae1b281a884 -r af0f6ec48de3 includes/render.php --- a/includes/render.php Mon Sep 17 11:52:58 2007 -0400 +++ b/includes/render.php Tue Sep 18 00:30:43 2007 -0400 @@ -72,7 +72,7 @@ $chartag = $row['char_tag']; unset($row); // Free some memory - if ( preg_match('#^\#redirect \[\[(.+?)\]\]#', $message, $m) && $redir && !isset($_GET['redirect']) || ( isset($_GET['redirect']) && $_GET['redirect'] != 'no' ) ) + if ( preg_match("#^\#redirect \[\[([^\]\r\n\a\t]+?)\]\]#", $message, $m) && $redir && ( !isset($_GET['redirect']) || ( isset($_GET['redirect']) && $_GET['redirect'] != 'no' ) ) ) { dc_here('render: looks like a redirect page to me...'); $old = $paths->cpage; diff -r 0ae1b281a884 -r af0f6ec48de3 includes/sessions.php --- a/includes/sessions.php Mon Sep 17 11:52:58 2007 -0400 +++ b/includes/sessions.php Tue Sep 18 00:30:43 2007 -0400 @@ -150,7 +150,8 @@ * @var string */ - var $valid_username = '([A-Za-z0-9 \!\@\(\)-]+)'; + //var $valid_username = '([A-Za-z0-9 \!\@\(\)-]+)'; + var $valid_username = '([^<>_&\?\'"%\n\r\t\a]+)'; /** * What we're allowed to do as far as permissions go. This changes based on the value of the "auth" URI param. @@ -576,10 +577,21 @@ // Initialize our success switch $success = false; + // Escaped username + $db_username = $this->prepare_text(strtolower($username)); + // Select the user data from the table, and decrypt that so we can verify the password - $this->sql('SELECT password,old_encryption,user_id,user_level,theme,style,temp_password,temp_password_time FROM '.table_prefix.'users WHERE lcase(username)=\''.$this->prepare_text(strtolower($username)).'\';'); + $this->sql('SELECT password,old_encryption,user_id,user_level,theme,style,temp_password,temp_password_time FROM '.table_prefix.'users WHERE lcase(username)=\''.$db_username.'\' OR username=\'' . $db_username . '\';'); if($db->numrows() < 1) - return 'The username and/or password is incorrect.'; + { + // This wasn't logged in <1.0.2, dunno how it slipped through + if($level > USER_LEVEL_MEMBER) + $this->sql('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,date_string,author,edit_summary,page_text) VALUES(\'security\', \'admin_auth_bad\', '.time().', \''.date('d M Y h:i a').'\', \''.$db->escape($username).'\', \''.$db->escape($_SERVER['REMOTE_ADDR']).'\', ' . intval($level) . ')'); + else + $this->sql('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,date_string,author,edit_summary) VALUES(\'security\', \'auth_bad\', '.time().', \''.date('d M Y h:i a').'\', \''.$db->escape($username).'\', \''.$db->escape($_SERVER['REMOTE_ADDR']).'\')'); + + return "The username and/or password is incorrect."; + } $row = $db->fetchrow(); // Check to see if we're logging in using a temporary password @@ -1392,24 +1404,51 @@ $username = $this->prepare_text($username); $email = $this->prepare_text($email); $real_name = $this->prepare_text($real_name); - $password = $aes->encrypt($password, $this->private_key, ENC_HEX); $nameclause = ( $real_name != '' ) ? ' OR real_name=\''.$real_name.'\'' : ''; $q = $this->sql('SELECT * FROM '.table_prefix.'users WHERE lcase(username)=\''.strtolower($username).'\' OR email=\''.$email.'\''.$nameclause.';'); - if($db->numrows() > 0) { + if($db->numrows() > 0) + { $r = 'The '; $i=0; $row = $db->fetchrow(); // Wow! An error checker that actually speaks English with the properest grammar! :-P - if($row['username'] == $username) { $r .= 'username'; $i++; } - if($row['email'] == $email) { if($i) $r.=', '; $r .= 'e-mail address'; $i++; } - if($row['real_name'] == $real_name && $real_name != '') { if($i) $r.=', and '; $r .= 'real name'; $i++; } + if ( $row['username'] == $username ) + { + $r .= 'username'; + $i++; + } + if ( $row['email'] == $email ) + { + if($i) $r.=', '; + $r .= 'e-mail address'; + $i++; + } + if ( $row['real_name'] == $real_name && $real_name != '' ) + { + if($i) $r.=', and '; + $r .= 'real name'; + $i++; + } $r .= ' that you entered '; $r .= ( $i == 1 ) ? 'is' : 'are'; $r .= ' already in use by another user.'; return $r; } + // Is the password strong enough? + if ( getConfig('pw_strength_enable') ) + { + $min_score = intval( getConfig('pw_strength_minimum') ); + $pass_score = password_score($password); + if ( $pass_score < $min_score ) + { + return 'The password you entered did not meet the complexity requirements for this site. Please choose a stronger password.'; + } + } + + $password = $aes->encrypt($password, $this->private_key, ENC_HEX); + // Require the account to be activated? switch(getConfig('account_activation')) { diff -r 0ae1b281a884 -r af0f6ec48de3 includes/template.php --- a/includes/template.php Mon Sep 17 11:52:58 2007 -0400 +++ b/includes/template.php Tue Sep 18 00:30:43 2007 -0400 @@ -1146,7 +1146,7 @@ $text_parser = $this->makeParserText($tplvars['sidebar_button']); - preg_match_all('#\[\[([a-zA-Z0-9 -_]*?)\]\]#is', $message, $il); + preg_match_all("#\[\[([^\|\]\n\a\r\t]*?)\]\]#is", $message, $il); for($i=0;$iPassword complexity requirements are not enforced here.