about Hiki

本サイトにおけるHikiの利用について

本サイトを構築するにあたって、CMSとしてソースコードを一部修正したHikiを利用しています。

以下にソースコードの差分を公開します。

 --- hiki/command.rb.org 2008-05-09 19:02:20.000000000 +0900
 +++ hiki/command.rb     2008-05-09 18:52:39.000000000 +0900
 @@ -83,6 +83,12 @@
              raise PermissionError, 'Permission denied' unless @plugin.postable?
            end
            @cmd = 'view' unless @cmd
 +
 +          # allow commands...
 +          if ['view', 'index', 'search', 'recent', 'rss', 'plugin'].index(@cmd) == nil
 +            raise PermissionError, 'Permission denied'
 +          end
 +
            raise if !@p && ['view', 'edit', 'diff', 'save'].index( @cmd )
            if @cmd == 'edit'
              raise PermissionError, 'Permission denied' unless @plugin.editable?
 --- plugin/00default.rb.org     2008-05-09 19:04:40.000000000 +0900
 +++ plugin/00default.rb 2008-05-09 19:16:45.000000000 +0900
 @@ -188,9 +188,6 @@
    if @conf.bot?
      menu << %Q!<a href="#{@conf.cgi_name}?c=index">#{@conf.msg_index}</a>!
    else
 -    menu << %Q!<a href="#{@conf.cgi_name}?c=create">#{@conf.msg_create}</a>! if creatable?
 -    menu << %Q!<a href="#{@conf.cgi_name}?c=edit;p=#{@page.escape}">#{@conf.msg_edit}</a>! if @page && editable?
 -    menu << %Q!<a href="#{@conf.cgi_name}?c=diff;p=#{@page.escape}">#{@conf.msg_diff}</a>! if @page && editable?
      menu << %Q!#{hiki_anchor( 'FrontPage', page_name('FrontPage') )}!
      menu << %Q!<a href="#{@conf.cgi_name}?c=index">#{@conf.msg_index}</a>!
      menu << %Q!<a href="#{@conf.cgi_name}?c=search">#{@conf.msg_search}</a>!
 @@ -206,9 +203,6 @@
        menu << cmd
      end
      menu_proc.each {|i| menu << i}
 -    menu << %Q!<a href="#{@conf.cgi_name}?c=login#{@page ? ";p=#{@page.escape}" : ""}">#{@conf.msg_login}</a>! unless @user || @conf.password.empty?
 -    menu << %Q!<a href="#{@conf.cgi_name}?c=admin">#{@conf.msg_admin}</a>! if admin?
 -    menu << %Q!<a href="#{@conf.cgi_name}?c=logout">#{@conf.msg_logout}</a>! if @user && !@conf.password.empty?
    end
    menu
  end
 @@ -293,23 +287,19 @@
 
 
  def auth?
 -  true
 +  false
  end
 
  def editable?( page = @page )
 -  if page
 -    auth? && ((!@db.is_frozen?( page ) && !@conf.options['freeze']) || admin?)
 -  else
 -    creatable?
 -  end
 +  false
  end
 
  def creatable?
 -  auth? && (!@conf.options['freeze'] || admin?)
 +  false
  end
 
  def postable?
 -  true
 +  false
  end
 --- template/form.html.org      2008-05-13 16:05:45.000000000 +0900
 +++ template/form.html  2008-05-13 16:05:54.000000000 +0900
 @@ -8,7 +8,6 @@
 
  <body>
  <div class="<%= @contents[:view_style] %>">
 -  <div class="adminmenu"><%= @contents[:tools] %></div>
    <h1 class="header"><%= @contents[:title] %></h1>
 
    <div class="day">
 @@ -26,6 +25,7 @@
        </div>
      </div>
    </div>
 +  <div class="adminmenu"><%= @contents[:tools] %></div>
  </div>
  <% if @contents[:sidebar_class] %>
  <div class="<%= @contents[:sidebar_class] %>">
 --- template/list.html.org      2008-05-13 16:00:29.000000000 +0900
 +++ template/list.html  2008-05-13 16:00:41.000000000 +0900
 @@ -8,7 +8,6 @@
 
  <body>
  <div class="<%= @contents[:view_style] %>">
 -  <div class="adminmenu"><%= @contents[:tools] %></div>
    <h1 class="header"><%= @contents[:title] %></h1>
 
    <div class="day">
 @@ -20,6 +19,7 @@
        </div>
      </div>
    </div>
  </div>
  <% if @contents[:sidebar_class] %>
  <div class="<%= @contents[:sidebar_class] %>">
 --- template/view.html.org      2008-05-12 18:19:13.000000000 +0900
 +++ template/view.html  2008-05-13 19:29:20.000000000 +0900
 @@ -9,19 +9,10 @@
  <body>
  <a name="top"> </a>
  <div class="<%= @contents[:view_style] %>">
 -  <div class="adminmenu"><%= @contents[:tools] %></div>
    <h1 class="header"><%= @contents[:view_title] %></h1>
    <% if !@contents[:body_enter].empty? %><div><%= @contents[:body_enter] %></div><% end %>
    <div><%= @contents[:body] %></div>
    <div class="day">
 -    <div class="comment">
 -      <div class="caption">
 -        <%=@conf.msg_last_modified%>:<%= @contents[:last_modified].strftime('%Y/%m/%d %H:%M:%S') %><br>
 -        <%=@conf.msg_keyword%>:<%= @contents[:keyword] %><br>
 -        <%=@conf.msg_reference%>:<%= @contents[:references] %><br>
 -        <% unless @contents[:page_attribute].empty? %><div><%= @contents[:page_attribute] %></div><% end %>
 -      </div>
 -    </div>
      <% unless @contents[:body_leave].empty? %><div><%= @contents[:body_leave] %></div><% end %>
    </div>
  </div>

この修正を行うと、コンテンツの新規追加・修正を一切行うことができなくなります。

コンテンツの編集・管理について

実際の運用では、下書き用のHikiを別途用意し、下書き用Hikiで編集・内容を確認したあと、 コンテンツをトップページへ反映するようにしています。

反映する際には以下のCGIを利用して、ボタンひとつで下書き用サイトからトップページへ反映できるようにしています。

 #!/usr/bin/ruby -Ku
 
 $KCODE = 'UTF-8'
 
 require 'fileutils'
 include FileUtils
 
 ##################################################################
 #
 # 各種設定
 #
 ##################################################################
 
 $hiki_root       = '/var/www'
 $hiki_data       = '/path/to/hikiのデータディレクトリ'
 $hiki_draft_root = '/var/www/下書き用サイト'
 $hiki_draft_data = '/path/to/下書き用サイトのhikiのデータディレクトリ'
 
 ##################################################################
 #
 # 下書き用Hikiのデータをトップページへ反映する関数
 #
 ##################################################################
 
 # 書き換え中にメンテナンスモードにするための.htaccessを用意する関数
 def change_maintenance_mode(root_dir, flag)
   htaccess_file = ""
   if flag
     htaccess_file = "#{root_dir}/.htaccess.maintenance"
   else
     htaccess_file = "#{root_dir}/.htaccess.normal"
   end
 
   cp(htaccess_file, "#{root_dir}/.htaccess")
 end
 
 
 # 下書き用Hikiのデータをトップページへ反映する関数
 def copy_draft_to_root
   change_maintenance_mode($hiki_root, true)
 
   ["text", "backup", "cache/parser", "cache/attach"].each {|dir|
     rm_r(Dir.glob("#{$hiki_data}/#{dir}/*"), {:force => true})
   }
 
   ["text", "cache/attach",].each {|dir|
     cp_r(Dir.glob("#{$hiki_draft_data}/#{dir}/*"), "#{$hiki_data}/#{dir}/")
   }
 
   cp("#{$hiki_draft_data}/info.db", "#{$hiki_data}/info.db");
 
   change_maintenance_mode($hiki_root, false)
 end
 
 ##################################################################
 #
 # ここからCGI用コード
 #
 ##################################################################
 
 require 'cgi-lib'
 
 print "Content-type: text/html; charset=UTF-8\n\n"
 input = CGI.new
 
 commit_flag = input['commit'] 
 
 if commit_flag == 'true'
   # 下書きHikiのデータをトップページへコピー
   copy_draft_to_root  
 
   # 反映した趣旨を出力
   print <<"EOS"
 <html>
   <head>
     <title>トップページのメンテナンス用CGI</title>
     <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
   </head>
   <body>
     <div>
       下書きページの内容をトップページに反映しました。
     </div>
   </body>
 </html>
 EOS
 else
   # フォーム、説明文の出力
   print <<"EOS"
 <html>
   <head>
     <title>トップページのメンテナンス用CGI</title>
     <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
   </head>
   <body>
   <hr>
   <div>
     <form method="POST">
       <input type="hidden" name="commit" value="true">
       下書きページの内容をトップページに反映する場合は、
       commitボタンを押してください<br>
       <input type="submit" name="submit" value="commit">
     </form>
   </div>
   <hr>
   <div>
     <p>
       このページは、http://www.piecake.com/のトップページのコンテンツを管理するCGIです。
     </p>
     <p>
       トップページを書き換える場合は、次の手順で編集を行います。
       <ol>
         <li>下書き用Hiki(https://www.piecake.com/下書き用サイト/)を編集してください。</li>
         <li>下書き用Hikiの内容をよく見直してください。</li>
         <li>
           本当にトップページを書き換える場合は、このページの上部にあるcommitボタンを押してください。
           下書き用Hikiのデータが丸ごとトップページへコピーされます。
         </li>
       </ol>
     </p>
   </div>
   </body>
 </html>
 EOS
 end