ad_validate_security_info

one of the documented procedures in this installation of the ACS
Usage:
ad_validate_security_info { -secure f }
What it does:
Validates the security info for the current connection, including session and user ID. If -secure t is specified, requires that the security info be secure to be considered valid.
Defined in: /web/philip/packages/acs-core/security-procs.tcl

Source code:

arg_parser_for_ad_validate_security_info $args

    
    global ad_conn
     
    if { $ad_conn(sec_validated) == "secure" || ( $secure == "f" && $ad_conn(sec_validated) == "insecure" ) } {
	return 1
    }

    set security_info [util_memoize "sec_get_session_info $ad_conn(session_id)"  [ad_parameter "SessionInfoCacheInterval" "" 600]]
    if { $security_info == "" } {
	set db [ns_db gethandle log]
	ad_assign_session_id $db
	ns_db releasehandle $db
	set security_info [util_memoize "sec_get_session_info $ad_conn(session_id)"  [ad_parameter "SessionInfoCacheInterval" "" 600]]
    }

    set user_id [lindex $security_info 0]
    set token [lindex $security_info 1]
    set secure_token [lindex $security_info 2]
    set last_ip [lindex $security_info 3]
    set last_hit [lindex $security_info 4]

    if { $user_id == "" } {
	set user_id 0
    }

    # We don't compare $last_ip, since some proxies rotate IP addresses. Thanks to lars@pinds.com.

    if { $last_hit + [sec_session_timeout] < [ns_time] || $user_id != $ad_conn(user_id) } {
	# Timeout. Fail, and clear the session ID cookie.
	sec_log "Timed out: clearing session ID cookie"
	sec_clear_session_id_cookie
	return 0
    }

    if { [string compare $token $ad_conn(token)] } {
	# The insecure token doesn't match. Fail, and clear the session ID cookie.
	sec_clear_session_id_cookie
	return 0
    }

    if { $secure == "f" } {
	# Passed with flying colors (for insecure validation).
	set ad_conn(sec_validated) "insecure"
    } else {
	if { ![ad_secure_conn_p] } {
	    # An insecure connection can't be securely validated.
	    return 0
	}

	if { [empty_string_p $secure_token] } {
	    # Secure token not yet assigned. Generate it; also regenerate insecure token.

	    set ad_conn(token) [sec_random_token]
	    set secure_token [sec_random_token]

	    set db [ns_db gethandle log]
	    ns_db dml $db "
                update sec_sessions
                set token = '$ad_conn(token)', secure_token = '$secure_token'
                where session_id = $ad_conn(session_id)
	    "
	    ns_db releasehandle $db
	    util_memoize_seed "sec_get_session_info $ad_conn(session_id)" [list $user_id $ad_conn(token) $secure_token $last_ip $last_hit]

	    sec_generate_session_id_cookie
	    sec_generate_secure_token_cookie $secure_token
	} elseif { [string compare [ns_urldecode [ad_get_cookie "ad_secure_token"]] $secure_token] } {
	    # Secure token doesn't match. Nice try, sucka.
	    sec_clear_session_id_cookie
	    return 0
	}
	set ad_conn(sec_validated) "secure"
    }
    return 1


philg@mit.edu