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 + + + + + + <% FOREACH d IN domains %> + + + + + <% END %> +
+ Name + + Owner's email +
+ <% d.name | html_entity %>.cyb + + [ show ] +
+
+ + 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 + + + + + + <% FOREACH u IN users %> + + + + + <% END %> +
+ Email address + + Active +
+ <% u.email | html_entity %> + + <% IF u.active %> + Yes + <% ELSE %> + No + <% 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 @@ DomainsAccountAdmin