へんこつ日誌

Oral_Top_Anchor
トップ «前の日記(2005年05月16日(月)) 最新 次の日記(2005年05月18日(水))»
RSS feed


ここから本文

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("&nbsp;\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リリースの声が聞こえてきているのでなおのこと(^^;