diff options
author | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2006-03-12 02:22:29 +0000 |
---|---|---|
committer | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2006-03-12 02:22:29 +0000 |
commit | 1311d67f0d430a946fc2463bd93379a1f8ca23f7 (patch) | |
tree | f2007b2a65369fb280405396233fbdfbe2bca02c /ikiwiki | |
parent | e7f2e59d1bb84c53368a615d047f01123f5a6b67 (diff) |
added signin form, although it needs to be hooked up to a user store
Diffstat (limited to 'ikiwiki')
-rwxr-xr-x | ikiwiki | 179 |
1 files changed, 153 insertions, 26 deletions
@@ -127,7 +127,7 @@ sub writefile ($$) { #{{{ close OUT; } #}}} -sub findlinks { #{{{ +sub findlinks ($) { #{{{ my $content=shift; my @links; @@ -243,6 +243,10 @@ sub linkbacks ($$) { #{{{ return $content; } #}}} +sub indexlink () { #{{{ + return "<a href=\"$url\">$wikiname</a>/ "; +} #}}} + sub finalize ($$) { #{{{ my $content=shift; my $page=shift; @@ -262,7 +266,7 @@ sub finalize ($$) { #{{{ $path.="../"; } $path=~s/\.\.\/$/index.html/; - $pagelink="<a href=\"$path\">$wikiname</a>/ $pagelink"; + $pagelink=indexlink()." $pagelink"; my @actions; if (length $cgiurl) { @@ -312,7 +316,7 @@ sub render ($) { #{{{ } #}}} sub loadindex () { #{{{ - open (IN, "$srcdir/.index") || return; + open (IN, "$srcdir/.ikiwiki/index") || return; while (<IN>) { $_=possibly_foolish_untaint($_); chomp; @@ -328,7 +332,10 @@ sub loadindex () { #{{{ } #}}} sub saveindex () { #{{{ - open (OUT, ">$srcdir/.index") || error("cannot write to .index: $!"); + if (! -d "$srcdir/.ikiwiki") { + mkdir("$srcdir/.ikiwiki"); + } + open (OUT, ">$srcdir/.ikiwiki/index") || error("cannot write to index: $!"); foreach my $page (keys %oldpagemtime) { print OUT "$oldpagemtime{$page} $pagesources{$page} $renderedfiles{$page} ". join(" ", @{$links{$page}})."\n" @@ -589,7 +596,8 @@ sub gen_wrapper ($$) { #{{{ my @envsave; push @envsave, qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI - CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE} if $cgi; + CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE + HTTP_COOKIE} if $cgi; my $envsave=""; foreach my $var (@envsave) { $envsave.=<<"EOF" @@ -638,34 +646,153 @@ EOF exit 0; } #}}} +sub cgi_recentchanges ($) { #{{{ + my $q=shift; + + my $list="<ul>\n"; + foreach my $change (rcs_recentchanges(100)) { + $list.="<li>"; + $list.=join(", ", map { htmllink("", $_, 1) } @{$change->{pages}}); + $list.="<br>\n"; + $list.="changed ".$change->{when}." by ". + htmllink("", $change->{user}, 1). + ": <i>".$change->{message}."</i>\n"; + $list.="</li>\n"; + } + $list.="</ul>\n"; + + print $q->header, + $q->start_html("RecentChanges"), + $q->h1(indexlink()." RecentChanges"), + $list, + $q->end_form, + $q->end_html; +} #}}} + +sub cgi_signin ($$) { #{{{ + my $q=shift; + my $session=shift; + + eval q{use CGI::FormBuilder}; + my $form = CGI::FormBuilder->new( + title => "$wikiname signin", + fields => [qw(do page name password confirm_password email)], + header => 1, + method => 'POST', + validate => { + name => '/^\w+$/', + confirm_password => { + perl => q{eq $form->field("password")}, + }, + email => 'EMAIL', + }, + required => 'NONE', + javascript => 0, + params => $q, + action => $q->request_uri, + ); + + $form->sessionid($session->id); + $form->field(name => "name", required => 0); + $form->field(name => "do", type => "hidden"); + $form->field(name => "page", type => "hidden"); + $form->field(name => "password", type => "password", required => 0); + $form->field(name => "confirm_password", type => "password", required => 0); + $form->field(name => "email", required => 0); + if ($session->param("name")) { + $form->field(name => "name", value => $session->param("name")); + } + if ($q->param("do") ne "signin") { + $form->text("You need to log in before you can edit pages."); + } + + if ($form->submitted) { + # Set required fields based on how form was submitted. + my %required=( + "Login" => [qw(name password)], + "Register" => [qw(name password confirm_password email)], + "Mail Password" => [qw(name)], + ); + foreach my $opt (@{$required{$form->submitted}}) { + $form->field(name => $opt, required => 1); + } + + # Validate password differently depending on how form was + # submitted. + if ($form->submitted eq 'Login') { + $form->field( + name => "password", + validate => sub { + # TODO get real user password + shift eq "foo"; + }, + ); + } + else { + $form->field(name => "password", validate => 'VALUE'); + } + } + else { + # Comments only shown first time. + $form->field(name => "name", comment => "use FirstnameLastName"); + $form->field(name => "confirm_password", comment => "(only needed"); + $form->field(name => "email", comment => "for registration)"); + } + + if ($form->submitted && $form->validate) { + if ($form->submitted eq 'Login') { + $session->param("name", $form->field("name")); + if (defined $form->field("do")) { + $q->redirect( + "$cgiurl?do=".$form->field("do"). + "&page=".$form->field("page")); + } + else { + $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; - + # 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') { - my $list="<ul>\n"; - foreach my $change (rcs_recentchanges(100)) { - $list.="<li>"; - $list.=join(", ", map { htmllink("", $_, 1) } @{$change->{pages}}); - $list.="<br>\n"; - $list.="changed ".$change->{when}." by ". - htmllink("", $change->{user}, 1). - ": <i>".$change->{message}."</i>\n"; - $list.="</li>\n"; - } - $list.="</ul>\n"; - - print $q->header, - $q->start_html("RecentChanges"), - $q->h1("<a href=\"$url\">$wikiname</a>/ RecentChanges"), - $list, - $q->end_form, - $q->end_html; + cgi_recentchanges($q); + return; + } + + if (! defined $session->param("name") || $do eq 'signin') { + cgi_signin($q, $session); return; } @@ -706,7 +833,7 @@ sub cgi () { #{{{ $q->param("do", "save"); print $q->header, $q->start_html("Creating $page"), - $q->h1("<a href=\"$url\">$wikiname</a>/ Creating $page"), + $q->h1(indexlink()." Creating $page"), $q->start_form(-action => $action), $q->hidden('do'), "Select page location:", @@ -733,7 +860,7 @@ sub cgi () { #{{{ $q->param("do", "save"); print $q->header, $q->start_html("Editing $page"), - $q->h1("<a href=\"$url\">$wikiname</a>/ Editing $page"), + $q->h1(indexlink()." Editing $page"), $q->start_form(-action => $action), $q->hidden('do'), $q->hidden('page'), |