2005年05月17日(火) [長年日記]
§1 箱根うつぎ
先日撮影した時は白一色だったので見間違えてしまいました。色とりどりの花を見ながら呆然としているとうつぎですねと声をかけて頂きました。「箱根うつぎと言って咲いた後に色が変わってきて最後は赤紫色で終わるのよ」と教えて頂きました。これは庭などに植えてあると楽しめますね>み〜ひゃん!
§2 認証付きhikiの続き at XREA
Hikiの編集機能を認証が必要なように改造すると同時に、HikiFarmで新しくできるWikiにも認証機能を自動的に付ける試みです。本来ならtypekey認証プラグインを使えば簡単なのですが、XREAではopensslの制限が厳しく、requireしただけでエラーになってしまうため断念せざるをえませんでした。そこで色々参考にさせて頂いてたどりついた答えと言うことです。
Hiki本体の改造
これについてはmatchy.net Hikiの編集機能に認証をかけるを参考にさせて貰いました。改造するファイルは3つ。Hikiのインストールディレクトリが$HOME/hikiだと仮定して
- $HOME/hiki/hiki.cgi
- $HOME/hiki/hiki/command.rb
- $HOME/hiki/style/default/html_formatter.rb
だが、このうち最後のhtml_formatter.rbだけが最新バージョンでは変数に変更があったため少し変えなければならなかった。
html_formatter.rb,v 1.25 2005/05/11 03:00:21 168行目あたり if !@conf.use_wikiname and t[:e] == :wikiname s[:html] << disp.escapeHTML elsif @db.exist?( t[:href] ) s[:html] << @plugin.hiki_anchor(t[:href].escape, disp.escapeHTML) @references << t[:href] + elsif @conf.cgi_name == 'view.cgi' + outer_alias = @interwiki.outer_alias(t[:href]) || disp.escapeHTML + s[:html] << outer_alias else missing_anchor_title = @conf.msg_missing_anchor_title % [ disp.escapeHTML ]
ここまでで来たら、hiki.cgiとまったく同じものをview.cgiとして同じディレクトリに入れる。これでWebから参照できるWikiディレクトリにシンボリックリンクか呼び出しの簡単なCGIをhiki.cgiとview.cgiと言う名前で作れば動くはずである。
HikiFarmの改造
当然ファームでも認証をかけたいので、HikiFarmのindex.cgiと同じ内容のcreate.cgiをコピーなどして同じディレクトリに作る。その後create.cgiを改造して、新しくできるWikiが認証付きになるかを確認する。
cereate.cgi 133行目付近から def create_wiki(name, hiki, cgi_name, data_path, default_pages_path) Dir.mkdir("#{@farm_pub_path}/#{name.untaint}") - File.open("#{@farm_pub_path}/#{name}/#{cgi_name}", 'w') do |f| - f.puts(index(name, hiki)) # fix me - f.chmod(0744) - end - + File.open("#{@farm_pub_path}/#{name}/hiki.cgi", 'w') do |f| + f.puts(hiki(name, hiki)) # fix me + f.chmod(0744) + end + + File.open("#{@farm_pub_path}/#{name}/view.cgi", 'w') do |f| + f.puts(view(name, hiki)) # fix me + f.chmod(0744) + end + + File.open("#{@farm_pub_path}/#{name}/attach.cgi", 'w') do |f| + f.puts(attach(name, hiki)) # fix me + f.chmod( 0744 ) + end File.open("#{@farm_pub_path}/#{name}/hikiconf.rb", 'w') do |f| f.puts(conf(name, hiki)) # fix me end + File.open("#{@farm_pub_path}/#{name}/.htaccess", 'w') do |f| + f.puts(htaccess(name, hiki)) # fix me + end Dir.mkdir("#{data_path}/#{name}") Dir.mkdir("#{data_path}/#{name}/text") 156行目付近から private def conf(wiki, hiki) <<CONF hiki='' eval( open( '../hikifarm.conf' ){|f|f.read.untaint} ) __my_wiki_name__ = '#{wiki}' eval( File::open( "\#{hiki}/hiki.conf" ){|f| f.read.untaint} ) eval( File::readlines( "/virtual/en-tec/etc/hikiconf.rb" ).join.untaint ) CONF end - def hiki(wiki, hiki) -<<-INDEX -#!#{@ruby} -hiki='' -eval( open( '../hikifarm.conf' ){|f|f.read.untaint} ) -$:.unshift "\#{hiki}" -load "\#{hiki}/hiki.cgi" -INDEX - end - + def hiki(wiki, hiki) +<<-HIKI +#!#{@ruby} +hiki='' +eval( open( '../hikifarm.conf' ){|f|f.read.untaint} ) +$:.unshift "\#{hiki}" +load "\#{hiki}/hiki.cgi" +HIKI + end + + def view(wiki, hiki) +<<-VIEW +#!#{@ruby} +hiki='' +eval( open( '../hikifarm.conf' ){|f|f.read.untaint} ) +$:.unshift "\#{hiki}" +load "\#{hiki}/view.cgi" +VIEW + end + + def htaccess(wiki, hiki) +<<-HTACCESS +DirectoryIndex view.cgi + +<Files hiki.cgi> +AuthName Hiki +AuthType Basic +AuthUserFile /virtual/en-tec/pass/wiki/.htpasswd +<Limit GET POST> +Require valid-user +</Limit> +</Files> + +HTACCESS + end + + def attach(wiki, hiki) +<<-ATTACH +#!#{@ruby} +hiki='' +eval( open( '../hikifarm.conf' ){|f|f.read.untaint} ) +$:.unshift "\#{hiki}" +load "\#{hiki}/attach.cgi" +ATTACH + end
最後のattachはおまけというか全てのWikiで画像などを扱えるようにココで設定している。最後にメニューの表示を少し変更してある。hiki_menu.rbなどとして、$HOME/hiki/pluginに入れておけばよい。
#===== menu def hiki_menu(data, command) menu = [] editable = %w(view edit diff) if @conf.bot? menu << %Q!<a accesskey="i" href="#{@conf.cgi_name}?c=index">#{@conf.msg_index}</a>! else menu << %Q!<a accesskey="c" href="hiki.cgi">管理者用</a>! if @conf.cgi_name == 'view.cgi' menu << %Q!<a accesskey="c" href="#{@conf.cgi_name}?c=create">#{@conf.msg_create}</a>! if @conf.cgi_name != 'view.cgi' menu << %Q!<a accesskey="e" href="#{@conf.cgi_name}?c=edit;p=#{@page.escape}">#{@conf.msg_edit}</a>! if editable.index(command) && @page && @conf.cgi_name != 'view.cgi' menu << %Q!<a accesskey="d" href="#{@conf.cgi_name}?c=diff;p=#{@page.escape}">#{@conf.msg_diff}</a>! if editable.index(command) && @page menu << %Q!#{hiki_anchor( 'FrontPage', page_name('FrontPage') )}! menu << %Q!<a accesskey="i" href="#{@conf.cgi_name}?c=index">#{@conf.msg_index}</a>! menu << %Q!<a accesskey="s" href="#{@conf.cgi_name}?c=search">#{@conf.msg_search}</a>! menu << %Q!<a accesskey="r" href="#{@conf.cgi_name}?c=recent">#{@conf.msg_recent_changes}</a>! @plugin_menu.each do |c| next if c[:option].has_key?('p') && !editable.index(command) cmd = %Q!<a href="#{@conf.cgi_name}?c=#{c[:command]}! c[:option].each do |key, value| value = @page.escape if key == 'p' cmd << %Q!;#{key}=#{value}! end cmd << %Q!">#{c[:display_text]}</a>! menu << cmd end menu_proc.each {|i| menu << i} menu << %Q!<a accesskey="m" href="#{@conf.cgi_name}?c=admin">#{@conf.msg_admin}</a>! if @conf.cgi_name != 'view.cgi' menu << %Q!<a accesskey="f" href="../">HikiFarm</a>! end data[:tools] = menu.collect! {|i| %Q!<span class="adminmenu">#{i}</span>! }.join(" \n").sanitize end
新しくWikiを作るときにはcreate.cgiを呼び出すように変更する。
index.cgiの302行目あたり <div class="update day"> <h2><span class="title">新しい Wiki サイトの作成</span></h2> <div class="form"> - <form class="update" method="post" action="#{@hikifarm_path}"> + <form class="update" method="post" action="create.cgi"> <div> 作成したい Wiki サイトの名称を指定します。 これは URL に含まれるので、できるだけ短く、 かつ Wiki の目的をよく表現したものが良いでしょう。 </div>
最後にcreate.cgiに認証を書けるため.htaccessに
<Files "cleate.cgi"> AuthName HikiFarm AuthType Basic AuthUserFile /virtual/en-tec/pass/hikifarm/.htpasswd Require valid-user </Files>
を付け加える。
稼働例はhttp://wiki.en-tec.org/にあるが、ココまで改造するとバージョンアップが大変だなぁと思うわけです。そろそろ0.8リリースの声が聞こえてきているのでなおのこと(^^;