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