diff --git a/dbupdate/5.sql b/dbupdate/5.sql
new file mode 100644
index 0000000..1c2089c
--- /dev/null
+++ b/dbupdate/5.sql
@@ -0,0 +1,2 @@
+alter table user add column admin integer not null default 0;
+update cyberman set dbrev=6;
diff --git a/lib/cyberman.pm b/lib/cyberman.pm
index 6c7b274..7f0a28b 100644
--- a/lib/cyberman.pm
+++ b/lib/cyberman.pm
@@ -10,6 +10,7 @@ use cyberman::Helper;
use cyberman::API;
use cyberman::Records;
use cyberman::Forgot;
+use cyberman::Admin;
# Index route, hook and helper functions for authentication
@@ -53,6 +54,7 @@ hook 'before' => sub {
var auth => $auth;
var email => $user->{"email"};
+ var admin => $user->{"admin"};
var config => config();
if ($user->{"stylesheet"} && grep {$_ eq $user->{"stylesheet"}} @{ config->{"stylesheets"}->{"available"} }) {
diff --git a/lib/cyberman/API.pm b/lib/cyberman/API.pm
index a211280..a03bd8e 100644
--- a/lib/cyberman/API.pm
+++ b/lib/cyberman/API.pm
@@ -30,4 +30,35 @@ get '/api/check_availability' => sub {
}
};
+get '/api/get_owner_email' => sub {
+ return "" if auth_test("admin");
+ if (!param("name")) {
+ return "";
+ }
+
+ my $domain = database->quick_select(
+ "domain",
+ {
+ "name" => param("name"),
+ },
+ );
+
+ if (!$domain) {
+ return "";
+ };
+
+ my $owner = database->quick_select(
+ "user",
+ {
+ "id" => $domain->{"ownerid"},
+ },
+ );
+
+ if (!$owner) {
+ return "";
+ }
+
+ return $owner->{"email"};
+};
+
true;
diff --git a/lib/cyberman/Admin.pm b/lib/cyberman/Admin.pm
new file mode 100644
index 0000000..463d634
--- /dev/null
+++ b/lib/cyberman/Admin.pm
@@ -0,0 +1,54 @@
+package cyberman::Admin;
+use Dancer2 appname => "cyberman";
+use Dancer2::Plugin::Database;
+
+use cyberman::Helper;
+
+get '/admin' => sub {
+ return auth_test("admin") if auth_test("admin");
+
+ my $sth = database->prepare(
+ "select count(*) from user",
+ );
+ $sth->execute;
+ my $usercount = $sth->fetchrow_hashref->{"count(*)"};
+
+ $sth = database->prepare(
+ "select count(*) from domain",
+ );
+ $sth->execute;
+ my $domaincount = $sth->fetchrow_hashref->{"count(*)"};
+
+ return template "admin" => {
+ usercount => $usercount,
+ domaincount => $domaincount,
+ };
+};
+
+get '/admin/users' => sub {
+ return auth_test("admin") if auth_test("admin");
+
+ my @users = database->quick_select(
+ "user",
+ {}
+ );
+
+ return template "admin/users" => {
+ users => \@users,
+ };
+};
+
+get '/admin/domains' => sub {
+ return auth_test("admin") if auth_test("admin");
+
+ my @domains = database->quick_select(
+ "domain",
+ {}
+ );
+
+ return template "admin/domains" => {
+ domains => \@domains,
+ };
+};
+
+true;
diff --git a/lib/cyberman/Helper.pm b/lib/cyberman/Helper.pm
index 17e9f51..f814243 100644
--- a/lib/cyberman/Helper.pm
+++ b/lib/cyberman/Helper.pm
@@ -24,6 +24,12 @@ sub auth_test {
return template 'redir' => {
"redir" => "/index",
};
+ } elsif ($id && $id eq "admin" && !vars->{"admin"}) {
+ return template 'redir' => {
+ "redir" => "/index",
+ };
+ } elsif ($id && $id eq "admin" && vars->{"admin"}) {
+ return 0;
} elsif ($id && vars->{"auth"} != $id) {
return template 'redir' => {
"redir" => "/index",
diff --git a/public/js/admin_domains.js b/public/js/admin_domains.js
new file mode 100644
index 0000000..abc95aa
--- /dev/null
+++ b/public/js/admin_domains.js
@@ -0,0 +1,14 @@
+function updateOwnerEmail() {
+ var name = this.domainName;
+ document.getElementById("owneremail-"+name).innerHTML = this.responseText;
+}
+
+function showOwnerEmail(name) {
+ document.getElementById("owneremail-"+name).innerHTML = "Loading...";
+
+ var req = new XMLHttpRequest();
+ req.domainName = name;
+ req.addEventListener("load", updateOwnerEmail);
+ req.open("GET", "/api/get_owner_email?name="+encodeURIComponent(name));
+ req.send();
+}
diff --git a/schema.sql b/schema.sql
index 258224c..87c9860 100644
--- a/schema.sql
+++ b/schema.sql
@@ -3,7 +3,7 @@ create table cyberman (
id integer primary key,
dbrev integer not null
);
-insert into cyberman (dbrev) values (5);
+insert into cyberman (dbrev) values (6);
drop table if exists user;
create table user (
@@ -15,7 +15,8 @@ create table user (
conftoken text not null,
newemail text,
recoverytoken text,
- stylesheet text
+ stylesheet text,
+ admin integer not null default 0
);
drop table if exists session;
diff --git a/views/admin.tt b/views/admin.tt
new file mode 100644
index 0000000..29196c4
--- /dev/null
+++ b/views/admin.tt
@@ -0,0 +1,14 @@
+
+
+ Admin
+
+
+
+
+
+ [ view user list ]
+ [ view domain list ]
+
+
+ I have <% usercount %> users and <% domaincount %> domains.
+
diff --git a/views/admin/domains.tt b/views/admin/domains.tt
new file mode 100644
index 0000000..954d981
--- /dev/null
+++ b/views/admin/domains.tt
@@ -0,0 +1,31 @@
+
+
+ Domain list
+
+
+
+
+
<% domains.size %> domains
+
+
+
+ Name
+ |
+
+ Owner's email
+ |
+
+ <% FOREACH d IN domains %>
+
+
+ <% d.name | html_entity %>.cyb
+ |
+
+ [ show ]
+ |
+
+ <% END %>
+
+
+
+
diff --git a/views/admin/users.tt b/views/admin/users.tt
new file mode 100644
index 0000000..0eac2f8
--- /dev/null
+++ b/views/admin/users.tt
@@ -0,0 +1,33 @@
+
+
+ User list
+
+
+
+
+
<% users.size %> users
+
+
+
+ Email address
+ |
+
+ Active
+ |
+
+ <% FOREACH u IN users %>
+
+
+ <% u.email | html_entity %>
+ |
+
+ <% IF u.active %>
+ Yes
+ <% ELSE %>
+ No
+ <% END %>
+ |
+
+ <% END %>
+
+
diff --git a/views/layouts/main.tt b/views/layouts/main.tt
index 1aa8c47..80a3516 100644
--- a/views/layouts/main.tt
+++ b/views/layouts/main.tt
@@ -20,6 +20,9 @@