+ if ($form->submitted && $form->validate) {
+ if ($form->submitted eq 'Login') {
+ $session->param("name", $form->field("name"));
+ if (defined $form->field("do") &&
+ $form->field("do") ne 'signin') {
+ print $q->redirect(
+ "$cgiurl?do=".$form->field("do").
+ "&page=".$form->field("page"));
+ }
+ else {
+ print $q->redirect($url);
+ }
+ }
+ elsif ($form->submitted eq 'Register') {
+ # TODO: save registration info
+ $form->field(name => "confirm_password", type => "hidden");
+ $form->field(name => "email", type => "hidden");
+ $form->text("Registration successful. Now you can Login.");
+ print $form->render(submit => ["Login"]);;
+ }
+ elsif ($form->submitted eq 'Mail Password') {
+ # TODO mail password
+ $form->text("Your password has been emailed to you.");
+ print $form->render(submit => ["Login", "Register", "Mail Password"]);;
+ }
+ }
+ else {
+ print $form->render(submit => ["Login", "Register", "Mail Password"]);;
+ }
+} #}}}
+
+sub cgi () { #{{{
+ eval q{use CGI};
+ eval q{use CGI::Session};
+
+ my $q=CGI->new;
+
+ my $do=$q->param('do');
+ if (! defined $do || ! length $do) {
+ error("\"do\" parameter missing");
+ }
+
+ # This does not need a session.
+ if ($do eq 'recentchanges') {
+ cgi_recentchanges($q);
+ return;
+ }
+
+ # session id has to be _sessionid for CGI::FormBuilder to work.
+ # TODO: stop having the formbuilder emit cookies and change session
+ # id to something else.
+ CGI::Session->name("_sessionid");
+ my $session = CGI::Session->new(undef, $q,
+ { Directory=> "$srcdir/.ikiwiki/sessions" });
+
+ # Everything below this point needs the user to be signed in.
+ if ((! $anonok && ! defined $session->param("name")) || $do eq 'signin') {
+ cgi_signin($q, $session);
+ return;
+ }
+
+ my ($page)=$q->param('page')=~/$wiki_file_regexp/;
+ if (! defined $page || ! length $page || $page ne $q->param('page') ||
+ $page=~/$wiki_file_prune_regexp/ || $page=~/^\//) {
+ error("bad page name");
+ }
+ $page=lc($page);
+
+ my $action=$q->request_uri;
+ $action=~s/\?.*//;
+
+ if ($do eq 'create') {
+ if (exists $pagesources{lc($page)}) {
+ # hmm, someone else made the page in the meantime?
+ print $q->redirect("$url/".htmlpage($page));
+ }
+
+ my @page_locs;
+ my ($from)=$q->param('from')=~/$wiki_file_regexp/;
+ if (! defined $from || ! length $from ||
+ $from ne $q->param('from') ||
+ $from=~/$wiki_file_prune_regexp/ || $from=~/^\//) {
+ @page_locs=$page;
+ }
+ else {
+ my $dir=$from."/";
+ $dir=~s![^/]+/$!!;
+ push @page_locs, $dir.$page;
+ push @page_locs, "$from/$page";
+ while (length $dir) {
+ $dir=~s![^/]+/$!!;
+ push @page_locs, $dir.$page;
+ }
+ }
+
+ $q->param("do", "save");
+ print $q->header,
+ $q->start_html("Creating $page"),
+ $q->h1(indexlink()." Creating $page"),
+ $q->start_form(-action => $action),
+ $q->hidden('do'),
+ "Select page location:",
+ $q->popup_menu('page', \@page_locs),
+ $q->textarea(-name => 'content',
+ -default => "",
+ -rows => 20,
+ -columns => 80),
+ $q->br,
+ "Optional comment about this change:",
+ $q->br,
+ $q->textfield(-name => "comments", -size => 80),
+ $q->br,
+ $q->submit("Save Page"),
+ $q->end_form,
+ $q->end_html;
+ }
+ elsif ($do eq 'edit') {
+ my $content="";
+ if (exists $pagesources{lc($page)}) {
+ $content=readfile("$srcdir/$pagesources{lc($page)}");
+ $content=~s/\n/\r\n/g;
+ }
+ $q->param("do", "save");
+ print $q->header,
+ $q->start_html("Editing $page"),
+ $q->h1(indexlink()." Editing $page"),
+ $q->start_form(-action => $action),
+ $q->hidden('do'),
+ $q->hidden('page'),
+ $q->textarea(-name => 'content',
+ -default => $content,
+ -rows => 20,
+ -columns => 80),
+ $q->br,
+ "Optional comment about this change:",
+ $q->br,
+ $q->textfield(-name => "comments", -size => 80),
+ $q->br,
+ $q->submit("Save Page"),
+ $q->end_form,
+ $q->end_html;
+ }
+ elsif ($do eq 'save') {
+ my $file=$page.$default_pagetype;
+ my $newfile=1;
+ if (exists $pagesources{lc($page)}) {
+ $file=$pagesources{lc($page)};
+ $newfile=0;
+ }
+
+ my $content=$q->param('content');
+ $content=~s/\r\n/\n/g;
+ $content=~s/\r/\n/g;
+ writefile("$srcdir/$file", $content);
+
+ my $message="web commit from $ENV{REMOTE_ADDR}";
+ if (defined $q->param('comments')) {
+ $message.=": ".$q->param('comments');
+ }
+
+ if ($svn) {
+ if ($newfile) {
+ rcs_add($file);
+ }
+ # presumably the commit will trigger an update
+ # of the wiki
+ rcs_commit($message);
+ }
+ else {
+ refresh();
+ }
+
+ print $q->redirect("$url/".htmlpage($page));
+ }
+ else {
+ error("unknown do parameter");
+ }
+} #}}}
+
+# main {{{
+my $rebuild=0;
+my $wrapper=0;
+if (grep /^-/, @ARGV) {
+ eval {use Getopt::Long};
+ GetOptions(
+ "wikiname=s" => \$wikiname,
+ "verbose|v" => \$verbose,
+ "rebuild" => \$rebuild,
+ "wrapper" => \$wrapper,
+ "svn!" => \$svn,
+ "anonok!" => \$anonok,
+ "cgi" => \$cgi,
+ "url=s" => \$url,
+ "cgiurl=s" => \$cgiurl,
+ "historyurl=s" => \$historyurl,
+ ) || usage();
+}
+usage() unless @ARGV == 3;
+($srcdir) = possibly_foolish_untaint(shift);
+($templatedir) = possibly_foolish_untaint(shift);
+($destdir) = possibly_foolish_untaint(shift);
+
+if ($cgi && ! length $url) {
+ error("Must specify url to wiki with --url when using --cgi");
+}
+
+gen_wrapper($svn, $rebuild) if $wrapper;
+memoize('pagename');
+memoize('bestlink');