-sub cgi () { #{{{
- eval q{use CGI};
- eval q{use CGI::Session};
-
- my $q=CGI->new;
- # 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" });
-
- my $do=$q->param('do');
- if (! defined $do || ! length $do) {
- error("\"do\" parameter missing");
- }
-
- if ($do eq 'recentchanges') {
- cgi_recentchanges($q);
- return;
- }
-
- 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');
-loadindex() unless $rebuild;
-if ($cgi) {
- cgi();
-}
-else {
- rcs_update() if $svn;
- refresh();
- saveindex();
-}
-#}}}