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