summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--src/http.cr10
-rw-r--r--src/xhtml.cr17
2 files changed, 18 insertions, 9 deletions
diff --git a/src/http.cr b/src/http.cr
index 1d0be13..bfd7bf7 100644
--- a/src/http.cr
+++ b/src/http.cr
@@ -23,6 +23,7 @@ require "uri"
 require "./sqlite"
 require "./xhtml"
 
+HTML_HEADINGS = Set{"applicants", "criteria", "joining", "members"}
 MAX_CONTENT_LENGTH = 4096
 MAX_NICK_LENGTH = 32
 OPENNIC_TLD = Set{".bbs", ".chan", ".cyb", ".dyn", ".epic",
@@ -38,11 +39,9 @@ class Server
     @db = Database.new cfg.db, cfg.opennic_remote, cfg.icann_remote
 
     @opennic_host = URI.parse(cfg.opennic_remote).host
-    @opennic_page = Page.new cfg.opennic_local, cfg.opennic_remote,
-                             cfg.api, @db
+    @opennic_page = Page.new cfg.opennic_local, cfg.opennic_remote, cfg.api, @db
     @opennic_page.write
-    @icann_page = Page.new cfg.icann_local, cfg.icann_remote,
-                           cfg.api, @db
+    @icann_page = Page.new cfg.icann_local, cfg.icann_remote, cfg.api, @db
     @icann_page.write
 
     @server = HTTP::Server.new do |context|
@@ -100,6 +99,9 @@ class Server
         errors["opennic"] = "Must be unique" if opennic == params["opennic"]
         errors["icann"] = "Must be unique" if icann == params["icann"]
       end
+      if HTML_HEADINGS.includes? params["nick"]
+        errors["nick"] = "Reserved names: #{HTML_HEADINGS.join ", "}"
+      end
 
       if errors.empty?
         @db.add_applicant params["nick"], params["opennic"], params["icann"]
diff --git a/src/xhtml.cr b/src/xhtml.cr
index c62b23a..35f9d62 100644
--- a/src/xhtml.cr
+++ b/src/xhtml.cr
@@ -48,8 +48,15 @@ class Page
     @db = db
   end
 
+  def heading(xml, level, text)
+    id = text.gsub ' ', '-'
+    xml.element "h#{level}", id: id do
+      xml.element "a", href: "##{id}" do xml.text text end
+    end
+  end
+
   def criteria(xml)
-    xml.element "h2" do xml.text "criteria" end
+    heading xml, 2, "criteria"
     xml.element "p" do
       xml.text "We accept pretty much any site"
       xml.text " served under an OpenNIC domain"
@@ -115,7 +122,7 @@ class Page
   end
 
   def member(xml, nick, opennic, icann)
-    xml.element "h3" do xml.text nick end
+    heading xml, 3, nick
     xml.text "OpenNIC: "
     xml.element "a", href: opennic do xml.text opennic end
     xml.element "br"
@@ -143,12 +150,12 @@ class Page
           end
           criteria xml
 
-          xml.element "h2" do xml.text "members" end
+          heading xml, 2, "members"
           @db.members.each_value do |nick, opennic, icann|
             member xml, nick, opennic, icann
           end
 
-          xml.element "h2" do xml.text "joining" end
+          heading xml, 2, "joining"
           xml.element "p" do
             xml.text "First, add "
             xml.element "a",
@@ -175,7 +182,7 @@ class Page
           end
           form xml, errors, params
 
-          xml.element "h2" do xml.text "applicants" end
+          heading xml, 2, "applicants"
           @db.applicants.each_value do |nick, opennic, icann|
             member xml, nick, opennic, icann
           end