トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

FreeStyleWikiのパッチ

はじめに

FSWikiのちょっとした改造。

なお、下記のパッチ等はご自由にどうぞ。(山下さんの「無償・無保証・著作権放棄」と同じ扱いにします。)

# 断りのない限り、3.6.4をインストールする時に使ったもの。(3.5.5の時のは消してしまいました。)

FrontPage」をなんとかする

FrontPage」って、かっちょ悪いよね。特にWikiというよりは、簡易のCMSとして使っているとなおさらそう。やっぱ任意の文字列にしたい。今のVersion(3.6.4)でも、できることはできるんだけど、Farm環境ではできない。

そこで、環境設定 → サイト名になるようにするwiki.cgiのパッチ。

wiki.cgi_title.patch

--- wiki.cgi.orig	2010-08-28 23:58:43.000000000 +0900
+++ wiki.cgi	2010-09-20 22:48:00.000000000 +0900
@@ -152,8 +152,13 @@
 	# ページのタイトルを決定
 	my $title = "";
 	if($cgi->param('action') eq "" && $wiki->page_exists($cgi->param('page')) && $wiki->is_installed('search')){
-		$title = "<a href=\"".$wiki->create_url({action=>"SEARCH",word=>$wiki->get_title()})."\">".
-		       &Util::escapeHTML($wiki->get_title())."</a>";
+		if($cgi->param("page") eq $wiki->config("frontpage")){
+			$title = "<a href=\"".$wiki->config("script_name")."?action=SEARCH&amp;word=".&Util::url_encode($wiki->config('site_title'))."\">";
+			$title .= &Util::escapeHTML($wiki->config('site_title'))."</a>";
+		} else {
+		    $title = "<a href=\"".$wiki->create_url({action=>"SEARCH",word=>$wiki->get_title()})."\">";
+		    $title .= &Util::escapeHTML($wiki->get_title())."</a>";
+		}
 	} else {
 		$title = &Util::escapeHTML($wiki->get_title());
 	}

本家の掲示板にあるものは、3.5.5用。3.5.*でもいけると思う。

LastModifiedを返すようにする

 {{lastmodified}}

で表示される編集時刻を、LastModifiedで返すようにした、wiki.cgiのパッチ。

wiki.cgi_lastmodified.patch

--- wiki.cgi.orig	2010-08-28 23:58:43.000000000 +0900
+++ wiki.cgi	2010-09-21 00:49:35.000000000 +0900
@@ -296,6 +301,11 @@
 	} else {
 		print "Content-Type: text/html;charset=EUC-JP\n";
 	}
+	if ($wiki->page_exists($cgi->param('page'))){
+		my $last_modified_time = $wiki->get_last_modified2($cgi->param('page'));
+		$last_modified_time = $last_modified_time - (60 * 60 * 9);
+		print "Last-Modified: " . localtime($last_modified_time) . "\n";
+	}
 	print "Pragma: no-cache\n";
 	print "Cache-Control: no-cache\n\n";
 	 

localtimeをスカラーコンテキストでつかうと、ctime(3)のと同じフォーマットで返してくれるのに、いまごろ気づいたのは秘密。

Farmの名前にハイフンとアンダーバーを使えるようにする

hoge_04とか、2004-11とか、使いたくなると思うんだけど、使えないので使えるようにするplugin/core/CreateWikiHandler.pmのパッチ。

CreateWikiHandler.pm.patch

--- plugin/core/CreateWikiHandler.pm.orig	2010-08-28 23:58:45.000000000 +0900
+++ plugin/core/CreateWikiHandler.pm	2010-09-20 20:54:43.000000000 +0900
@@ -54,7 +54,7 @@
 			       "  <h3>Wikiの名前</h3>\n".
 			       "  <p>ここで設定したWiki名はURLに含まれますのでそのWikiの特徴を表した、".
 			       "     できるだけ短い名前をつけることをオススメします。".
-			       "     半角英数字しか使用できません。</p>\n".
+			       "     半角英数字'[a-zA-Z0-9]'とハイフン'-'とアンダーバー'_'しか使用できません。</p>\n".
 			       "  <p>Wiki名:<input type=\"text\" name=\"child\" size=\"40\"></p>".
 			       "  <h3>管理者の情報</h3>\n".
 			       "  <p>作成するWikiの管理者IDとパスワードを設定してください。".
@@ -87,7 +87,7 @@
 		}
 		
 		# 入力チェック
-		if(!($child =~ /^[A-Za-z0-9]+$/)){
+		if(!($child =~ /^[A-Za-z0-9][-_A-Za-z0-9]*[A-Za-z0-9]$/)){
 			return $farm->error(&Util::escapeHTML($child)."は不正な名称です。");
 		
 		} elsif($admin_id eq ""){

あと、wiki.cgiにも。

wiki.cgi_farmname.patch

--- wiki.cgi.orig	2010-08-28 23:58:43.000000000 +0900
+++ wiki.cgi	2010-09-20 22:48:00.000000000 +0900
@@ -56,7 +56,7 @@
 	my $path_count = 0;
 	if(length($path_info) > 0){
 		# Farmがあるか確認する
-		unless($path_info =~ m<^(/[A-Za-z0-9]+)*/?$> and -d $wiki->config('data_dir').$path_info){
+		unless($path_info =~ m<^(/[-_A-Za-z0-9]+)*/?$> and -d $wiki->config('data_dir').$path_info){
 			CORE::die("Wikiが存在しません。");
 		}
 		

FooterのCopyright表示を出さないようにしたい

パッチというよりは、wiki.cgiのここを書き換えるだけ。

wiki.cgi_noncopyright.patch

--- wiki.cgi.orig	2010-08-28 23:58:43.000000000 +0900
+++ wiki.cgi	2010-09-20 22:48:00.000000000 +0900
@@ -185,7 +190,7 @@
 	# コピーライトを表示するかどうか
 	my $admin_name = $wiki->config('admin_name');
 	my $admin_mail = $wiki->config('admin_mail_pub');
-	my $out_copyright  = 1;
+	my $out_copyright  = 0;
 	if($admin_name eq ""){ $admin_name = $admin_mail; }
 	if($admin_name eq "" && $admin_mail eq ""){ $out_copyright = 0; }
 

refプラグインのダウンロード数を表示させない

refプラグインでファイルをリンクすると、右側にダウンロード数がかっこ付で表示される。これがうっとおしい場合がある。以下の修正で、表示させないようにできる。

Ref.pm.patch

--- /tmp/Ref.pm	2012-09-03 10:24:29.532287750 +0900
+++ Ref.pm	2012-09-03 10:22:38.089454136 +0900
@@ -57,12 +57,12 @@
 		my $buf = "<a href=\"".$wiki->create_url({ action=>"ATTACH",page=>$page,,file=>$file })."\">".&Util::escapeHTML($alias)."</a>";
 		
 		# ダウンロード回数を取得
-		my $count = Util::load_config_hash(undef,$wiki->config('log_dir')."/".$wiki->config('download_count_file'));
-		if(defined($count->{$page."::".$file})){
-			$buf .= "(".$count->{$page."::".$file}.")";
-		} else {
-			$buf .= "(0)";
-		}
+		# my $count = Util::load_config_hash(undef,$wiki->config('log_dir')."/".$wiki->config('download_count_file'));
+		# if(defined($count->{$page."::".$file})){
+		# 	$buf .= "(".$count->{$page."::".$file}.")";
+		# } else {
+		# 	$buf .= "(0)";
+		# }
 		return $buf;
 		
 	} else {

その他

 refプラグインのダウンロード数が、クリアされてしまう

3.5.5 -> 3.6.4で困ったこととして、refプラグインのダウンロード数が、クリアされてしまうというのがあった。これは、プラグインの仕様が変更されたためで、具体的には、plugin/attach/Ref.pm の変更により、毎回、attach.log から数えていたのが、download_count.log という新しいログファイルから数えるようになったため。

attach.log から、download_count.log 形式のファイルを作る一行野郎でなんとかした。

 grep ^DOWNLOAD attach.log | cut -d' ' -f2,3 | awk '{print "\""$1"::"$2"\""}'| sort | uniq -c | sed 's/^ *//'| awk '{print $2"=\""$1"\""}' | nkf --url-input -e 

 pdfプラグインが使えない

本家のBugTrack-plugin/402を見るべし。pdfプラグインが使っているPDFJというモジュールで使われている疑似ハッシュという機能が、最近のPerl(5.9以降)では、非サポートになったため、が原因らしい。(もともと、5.8で非推奨になっていたので、しょうがない。)ここで提案されているパッチをあてれば動作するようになる。

 日本語を含むページ名のページで、pdfプラグインでPDFを生成すると、エラーになって生成できないことがある

ある程度長いとおきるみたい。これは、本家のBBS-サポート掲示板/559において、tkuro11さんのコメントにある修正を、Util.pmに行うと、直ります。(これは、添付ファイル名にもおきる問題みたいで、Util.pmの修正で一緒に直ります。)

Util.pm.patch

--- Util.pm.orig	2012-07-10 16:51:41.504825868 +0900
+++ Util.pm	2012-08-07 13:03:43.415797902 +0900
@@ -691,6 +691,7 @@
 	my ($filename, $disposition) = @_;
 	my $ua = $ENV{"HTTP_USER_AGENT"};
 	my $encoded = ($ua =~ /MSIE/ ? &Jcode::convert($filename, 'sjis') : Jcode->new($filename)->mime_encode(''));
+	$encoded =~ s/\n//mg;
 	return "Content-Disposition: $disposition;filename=\"".$encoded."\"\n\n";
 }
 

 ページに添付された日本語ファイル名のファイルをInternet Explorer 11でダウンロードすると、ファイル名が文字化けする

Util.pmのmake_content_disposition()で、Internet Explorerの判定に失敗しているのが原因。

以下の修正で直ります。(ついでに、それっぽいブラウザも判定できるようにしてみた。正しいかどうかはわからないけど、今のとこ問題ないみたい。ちょっと前のSafariが以下だとだめみたい。けど、そのまま使っている。)

Util.pm.patch2

--- Util.pm.orig	2012-07-10 16:51:41.504825868 +0900
+++ Util.pm	2015-12-11 19:09:48.216282451 +0900
@@ -688,10 +688,48 @@
 # </p>
 #===============================================================================
 sub make_content_disposition {
+	eval("use URI::Escape;");
 	my ($filename, $disposition) = @_;
 	my $ua = $ENV{"HTTP_USER_AGENT"};
-	my $encoded = ($ua =~ /MSIE/ ? &Jcode::convert($filename, 'sjis') : Jcode->new($filename)->mime_encode(''));
-	return "Content-Disposition: $disposition;filename=\"".$encoded."\"\n\n";
+	my $rfc6266 = 0;
+	my $encoded;
+	if ( $ua =~ /MSIE|Trident\/7.0/ ) { # =< IE11
+		$encoded = &Jcode::convert($filename, 'sjis');
+	}
+	elsif ( $ua =~ /Edge\/12/ ) { # Microsoft Edge
+		$rfc6266 = 1;
+		$encoded = Jcode->new($filename)->utf8;
+		$encoded = URI::Escape::uri_escape($encoded);
+	}
+	elsif ( $ua =~ /Safari/ && $ua =~ /AppleWebKit\/(\S+)/ ) {
+		my $applewebkitver = $1;
+		if ( $applewebkitver >= 536.26 ) { # >= iOS6
+			$rfc6266 = 1;
+			$encoded = Jcode->new($filename)->utf8;
+			$encoded = URI::Escape::uri_escape($encoded);
+		}
+		else {
+			$encoded = Jcode->new($filename)->mime_encode('');
+		}
+	}
+	elsif ( $ua =~ /Firefox\/(\S+)/ ) {
+		my $firefoxver = $1;
+		if ( $firefoxver >= 26.0 ) { # >= Firefox 26.0
+			$rfc6266 = 1;
+			$encoded = Jcode->new($filename)->utf8;
+			$encoded = URI::Escape::uri_escape($encoded);
+		}
+		else {
+			$encoded = Jcode->new($filename)->mime_encode('');
+		}
+	}
+	else {
+		$encoded = Jcode->new($filename)->mime_encode('');
+	}
+	$encoded =~ s/\n//mg;
+	$rfc6266 ? return "Content-Disposition: $disposition; filename*=utf-8''" . $encoded . "\n\n"
+	         : return "Content-Disposition: $disposition; filename=\"".$encoded."\"\n\n"
+	         ;
 }
 
 #===============================================================================

 CGI::param called in list context from lib/CGI2.pm line XX, this can lead to vulnerabilities. See the warning in "Fetching the value or values of a single named parameter" .. というエラーがhttpdのログに出る

CGI.pmの4.08から、CGI::paramをリストコンテキストで使うと、警告がでるようになった。"Perl5におけるコンテキストの扱いによる脆弱性について"参照。

CGI2.pmにそれがあるのが原因。

CGI.pmのpod曰く、

 If you call param() in list context with an argument a warning will be raised by CGI.pm, you can disable this warning by setting $CGI::LIST_CONTEXT_WARN to 0 or by using the multi_param() method instead

とある。当面、CGI2.pmに $CGI::LIST_CONTEXT_WARN = 0; を書くことで回避できる。

 Unescaped left brace in regex is deprecated, passed through in regex というエラーがhttpdのログにでる。

Perl 5.22.1より後から、"{"は正規表現の中で書く際、エスケープが推奨されるようになったため。(なお、5.26からは実行エラーになるようになった。)Parser.pm に該当箇所があることが原因。"\"でエスケープすればよい。(下記パッチで、"}"もエスケープしているのは、わかりやすいからというだけで、他意はない。)

Parser.pm.patch

--- Parser.pm.orig	2010-08-28 23:58:44.000000000 +0900
+++ Parser.pm	2017-08-21 04:00:44.000000000 +0900
@@ -82,7 +82,7 @@
 		}
 		
 		# パラグラフプラグイン
-		if($line =~ /^{{(.+}})$/){
+		if($line =~ /^\{\{(.+\}\})$/){
 			if(!$self->{block}){
 				my $plugin = $self->{wiki}->parse_inline_plugin($1);
 				my $info   = $self->{wiki}->get_plugin_info($plugin->{command});
@@ -94,7 +94,7 @@
 				}
 				next;
 			}
-		} elsif($line =~ /^{{(.+)$/){
+		} elsif($line =~ /^\{\{(.+)$/){
 			if ($self->{block}) {
 				$self->{block}->{level}++;
 				$self->{block}->{args}->[0] .= $line."\n";
@@ -273,7 +273,7 @@
 	while ($source ne q{}) {
 
 		# どのインライン Wiki 書式の先頭にも match しない場合
-		if (!($source =~ /^(.*?)((?:{{|\[\[?|https?:|mailto:|f(?:tp:|ile:)|'''?|==|__|<<).*)$/)) {
+		if (!($source =~ /^(.*?)((?:\{\{|\[\[?|https?:|mailto:|f(?:tp:|ile:)|'''?|==|__|<<).*)$/)) {
 			# キーワード検索・置換処理のみ実施して終了する
 			push @array, $self->_parse_line_keyword($pre . $source);
 			return @array;
@@ -284,7 +284,7 @@
 		@parsed = ();
 
 		# プラグイン
-		if ($source =~ /^{{/) {
+		if ($source =~ /^\{\{/) {
 			$source = $';
 			my $plugin = $self->{wiki}->parse_inline_plugin($source);
 			unless($plugin){

 pdfプラグインでPDF生成すると、ref_imageで指定した画像が含まれない

実は、JPEG形式だと出力される。 これは、pdfプラグインが使用する、FSWiki同梱のPDFJモジュールの仕様らしい。(なお、最新のPDFJモジュールでは、PNG形式でもOKになっているので、下を見て、自分でがんばって入れ替えてもよいかも。)

おまけ:PDFJモジュールのアップデート

 はじめに

PNGをどうしても使いたい事情があったので、PDFJモジュールを0.90にアップデートすることにした。

 バックアップ

もともとFSWikiについていたlib/PDFJ.pm と lib/PDFJ/ をとりあえず、バックアップしておく。

 FSWikiの修正

JPEGデータしか、PDFJに食わせないようにしているので、plugin/pdf/PDFParser.pmを修正する。

 @@ -451,7 +451,7 @@
         $self->end_text;
         $self->end_verbatim;
 
 -       unless($file =~ /\.jpe?g$/i){
 +       unless($file =~ /\.jpe?g$|\.png$/i){
                 return;
         }

 PDFJの修正

PDFJ本家から、PDFJ-0.90.zipをとってきて、展開する。カレントディレクトリにぶちまけることになるので、作業ディレクトリを掘って、その中で展開すること。

展開したら、以下の修正を行う。

疑似ハッシュ問題

0.90にも、疑似ハッシュ問題があり、Perl 5.9以降では動かないので、修正する。作者もパッチを公開しているが、どうやってもこのパッチはあたらなかった。よって、内容を手パッチしてもよいが、めんどくさいので、FreeBSD portsのパッチをとってきてあてるとよい。(一緒に、use warningsをつけた時に出るエラーも修正されている。)

PNG.pmのuse POSIX忘れ

PDFJ/PNG.pmは、use POSIXを忘れており、ceil、floor、といったサブルーチンがない、というエラーが出る。以下の修正をしよう。

 @@ -4,6 +4,7 @@
  use PDFJ::Object;
  use FileHandle;
  use Compress::Zlib;
 +use POSIX qw(ceil floor);
  use Carp;
  use strict;

PDFJ::Imageでの拡張子による判定がFSWikiでは効かない

PDFJ.pmのPDFJ::Imageでは、ファイル名の拡張子(サフィックス)で、JPEGかPNGかを判定している。しかし、FSWikiでは、attachディレクトリに、"ページ名.ファイル名%2E拡張子"というファイル名で、ファイルが保存されている。ゆえに、PDFJ::Imageは、"ファイル名%2E拡張子"を拡張子だと思ってしまい、判定ができないといってエラーを出す。

PDFJを修正するのは気持ちよくないが、手っ取り早いので、以下の修正をPDFJ.pmに行う。

 @@ -5358,7 +5358,8 @@
  sub new {
         my($class, $docobj, $src, $pxwidth, $pxheight, $width, $height, $padding,
                 $colorspace) = @_;
 -       my($ext) = $src =~ /([^\.]+)$/;
 +       #my($ext) = $src =~ /([^\.]+)$/;
 +       my($ext) = $src =~ /(jpe?g|png)$/i;
         if( $src =~ /^http:/i ) {
                 croak "unknown image file extention: $ext"
                         unless $ext =~ /^jpe?g$/i;

インストール

あとは、PDFJ.pm と PDFJ/ のみ、FSWikiの lib/ 以下にコピーすれば、PNGも使えるようになる。

おまけ:自作プラグイン

 JVNRSS プラグイン

JVNRSSのツールをFSWikiにくっつけたい人のためのプラグイン。職場とかでFSWiki使っている人にはうれしいかも。

たとえば、

 {{jvn jvnpanel}}

と書くと、

となります。どんな種類があるかは、JVNRSSを見て下さいな。

おまけ:コマンドライン上で、loginユーザを追加する

たくさんloginユーザを追加しなきゃ、なんて時にいちいちWebインターフェースはめんどくさい。そこで、

 wikiadduser -u hogena

とかやるPerlスクリプト。出力をuser.datに追加してやればOK。shell上では、

 wikiadduser -u hogena >> user.dat

とかってわけね。

#!/usr/pkg/bin/perl -w

use strict;
use lib '/usr/pkg/libexec/cgi-bin/fwiki/lib';
use Digest::MD5;
my $flag=1;
my $passwd="hoge";
my $loginname="hoge";

if (@ARGV !=2 or $ARGV[0] !~ /-[ru]/){
    die "Usage: $0 -[r|u] loginname\n-r: wiki admin\n-u: wiki user\n";
}
if ($ARGV[0] eq "-r"){
    $flag = 0;
}elsif ($ARGV[0] eq "-u"){
    $flag = 1;
}else{
    die "bogus!!\n";
}
$ARGV[1] =~ tr/A-Z/a-z/;
$passwd = $ARGV[1];
$loginname = $ARGV[1];
$passwd =~ tr /A-Za-z/N-ZA-Mn-za-m/; # rot13 loginname

my $md5 = Digest::MD5->new;
$md5->add($passwd);
$md5->add($loginname);
my $digest = $md5->hexdigest;
print "$loginname=$digest\t$flag\n";

use libの行は、FSWikiのlibディレクトリの位置を絶対パスで書いて下さい。あと、一行目のPerlのパスを書き換えるのも忘れずに。

ちなみに、パスワードはlogin名のrot13が勝手につきます。(それぞれのユーザに後で変更してもらうという考え。)rot13って何?って人は、たとえば、ウィキペディアの解説をどうぞ。

間違いの指摘や、ご意見などは、FrontPageにある連絡先にメールを下さるとうれしいです。

最終更新時間:2017年08月21日 04時08分21秒