SQL-based authentication: Difference between revisions

→‎Tcl: Added implementation
No edit summary
(→‎Tcl: Added implementation)
Line 88:
"user successfully created and authenticated!\n" print
 
=={{header|Tcl}}==
{{works with|Tcl|8.6}}
Also requires the TDBC driver for MySQL, and the md5 package from tcllib.
<lang Tcl>package require tdbc
package require
 
proc connect_db {handleName dbname host user pass} {
package require tdbc::mysql
tdbc::mysql::connection create $handleName -user $user -passwd $pass \
-host $host -database $dbname
return $handleName
}
 
proc r64k {} {
expr int(65536*rand())
}
proc encode {salt pass} {
md5::md5 $salt$pass
}
 
proc create_user {handle user pass} {
set salt [binary format ssssssss \
[r64k] [r64k] [r64k] [r64k] [r64k] [r64k] [r64k] [r64k]]
set md5 [encode $salt $pass]
$handle allrows {
INSERT IGNORE INTO users (username, pass_salt, pass_md5)
VALUES (:user, :salt, :md5)
}
return ;# Ignore the result of the allrows method
}
 
proc authenticate_user {handle user pass} {
$handle foreach row {
SELECT userid, pass_salt, pass_md5 FROM users WHERE
username=:user LIMIT 1
} {
dict with row {
if {$pass_md5 eq [encode $pass_salt $pass]} {
return $userid
}
}
}
error "authentication failed for user \"$user\""
}</lang>
Anonymous user