diff --git a/config.yml b/config.yml index 17682e6..563a5e2 100644 --- a/config.yml +++ b/config.yml @@ -16,7 +16,4 @@ plugins: dbname: 'db.sqlite' log_queries: 1 -nsd: - enable: 1 - zone_conf: /var/nsd/etc/zones.conf - zone_dir: /var/nsd/zones/master +tld: 'cyb' diff --git a/cpanfile b/cpanfile index cc8d8c9..7e84f7c 100644 --- a/cpanfile +++ b/cpanfile @@ -9,7 +9,7 @@ requires "DBD::SQLite" => "0"; requires "HTML::Entities" => "0"; requires "Digest::Bcrypt" => "0"; requires "Math::Random::Secure" => "0"; -requires "if" => "0"; +requires "Switch" => "0"; requires "Plack::Middleware::Deflater" => "0"; requires "Plack::Middleware::Session" => "0"; diff --git a/lib/NSD/Interface.pm b/lib/NSD/Interface.pm deleted file mode 100644 index d2b5921..0000000 --- a/lib/NSD/Interface.pm +++ /dev/null @@ -1,10 +0,0 @@ -package NSD::Interface; -use strict; -use warnings; -use Dancer2 appname => "cyberman"; - -use Exporter; - -our @EXPORT = qw(); - -1; diff --git a/lib/cyberman.pm b/lib/cyberman.pm index e9f0a19..18b949e 100644 --- a/lib/cyberman.pm +++ b/lib/cyberman.pm @@ -8,6 +8,7 @@ use cyberman::Auth; use cyberman::Account; use cyberman::Helper; use cyberman::API; +use cyberman::Records; # Index route, hook and helper functions for authentication @@ -52,6 +53,7 @@ hook 'before' => sub { var auth => $auth; var email => $email; + var config => config(); }; get qr{^/(index)?$} => sub { diff --git a/lib/cyberman/API.pm b/lib/cyberman/API.pm index bd24d51..5d42a3b 100644 --- a/lib/cyberman/API.pm +++ b/lib/cyberman/API.pm @@ -7,8 +7,6 @@ use cyberman::Helper; get '/api/check_availability' => sub { # No auth req'd # returns 'y' or 'n' - - # TODO: check name validity here if (!param("name")) { return "n"; diff --git a/lib/cyberman/Domains.pm b/lib/cyberman/Domains.pm index c61963a..8162569 100644 --- a/lib/cyberman/Domains.pm +++ b/lib/cyberman/Domains.pm @@ -4,7 +4,6 @@ use Dancer2 appname => "cyberman"; use Dancer2::Plugin::Database; use cyberman::Helper; -use if config->{"use_nsd"}, "NSD::Interface"; get '/domains' => sub { return auth_test() if auth_test(); @@ -73,11 +72,11 @@ post '/domains/new' => sub { }; }; -get '/domains/:id/remove' => sub { +get '/domains/:name/remove' => sub { my $domain = database->quick_select( "domain", { - "id" => param("id"), + "name" => param("name"), }, ); @@ -88,11 +87,11 @@ get '/domains/:id/remove' => sub { }; }; -post '/domains/:id/remove' => sub { +post '/domains/:name/remove' => sub { my $domain = database->quick_select( "domain", { - "id" => param("id"), + "name" => param("name"), }, ); @@ -106,7 +105,7 @@ post '/domains/:id/remove' => sub { database->quick_delete( "domain", { - "id" => param("id"), + "name" => param("name"), }, ); diff --git a/lib/cyberman/Records.pm b/lib/cyberman/Records.pm new file mode 100644 index 0000000..038f162 --- /dev/null +++ b/lib/cyberman/Records.pm @@ -0,0 +1,174 @@ +package cyberman::Records; + +use Dancer2 appname => "cyberman"; +use Dancer2::Plugin::Database; +use Switch; + +use cyberman::Helper; + +get '/domains/:name/records' => sub { + my $domain = database->quick_select( + "domain", + { + "name" => param("name"), + }, + ); + + if (!$domain) { + return "No such domain!"; + } + + return auth_test($domain->{"ownerid"}) if auth_test($domain->{"ownerid"}); + + my @records = database->quick_select( + "record", + { + "domainid" => $domain->{"id"}, + }, + ); + + template 'records' => { + domain => $domain, + records => \@records, + }; +}; + +get '/domains/:name/records/add' => sub { + my $domain = database->quick_select( + "domain", + { + "name" => param("name"), + }, + ); + + if (!$domain) { + return "No such domain!"; + } + + return auth_test($domain->{"ownerid"}) if auth_test($domain->{"ownerid"}); + + template 'records/add' => { + domain => $domain, + }; +}; + +post '/domains/:name/records/add' => sub { + my $domain = database->quick_select( + "domain", + { + "name" => param("name"), + }, + ); + + if (!$domain) { + return "No such domain!"; + } + + return auth_test($domain->{"ownerid"}) if auth_test($domain->{"ownerid"}); + + my %errs; + + # tw overuse of regex + + switch (param("type")) { + case "A" { + if (param("value") !~ m/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}$/) { + # here we go... + $errs{"e_bad_value"} = 1; + } + } + case "AAAA" { + if (param("value") !~ m/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/) { + # I am sorry + $errs{"e_bad_value"} = 1; + } + } + case "NS" { + if (param("value") !~ m/^([a-zA-Z0-9]([a-zA-Z0-9-_]*[a-zA-Z0-9])?\.)+$/) { + $errs{"e_bad_value"} = 1; + } + } + else { + $errs{"e_bad_type"} = 1; + } + } + + if (param("rname") !~ m/^(@|([a-zA-Z0-9]([a-zA-Z0-9-_]*[a-zA-Z0-9])\.)*[a-zA-Z0-9]([a-zA-Z0-9-_]*[a-zA-Z0-9])?)$/) { + $errs{"e_bad_name"} = 1; + } + + if (scalar(keys(%errs)) != 0) { + return template 'records/add' => { + domain => $domain, + %errs, + error => 1, + }; + } + + my $sid = $domain->{"lastsid"} + 1; + database->quick_update( + "domain", + { + "id" => $domain->{"id"}, + }, + { + "lastsid" => $sid, + }, + ); + + database->quick_insert( + "record", + { + "sid" => $sid, + "domainid" => $domain->{"id"}, + "type" => param("type"), + "name" => param("rname"), + "value" => param("value"), + }, + ); + + template 'redir' => { + "redir" => "../records?added=1", + }; +}; + +post '/domains/:name/records/:sid/remove' => sub { + my $domain = database->quick_select( + "domain", + { + "name" => param("name"), + }, + ); + + if (!$domain) { + return "No such domain!"; + } + + return auth_test($domain->{"ownerid"}) if auth_test($domain->{"ownerid"}); + + my $record = database->quick_select( + "record", + { + "domainid" => $domain->{"id"}, + "sid" => param("sid"), + }, + ); + + if (!$record) { + return "No such record!"; + } + + database->quick_delete( + "record", + { + "domainid" => $domain->{"id"}, + "sid" => param("sid"), + }, + ); + + template 'redir' => { + "redir" => "../../records?removed=1", + }; +}; + +true; diff --git a/schema.sql b/schema.sql index 6c61830..2f271ec 100644 --- a/schema.sql +++ b/schema.sql @@ -19,5 +19,16 @@ drop table if exists domain; create table domain ( id integer primary key, name string not null, - ownerid integer not null -) + ownerid integer not null, + lastsid integer not null default 0 +); + +drop table if exists record; +create table record ( + id integer primary key, + sid integer not null, + domainid integer not null, + type string not null, + name string not null, + value string not null +); diff --git a/views/domains.tt b/views/domains.tt index 990f9f4..b6269f7 100644 --- a/views/domains.tt +++ b/views/domains.tt @@ -19,7 +19,7 @@
- [ Register a domain ] + [ register a domain ]
<% IF domains.size > 0 %> @@ -49,8 +49,8 @@ <% d.name | html_entity %>.cyb - [ edit ] - [ remove ] + [ edit ] + [ remove ] <% END %> diff --git a/views/records.tt b/views/records.tt new file mode 100644 index 0000000..dab3448 --- /dev/null +++ b/views/records.tt @@ -0,0 +1,76 @@ +
+
+

Editing <% domain.name | html_entity %>.<% vars.config.tld %>

+
+ + <% IF params.added %> +
+ The record was created successfully! +
+

+ <% END %> + + <% IF params.removed %> +
+ The record was removed successfully! +
+

+ <% END %> +
+ +
+
+ [ add record ] +
+ + <% IF records.size > 0 %> + + <% records.size %> + <% IF records.size == 1 %> + record + <% ELSE %> + records + <% END %> + + +
+ + + + + + + + + <% FOREACH r IN records %> + + + + + + + <% END %> +
+ Name + + Type + + Value + + Actions +
+ <% r.name | html_entity %> + + <% r.type | html_entity %> + + <% r.value | html_entity %> + +
+ [  ] +
+
+ + <% ELSE %> + This domain has no records. + <% END %> +
diff --git a/views/records/add.tt b/views/records/add.tt new file mode 100644 index 0000000..bc307b7 --- /dev/null +++ b/views/records/add.tt @@ -0,0 +1,75 @@ +
+
+

Add a record

+
+
+ +<% IF error %> +
+
+ There were some problems with your submission: +
+
    + <% IF e_bad_value %> +
  • The value you entered was invalid. + <% IF params.type == 'NS' %>(Did you forget the trailing '.'?)<% END %>
  • + <% END %> + <% IF e_bad_type %> +
  • You must choose a type for the record.
  • + <% END %> + <% IF e_bad_name %> +
  • The name of the record is invalid.
  • + <% END %> +
+
+
+
+<% END %> + +
+ Adding a record for <% domain.name | html_entity %>.<% vars.config.tld %> + + +