Commit 968e9d7a authored by terry%netscape.com's avatar terry%netscape.com

Changed the way password validation works. We now keep a

crypt'd version of the password in the database, and check against that. (This is silly, because we're also keeping the plaintext version there, but I have plans...) Stop passing the plaintext password around as a cookie; instead, we have a cookie that references a record in a new database table, logincookies. IMPORTANT: if updating from an older version of Bugzilla, you must run the following commands to keep things working: ./makelogincookiestable.sh echo "alter table profiles add column cryptpassword varchar(64);" | mysql bugs echo "update profiles set cryptpassword = encrypt(password,substring(rand(),3, 4));" | mysql bugs
parent a40c093d
...@@ -171,7 +171,7 @@ proc make_options { src default {isregexp 0} } { ...@@ -171,7 +171,7 @@ proc make_options { src default {isregexp 0} } {
proc PasswordForLogin {login} { proc PasswordForLogin {login} {
SendSQL "select password from profiles where login_name = '[SqlQuote $login]'" SendSQL "select cryptpassword from profiles where login_name = '[SqlQuote $login]'"
return [FetchSQLData] return [FetchSQLData]
} }
...@@ -179,7 +179,7 @@ proc PasswordForLogin {login} { ...@@ -179,7 +179,7 @@ proc PasswordForLogin {login} {
proc confirm_login {{nexturl ""}} { proc confirm_login {{nexturl ""}} {
# puts "Content-type: text/plain\n" # puts "Content-type: text/plain\n"
global FORM COOKIE argv0 global FORM COOKIE argv0 env
ConnectToDatabase ConnectToDatabase
if { [info exists FORM(Bugzilla_login)] && if { [info exists FORM(Bugzilla_login)] &&
[info exists FORM(Bugzilla_password)] } { [info exists FORM(Bugzilla_password)] } {
...@@ -194,10 +194,18 @@ proc confirm_login {{nexturl ""}} { ...@@ -194,10 +194,18 @@ proc confirm_login {{nexturl ""}} {
puts "<p>Please click <b>back</b> and try again." puts "<p>Please click <b>back</b> and try again."
exit exit
} }
set realpwd [PasswordForLogin $FORM(Bugzilla_login)] set realcryptpwd [PasswordForLogin $FORM(Bugzilla_login)]
set enteredpwd $FORM(Bugzilla_password);
SendSQL "select encrypt('[SqlQuote $enteredpwd]','[crange $realcryptpwd 0 1]')";
set enteredcryptpwd [lindex [FetchSQLData] 0]
if {[info exists FORM(PleaseMailAPassword)]} { if {[info exists FORM(PleaseMailAPassword)]} {
if {[cequal $realpwd ""]} { if {[cequal $realcryptpwd ""]} {
set realpwd [InsertNewUser $FORM(Bugzilla_login)] set realpwd [InsertNewUser $FORM(Bugzilla_login)]
} else {
SendSQL "select password from profiles where login_name = '[SqlQuote $FORM(Bugzilla_login)]'"
set realpwd [lindex [FetchSQLData] 0]
} }
set template "From: bugzilla-daemon set template "From: bugzilla-daemon
To: %s To: %s
...@@ -205,15 +213,16 @@ Subject: Your bugzilla password. ...@@ -205,15 +213,16 @@ Subject: Your bugzilla password.
To use the wonders of bugzilla, you can use the following: To use the wonders of bugzilla, you can use the following:
E-mail address: %s E-mail address: %s
Password: %s Password: %s
To change your password, go to: To change your password, go to:
[Param urlbase]changepassword.cgi [Param urlbase]changepassword.cgi
(Your bugzilla and CVS password, if any, are not currently synchronized. (Your bugzilla and CVS password, if any, are not currently synchronized.
Top hackers are working around the clock to fix this, as you read this.) Top hackers are working around the clock to fix this, as you read this.)
" "
set msg [format $template $FORM(Bugzilla_login) \ set msg [format $template $FORM(Bugzilla_login) \
$FORM(Bugzilla_login) $realpwd] $FORM(Bugzilla_login) $realpwd]
...@@ -227,7 +236,7 @@ Top hackers are working around the clock to fix this, as you read this.) ...@@ -227,7 +236,7 @@ Top hackers are working around the clock to fix this, as you read this.)
exit exit
} }
if {[cequal $realpwd ""] || ![cequal $realpwd $FORM(Bugzilla_password)]} { if {[cequal $realcryptpwd ""] || ![cequal $enteredcryptpwd $realcryptpwd]} {
puts "Content-type: text/html\n" puts "Content-type: text/html\n"
puts "<H1>Login failed.</H1>" puts "<H1>Login failed.</H1>"
puts "The username or password you entered is not valid. Please" puts "The username or password you entered is not valid. Please"
...@@ -235,19 +244,33 @@ Top hackers are working around the clock to fix this, as you read this.) ...@@ -235,19 +244,33 @@ Top hackers are working around the clock to fix this, as you read this.)
exit exit
} }
set COOKIE(Bugzilla_login) $FORM(Bugzilla_login) set COOKIE(Bugzilla_login) $FORM(Bugzilla_login)
set COOKIE(Bugzilla_password) $FORM(Bugzilla_password) SendSQL "insert into logincookies (userid,cryptpassword,hostname) values ([DBNameToIdAndCheck $FORM(Bugzilla_login)], '[SqlQuote $realcryptpwd]', '[SqlQuote $env(REMOTE_HOST)]')"
SendSQL "select LAST_INSERT_ID()"
set logincookie [FetchSQLData]
set COOKIE(Bugzilla_logincookie) $logincookie
puts "Set-Cookie: Bugzilla_login=$COOKIE(Bugzilla_login) ; path=/; expires=Sun, 30-Jun-2029 00:00:00 GMT" puts "Set-Cookie: Bugzilla_login=$COOKIE(Bugzilla_login) ; path=/; expires=Sun, 30-Jun-2029 00:00:00 GMT"
puts "Set-Cookie: Bugzilla_password=$COOKIE(Bugzilla_password) ; path=/; expires=Sun, 30-Jun-2029 00:00:00 GMT" puts "Set-Cookie: Bugzilla_logincookie=$COOKIE(Bugzilla_logincookie) ; path=/; expires=Sun, 30-Jun-2029 00:00:00 GMT"
# This next one just cleans out any old bugzilla passwords that may
# be sitting around in the cookie files, from the bad old days when
# we actually stored the password there.
puts "Set-Cookie: Bugzilla_password= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT"
} }
set realpwd {} set loginok 0
if { [info exists COOKIE(Bugzilla_login)] && [info exists COOKIE(Bugzilla_password)] } { if { [info exists COOKIE(Bugzilla_login)] && [info exists COOKIE(Bugzilla_logincookie)] } {
set realpwd [PasswordForLogin $COOKIE(Bugzilla_login)] SendSQL "select profiles.login_name = '[SqlQuote $COOKIE(Bugzilla_login)]' and profiles.cryptpassword = logincookies.cryptpassword and logincookies.hostname = '[SqlQuote $env(REMOTE_HOST)]' from profiles,logincookies where logincookies.cookie = $COOKIE(Bugzilla_logincookie) and profiles.userid = logincookies.userid"
set loginok [FetchSQLData]
} }
if {[cequal $realpwd ""] || ![cequal $realpwd $COOKIE(Bugzilla_password)]} { if {$loginok != "1"} {
puts "Content-type: text/html\n" puts "Content-type: text/html\n"
puts "<H1>Please log in.</H1>" puts "<H1>Please log in.</H1>"
puts "I need a legitimate e-mail address and password to continue." puts "I need a legitimate e-mail address and password to continue."
...@@ -284,9 +307,18 @@ e-mail address above and click ...@@ -284,9 +307,18 @@ e-mail address above and click
here:<input type=submit value=\"E-mail me a password\" here:<input type=submit value=\"E-mail me a password\"
name=PleaseMailAPassword> name=PleaseMailAPassword>
</form>" </form>"
# This seems like as good as time as any to get rid of old
# crufty junk in the logincookies table. Get rid of any entry
# that hasn't been used in a month.
SendSQL "delete from logincookies where to_days(now()) - to_days(lastused) > 30"
exit exit
} }
# Update the timestamp on our logincookie, so it'll keep on working.
SendSQL "update logincookies set lastused = null where cookie = $COOKIE(Bugzilla_logincookie)"
} }
......
...@@ -66,7 +66,11 @@ Please click <b>Back</b> and try again." ...@@ -66,7 +66,11 @@ Please click <b>Back</b> and try again."
puts "Content-type: text/html\n" puts "Content-type: text/html\n"
SendSQL "update profiles set password='$pwd' where login_name='[SqlQuote $COOKIE(Bugzilla_login)]'" SendSQL "select encrypt('$pwd')"
set encrypted [lindex [FetchSQLData] 0]
SendSQL "update profiles set password='$pwd',cryptpassword='$encrypted' where login_name='[SqlQuote $COOKIE(Bugzilla_login)]'"
SendSQL "update logincookies set cryptpassword = '$encrypted' where cookie = $COOKIE(Bugzilla_logincookie)"
puts "<H1>OK, done.</H1> puts "<H1>OK, done.</H1>
Your new password has been set. Your new password has been set.
......
...@@ -49,14 +49,6 @@ proc ConnectToDatabase {} { ...@@ -49,14 +49,6 @@ proc ConnectToDatabase {} {
} }
} }
# Useful for my stand-alone debugging
proc DebugConnect {} {
global COOKIE
set COOKIE(Bugzilla_login) terry
set COOKIE(Bugzilla_password) terry
ConnectToDatabase
}
proc SendSQL { str } { proc SendSQL { str } {
# puts $str # puts $str
...@@ -71,7 +63,12 @@ proc SendSQL { str } { ...@@ -71,7 +63,12 @@ proc SendSQL { str } {
proc MoreSQLData {} { proc MoreSQLData {} {
global mysqlhandle global mysqlhandle
set result [mysqlresult $mysqlhandle "rows?"] set result [mysqlresult $mysqlhandle "rows?"]
return [expr ![cequal $result ""] && $result > 0] if {![cequal $result ""]} {
if {$result > 0} {
return 1
}
}
return 0
} }
proc FetchSQLData {} { proc FetchSQLData {} {
...@@ -286,7 +283,7 @@ proc InsertNewUser {username} { ...@@ -286,7 +283,7 @@ proc InsertNewUser {username} {
loop i 0 8 { loop i 0 8 {
append pwd [cindex "abcdefghijklmnopqrstuvwxyz" [random 26]] append pwd [cindex "abcdefghijklmnopqrstuvwxyz" [random 26]]
} }
SendSQL "insert into profiles (login_name, password) values ('[SqlQuote $username]', '$pwd')" SendSQL "insert into profiles (login_name, password, cryptpassword) values ('[SqlQuote $username]', '$pwd', encrypt('$pwd'))"
return $pwd return $pwd
} }
......
#!/bin/sh
#
# The contents of this file are subject to the Mozilla Public License
# Version 1.0 (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
# License for the specific language governing rights and limitations
# under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are Copyright (C) 1998
# Netscape Communications Corporation. All Rights Reserved.
#
# Contributor(s): Terry Weissman <terry@mozilla.org>
mysql bugs > /dev/null 2>/dev/null << OK_ALL_DONE
drop table logincookies;
OK_ALL_DONE
mysql bugs << OK_ALL_DONE
create table logincookies (
cookie mediumint not null auto_increment primary key,
userid mediumint not null,
cryptpassword varchar(64),
hostname varchar(128),
lastused timestamp,
index(lastused)
);
show columns from logincookies;
show index from logincookies;
OK_ALL_DONE
...@@ -31,6 +31,7 @@ create table profiles ( ...@@ -31,6 +31,7 @@ create table profiles (
userid mediumint not null auto_increment primary key, userid mediumint not null auto_increment primary key,
login_name varchar(255) not null, login_name varchar(255) not null,
password varchar(16), password varchar(16),
cryptpassword varchar(64),
realname varchar(255), realname varchar(255),
index(login_name) index(login_name)
); );
......
...@@ -234,11 +234,9 @@ if {[info exists COOKIE(Bugzilla_login)]} { ...@@ -234,11 +234,9 @@ if {[info exists COOKIE(Bugzilla_login)]} {
if {[cequal $COOKIE(Bugzilla_login) [Param maintainer]]} { if {[cequal $COOKIE(Bugzilla_login) [Param maintainer]]} {
puts "<a href=editparams.cgi>Edit Bugzilla operating parameters</a><br>" puts "<a href=editparams.cgi>Edit Bugzilla operating parameters</a><br>"
} }
puts " puts "<a href=relogin.cgi>Log in as someone besides <b>$COOKIE(Bugzilla_login)</b></a><br>"
<a href=relogin.cgi>Log in as someone besides <b>$COOKIE(Bugzilla_login)</b></a><br>
<a href=changepassword.cgi>Change my password.</a><br>"
} }
puts "<a href=changepassword.cgi>Change your password.</a><br>"
puts "<a href=\"enter_bug.cgi\">Create a new bug.</a><br>" puts "<a href=\"enter_bug.cgi\">Create a new bug.</a><br>"
}]} { }]} {
......
...@@ -26,6 +26,7 @@ source CGI.tcl ...@@ -26,6 +26,7 @@ source CGI.tcl
puts "Set-Cookie: Bugzilla_login= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT puts "Set-Cookie: Bugzilla_login= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
Set-Cookie: Bugzilla_logincookie= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
Set-Cookie: Bugzilla_password= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT Set-Cookie: Bugzilla_password= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
Content-type: text/html Content-type: text/html
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment