thumb: indicate 1 month caching of generated output
[minimedit.git] / auth.inc.php
index ef80ecdab5533200649183c81cc618c554eea2d2..4d9b29e2a297f00e05184cdb954e54c802d1c958 100644 (file)
@@ -1,4 +1,76 @@
 <?php
+date_default_timezone_set('Europe/Amsterdam');
+
+class User
+{
+       function __construct($dir)
+       {
+               if (!file_exists($dir)) {
+                       throw new Exception("Gebruiker niet gevonden in $dir");
+               }
+               $this->dir = $dir;
+               $this->login = basename($dir);
+       }
+
+       function __get($col)
+       {
+               return $this->$col = $this->$col();  # run method and cache
+       }
+
+       function rawname()
+       {
+               return rtrim(@file_get_contents("{$this->dir}/name.txt"));
+       }
+
+       function name()
+       {
+               return htmlspecialchars(implode(' & ', explode("\n", $this->rawname)));
+       }
+
+       function html()
+       {
+               return $this->name ?: $this->login;
+       }
+
+       function email()
+       {
+               return rtrim(@file_get_contents("{$this->dir}/email.txt"));
+       }
+
+       function admin()
+       {
+               return @file_exists("{$this->dir}/.admin");
+       }
+
+       function seen()
+       {
+               return @filemtime("{$this->dir}/last.log");
+       }
+
+       function logclient()
+       {
+               if ($log = @fopen("{$this->dir}/last.log", 'w')) {
+                       $line = $_SERVER['REMOTE_ADDR'].' '.$_SERVER['HTTP_USER_AGENT'];
+                       fwrite($log, $line."\n");
+               }
+       }
+}
+
+function login_password_verify($input, $test)
+{
+       if (substr($test, 0, 1) != '$') {
+               # plaintext match for uncrypted passwords
+               return $input === $test;
+       }
+       return password_verify($input, $test);
+}
+
+function login_setcookie()
+{
+       global $User;
+       return setcookie('login', $User->auth, 0, '/');
+}
+
 function login($inuser, $inpass = NULL)
 {
        if (empty($inuser)) return;
@@ -7,7 +79,8 @@ function login($inuser, $inpass = NULL)
        }
 
        # find password data by user name
-       $pwfile = sprintf('login/%s/.passwd', strtolower($inuser));
+       $userdir = 'profile/'.preg_replace('/[^a-z0-9]+/', '-', strtolower($inuser));
+       $pwfile = "$userdir/.passwd";
        if (!file_exists($pwfile)) return;
        $usertest = trim(file_get_contents($pwfile));
        if (!$usertest) return;
@@ -15,7 +88,7 @@ function login($inuser, $inpass = NULL)
        # verify password
        $authhash = md5($usertest);
        if (isset($inpass)) {
-               if (!password_verify($inpass, $usertest)) return;
+               if (!login_password_verify($inpass, $usertest)) return;
        }
        else {
                if ($inauth !== $authhash) return;
@@ -23,11 +96,11 @@ function login($inuser, $inpass = NULL)
 
        if (function_exists('apache_note')) apache_note('user', $inuser);
 
-       return [
-               'name'  => $inuser,
-               'admin' => !empty($inuser) && strtolower($inuser) != 'lid',
-               'auth'  => "$inuser:$authhash",
-       ];
+       $user = new User($userdir);
+       $user->logclient();
+       $user->pass = $usertest;
+       $user->auth = "$inuser:$authhash";
+       return $user;
 }
 
 if (isset($_COOKIE['login'])) {