From a2173321ff2566574b4b4bb94b5918885a6dd27e Mon Sep 17 00:00:00 2001 From: Jacob Parker Date: Wed, 22 Feb 2012 22:43:07 -0500 Subject: [PATCH 1/2] ported more generalized handler stuff from csc fork --- src/config.d | 6 +++--- src/web.d | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/config.d b/src/config.d index a133c26..b7f1171 100644 --- a/src/config.d +++ b/src/config.d @@ -3,9 +3,9 @@ const string url_root = "/~j3parker/"; const string site_title = "This is a Title"; const string site_subtitle = "but this is a subtitle"; -const bool nav_tree_vert = true; -const bool nav_tree_chev = true; -const bool page_container = false; +const bool nav_tree_vert = false; +const bool nav_tree_chev = false; +const bool page_container = true; string[string] handlers; diff --git a/src/web.d b/src/web.d index 5013d7d..c5ad886 100755 --- a/src/web.d +++ b/src/web.d @@ -1,5 +1,5 @@ //#!/usr/bin/rdmd -import std.stdio, std.path, std.process, std.file, std.array, std.string, std.algorithm, std.datetime; +import std.stdio, std.path, std.process, std.file, std.array, std.string, std.algorithm, std.datetime, std.ascii; import config; string dweb_root; @@ -65,9 +65,14 @@ void do_header() { html_push("
"); html_push("
"); + + html_push("
"); + html_pop("
"); + html_push("
"); html("changelog"); html_pop("
"); + html_pop("
"); html_push("
"); @@ -87,6 +92,15 @@ bool dirExists(string path) { try { if (isDir(path)) return true; else return void do_content(string url) { html_push("
"); + // first, see if we have something that wants to handle url outright + foreach (string glob, string h; handlers) { + if (globMatch(url, glob)) { + html(shell(dweb_root ~ "/bin/" ~ h ~ " " ~ url)); + html_pop("
"); + return; + } + } + // if that failed, see if we can handle the file if (url == "" ? false : url[$-1] == '/') url ~= "index"; foreach (f; array(map!"a.name"(dirEntries(dirName(dweb_root ~ "/srv/" ~ url), SpanMode.shallow)))) { if (isDir(f)) continue; @@ -119,6 +133,11 @@ void do_footer() { html_pop("
\n"); } +bool evil(string s) { + foreach(char c; s) if (!isAlphaNum(c) && c != '/' && c != '-' && c != '_') return true; + return false; +} + void main(string[] args) { init_handlers(); dweb_root = getcwd()[0..$-4]; // take out bin/ @@ -128,6 +147,7 @@ void main(string[] args) { html_push("\n"); string url = getenv("SCRIPT_URL")[url_root.length..$]; + if (evil(url)) { html ("bad url."); return; } string pagename = baseName(url); if (pagename.length != 0) pagename = " - " ~ pagename; From b1f4c544fff411396facd6eeee5d04ef156006aa Mon Sep 17 00:00:00 2001 From: Jennifer Yeelam Wong Date: Thu, 23 Feb 2012 02:21:18 -0500 Subject: [PATCH 2/2] CSC CSS fiddlings. Vertically aligned the logo, removed h2 top margins --- pub/style/logo_black.png | Bin 0 -> 17955 bytes pub/style/style.css | 47 ++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 18 deletions(-) create mode 100644 pub/style/logo_black.png diff --git a/pub/style/logo_black.png b/pub/style/logo_black.png new file mode 100644 index 0000000000000000000000000000000000000000..fd45d98ffa9383c3290916f08c39788dd889a612 GIT binary patch literal 17955 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 eX__g30Q`U0fizI2HI%LZ0000