From 03dfa83af2a4a80db839f07819223b9dfc7639d8 Mon Sep 17 00:00:00 2001 From: "http://ptecza.myopenid.com/" Date: Mon, 28 Jul 2008 03:09:43 -0400 Subject: [PATCH 01/11] * Progressbar plugin? --- doc/todo/progressbar_plugin.mdwn | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 doc/todo/progressbar_plugin.mdwn diff --git a/doc/todo/progressbar_plugin.mdwn b/doc/todo/progressbar_plugin.mdwn new file mode 100644 index 000000000..42c9c6bea --- /dev/null +++ b/doc/todo/progressbar_plugin.mdwn @@ -0,0 +1,41 @@ +I would like to add next plugin to Ikiwiki. It's `progressbar` +(or simply `progress`, I'm not sure what plugin name better is). I know that +[DokuWiki](http://wiki.splitbrain.org/plugin:progressbar) has similar plugin, +so I think it can be useful also for Ikiwiki users. + +Here is proposition of the plugin syntax: + + \[[!progress done=50]] + +A here is its HTML result: + +
+
50%
+
+ +Of course, `done` argument is integer from 0 to 100. + +Default CSS styles for the plugin can be like below: + + div.progress { + border: 1px solid #ddd; + /* border: 2px solid #ddd; */ + width: 200px; + background: #fff; + padding: 2px; + /* padding: 0px; */ + border: 2px solid #aaa; + background: #eee; + } + div.progress-done { + height: 14px; + background: #ff6600; + font-size: 12px; + text-align: center; + vertical-align: middle; + } + +You can use alternative, commented CSS code for `div.progress` if you dislike +padding around done strip. + +Any comments? --[[Paweł|ptecza]] From 0d75610f5bc141624d088bbabe113f23e9f94493 Mon Sep 17 00:00:00 2001 From: "http://ptecza.myopenid.com/" Date: Mon, 28 Jul 2008 03:14:02 -0400 Subject: [PATCH 02/11] * Completion --- doc/todo/progressbar_plugin.mdwn | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/todo/progressbar_plugin.mdwn b/doc/todo/progressbar_plugin.mdwn index 42c9c6bea..3101010b2 100644 --- a/doc/todo/progressbar_plugin.mdwn +++ b/doc/todo/progressbar_plugin.mdwn @@ -7,13 +7,16 @@ Here is proposition of the plugin syntax: \[[!progress done=50]] +Of course, `done` argument is integer from 0 to 100. + A here is its HTML result:
50%
-Of course, `done` argument is integer from 0 to 100. +Note: I was trying with `` tags too, but that tag is inline, so I can't +set `width` property for it. Default CSS styles for the plugin can be like below: From f44135c66b716433eb94f57a16bcc7ad1a893fea Mon Sep 17 00:00:00 2001 From: "http://ptecza.myopenid.com/" Date: Mon, 28 Jul 2008 03:17:32 -0400 Subject: [PATCH 03/11] * Edition --- doc/todo/progressbar_plugin.mdwn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/todo/progressbar_plugin.mdwn b/doc/todo/progressbar_plugin.mdwn index 3101010b2..d586ce79c 100644 --- a/doc/todo/progressbar_plugin.mdwn +++ b/doc/todo/progressbar_plugin.mdwn @@ -1,5 +1,5 @@ -I would like to add next plugin to Ikiwiki. It's `progressbar` -(or simply `progress`, I'm not sure what plugin name better is). I know that +I would like to add next plugin to Ikiwiki. It's `progressbar` or simply `progress`. +I'm not sure what plugin name better is, probably that shorter ;) I know that [DokuWiki](http://wiki.splitbrain.org/plugin:progressbar) has similar plugin, so I think it can be useful also for Ikiwiki users. From 8de670263c16a8b58fbde87d76e3e33da0ddf942 Mon Sep 17 00:00:00 2001 From: "http://schmonz.livejournal.com/" Date: Mon, 28 Jul 2008 23:57:26 -0400 Subject: [PATCH 04/11] document unixauth.pm --- doc/plugins/contrib/unixauth.mdwn | 154 ++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 doc/plugins/contrib/unixauth.mdwn diff --git a/doc/plugins/contrib/unixauth.mdwn b/doc/plugins/contrib/unixauth.mdwn new file mode 100644 index 000000000..12f885c33 --- /dev/null +++ b/doc/plugins/contrib/unixauth.mdwn @@ -0,0 +1,154 @@ +[[!template id=plugin name=unixauth core=0 author="[[schmonz]]"]] +[[!tag type/auth]] + +This plugin authenticates users against the Unix user database. It presents a similar UI to [[plugins/passwordauth]], but simpler, as there's no need to be able to register or change one's password. + +[pwauth](http://www.unixpapa.com/pwauth/) must be installed and working. In particular, it must be configured to recognize the UID of the calling web server, or authentication will always fail. Set `pwauth_path` to the full path of your pwauth binary. + +As [with passwordauth](/security/#index14h2), be wary of sending usernames and passwords in cleartext. Unlike with passwordauth, sniffing these credentials can get an attacker much further than mere wiki access. SSL with this plugin is a __must__. + +[[!toggle id="code" text="unixauth.pm"]] + +[[!toggleable id="code" text=""" + + #!/usr/bin/perl + # Ikiwiki unixauth authentication. + package IkiWiki::Plugin::unixauth; + + use warnings; + use strict; + use IkiWiki 2.00; + + sub import { #{{{ + hook(type => "formbuilder_setup", id => "unixauth", + call => \&formbuilder_setup); + hook(type => "formbuilder", id => "unixauth", + call => \&formbuilder); + hook(type => "sessioncgi", id => "unixauth", call => \&sessioncgi); + } # }}} + + # Checks if a string matches a user's password, and returns true or false. + sub checkpassword ($$;$) { #{{{ + my $user=shift; + my $password=shift; + my $field=shift || "password"; + + # It's very important that the user not be allowed to log in with + # an empty password! + if (! length $password) { + return 0; + } + + my $ret=0; + if (! exists $config{pwauth_path}) { + $config{pwauth_path}="/usr/libexec/pwauth"; + } + open PWAUTH, "|$config{pwauth_path}" or die("Could not run pwauth"); + print PWAUTH "$user\n$password\n"; + close PWAUTH; + $ret=!($?>>8); + + if ($ret) { + my $userinfo=IkiWiki::userinfo_retrieve(); + if (! length $user || ! defined $userinfo || + ! exists $userinfo->{$user} || ! ref $userinfo->{$user}) { + IkiWiki::userinfo_setall($user, { + 'email' => '', + 'regdate' => time, + }); + } + } + + return $ret; + } #}}} + + sub formbuilder_setup (@) { #{{{ + my %params=@_; + + my $form=$params{form}; + my $session=$params{session}; + my $cgi=$params{cgi}; + + if ($form->title eq "signin") { + $form->field(name => "name", required => 0); + $form->field(name => "password", type => "password", required => 0); + + if ($form->submitted) { + my $submittype=$form->submitted; + # Set required fields based on how form was submitted. + my %required=( + "Login" => [qw(name password)], + ); + foreach my $opt (@{$required{$submittype}}) { + $form->field(name => $opt, required => 1); + } + + # Validate password against name for Login. + if ($submittype eq "Login") { + $form->field( + name => "password", + validate => sub { + checkpassword($form->field("name"), shift); + }, + ); + } + + elsif ($submittype eq "Login") { + $form->field( + name => "name", + validate => sub { + my $name=shift; + length $name && + IkiWiki::userinfo_get($name, "regdate"); + }, + ); + } + } + else { + # First time settings. + $form->field(name => "name"); + if ($session->param("name")) { + $form->field(name => "name", value => $session->param("name")); + } + } + } + elsif ($form->title eq "preferences") { + $form->field(name => "name", disabled => 1, + value => $session->param("name"), force => 1, + fieldset => "login"); + $form->field(name => "password", disabled => 1, type => "password", + fieldset => "login"), + } + } + + sub formbuilder (@) { #{{{ + my %params=@_; + + my $form=$params{form}; + my $session=$params{session}; + my $cgi=$params{cgi}; + my $buttons=$params{buttons}; + + if ($form->title eq "signin") { + if ($form->submitted && $form->validate) { + if ($form->submitted eq 'Login') { + $session->param("name", $form->field("name")); + IkiWiki::cgi_postsignin($cgi, $session); + } + } + } + elsif ($form->title eq "preferences") { + if ($form->submitted eq "Save Preferences" && $form->validate) { + my $user_name=$form->field('name'); + } + } + } #}}} + + sub sessioncgi ($$) { #{{{ + my $q=shift; + my $session=shift; + } #}}} + + 1 + +"""]] From 48477d92fdd066eb508cce3aa8ea9d3574e24103 Mon Sep 17 00:00:00 2001 From: "http://schmonz.livejournal.com/" Date: Tue, 29 Jul 2008 00:04:48 -0400 Subject: [PATCH 05/11] sorry, should have mentioned pkgsrc is cross-platform --- doc/download.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/download.mdwn b/doc/download.mdwn index 71d333ad4..6566dc122 100644 --- a/doc/download.mdwn +++ b/doc/download.mdwn @@ -28,7 +28,7 @@ There is also an unofficial backport of ikiwiki for Ubuntu Hardy, provided by [[Paweł_Tęcza|users/ptecza]], at [http://gpa.net.icm.edu.pl/ubuntu/](http://gpa.net.icm.edu.pl/ubuntu/index-en.html). -NetBSD pkgsrc has an [ikiwiki package](ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/www/ikiwiki/README.html). +NetBSD and many other platforms: pkgsrc has an [ikiwiki package](ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/www/ikiwiki/README.html). FreeBSD has ikiwiki in its [ports collection](http://www.freshports.org/www/ikiwiki/). From a81dfc9063aa873f6b005ae3ae6a30b3faee04aa Mon Sep 17 00:00:00 2001 From: "http://schmonz.livejournal.com/" Date: Tue, 29 Jul 2008 00:20:35 -0400 Subject: [PATCH 06/11] --- doc/users/schmonz.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/users/schmonz.mdwn diff --git a/doc/users/schmonz.mdwn b/doc/users/schmonz.mdwn new file mode 100644 index 000000000..7e297fbf0 --- /dev/null +++ b/doc/users/schmonz.mdwn @@ -0,0 +1 @@ +[Amitai Schlair](http://www.schmonz.com/) recently discovered ikiwiki. From 37245a9988d22938a8f13fb89cecc5c23bbed419 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 29 Jul 2008 15:04:34 -0400 Subject: [PATCH 07/11] add refresh hook --- IkiWiki/Plugin/skeleton.pm.example | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/IkiWiki/Plugin/skeleton.pm.example b/IkiWiki/Plugin/skeleton.pm.example index 1af8e4e9d..10c7002e4 100644 --- a/IkiWiki/Plugin/skeleton.pm.example +++ b/IkiWiki/Plugin/skeleton.pm.example @@ -11,6 +11,7 @@ use IkiWiki 2.00; sub import { #{{{ hook(type => "getopt", id => "skeleton", call => \&getopt); hook(type => "checkconfig", id => "skeleton", call => \&checkconfig); + hook(type => "refresh", id => "skeleton", call => \&refresh); hook(type => "needsbuild", id => "skeleton", call => \&needsbuild); hook(type => "preprocess", id => "skeleton", call => \&preprocess); hook(type => "filter", id => "skeleton", call => \&filter); @@ -42,6 +43,10 @@ sub checkconfig () { #{{{ debug("skeleton plugin checkconfig"); } #}}} +sub refresh () { #{{{ + debug("skeleton plugin refresh"); +} #}}} + sub needsbuild () { #{{{ debug("skeleton plugin needsbuild"); } #}}} From a02c3f46ea79313a4e0f6df924efac067b0fd177 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 29 Jul 2008 15:39:01 -0400 Subject: [PATCH 08/11] initial draft --- IkiWiki/Plugin/autoindex.pm | 55 +++++++++++++++++++++++++++++++++++++ doc/plugins/autoindex.mdwn | 7 +++++ templates/autoindex.tmpl | 1 + 3 files changed, 63 insertions(+) create mode 100644 IkiWiki/Plugin/autoindex.pm create mode 100644 doc/plugins/autoindex.mdwn create mode 100644 templates/autoindex.tmpl diff --git a/IkiWiki/Plugin/autoindex.pm b/IkiWiki/Plugin/autoindex.pm new file mode 100644 index 000000000..0a8d90701 --- /dev/null +++ b/IkiWiki/Plugin/autoindex.pm @@ -0,0 +1,55 @@ +#!/usr/bin/perl +package IkiWiki::Plugin::autoindex; + +use warnings; +use strict; +use IkiWiki 2.00; +use Encode; + +sub import { #{{{ + hook(type => "refresh", id => "autoindex", call => \&refresh); +} # }}} + +sub genindex ($) { #{{{ + my $page=shift; + my $file=$page.".".$config{default_pageext}; + my $template=template("autoindex.tmpl"); + $template->param(page => $page); + writefile($file, $config{srcdir}, $template->output); +} #}}} + +sub refresh () { #{{{ + eval q{use File::Find}; + error($@) if $@; + + my (%pages, %dirs); + find({ + no_chdir => 1, + wanted => sub { + $_=decode_utf8($_); + if (IkiWiki::file_pruned($_, $config{srcdir})) { + $File::Find::prune=1; + } + elsif (! -l $_) { + my ($f)=/$config{wiki_file_regexp}/; # untaint + return unless defined $f; + $f=~s/^\Q$config{srcdir}\E\/?//; + return unless length $f; + if (! -d _) { + $pages{pagename($f)}=1; + } + else { + $dirs{$f}=1; + } + } + } + }, $config{srcdir}); + + foreach my $dir (keys %dirs) { + if (! exists $pages{$dir}) { + genindex($dir); + } + } +} #}}} + +1 diff --git a/doc/plugins/autoindex.mdwn b/doc/plugins/autoindex.mdwn new file mode 100644 index 000000000..66e0163c2 --- /dev/null +++ b/doc/plugins/autoindex.mdwn @@ -0,0 +1,7 @@ +[[!template id=plugin name=autoindex core=0 author="[[Joey]]"]] +[[!tag type/useful]] + +This plugin searches for [[SubPages|ikiwiki/subpage]] with a missing parent +page, and generates a parent page for them. The generated page content is +controlled by the autoindex [[template|wikitemplates]], which by default, +uses a [[map]] to list the SubPages. diff --git a/templates/autoindex.tmpl b/templates/autoindex.tmpl new file mode 100644 index 000000000..d5ec3b8ee --- /dev/null +++ b/templates/autoindex.tmpl @@ -0,0 +1 @@ +[[!map pages="/* and ! /*/*"]] From d6c73e9ef6dcd89ade9ca64755d683ac88d46ae7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 29 Jul 2008 15:40:07 -0400 Subject: [PATCH 09/11] rename discussion page to match plugin name --- doc/plugins/{plaintext => txt}/discussion.mdwn | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/plugins/{plaintext => txt}/discussion.mdwn (100%) diff --git a/doc/plugins/plaintext/discussion.mdwn b/doc/plugins/txt/discussion.mdwn similarity index 100% rename from doc/plugins/plaintext/discussion.mdwn rename to doc/plugins/txt/discussion.mdwn From f0090d8c5781682eb0e4a59cb92438c0b7baafa1 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 29 Jul 2008 15:51:25 -0400 Subject: [PATCH 10/11] check generated pages in I considered not checking them in, or making the checkin configurable. However, then they would remain not checked in if edited by a user, which is probably not desired. Note that passing undef as the username/ip to rcs_commit_staged may not result in ideal behavior; the commit may seem to come from "anonymous" with some revision control systems. Most of them handle it a bit better and just have it come from whatever user is running the build. --- IkiWiki/Plugin/autoindex.pm | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/IkiWiki/Plugin/autoindex.pm b/IkiWiki/Plugin/autoindex.pm index 0a8d90701..8179ee1e7 100644 --- a/IkiWiki/Plugin/autoindex.pm +++ b/IkiWiki/Plugin/autoindex.pm @@ -16,6 +16,9 @@ sub genindex ($) { #{{{ my $template=template("autoindex.tmpl"); $template->param(page => $page); writefile($file, $config{srcdir}, $template->output); + if ($config{rcs}) { + IkiWiki::rcs_add($file); + } } #}}} sub refresh () { #{{{ @@ -45,9 +48,23 @@ sub refresh () { #{{{ } }, $config{srcdir}); + my @needed; foreach my $dir (keys %dirs) { if (! exists $pages{$dir}) { - genindex($dir); + push @needed, $dir; + } + } + + if (@needed) { + if ($config{rcs}) { + IkiWiki::disable_commit_hook(); + } + genindex($_) foreach @needed; + if ($config{rcs}) { + IkiWiki::rcs_commit_staged( + gettext("automatic index generation"), + undef, undef); + IkiWiki::enable_commit_hook(); } } } #}}} From 106578f524a7ef8184029ac393dbe9d68b017756 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 29 Jul 2008 15:54:07 -0400 Subject: [PATCH 11/11] changelog --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index e2258e9e6..7fd135700 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +ikiwiki (2.56) UNRELEASED; urgency=low + + * autoindex: New plugin that generates missing index pages. + (Sponsored by The TOVA Company.) + + -- Joey Hess Tue, 29 Jul 2008 15:53:26 -0400 + ikiwiki (2.55) unstable; urgency=low * remove: New plugin that adds the ability to remove pages via the web.