#rR gscope_passman.tcl package require TclOO oo::class create ::PassMan { #rR Gère tout ce qui concerne les mots de passes encryptes dans un fichier type htpasswd""" variable fichierPasswd variable lesUser variable lesEncpDe constructor {{fichierAutre ""}} { package require md5 package require md5crypt if {$fichierAutre!=""} { set fichierPasswd $fichierAutre } else { set fichierPasswd "/usr/local/apache2/users/blastome_passwd" } set lesUser {} set lesEncpDe [dict create] set f [open $fichierPasswd "r"] while {[gets $f ligne]>=0} { if { ! [regexp {^[^\:]+\:.+} $ligne]} { continue } lassign [split $ligne ":"] user encp lappend lesUser $user #if { ! [dict exists lesEncpDe $user]} { dict create $lesEncpDe $user } dict lappend lesEncpDe $user $encp } close $f } method users {} { return $lesUser } method encpNE_DOIT_PAS_EXISTER {user} { if {[dict exists $lesEncpDe $user]} { return [dict get $lesEncpDe $user] } else { return {} } } method userExists {user} { return [expr [lsearch -exact $lesUser $user]>=0] } method passOk {user rawp} { if { ! [my userExists $user] } { return 0 } LogWscope "passOk $user $rawp" foreach encp [dict get $lesEncpDe $user] { LogWscope $encp if {$encp==$rawp} { return 1 } if {[llength [split $encp "\$"]]<4} { continue } lassign [split $encp "\$"] bidon algo1 salt1 hash1 set hash2 "turlututu" if {[regexp "apr" $algo1]} { lassign [split [::md5crypt::aprcrypt $rawp $salt1] "\$"] bidon algo2 salt2 hash2 } elseif {[regexp "xxxxxxxxsha" algo1]} { lassign [split [::xxxxxxx::xxxxxxxx $rawp $salt1] "\$"] bidon algo2 salt2 hash2 } if {[string equal $hash1 $hash2]} { return 1 } } return 0 } method createNew {login passe {dirsToCreate ""}} { if {[my userExists $login]} { return "User already exists" } set newSalt "8sFt66rZ" ; #rR a faire !!!!!!! set newHash [::md5crypt::aprcrypt $passe $newSalt] if { ! [dict exists $lesEncpDe $login] || [lsearch -exact [dict get $lesEncpDe $login] $newHash]<0} { set newLine "$login:$newHash" dict lappend lesEncpDe $login $newHash set f [open $fichierPasswd "a"] puts $f $newLine close $f } foreach dir $dirsToCreate { file mkdir $dir } return $login } } proc TestPassman {} { set pm [::PassMan new] Espionne [$pm passOk ripp alphaRR] $pm createNew titi titi Espionne [$pm passOk titi tuututut] Espionne [$pm passOk titi titi] return ok } proc Cookie {{qui ""}} { #rR a faire si on n'est pas dans Zinc if {[info exists $::env(HTTP_COOKIE)]} { return "" } set lesCook [dict create] foreach cookie [split $::env(HTTP_COOKIE) ";"] { lassign [split $cookie "="] key value if {$key == $qui} { return $value } dict set lesCook $key $value } if {$qui=="GetDict"} { return $lesCook } return "" } proc MyLogin {{NewValue ""}} { global MyLogin if {$NewValue!=""} { set MyLogin $NewValue } if { ! [info exists MyLogin]} { set MyLogin "AnonymousUser" } return $MyLogin }