Warum Frontend-Login über front_crclogin nicht funzt

Gesperrt
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Warum Frontend-Login über front_crclogin nicht funzt

Beitrag von HerrB »

In conlib/local.php Klasse Contenido_Frontend_Challenge_Crypt_Auth Methode auth_validatelogin fehlt die Berücksichtigung der Frontend-Accounts (und ein global $client):

Vor

Code: Alles auswählen

$exspected_response = md5("$username:$pass:$challenge");
dies einfügen:

Code: Alles auswählen

/* Authentification via frontend users */
    $query = sprintf("SELECT idfrontenduser, password FROM %s WHERE username = '%s' AND idclient='$client' AND active='1'", $this->fe_database_table, urlencode($username));
    $this->db->query($query);
    
	if ($this->db->next_record())
	{
		$uid = $this->db->f("idfrontenduser");
		$perm = "frontend";
		$pass = $this->db->f("password");
	}
(Problem, dass bei Klick auf geschützte Katgeorie bei fehlender Umleitung Login-Fenster mit nobody erscheint, in dem sich kein Frontend-User anmelden kann).

Für Checkin vorgesehen.

Gruß
HerrB
Zuletzt geändert von HerrB am Do 25. Jan 2007, 21:03, insgesamt 1-mal geändert.
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ähm...

@HerrB
sag mal

Code: Alles auswählen

AND locked='0'
war was ? die spalte kenn ich nicht...
*** make your own tools (wishlist :: thx)
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

... hat da auch nix verloren, geändert.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

zwecks vereinfachung...

Contenido_Frontend_Challenge_Crypt_Auth

function auth_preauth()

und

function auth_validatelogin()

machen an sich das selbe (bis auf eine kleinigkeit)

sobald die änderung in der auth_validatelogin ergänzt wurde, könnte man folgende neue version der auth_preauth() verwenden... (dann gäbe es weniger doppelten code)

Code: Alles auswählen

   function auth_preauth()
  {
    global $password;
    
    if ($password == "")
    {
    	/* Stay as nobody when an empty password is passed */
        $uid = $this->auth["uname"] = $this->auth["uid"] = "nobody";
        return false;
    }
    
    return $this->auth_validatelogin(); // shorten up
    
   }
*** make your own tools (wishlist :: thx)
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Finde ich gut. Ich habe mir die Funktion dann mal komplett angesehen.

Da ich natürlich dabei das eine oder andere Geheimnis des Login-Prozesses übersehen haben könnte, freue ich mich über Feedback. Danke.

- Es werden erst die Frontend-Accounts überprüft.
- Wurde ein Frontend-Account gefunden, werden die Backend-Accounts nicht mehr berücksichtigt.
- Wenn kein Account gefunden werden kann, wird auch nicht versucht, Gruppenrechte zu dem Account zu ermitteln. Es werden nur für Backend-Accounts Gruppenrechte ermittelt.

Code: Alles auswählen

function auth_validatelogin()
  {
	global $username, $password, $challenge, $response, $auth_handlers, $client;
    
    $client = (int)$client;
    
    if(isset($username))
    {
        $this->auth["uname"] = $username;     ## This provides access for "loginform.ihtml"
    } else if ($this->nobody) {                      ##  provides for "default login cancel"
        $uid = $this->auth["uname"] = $this->auth["uid"] = "nobody";
        return $uid;
    }
    
    $uid = false;

    /* Authentification via frontend users */
    $this->db->query(sprintf("SELECT idfrontenduser, password FROM %s WHERE username = '%s' AND idclient='$client' AND active='1'", 
    						 $this->fe_database_table,
    						 urlencode($username)));
    
	if ($this->db->next_record())
	{
		$uid  = $this->db->f("idfrontenduser");
		$perm = "frontend";
		$pass = $this->db->f("password");
	}
	
	if ($uid == false)
	{
		/* Authentification via backend users */
    	$this->db->query(sprintf("select user_id, perms, password from %s where username = '%s'",
                          		 $this->database_table,
								 addslashes($username)));

        while($this->db->next_record())
        {
			$uid   = $this->db->f("user_id");
			$perm  = $this->db->f("perms");
			$pass  = $this->db->f("password");   ## Password is stored as a md5 hash

			if (is_array($auth_handlers))
			{
    			if (in_array($pass, $auth_handlers))
    			{
    				$success = call_user_func($pass, $username, $password);
    		
    				if ($success)
    				{
    					$uid  = md5($username);
        				$pass = md5($password);
    				}
    			}
			}
		}
	
		if ($uid !== false) {
	    	$this->db->query(sprintf("select A.group_id as group_id, A.perms as perms ".
    	            				 "from %s AS A, %s AS B where A.group_id = B.group_id AND ".
    	            				 "B.user_id = '%s'",
        	                 		 $this->group_table,
            	             		 $this->member_table,
                	         		 $uid));
                          
			/* Deactivated: Backend user would be sysadmin when logged on as frontend user
	     	*  (and perms would be checked), see http://www.contenido.org/forum/viewtopic.php?p=85666#85666 
			$perm = "sysadmin"; */
			if ($perm != "")
			{
				$gperm[] = $perm;
			}
	
	    	while ($this->db->next_record())
    		{
    			$gperm[] = $this->db->f("perms");
    		}
    
	    	if (is_array($gperm))
    		{
    			$perm = implode(",",$gperm);
    		}
		}
	}
	
	if ($uid == false)
	{
		## Account not found, sleep and exit
		sleep(5);
		return false;
	} else {
		if ($response == "")					## True when JS is disabled
		{
			if (md5($password) != $pass)		## md5 hash for non-JavaScript browsers
			{
				sleep(5);
				return false;
			} else {
				$this->auth["perm"] = $perm;
				return $uid;
			}
		}

		$expected_response = md5("$username:$pass:$challenge");
    	if ($expected_response != $response)	## Response is set, JS is enabled
		{
			sleep(5);
			return false;
		} else {
			$this->auth["perm"] = $perm;
			return $uid;
		}
	}
  }
Noch nicht getestet.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Done.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Gesperrt