[Gd-chatter] r10800 - in trunk/libraries/koala: sources/examples/wiki www/wiki

hannes at gwydiondylan.org hannes at gwydiondylan.org
Sat Jun 17 01:52:40 CEST 2006


Author: hannes
Date: Sat Jun 17 01:52:37 2006
New Revision: 10800

Added:
   trunk/libraries/koala/www/wiki/preview.dsp   (contents, props changed)
Modified:
   trunk/libraries/koala/sources/examples/wiki/wiki.dylan
   trunk/libraries/koala/www/wiki/edit.dsp
   trunk/libraries/koala/www/wiki/footer.dsp
   trunk/libraries/koala/www/wiki/header.dsp
   trunk/libraries/koala/www/wiki/version.dsp
Log:
Job: 7219
*implemented preview
*fixed xss in author or comment (always escape them)


Modified: trunk/libraries/koala/sources/examples/wiki/wiki.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/wiki.dylan	(original)
+++ trunk/libraries/koala/sources/examples/wiki/wiki.dylan	Sat Jun 17 01:52:37 2006
@@ -36,20 +36,23 @@
 define method page-content
     (title :: <string>, #key format = #"raw", version)
  => (content :: false-or(<string>))
-  let page = find-page(title);
-  if (page)
-    let latest = page.revisions.last;
-    let raw-text = if (version & version > 0 & version <= latest.page-version)
-                     page.revisions[version - 1].content;
-                   else
-                     latest.content
-                   end;
-    select (format)
-      #"raw" => raw-text;
-      // HACK HACK HACK.  Prepend a newline so the start-of-line context applies.
-      #"html" => wiki-markup-to-html(concatenate("\n", raw-text));
-      otherwise => error("Invalid format (%=) requested.", format);
-    end
+  let text = *content*;
+  unless (text)
+    let page = find-page(title);
+    if (page)
+      let latest = page.revisions.last;
+      text := if (version & version > 0 & version <= latest.page-version)
+                page.revisions[version - 1].content;
+              else
+                latest.content
+              end;
+    end;
+  end;
+  select (format)
+    #"raw" => text;
+    // HACK HACK HACK.  Prepend a newline so the start-of-line context applies.
+    #"html" => wiki-markup-to-html(concatenate("\n", text));
+    otherwise => error("Invalid format (%=) requested.", format);
   end
 end;
 
@@ -68,8 +71,7 @@
     (page :: <view-page>, request :: <request>, response :: <response>)
   dynamic-bind (*title* = get-query-value("title") | *default-title*,
                 *version* = ignore-errors(string-to-integer(get-query-value("v"))),
-                *content* = page-content(*title*, version: *version*, format: #"html")
-                              | "(no content)")
+                *content* = page-content(*title*, version: *version*) | "(no content)")
     next-method();    // process the DSP template
   end;
 end;
@@ -81,7 +83,7 @@
 
 define method respond-to-get
     (page :: <edit-page>, request :: <request>, response :: <response>)
-  dynamic-bind (*title* = *title* | get-query-value("title"),
+  dynamic-bind (*title* = get-query-value("title"),
                 *content* = if (*title* & find-page(*title*))
                               latest-text(find-page(*title*));
                             else
@@ -94,46 +96,57 @@
 
 define named-method new-page? in wiki
   (page :: <wiki-page>, request :: <request>)
-  *title* = ""
+  *title* = "new"
 end;
 
 define method respond-to-post
     (page :: <edit-page>, request :: <request>, response :: <response>)
-  let title = trim(get-query-value("title") | "");
-  let content = get-query-value("page-content") | "";
-  if (~ logged-in?(request))
-    note-form-error("You must be logged in to edit a page.");
-    // redisplay edit page.
-    dynamic-bind (*title* = title,
-                  *content* = content)
-      respond-to-get(page, request, response);
-    end;
-  elseif (title = "")
-    note-form-error("You must supply a valid page title.", field: "title");
-    // redisplay edit page.
-    dynamic-bind (*title* = title,
-                  *content* = content)
-      respond-to-get(page, request, response);
-    end;
+  if (get-query-value("preview"))
+    respond-to-get(*preview-page*, request, response)
   else
-    save-page(title, content, comment: get-query-value("comment"));
-    // Show the page after editing
-    respond-to-get(*view-page*, request, response);
+    let title = trim(get-query-value("title") | "");
+    let content = get-query-value("page-content") | "";
+    if (~ logged-in?(request))
+      note-form-error("You must be logged in to edit a page.");
+      // redisplay edit page.
+      dynamic-bind (*title* = title,
+                    *content* = content)
+        respond-to-get(page, request, response);
+      end;
+    elseif (title = "")
+      note-form-error("You must supply a valid page title.", field: "title");
+      // redisplay edit page.
+      dynamic-bind (*title* = title,
+                    *content* = content)
+        respond-to-get(page, request, response);
+      end;
+    else
+      save-page(title, content, comment: get-query-value("comment"));
+      // Show the page after editing
+      respond-to-get(*view-page*, request, response);
+    end;
   end;
 end;
 
-// Not sure this is even needed.
-define page new-page (<wiki-page>)
-    (url: "/wiki/new.dsp",
-     source: "wiki/edit.dsp")
-  keyword page-title:, init-value: "(new page)";
+define page preview-page (<wiki-page>)
+  (url: "/wiki/preview.dsp",
+   source: "wiki/preview.dsp")
+end;
+
+define thread variable *comment* = #f;
+
+define tag show-comment in wiki
+  (page :: <wiki-page>, response :: <response>)
+  ()
+  write(output-stream(response), *comment*);
 end;
 
 define method respond-to-get
-    (page :: <new-page>, request :: <request>, response :: <response>)
-  dynamic-bind (*title* = "",
-                *content* = "")
-    respond-to-get(*edit-page*, request, response);
+    (page :: <preview-page>, request :: <request>, response :: <response>)
+  dynamic-bind (*title* = get-query-value("title") | "",
+                *content* = get-query-value("page-content") | "",
+                *comment* = get-query-value("comment") | "")
+    next-method();
   end;
 end;
 
@@ -394,8 +407,7 @@
     (page :: <wiki-page>, response :: <response>)
     (format :: <string> = "raw")
   write(output-stream(response),
-        (*title* & page-content(*title*, version: *version*, format: as(<symbol>, format)))
-        | *content*);
+        page-content(*title*, version: *version*, format: as(<symbol>, format)));
 end;
 
 define body tag show-revisions in wiki
@@ -580,13 +592,13 @@
 define tag show-change-author in wiki
     (page :: <wiki-page>, response :: <response>)
     ()
-  write(output-stream(response), *change*.author);
+  write(output-stream(response), escape-xml(*change*.author));
 end;
 
 define tag show-change-comment in wiki
     (page :: <wiki-page>, response :: <response>)
     ()
-  write(output-stream(response), *change*.comment);
+  write(output-stream(response), escape-xml(*change*.comment));
 end;
 
 define page admin-page (<wiki-page>)

Modified: trunk/libraries/koala/www/wiki/edit.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/edit.dsp	(original)
+++ trunk/libraries/koala/www/wiki/edit.dsp	Sat Jun 17 01:52:37 2006
@@ -37,7 +37,8 @@
           <br/>
           Comment: <input type="text" name="comment"/>
           <br/>
-          <input type="submit" value="Save"/>
+          <input type="submit" name="preview" value="Preview"/>
+          <input type="submit" name="save" value="Save"/>
         </div>
       </form>
     </dsp:then>

Modified: trunk/libraries/koala/www/wiki/footer.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/footer.dsp	(original)
+++ trunk/libraries/koala/www/wiki/footer.dsp	Sat Jun 17 01:52:37 2006
@@ -19,11 +19,6 @@
   <a href="/wiki/recent.dsp">Recent&nbsp;Changes</a>
   <a href="/wiki/index.dsp">Index</a>
   <a href="/wiki/version.dsp?title=<wiki:show-title/>">History</a>
-  <span class="lastrevisions">
-    <wiki:show-revisions count="10">
-      <a class="revisionlink" href="/wiki/view.dsp?title=<wiki:show-title v="false"/>&amp;v=<wiki:version/>">[<wiki:version/>]</a>
-    </wiki:show-revisions>
-  </span>
 </div>
   <p id="valid_xhtml"><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
 </div>

Modified: trunk/libraries/koala/www/wiki/header.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/header.dsp	(original)
+++ trunk/libraries/koala/www/wiki/header.dsp	Sat Jun 17 01:52:37 2006
@@ -10,7 +10,7 @@
   </form>
   <div class="navbar">
     <a href="/wiki/view.dsp?title=Home">Home</a>&nbsp;&nbsp;
-    <a href="/wiki/new.dsp">New Page</a>&nbsp;&nbsp;
+    <a href="/wiki/edit.dsp?title=new">New Page</a>&nbsp;&nbsp;
     <a href="/wiki/view.dsp?title=Markup">Wiki Markup</a>&nbsp;&nbsp;
     <a href="/wiki/backlink.dsp?title=<wiki:show-title/>">Backlinks</a>&nbsp;&nbsp;
     <dsp:when test="editable?">

Added: trunk/libraries/koala/www/wiki/preview.dsp
==============================================================================
--- (empty file)
+++ trunk/libraries/koala/www/wiki/preview.dsp	Sat Jun 17 01:52:37 2006
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<%dsp:taglib name="wiki"/>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Dylan Wiki: Preview of <wiki:show-title/></title>
+  <link  rel="stylesheet" href="/wiki/wiki.css"/>
+</head>
+
+<body>
+
+  <%dsp:include url="header.dsp"/>
+
+  <dsp:show-form-notes/>
+
+  <h1>Preview for "<wiki:show-title v="false" for-url="false"/>"</h1>
+  <form action="/wiki/edit.dsp" method="post">
+    <div id="edit">
+       <input type="hidden" name="title" value="<wiki:show-title/>"/>
+       <wiki:show-content format="html"/><br/><hr/>
+       <textarea name="page-content" cols="80" rows="20"><wiki:show-content format="raw"/></textarea><br/>
+       Comment: <input type="text" name="comment" value="<wiki:show-comment/>"/><br/>
+       <input type="submit" name="preview" value="Preview"/>
+       <input type="submit" name="save" value="Save"/>
+      </div>
+    </form>
+
+  <%dsp:include url="footer.dsp"/>
+</body>
+</html>

Modified: trunk/libraries/koala/www/wiki/version.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/version.dsp	(original)
+++ trunk/libraries/koala/www/wiki/version.dsp	Sat Jun 17 01:52:37 2006
@@ -14,7 +14,7 @@
     <h3>Version History of <wiki:show-title/></h3>
     <ul>
     <wiki:show-versions>
-      <li><wiki:show-change-timestamp/> version <wiki:show-change-version/> <a href="/wiki/diff.dsp?title=<wiki:show-change-title/>&version=<wiki:show-change-version/>">diff</a> by <wiki:show-change-author/> Comment <wiki:show-change-comment/></li>
+      <li><wiki:show-change-timestamp/> version <wiki:show-change-version/> <a href="/wiki/diff.dsp?title=<wiki:show-change-title/>&version=<wiki:show-change-version/>">diff to previous</a> by <wiki:show-change-author/> Comment <wiki:show-change-comment/></li>
     </wiki:show-versions>
     </ul>
   </div>



More information about the chatter mailing list