PageSpec ip()
(implementation match_ip
) supports globs, but it would be useful to be able to write say
154.12.192.0/22
to block a range of addresses that aren't matchable with a simple glob.
Perhaps not in the same PageSpec, but it might also be useful to support looking up AS assignments and blocking ranges that way, see https://feeding.cloud.geek.nz/posts/blocking-comment-spammers-ikiwiki/. For the example IP above, this would be 6,171 IP ranges, and considerably more lines in banned_users
without features like these.
— Jon, 2025-01-24
#!/usr/bin/perl
# Copyright © 2008 Joey Hess <joey@ikiwiki.info>
# Copyright © 2025 Jonathan Dowland <jon@dow.land>
# Licensed under the GNU GPL, version 2, or any later version published by the
# Free Software Foundation
use warnings;
use strict;
use IkiWiki 3.00;
use Net::Netmask;
package IkiWiki::PageSpec;
sub match_ipblock ($$;@) {
shift;
my $string=shift;
my %params=@_;
if (! exists $params{ip}) {
return IkiWiki::ErrorReason->new("no IP specified");
}
my $block = Net::Netmask->safe_new($string);
unless ($block) {
return IkiWiki::ErrorReason->new("invalid netmask specified");
}
if ($block->match($params{ip})) {
return IkiWiki::SuccessReason->new("IP is in block $string");
} else {
return IkiWiki::FailReason->new("IP is $params{ip}, not in block $string");
}
}
1
If I look at this further I'd move it into a plugin rather than add Net::Netmask
to IkiWiki.pm
.
— Jon, 2025-01-24
I've altered the code block above; I'm now testing this plugin on my site. — Jon, 2025-01-27