PukiWiki1.4.7 WikiFarmEngine


HikiやFSWikiにはあるんだけどPukiWikiにはないので、どうにかならないかなぁと試行錯誤した結果。会社で社内Wiki用にまとめたけど、こっちにも書いておく。URLとかPathとかは適宜読み替えてください。ま、こんなもの参考にする人は何かあったときの未来の俺くらいだとは思うが。

http://www.aksum.jp/pukiwiki/index.php?%E3%83%8F%E3%83%83%E3%82%AF%2F04-WikiFarmEngine

こんなものがあるにはあるのだけども、残念ながらPukiWiki1.4.6ベースで、文字コードがEUC。今時EUCはねーだろう、ということでどうにか1.4.7UTF-8ベースにする

+$adminpage = ‘:config/admin’; + ///////////////////////////////////////////////// // Functionality settings

@@ -77,7 +79,7 @@ define(‘UPLOAD_DIR’, DATA_HOME . ‘attach/’ ); // Attached files and logs define(‘COUNTER_DIR’, DATA_HOME . ‘counter/’ ); // Counter plugin’s counts define(‘TRACKBACK_DIR’, DATA_HOME . ‘trackback/'); // TrackBack logs -define(‘PLUGIN_DIR’, DATA_HOME . ‘plugin/’ ); // Plugin directory +define(‘PLUGIN_DIR’, COMMON_DIR . ‘plugin/’ ); // Plugin directory

///////////////////////////////////////////////// // Directory settings II (ended with ‘/') @@ -89,8 +91,10 @@ // CSSs(.css) and JavaScripts(.js) are needed at // ./SKIN_DIR from index.php.

+require(CONFIG_DIR . ‘skin.ini.php’); + // Static image files -define(‘IMAGE_DIR’, ‘image/'); +define(‘IMAGE_DIR’, COMMON_DIR . ‘image/'); // Keep this directory shown via web browsers like // ./IMAGE_DIR from index.php.

@@ -190,7 +194,7 @@ // Admin password for this Wikisite

// Default: always fail -$adminpass = ‘{x-php-md5}!'; +//$adminpass = ‘{x-php-md5}!';

// Sample: //$adminpass = ‘pass’; // Cleartext @@ -230,42 +234,6 @@ $pagereading_config_dict = ‘:config/PageReading/dict’;

///////////////////////////////////////////////// -// User definition -$auth_users = array(

  •   // Username => password
    
  •   'foo'   => 'foo_passwd', // Cleartext
    
  •   'bar'   => '{x-php-md5}f53ae779077e987718cc285b14dfbe86', // PHP md5() 'bar_passwd'
    
  •   'hoge'  => '{SMD5}OzJo/boHwM4q5R+g7LCOx2xGMkFKRVEx',      // LDAP SMD5 'hoge_passwd'
    

-);

-///////////////////////////////////////////////// -// Authentication method

-$auth_method_type = ‘pagename’; // By Page name -//$auth_method_type = ‘contents’; // By Page contents

-///////////////////////////////////////////////// -// Read auth (0:Disable, 1:Enable) -$read_auth = 0;

-$read_auth_pages = array(

  •   // Regex                   Username
    
  •   '#HogeHoge#'            => 'hoge',
    
  •   '#(NETABARE|NetaBare)#' => 'foo,bar,hoge',
    

-);

-///////////////////////////////////////////////// -// Edit auth (0:Disable, 1:Enable) -$edit_auth = 0;

-$edit_auth_pages = array(

  •   // Regex                   Username
    
  •   '#BarDiary#'            => 'bar',
    
  •   '#HogeHoge#'            => 'hoge',
    
  •   '#(NETABARE|NetaBare)#' => 'foo,bar,hoge',
    

-);

-///////////////////////////////////////////////// // Search auth // 0: Disabled (Search read-prohibited page contents) // 1: Enabled (Search only permitted pages for the user) @@ -530,4 +498,12 @@

    array('pattern'=>'#^#', 'profile'=>'default'),  // Sentinel

); + +require(DATA_HOME . ‘userauth.php’); +$auth_users = $userauth->get_auth_users(); +$auth_method_type = $userauth->get_auth_method_type(); +$read_auth = $userauth->get_read_auth(); +$read_auth_pages = $userauth->get_read_auth_pages(); +$edit_auth = $userauth->get_edit_auth(); +$edit_auth_pages = $userauth->get_edit_auth_pages(); ?>


<h3>ja.lng.php</h3>
```diff
--- pukiwiki-1.4.7_notb_utf8/ja.lng.php   2006-10-22 05:40:24.000000000 +0900
+++ common/config/ja.lng.php    2008-10-09 11:28:33.000000000 +0900
@@ -81,8 +81,8 @@
 
 ///////////////////////////////////////
 // Page name
-$rule_page = 'FormattingRules';        // Formatting rules
-$help_page = 'Help';           // Help
+$rule_page = '整形ルール';     // Formatting rules
+$help_page = 'ヘルプ';         // Help
 
 ///////////////////////////////////////
 // TrackBack (REMOVED)
@@ -442,4 +442,6 @@
 // yetlist.inc.php
$_title_yetlist = '未作成のページ一覧';
$_err_notexist  = '未作成のページはありません。';
+
+$_LANG['skin']['admin']       = '管理';
 ?>
  •   if (PKWK_READONLY ||
    
  •           ! isset($_SERVER['PHP_AUTH_USER']) ||
    

+// if (PKWK_READONLY ||

  •   if(     ! isset($_SERVER['PHP_AUTH_USER']) ||
              ! in_array($_SERVER['PHP_AUTH_USER'], $user_list) ||
              ! isset($auth_users[$_SERVER['PHP_AUTH_USER']]) ||
              pkwk_hash_compute(
    

<h3>lib/html.php</h3>
```diff
--- pukiwiki-1.4.7_notb_utf8/lib/html.php 2006-10-22 05:40:25.000000000 +0900
+++ common/lib/html.php 2008-10-09 16:34:57.000000000 +0900
@@ -37,6 +37,9 @@
        $r_page = rawurlencode($_page); 
 
        // Set $_LINK for skin
+
+        $_LINK['admin']      = "$script?%3Aconfig%2Fadmin";
+
        $_LINK['add']      = "$script?cmd=add&page=$r_page";
        $_LINK['backup']   = "$script?cmd=backup&page=$r_page";
        $_LINK['copy']     = "$script?plugin=template&refer=$r_page";
  • include_once( COMMON_DIR . ‘plugin/paraedit.inc.php’);
  • $post[“msg”] = _plugin_paraedit_parse_postmsg($post[“msg_before”], $post[“msg”], $post[“msg_after”]);

///////////////////////////////////////////////// // Main


<h3>skin/pukiwiki.skin.php</h3>
```diff
--- pukiwiki-1.4.7_notb_utf8/skin/pukiwiki.skin.php       2006-10-22 05:40:28.000000000 +0900
+++ common/skin/pukiwiki.skin.php       2008-10-08 19:31:22.000000000 +0900
@@ -76,8 +76,8 @@
  <title><?php echo $title ?> - <?php echo $page_title ?></title>
 
  <link rel="SHORTCUT ICON" href="<?php echo $image['favicon'] ?>" />
- <link rel="stylesheet" type="text/css" media="screen" href="skin/pukiwiki.css.php?charset=<?php echo $css_charset ?>" charset="<?php echo $css_charset ?>" />
- <link rel="stylesheet" type="text/css" media="print"  href="skin/pukiwiki.css.php?charset=<?php echo $css_charset ?>&media=print" charset="<?php echo $css_charset ?>" />
+ <link rel="stylesheet" href="<?php echo CSS_FILE ?>?charset=<?php echo $css_charset ?>" type="text/css" media="screen" charset="<?php echo $css_charset ?>" />
+ <link rel="stylesheet" href="<?php echo CSS_FILE ?>?charset=<?php echo $css_charset ?>&media=print" type="text/css" media="print" charset="<?php echo $css_charset ?>" />
   <link rel="alternate" type="application/rss+xml" title="RSS" href="<?php echo $link['rss'] ?>" /><?php // RSS auto-discovery ?>
 
  <?php if (PKWK_ALLOW_JAVASCRIPT && $trackback_javascript) { ?> <script type="text/javascript" src="skin/trackback.js"></script><?php } ?>
@@ -154,6 +154,8 @@
  | <?php _navigator('help')   ?>
  ]
 
+ [ <?php _navigator('admin') ?> ]
+
 <?php if ($trackback) { ?>
  [ <?php _navigator('trackback', $lang['trackback'] . '(' . tb_count($_page) . ')',
        ($trackback_javascript == 1) ? 'onclick="OpenTrackback(this.href); return false"' : '') ?> ]

-div.ie5 { text-align:center; } +div.ie5 { text-align:left; }

span.noexists { color:inherit;


<h2>1.4.7からじゃなくてPukiFarmからの差分</h2>
PukiFarmのソースはEUC-JPなので、単純にコピーするだけでなく
<code><pre>
nkf --overwrite -w0 コピーしたソース

とか必ずやる

common/plugin/add_site.inc.php [#v644fe5c]
--- ~/pukifarm/common/plugin/add_site.inc.php   2008-10-09 18:44:16.137051769 +0900
+++ common/plugin/add_site.inc.php      2008-10-09 16:05:55.000000000 +0900
@@ -14,7 +14,7 @@
 // サイトの元データ
 define('INIT_DIR', '../datasource/' );
 // PukiFarm の URL (編集必須)
-define('FARM_URL', 'http://aksum.jp/pukifarm/admin/');
+define('FARM_URL', 'http://wiki/farm/');

 function plugin_add_site_convert()
 {
@@ -73,8 +73,8 @@
     closedir($dir);

     plugin_add_site_create_site($id);
-
-    $retval['msg'] = $_registed;
+
+       $retval['msg'] = $_registed;
     $retval['body'] = convert_html('登録完了しました。'.FARM_URL.$id.'/ からアクセスして下さい。');

     return $retval;
@@ -120,9 +120,7 @@

 \$site_id = '{$id}';

 require(CONFIG_DIR . 'password.ini.php');
 require(CONFIG_DIR . 'baseconf.ini.php');
-require(CONFIG_DIR . 'amazon_id.ini.php');

 /////////////////////////////////////////////////
 require(LIB_DIR . 'pukiwiki.php');

function plugin_farmlist_convert() { $path = ‘/var/www/html/farm/'; $count = 0; foreach (glob($path . “*”, GLOB_ONLYDIR) as $dirname) { //最初からある3つのディレクトリは除外 if (ereg(“admin$”, $dirname)); elseif (ereg(“datasource$”, $dirname)); elseif (ereg(“common$”, $dirname)); else { $list[] = array(‘name’ => basename($dirname), ‘time’ => get_mtime($dirname)); $count++; } } usort($list, “cmp”); $liststr = ‘'; foreach ($list as $key => $value) { $liststr = $liststr . “\n”; $liststr = $liststr . " <td class="style_td"><a href="http://wiki/farm/” . $value[‘name’] . “/">” . $value[‘name’] . “\n”; $liststr = $liststr . " <td class="style_td">” . $value[‘time’] . “\n”; $liststr = $liststr . “\n”; } $string = «<EOD

function cmp($a, $b) { if ($a[‘time’] == $b[‘time’]) { return 0; } $datea = strptime($a[‘time’], “%Y/%m/%d %H:%M:%S”); $dateb = strptime($b[‘time’], “%Y/%m/%d %H:%M:%S”); return ($datea > $dateb) ? -1 : 1; }

function get_mtime($path) { $mtime = filemtime($path); return date(“Y/m/d H:i:s”, $mtime); } ?>


<h2>datasource/wikiとadmin/wikiのファイル名変換</h2>
PukiFarmから持ってくるとEUC-JPなので、UTF-8ではうまく日本語が読めない。http://d.hatena.ne.jp/kohiro2/20080711/p1 からスクリプトを拝借、*/wikiのところだけ。

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

use strict;
use warnings;
use Encode;
use File::Basename;
use File::Copy;
use IO::File;
use Path::Class::Dir;
use Path::Class::File;

use constant REGEX_SUFFIX => qw(\..+$);>	# 【最初】の . 以降を拡張子とする
#use constant REGEX_SUFFIX => qw(\.[^\.]+$);	# 【最後】の . 以降を拡張子とする

&main();

sub main {
	if ( $#ARGV != 1 ){
		print "error: $0 [source_dir] [target_dir]\n";
		exit 1;
	}

	(my $src_dir_root, my $trg_dir_root) = @ARGV;
	my $subdir_name;
	my @suffixes;
	my $src_dir;
	my $trg_dir;

	####### */wiki #######
	$subdir_name = "wiki";
	@suffixes = (".txt");
	($src_dir, $trg_dir) = &set_dir($src_dir_root, $trg_dir_root, $subdir_name);
	foreach my $src_file ($src_dir->children) {
		if ($src_file->is_dir) { next; }
		(my $hexname, undef, my $suffix) = fileparse($src_file->basename, REGEX_SUFFIX);
		next if ( grep( /$suffix/, @suffixes) == 0 );
		my $trg_file = Path::Class::File->new($trg_dir, &hexEUCtoUTF8($hexname) . $suffix);
		&fileEUCtoUTF8($src_file->open('r'), $trg_file->open('w'));
		utime $src_file->stat->atime, $src_file->stat->mtime, $trg_file;
	}
}
 
### 元先ディレクトリを設定
sub set_dir {
	my $src_rootdir = shift;
	my $trg_rootdir = shift;
	my $subdir = shift;

	my $src_dir = Path::Class::Dir->new($src_rootdir, $subdir);
	my $trg_dir = Path::Class::Dir->new($trg_rootdir, $subdir);

	# 元ディレクトリ確認
	if ( ! -e $src_dir ) {
		print "ERROR: Can't locate source directory.\n";
		exit 1;
	}

	# 先ディレクトリ確認
	$trg_dir->mkpath if ( ! -e $trg_dir );

	return ($src_dir, $trg_dir);
}


### File EUC-JP => UTF-8
sub fileEUCtoUTF8 {
	my $src_fh = shift;
	my $trg_fh = shift;

	while (<$src_fh>) {
		chomp;
		my $tmp = encode('utf-8', decode("euc-jp", $_));
		$trg_fh->print("$tmp\n");
	}

	$trg_fh->close;
	$src_fh->close;
}


### HEX => EUC-JP => UTF-8 => HEX => UPPER CASE
sub hexEUCtoUTF8 {
	my $string = shift;

	# 変換: 16進 → バイナリ
	$string =~ s/([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1) )/eg;
	# 変換: EUC-JP → UTF-8
	$string = encode('utf-8', decode("euc-jp", $string));
	# 変換: バイナリ → 16進
	$string = unpack("H*", $string);
 	# 変換: 小文字 → 大文字
	$string =~ tr/a-z/A-Z/;

	return $string;
}

1;

// データ区切り記号(変える必要はありません)


<h3>userauth_admin.php</h3>
```diff
--- -   2008-10-09 19:07:01.886083742 +0900
+++ datasource/userauth_admin.php       2008-10-09 17:16:53.000000000 +0900
@@ -26,10 +26,11 @@
 //           md5('0123')       ←0123の部分がパスワード
 //       のような記述でも使用できます。
 // $adminpass = 'eb62f6b9306db575c2d596b1279627a4';    //例
-$adminpass = md5('0123');
+require('config/password.ini.php');

 // * 戻るボタンの行き先
-$backurl = 'http://';
+$backurl = 'index.php';

 // * 認証データのファイル名指定
 //
@@ -49,7 +50,7 @@
 //       なら他の対策を考える必要があります。)
 //
 //       なお、この値と userauth.php 内の設定は同じにして下さい。
-$file = 'userauth.txt';
+$file = 'config/userauth.txt';

 // * userauth.phpのファイル名(保存後のチェックで使用)
 $checkscript = 'userauth.php';
@@ -523,19 +524,13 @@

 function admin_auth( &$mes, $logout = FALSE ){
        global $adminpass;
-
-       // adminpassがデフォルトのままなら認証失敗
        $dmes = '';
-       if($adminpass == 'eb62f6b9306db575c2d596b1279627a4'){
-               $mes = '<b>$adminpass</b>の設定を変更して下さい'."\n";
-               $logout = TRUE;
-       }

        if(!$logout && !isset($_GET['logout']) && isset($_SESSION['login'])){
                $mes = 'login';
                return TRUE;
        } elseif(!$logout && !isset($_GET['logout']) && isset($_POST['lpassword'])){
-               $in_passwd = md5(rtrim($_POST['lpassword']));
+               $in_passwd = '{x-php-md5}' . md5(rtrim($_POST['lpassword']));
                if($in_passwd == $adminpass){
                        $_SESSION['login'] = 1;
                        $mes = 'login';

これで管理者パスワードと共通化できる。あとは :config/admin から呼び出したいので、リンクを張るだけのpluginを書く。

<?php
// PukiWiki - Yet another WikiWikiWeb clone
// $Id: comment.inc.php,v 1.0 2008/10/08 ogata.nobutoshi Exp $
// Copyright (C)
//   2002-2005 PukiWiki Developers Team
//   2001-2002 Originally written by yu-ji
// License: GPL v2 or (at your option) any later version
//
// WikiFarm List plugin

function plugin_userauth_admin_convert()
{
    global $site_id;
    return "<a href=\"http://wiki/farm/" . $site_id . "/userauth_admin.php\">ユーザー認証管理室</a>";
}
?>

:config/adminに余計なものがついてるので編集

*管理画面 [#u0e4cc19]

**管理者パスワードの変更 [#zfee523b]
#ch_password

**その他のユーザー認証管理 [#v31ac382]
#userauth_admin
<Directory />
    AllowOverride All
</Directory>
<Directory "/var/www/html/farm">
    Options +ExecCGI +FollowSymLinks
    AddHandler cgi-script .cgi
    DirectoryIndex index.php
</Directory>