<?php
-$ALLOWED = [
- '127.0.0.1',
- '192.168.178.0/24',
- '94.208.83.16', # arie.ziggo
- '83.161.198.138', # shiar.demon
- '145.131.141.219', # shiar@1m
-];
-
-$editable = in_array($_SERVER['REMOTE_ADDR'], $ALLOWED) ?
- $_SERVER['REMOTE_ADDR'] : FALSE;
+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 admin()
+ {
+ return @file_exists("{$this->dir}/.admin");
+ }
+
+ function seen()
+ {
+ return @filemtime("{$this->dir}/last.log");
+ }
+}
+
+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;
+ if (!isset($inpass)) {
+ @list ($inuser, $inauth) = explode(':', $inuser, 2);
+ }
+
+ # find password data by user name
+ $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;
+
+ # verify password
+ $authhash = md5($usertest);
+ if (isset($inpass)) {
+ if (!login_password_verify($inpass, $usertest)) return;
+ }
+ else {
+ if ($inauth !== $authhash) return;
+ }
+
+ if (function_exists('apache_note')) apache_note('user', $inuser);
+
+ if ($log = @fopen("$userdir/last.log", 'w')) {
+ fwrite($log, "{$_SERVER['REMOTE_ADDR']} {$_SERVER['HTTP_USER_AGENT']}\n");
+ }
+
+ return [
+ 'name' => $inuser,
+ 'dir' => $userdir,
+ 'admin' => file_exists("$userdir/.admin"),
+ 'pass' => $usertest,
+ 'auth' => "$inuser:$authhash",
+ ];
+}
+
+if (isset($_COOKIE['login'])) {
+ global $User;
+ $User = login($_COOKIE['login']);
+}