diff admin.inc.php @ 0:8019b357cc03

Initial import.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 04 Dec 2012 19:07:18 +0200
parents
children 76c3b89d7b11
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/admin.inc.php	Tue Dec 04 19:07:18 2012 +0200
@@ -0,0 +1,452 @@
+<?
+// Check if sessions are enabled
+if (!stChkSetting("admpass"))
+{
+  echo "<h1>Oh noes, admin configuration not done!</h1>\n".
+  "<p>Better go and prod that, so you get to use the fine admin interface.</p>\n";
+  $authState = "error";
+}
+else
+if (stAuthSession())
+{
+  $authState = "ok";
+}
+else
+{
+  // Perform authentication if we are not in session already
+  echo "<h1>Party admin login</h1>\n".
+    "<p>Please use illegal telepathy over HTTP to provide a password to enter the party administration systembolaget.</p>\n".
+    "<form name=\"admlogin\" action=\"login.php\" method=\"post\">\n".
+    stGetFormHiddenInput("mode", "check")."\n".
+    stGetFormHiddenInput("goto", $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"])."\n".
+    stGetFormPasswordInput("admpass", "pass", "")."\n".
+    " <input type=\"submit\" value=\" Login \" />\n".
+    "</form>\n";
+
+  $authState = "login";
+}
+
+if ($authState == "ok")
+{
+?>
+<script type="text/javascript">
+function statusMsg(msg)
+{
+  document.getElementById("nstatus").innerHTML = msg;
+}
+
+
+function strtrim(str)
+{
+  if (!str || str == null)
+    return "";
+  return str.replace(/^\s+|\s+$/g,'')
+}
+
+
+function strencode(str)
+{
+  return encodeURIComponent(escape(str));
+}
+
+
+function createXMLRequest()
+{
+  var req;
+  if (window.XMLHttpRequest)
+  {
+    // Modern browsers
+    req = new XMLHttpRequest();
+  }
+  else
+  {
+    // Old IE versions
+    req = new ActiveXObject("Microsoft.XMLHTTP");
+  }
+  return req;
+}
+
+
+function sendPOSTRequest(params, success, failure)
+{
+  var req = createXMLRequest();
+  req.open("POST", "ajax.php", true);
+  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+  req.setRequestHeader("Content-length", params.length);
+  req.setRequestHeader("Connection", "close");
+
+  req.onreadystatechange = function()
+  {
+    if (req.readyState == 4)
+    {
+      if (req.status == 404)
+      {
+        window.location = "logout";
+      }
+      else
+      if (req.status == 200)
+      {
+        success(req.responseText);
+        statusMsg(req.statusText);
+      }
+      else
+      {
+        if (failure)
+        {
+          failure(req.status, req.statusText, req.responseText);
+        }
+        else
+        {
+          statusMsg("["+req.status+" - "+req.statusText+"] "+ req.responseText);
+        }
+      }
+    }
+  }
+  req.send(params);
+}
+
+
+function makePostArgs(fields, fprefix, fsuffix)
+{
+  var res = [];
+  for (var id in fields)
+  {
+    var elem = document.getElementById(fprefix + id + fsuffix);
+    if (!elem)
+    {
+      alert("No such DOM element '"+ id +"'.");
+      return "";
+    }
+
+    switch (fields[id])
+    {
+      case 0:
+      case 1:
+        {
+          var str = strtrim(elem.value);
+          if (fields[id] == 1 && str == "")
+          {
+            alert("One or more of the fields are empty.");
+            return "";
+          }
+          res.push(id+"="+strencode(str));
+        }
+        break;
+
+      case 2:
+        res.push(id+"="+parseInt(elem.value));
+        break;
+
+      case 3:
+        res.push(id+"="+(elem.checked ? "1" : "0"));
+        break;
+
+    }
+  }
+  return res.join("&");
+}
+
+
+function refreshItems(id,name,msgname)
+{
+  var msuccess = function(txt)
+  {
+    var nitem = document.getElementById(id);
+    nitem.innerHTML = txt;
+  }
+
+  sendPOSTRequest("action=get&type="+name, msuccess);
+}
+
+
+function deleteItem(id,prefix,type,func,dsc)
+{
+  var msuccess = function(txt)
+  {
+    var item = document.getElementById(prefix+id);
+    item.style.display = "none";
+    setTimeout(func, 550);
+  }
+
+  if (confirm("Are you sure you want to delete "+dsc+" #"+id+"?"))
+  {
+    sendPOSTRequest("action=delete&type="+type+"&id="+id, msuccess);
+  }
+}
+
+
+function refreshNews()
+{
+  refreshItems("nnews", "news", "News list");
+}
+
+
+function refreshAttendees()
+{
+  refreshItems("nattendees", "attendees", "Attendees list");
+}
+
+
+function refreshDump()
+{
+  var msuccess = function(txt)
+  {
+    var nitem = document.getElementById("ndump");
+    nitem.innerHTML = txt;
+  }
+
+  sendPOSTRequest("action=dump&type=attendees", msuccess);
+}
+
+
+function refreshCompos()
+{
+  refreshItems("ncompos", "compos", "Compo list");
+}
+
+
+function refreshEntries()
+{
+  refreshItems("nentries", "entries", "Entry list");
+}
+
+
+function refreshVoters()
+{
+  refreshItems("nvoters", "voters", "Voters list");
+}
+
+
+function addNews()
+{
+  var args = makePostArgs({"title":1,"text":1,"author":1}, "nn", "");
+
+  var msuccess = function(txt)
+  {
+    setTimeout("refreshNews();", 550);
+  }
+
+  sendPOSTRequest(
+    "action=add&type=news&"+args,
+    msuccess);
+  return false;
+}
+
+
+function deleteNews(id)
+{
+  deleteItem(id, "news", "news", "refreshNews();", "news item");
+}
+
+
+function deleteAttendee(id)
+{
+  deleteItem(id, "attendee", "attendees", "refreshAttendees();", "attendee");
+}
+
+
+function updateAttendee(id)
+{
+  var args = makePostArgs({"oneliner":0,"email":0}, "at", id);
+
+  sendPOSTRequest("action=update&type=attendees&id="+id+"&"+args);
+}
+
+
+function addCompo()
+{
+  var args = makePostArgs({"name":1, "description":1}, "nc", "");
+
+  var msuccess = function(txt)
+  {
+    setTimeout("refreshCompos();", 550);
+  }
+
+  sendPOSTRequest("action=add&type=compo&"+args, msuccess);
+  return false;
+}
+
+
+function updateCompo(id)
+{
+  var args = makePostArgs({"name":1, "description":1, "enabled":3}, "co", id);
+
+  sendPOSTRequest("action=update&type=compo&id="+id+"&"+args);
+}
+
+
+function addEntry(id)
+{
+  var args = makePostArgs({"name":1, "author":1}, "ne", id);
+
+  var msuccess = function(txt)
+  {
+    setTimeout("refreshEntries();", 550);
+  }
+
+  sendPOSTRequest("action=add&type=entry&compo_id="+id+"&"+args, msuccess);
+  return false;
+}
+
+
+function updateEntry(id)
+{
+  var args = makePostArgs({"name":1, "author":1}, "en", id);
+
+  sendPOSTRequest(
+    "action=update&type=entry&id="+id+"&"+args);
+}
+
+
+function deleteEntry(id)
+{
+  deleteItem(id, "entry", "entries", "refreshEntries();", "entry");
+}
+
+
+function updateVoter(id)
+{
+  var args = makePostArgs({"enabled":3, "name":0}, "vo", id);
+
+  sendPOSTRequest("action=update&type=voter&id="+id+"&"+args);
+}
+
+
+var registeredTabs = Object();
+
+
+function updateTabList()
+{
+  var item = document.getElementById("pageTabs");
+  var str = "";
+  for (var id in registeredTabs)
+  {
+    str += "<a href=\"#\" onClick=\"switchActiveTab('"+
+      id+"')\">"+registeredTabs[id]+"</a>";
+  }
+  
+  str += "<a class=\"admin\" href=\"logout\">Logout</a>";
+  
+  item.innerHTML = str;
+}
+
+
+function registerTab(id, name)
+{
+  registeredTabs[id] = name;
+}
+
+
+function refreshTabs()
+{
+  for (var id in registeredTabs)
+  {
+    setTimeout("refresh"+ registeredTabs[id] +"();", 10);
+  }
+}
+
+
+function switchActiveTab(tab)
+{
+  for (var id in registeredTabs)
+  {
+    var ob = document.getElementById(id);
+    if (ob)
+    {
+      ob.style.display = (tab == id) ? "block" : "none";
+      if (tab == id)
+      {
+        setTimeout("refresh"+ registeredTabs[id] +"();", 10);
+      }
+    }
+  }
+}
+</script>
+
+<div id="nstatus">
+-
+</div>
+
+<div id="pageTabs">
+</div>
+
+<!-- ========================== -->
+
+<div id="ntab0">
+
+<form method="post" action="" onsubmit="return addNews()">
+ <input id="nntitle" type="text" size="40" /><br />
+ <textarea id="nntext" rows="5" cols="60"></textarea><br />
+ <input id="nnauthor" type="text" value="orgaz" />
+ <input id="nnadd" type="submit" value=" Add post " />
+ <input type="button" value=" Clear " onClick="this.form.reset()" />
+</form>
+
+<hr />
+
+<div id="nnews">
+</div>
+</div>
+
+<!-- ========================== -->
+
+<div id="ntab1">
+<div id="nattendees">
+</div>
+</div>
+
+<!-- ========================== -->
+
+<div id="ntab2">
+<div id="ndump">
+</div>
+</div>
+
+<!-- ========================== -->
+
+<div id="ntab3">
+
+<form method="post" action="" onsubmit="return addCompo()">
+ <input id="ncname" type="text" size="64" /><br />
+ <textarea id="ncdescription" rows="5" cols="60"></textarea><br />
+ <input id="nccompo" type="submit" value=" Add compo " />
+ <input type="button" value=" Clear " onClick="this.form.reset()" />
+</form>
+
+<hr />
+<div id="ncompos">
+</div>
+</div>
+
+<!-- ========================== -->
+
+<div id="ntab4">
+<div id="nentries">
+</div>
+</div>
+
+<!-- ========================== -->
+
+<div id="ntab5">
+<p>
+Key entries can only be generated via the shell-utility 'keygen'.
+</p>
+<div id="nvoters">
+</div>
+</div>
+
+<!-- ========================== -->
+
+<script type="text/javascript">
+registerTab("ntab0", "News");
+registerTab("ntab1", "Attendees");
+registerTab("ntab2", "Dump");
+registerTab("ntab3", "Compos");
+registerTab("ntab4", "Entries");
+registerTab("ntab5", "Voters");
+updateTabList();
+switchActiveTab("ntab0");
+</script>
+<?
+}
+?>
\ No newline at end of file