<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>ewiki.sql</filename>
    </added>
    <added>
      <filename>templates/archaic/edit-profile.php</filename>
    </added>
    <added>
      <filename>templates/archaic/login.php</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -37,5 +37,8 @@ final class Config
 
     // The default maximum image height
     const IMAGE_HEIGHT = 480;
+
+    // The DSN of the database to use
+    const DSN = 'pgsql:';
 }
 </diff>
      <filename>include/config.class.php</filename>
    </modified>
    <modified>
      <diff>@@ -48,14 +48,39 @@ function ls_r($path)
     return $r;
 }
 
+function gentoken($len, $chrs='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./-_')
+{
+    $str = '';
+    for ($i = 0; $i &lt; $len; $i++)
+        $str .= $chrs{rand(0, strlen($chrs)-1)};
+    return $str;
+}
+
+$pdo = new PDO(Config::DSN);
+$pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$view = new View;
+
+$user = NULL;
+if (isset($_COOKIE['session']))
+{
+    $stmt = $pdo-&gt;prepare('SELECT * FROM ewiki_users WHERE &quot;session&quot; = :session');
+    $stmt-&gt;execute(array('session' =&gt; $_COOKIE['session']));
+    $user = $stmt-&gt;fetchObject();
+    $stmt-&gt;closeCursor();
+
+    if ($user === FALSE)
+        $user = NULL;
+}
+
+$view-&gt;user = $user;
+
 $repo = new Git(Config::GIT_PATH);
 
 $parts = explode('?', $_SERVER['REQUEST_URI'], 2);
 assert(!strncmp($parts[0], Config::PATH, strlen(Config::PATH)));
 $parts[0] = substr($parts[0], strlen(Config::PATH));
 
-$view = new View;
-
 $tip = $repo-&gt;getHead(Config::GIT_BRANCH);
 $commit = $tip;
 if (isset($_GET['commit']))
@@ -84,7 +109,36 @@ else
     $view-&gt;page = $page;
 }
 
-if ($special[0] == 'recent') // {{{1
+if (!$user || $special[0] == 'login') // {{{1
+{
+    $view-&gt;setTemplate('login.php');
+
+    $view-&gt;wrong = FALSE;
+    if (isset($_POST['user']) &amp;&amp; isset($_POST['password']))
+    {
+        $stmt = $pdo-&gt;prepare('SELECT * FROM ewiki_users WHERE &quot;user&quot; = :user AND &quot;password&quot; = :password');
+        $stmt-&gt;execute(array('user' =&gt; $_POST['user'], 'password' =&gt; sha1($_POST['password'])));
+        $user = $stmt-&gt;fetchObject();
+        $stmt-&gt;closeCursor();
+
+        if ($user)
+        {
+            $session = gentoken(10);
+            $stmt = $pdo-&gt;prepare('UPDATE ewiki_users SET &quot;session&quot; = :session WHERE &quot;user&quot; = :user');
+            $stmt-&gt;execute(array('user' =&gt; $user-&gt;user, 'session' =&gt; $session));
+            $stmt-&gt;closeCursor();
+
+            setcookie('session', $session, 0, Config::PATH . '/');
+            redirect(Config::PATH . '/');
+            exit(0);
+        }
+        else
+            $view-&gt;wrong = TRUE;
+    }
+
+    $view-&gt;display();
+}
+else if ($special[0] == 'recent') // {{{1
 {
     $view-&gt;setTemplate('recent-changes.php');
 
@@ -193,6 +247,47 @@ else if ($special[0] == 'merge') // {{{1
 
     $view-&gt;display();
 }
+else if ($special[0] == 'profile') // {{{1
+{
+    $view-&gt;setTemplate('edit-profile.php');
+
+    $view-&gt;invalid_password = FALSE;
+    if (isset($_POST['email']) &amp;&amp; isset($_POST['newpass']))
+    {
+        $stmt = $pdo-&gt;prepare('UPDATE ewiki_users SET &quot;email&quot; = :email WHERE &quot;user&quot; = :user');
+        $stmt-&gt;execute(array('user' =&gt; $user-&gt;user, 'email' =&gt; $_POST['email']));
+        $stmt-&gt;closeCursor();
+        $user-&gt;email = $_POST['email'];
+
+        if ($_POST['newpass'])
+        {
+            if (strlen($_POST['newpass']) &gt;= 3)
+            {
+                $stmt = $pdo-&gt;prepare('UPDATE ewiki_users SET &quot;password&quot; = :pass WHERE &quot;user&quot; = :user');
+                $stmt-&gt;execute(array('user' =&gt; $user-&gt;user, 'pass' =&gt; sha1($_POST['newpass'])));
+                $stmt-&gt;closeCursor();
+            }
+            else
+                $view-&gt;invalid_password = TRUE;
+        }
+
+        if (!$view-&gt;invalid_password)
+        {
+            redirect(Config::PATH . '/');
+            exit(0);
+        }
+    }
+
+    $view-&gt;display();
+}
+else if ($special[0] == 'logout') // {{{1
+{
+    $stmt = $pdo-&gt;prepare('UPDATE ewiki_users SET &quot;session&quot; = NULL WHERE &quot;user&quot; = :user');
+    $stmt-&gt;execute(array('user' =&gt; $user-&gt;user));
+    $stmt-&gt;closeCursor();
+    setcookie('session', '', 1, Config::PATH . '/');
+    redirect(Config::PATH . '/');
+}
 else if ($special !== NULL) // {{{1
     throw new Exception(sprintf('unknown special: %s', $special[0]));
 else if ($action == 'view') // {{{1
@@ -302,8 +397,16 @@ else if ($action == 'edit') // {{{1
 	$newcommit-&gt;tree = $tree-&gt;getName();
         $newcommit-&gt;parents = array($commit-&gt;getName());
 	$stamp = new GitCommitStamp;
-	$stamp-&gt;name = $_SERVER['REMOTE_ADDR'];
-	$stamp-&gt;email = sprintf('anonymous@%s', $_SERVER['REMOTE_ADDR']);
+        if ($user)
+        {
+            $stamp-&gt;name = $user-&gt;name;
+            $stamp-&gt;email = $user-&gt;email;
+        }
+        else
+        {
+            $stamp-&gt;name = $_SERVER['REMOTE_ADDR'];
+            $stamp-&gt;email = sprintf('anonymous@%s', $_SERVER['REMOTE_ADDR']);
+        }
 	$stamp-&gt;time = time();
 	$stamp-&gt;offset = idate('Z', $stamp-&gt;time);
 </diff>
      <filename>index.php</filename>
    </modified>
    <modified>
      <diff>@@ -10,6 +10,13 @@
 &lt;body&gt;
 &lt;div id=&quot;page&quot;&gt;
 &lt;div id=&quot;linkpane&quot;&gt;
+    &lt;? if ($user): ?&gt;
+    &lt;div id=&quot;userinfo&quot;&gt;
+        &lt;span id=&quot;uid&quot;&gt;&lt;?= Markup::escape($user-&gt;name) ?&gt;
+        &amp;lt;&lt;?= Markup::escape($user-&gt;email) ?&gt;&amp;gt;&lt;/span&gt;
+        &lt;a href=&quot;&lt;?= Config::PATH ?&gt;/:profile&quot;&gt;change password/email&lt;/a&gt;
+        &lt;a href=&quot;&lt;?= Config::PATH ?&gt;/:logout&quot;&gt;logout&lt;/a&gt;
+    &lt;/div&gt;
     &lt;div id=&quot;globallinks&quot;&gt;
         &lt;a href=&quot;&lt;?= Config::PATH ?&gt;/&quot;&gt;home&lt;/a&gt;
         &lt;a href=&quot;&lt;?= Config::PATH ?&gt;/:recent&quot;&gt;recent changes&lt;/a&gt;
@@ -27,4 +34,5 @@
         &lt;/div&gt;
     &lt;? endif; ?&gt;
     &lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;
+    &lt;? endif; ?&gt;
 &lt;/div&gt;</diff>
      <filename>templates/archaic/header.php</filename>
    </modified>
    <modified>
      <diff>@@ -36,7 +36,7 @@
 
 &lt;div class=&quot;par&quot;&gt;
     Summary of changes:
-    &lt;input type=&quot;text&quot; name=&quot;summary&quot; class=&quot;summary&quot; /&gt;
+    &lt;input type=&quot;text&quot; name=&quot;summary&quot; class=&quot;text&quot; /&gt;
     &lt;div class=&quot;submit&quot;&gt;
         &lt;input type=&quot;submit&quot; value=&quot;Save changes&quot; class=&quot;submit&quot; /&gt;
     &lt;/div&gt;</diff>
      <filename>templates/archaic/page-edit.php</filename>
    </modified>
    <modified>
      <diff>@@ -30,7 +30,7 @@ body
 #linkpane
 {
     font-size: .75em;
-    line-height: 1.2;
+    line-height: 1.5;
     padding-top: 1em;
 }
 
@@ -43,7 +43,9 @@ body
     float: left;
     text-align: left;
 }
-#globallinks a { margin: 0px 1em 0px 0px; }
+#globallinks a,
+#userinfo a,
+#userinfo #uid { margin: 0px 1em 0px 0px; }
 
 #pagelinks
 {
@@ -53,6 +55,12 @@ body
 }
 #pagelinks a { margin: 0px 0px 0px 1em; }
 
+#userinfo,
+#userinfo a
+{
+    color: #AAA;
+}
+
 p,
 div.par
 {
@@ -133,7 +141,7 @@ table.history
     overflow: scroll;
 }
 
-#edit-form input.summary
+input.text
 {
     font-family: monospace;
     font-size: .9em;
@@ -142,7 +150,7 @@ table.history
     padding: .25em;
 }
 
-#edit-form input.submit
+input.submit
 {
     display: block;
     margin: .75em 0px .75em auto;
@@ -178,13 +186,24 @@ div.commits .commit .changes
     font-size: .8em;
 }
 
+div.error,
 div.history-warning
 {
-    background-color: #FFE;
-    border: 1px solid #FA0;
     padding: .5em 1em;
     margin: 1em 0px;
     line-height: 1.2;
     font-size: .8em;
 }
 
+div.history-warning
+{
+    background-color: #FFE;
+    border: 1px solid #FA0;
+}
+
+div.error
+{
+    background-color: #FEE;
+    border: 1px solid #F00;
+}
+</diff>
      <filename>templates/archaic/style.css</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>11f056def0cdafb58821982232c6aa5c24ea5f02</id>
    </parent>
  </parents>
  <author>
    <name>Patrik Fimml</name>
    <email>patrik@fimml.at</email>
  </author>
  <url>http://github.com/patrikf/ewiki/commit/81df955a74280a9164304e3f117b09bf2097a24e</url>
  <id>81df955a74280a9164304e3f117b09bf2097a24e</id>
  <committed-date>2008-07-30T07:48:05-07:00</committed-date>
  <authored-date>2008-07-30T07:36:10-07:00</authored-date>
  <message>Add user management</message>
  <tree>160da72c2843748dfd983099b3f0897dbaac50a0</tree>
  <committer>
    <name>Patrik Fimml</name>
    <email>patrik@fimml.at</email>
  </committer>
</commit>
