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