Index by: file name | procedure name | procedure call | annotation
gscope_passman.tcl (annotations | original source)

#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
}

Index by: file name | procedure name | procedure call | annotation
File generated 2022-04-05 at 12:55.