Seite 1 von 1

bug conlib/local.php

Verfasst: Fr 11. Aug 2006, 11:05
von emergence
damit ich es mal erwähnt hab... wollte eigentlich ganz was anders versuchen aber na ja...

folgendes findet sich mehrfach in conlib/local.php

Code: Alles auswählen

    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);
                }
            }
        }
    }
gut, folgende funktion zum registrieren eigener auth handler gibts da auch noch

Code: Alles auswählen

/* Registers an external auth handler */
function register_auth_handler($handler)
{
    global $auth_handlers;

    if (!is_array($auth_handlers))
    {
        $auth_handlers = array();
    }

    if (!in_array($handler, $auth_handlers))
    {
        $auth_handlers[] = $handler;
    }
}
tja und der aufruf des handlers erfolgt nur dann wenn das passwort dem handlernamen entspricht...

jetzt komm ich zum bug...
da $pass immer ein md5 kodierter wert ist, kann das hier
if (in_array($pass, $auth_handlers))
nie stimmen...

die funktion müsste dann
function *md5 kodierter wert des handlers* () { }
heissen....

entweder ist das in der doku(Pluggable Authentification) falsch beschrieben, oder der code wurde in der form noch eingesetzt als das pw noch nicht md5 kodiert war...

Verfasst: Fr 11. Aug 2006, 11:25
von emergence
ich hab jetzt etwas geändert, damit läuft das zumindestens bei mir so, wie es dokumentiert wurde...

die funktion wurde geändert (und kann nun auch mehrere handler auf einmal registrieren...)

Code: Alles auswählen

/* Registers an external auth handler */
function register_auth_handler($handlers) {
	global $auth_handlers;

	if (!is_array($auth_handlers))
	{
		$auth_handlers = array();
	}

	if (!is_array($handlers)) {
		$handlers = Array($handlers);
	}

	foreach ($handlers as $handler) {
		if (!in_array($handler, $auth_handlers)) {
			$auth_handlers[md5($handler)] = $handler;
		}
	}

}
und die passage zum checken ob ein handler gültig ist sieht bei mir nun so aus

Code: Alles auswählen

		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 (isset($auth_handlers[$pass])) {
					$success = call_user_func($auth_handlers[$pass], $username, $password);

					if ($success) {
						$uid = md5($username);
						$pass = md5($password);
					}
				}
			}

		}
die andere variante des call_user_func würde noch bei allen nicht Crypt klassen lauffähig sein...

Verfasst: Fr 11. Aug 2006, 11:34
von emergence
und weil ich schon dabei bin

class Contenido_Frontend_Challenge_Crypt_Auth

function auth_validatelogin()

Code: Alles auswählen

    $perm = "sysadmin";
rausnehmen... ein backenduser hätte im frontend wenn man darauf hingehend kontrolliert automatisch perm sysadmin...
hat da wirklich nichts verloren...

Verfasst: Mo 2. Okt 2006, 17:13
von HerrB
Das mit dem $perm habe ich mal rausgenommen (da bin ich gespannt, ob das nicht 4fb-Projekte betrifft...).

Zum anderen: Kann ich überhaupt nicht einschätzen/testen. Kann das jemals vorher funktioniert haben bzw. wenn es in der jetzigen Form funktioniert hat, ist die Änderung mit ggf. vorhandenen Handlern/Code kompatibel?

Gruß
HerrB

Verfasst: Mo 2. Okt 2006, 17:22
von emergence
gute frage...
ich denke das construct wurde mal für die nicht crypt klassen geschrieben... dort würde es ja funktionieren...

Verfasst: Fr 6. Okt 2006, 12:02
von emergence
ach ja lt. che hat das noch nie wirklich funktioniert...

Verfasst: Di 5. Jun 2007, 23:42
von HerrB
Soweit eingebaut. Wäre ein

Code: Alles auswählen

if (array_key_exists($pass, $auth_handlers))
statt

Code: Alles auswählen

if (isset($auth_handlers[$pass]))
eventuell robuster?

Gruß
HerrB

Verfasst: Mi 6. Jun 2007, 05:39
von emergence
HerrB hat geschrieben:Soweit eingebaut. Wäre ein

Code: Alles auswählen

if (array_key_exists($pass, $auth_handlers))
statt

Code: Alles auswählen

if (isset($auth_handlers[$pass]))
eventuell robuster?
möglich... müsste auch funktionieren...

Verfasst: So 24. Jun 2007, 18:51
von HerrB
Done.

Gruß
HerrB