Merge branch 'tova' into autoconfig
authorJoey Hess <joey@kodama.kitenet.net>
Tue, 29 Jul 2008 19:54:45 +0000 (15:54 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Tue, 29 Jul 2008 19:54:45 +0000 (15:54 -0400)
Conflicts:

debian/changelog

IkiWiki/Plugin/autoindex.pm [new file with mode: 0644]
IkiWiki/Plugin/skeleton.pm.example
debian/changelog
doc/download.mdwn
doc/plugins/autoindex.mdwn [new file with mode: 0644]
doc/plugins/contrib/unixauth.mdwn [new file with mode: 0644]
doc/plugins/txt/discussion.mdwn [moved from doc/plugins/plaintext/discussion.mdwn with 100% similarity]
doc/todo/progressbar_plugin.mdwn [new file with mode: 0644]
doc/users/schmonz.mdwn [new file with mode: 0644]
templates/autoindex.tmpl [new file with mode: 0644]

diff --git a/IkiWiki/Plugin/autoindex.pm b/IkiWiki/Plugin/autoindex.pm
new file mode 100644 (file)
index 0000000..8179ee1
--- /dev/null
@@ -0,0 +1,72 @@
+#!/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);
+       if ($config{rcs}) {
+               IkiWiki::rcs_add($file);
+       }
+} #}}}
+
+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});
+
+       my @needed;
+       foreach my $dir (keys %dirs) {
+               if (! exists $pages{$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();
+               }
+       }
+} #}}}
+
+1
index 49c4d88f288d024cfed3dd31b62392ea0b201fb4..bbf11e603839a24f787f0f2ec02ac0f7774f9235 100644 (file)
@@ -12,6 +12,7 @@ sub import { #{{{
        hook(type => "getopt", id => "skeleton",  call => \&getopt);
        hook(type => "getsetup", id => "skeleton",  call => \&getsetup);
        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);
@@ -54,6 +55,10 @@ sub checkconfig () { #{{{
        debug("skeleton plugin checkconfig");
 } #}}}
 
+sub refresh () { #{{{
+       debug("skeleton plugin refresh");
+} #}}}
+
 sub needsbuild () { #{{{
        debug("skeleton plugin needsbuild");
 } #}}}
index 7b4bc42156d94d11ea1590fda10f383676fc01b7..c4e4b7f48a34b1bbac5c92b6ed1090662ef37421 100644 (file)
@@ -14,6 +14,13 @@ ikiwiki (2.60) UNRELEASED; urgency=low
 
  -- Joey Hess <joeyh@debian.org>  Mon, 21 Jul 2008 11:35:46 -0400
 
+ikiwiki (2.56) UNRELEASED; urgency=low
+
+  * autoindex: New plugin that generates missing index pages.
+    (Sponsored by The TOVA Company.)
+
+ -- Joey Hess <joeyh@debian.org>  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.
index 71d333ad4d7b5fd5e64ac948f102b62a829a4874..6566dc1224f65224cffedaa3993c1c52b35819e5 100644 (file)
@@ -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/).
diff --git a/doc/plugins/autoindex.mdwn b/doc/plugins/autoindex.mdwn
new file mode 100644 (file)
index 0000000..66e0163
--- /dev/null
@@ -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/doc/plugins/contrib/unixauth.mdwn b/doc/plugins/contrib/unixauth.mdwn
new file mode 100644 (file)
index 0000000..12f885c
--- /dev/null
@@ -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
+
+"""]]
diff --git a/doc/todo/progressbar_plugin.mdwn b/doc/todo/progressbar_plugin.mdwn
new file mode 100644 (file)
index 0000000..d586ce7
--- /dev/null
@@ -0,0 +1,44 @@
+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.
+
+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:
+
+    <div class="progress">
+      <div class="progress-done" style="width: 50%">50%</div>
+    </div>
+
+Note: I was trying with `<span>` 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:
+
+    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]]
diff --git a/doc/users/schmonz.mdwn b/doc/users/schmonz.mdwn
new file mode 100644 (file)
index 0000000..7e297fb
--- /dev/null
@@ -0,0 +1 @@
+[Amitai Schlair](http://www.schmonz.com/) recently discovered ikiwiki.
diff --git a/templates/autoindex.tmpl b/templates/autoindex.tmpl
new file mode 100644 (file)
index 0000000..d5ec3b8
--- /dev/null
@@ -0,0 +1 @@
+[[!map pages="<TMPL_VAR PAGE>/* and ! <TMPL_VAR PAGE>/*/*"]]