-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();
- 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;