commit
12c5786df4
|
@ -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
|
|
@ -12,6 +12,7 @@ sub import { #{{{
|
||||||
hook(type => "getopt", id => "skeleton", call => \&getopt);
|
hook(type => "getopt", id => "skeleton", call => \&getopt);
|
||||||
hook(type => "getsetup", id => "skeleton", call => \&getsetup);
|
hook(type => "getsetup", id => "skeleton", call => \&getsetup);
|
||||||
hook(type => "checkconfig", id => "skeleton", call => \&checkconfig);
|
hook(type => "checkconfig", id => "skeleton", call => \&checkconfig);
|
||||||
|
hook(type => "refresh", id => "skeleton", call => \&refresh);
|
||||||
hook(type => "needsbuild", id => "skeleton", call => \&needsbuild);
|
hook(type => "needsbuild", id => "skeleton", call => \&needsbuild);
|
||||||
hook(type => "preprocess", id => "skeleton", call => \&preprocess);
|
hook(type => "preprocess", id => "skeleton", call => \&preprocess);
|
||||||
hook(type => "filter", id => "skeleton", call => \&filter);
|
hook(type => "filter", id => "skeleton", call => \&filter);
|
||||||
|
@ -54,6 +55,10 @@ sub checkconfig () { #{{{
|
||||||
debug("skeleton plugin checkconfig");
|
debug("skeleton plugin checkconfig");
|
||||||
} #}}}
|
} #}}}
|
||||||
|
|
||||||
|
sub refresh () { #{{{
|
||||||
|
debug("skeleton plugin refresh");
|
||||||
|
} #}}}
|
||||||
|
|
||||||
sub needsbuild () { #{{{
|
sub needsbuild () { #{{{
|
||||||
debug("skeleton plugin needsbuild");
|
debug("skeleton plugin needsbuild");
|
||||||
} #}}}
|
} #}}}
|
||||||
|
|
|
@ -14,6 +14,13 @@ ikiwiki (2.60) UNRELEASED; urgency=low
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Mon, 21 Jul 2008 11:35:46 -0400
|
-- 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
|
ikiwiki (2.55) unstable; urgency=low
|
||||||
|
|
||||||
* remove: New plugin that adds the ability to remove pages via the web.
|
* remove: New plugin that adds the ability to remove pages via the web.
|
||||||
|
|
|
@ -28,7 +28,7 @@ There is also an unofficial backport of ikiwiki for Ubuntu Hardy, provided by
|
||||||
[[Paweł_Tęcza|users/ptecza]],
|
[[Paweł_Tęcza|users/ptecza]],
|
||||||
at [http://gpa.net.icm.edu.pl/ubuntu/](http://gpa.net.icm.edu.pl/ubuntu/index-en.html).
|
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
|
FreeBSD has ikiwiki in its
|
||||||
[ports collection](http://www.freshports.org/www/ikiwiki/).
|
[ports collection](http://www.freshports.org/www/ikiwiki/).
|
||||||
|
|
|
@ -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.
|
|
@ -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
|
||||||
|
|
||||||
|
"""]]
|
|
@ -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]]
|
|
@ -0,0 +1 @@
|
||||||
|
[Amitai Schlair](http://www.schmonz.com/) recently discovered ikiwiki.
|
|
@ -0,0 +1 @@
|
||||||
|
[[!map pages="<TMPL_VAR PAGE>/* and ! <TMPL_VAR PAGE>/*/*"]]
|
Loading…
Reference in New Issue