1#!/usr/local/bin/perl
2###############################################################################
3#
4# FreeStyleWiki �ե��ȥ����CGI������ץ�
5#
6###############################################################################
7BEGIN {
8	if(exists $ENV{MOD_PERL}){
9		# �����ȥǥ��쥯�ȥ���ѹ�
10		chdir($ENV{FSWIKI_HOME});
11	}
12}
13
14#==============================================================================
15# �⥸�塼��Υ����롼��
16#==============================================================================
17use Cwd;
18use lib './lib';
19use strict;
20#use CGI::Carp qw(fatalsToBrowser);
21#use CGI2;
22use Wiki;
23use Util;
24use Jcode;
25use HTML::Template;
26
27# �������ʤ���Apache::Registory��ư���ʤ�
28if(exists $ENV{MOD_PERL}){
29	eval("use Digest::Perl::MD5;");
30	eval("use plugin::core::Diff;");
31	eval("use plugin::pdf::PDFMaker;");
32	&Jcode::load_module("Jcode::Unicode");
33}
34
35#==============================================================================
36# CGI��Wiki����������
37#==============================================================================
38my $wiki = Wiki->new('setup.dat');
39my $cgi = $wiki->get_CGI();
40
41eval {
42	# Session�ѥǥ��쥯�ȥ��Farm�Ǥⶦ�̤˻��Ѥ���
43	$wiki->config('session_dir',$wiki->config('log_dir'));
44
45	#==============================================================================
46	# Farm�Ȥ���ư�����
47	#==============================================================================
48	my $path_info  = $cgi->path_info();
49	my $path_count = 0;
50	if(length($path_info) > 0){
51		# Farm�����뤫��ǧ����
52		unless($path_info =~ m<^(/[A-Za-z0-9]+)*/?$> and -d $wiki->config('data_dir').$path_info){
53			CORE::die("Wiki��¸�ߤ��ޤ���");
54		}
55
56		# PATH_INFO�κǸ夬/���ä���/�ʤ���URL��ž������
57		if($path_info =~ m|/$|) {
58			$path_info =~ s|/$||;
59			$wiki->redirectURL($cgi->url().$path_info);
60		}
61		$path_info =~ m</([^/]+)$>;
62		$wiki->config('script_name', $1);
63		$wiki->config('data_dir'   , $wiki->config('data_dir'  ).$path_info);
64		$wiki->config('config_dir' , $wiki->config('config_dir').$path_info);
65		$wiki->config('backup_dir' , $wiki->config('backup_dir').$path_info);
66		$wiki->config('log_dir'    , $wiki->config('log_dir'   ).$path_info);
67
68		if(!($wiki->config('theme_uri') =~ /^(\/|http:|https:|ftp:)/)){
69			my @paths = split(/\//,$path_info);
70			$path_count = $#paths;
71			for(my $i=0;$i<$path_count;$i++){
72				$wiki->config('theme_uri','../'.$wiki->config('theme_uri'));
73			}
74		}
75	}
76
77	#==============================================================================
78	# �����ȿ�ǡʤ⤦����äȥ��ޡ��Ȥˤ�ꤿ���͡�
79	#==============================================================================
80	my $config = &Util::load_config_hash($wiki,$wiki->config('config_file'));
81	foreach my $key (keys(%$config)){
82		$wiki->config($key,$config->{$key});
83	}
84	# ���̤����꤬ɬ�פʤ�Τ������
85	$wiki->config('css',
86		$wiki->config('theme_uri')."/".$config->{theme}."/".$config->{theme}.".css");
87	$wiki->config('site_tmpl',
88		$wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}.".tmpl");
89	$wiki->config('site_handyphone_tmpl',
90		$wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}."_handyphone.tmpl");
91
92	# ����å���������ȿ��
93	my $cache_config = &Util::load_config_hash($wiki,'cache.dat');
94	$wiki->config('use_cache'   ,$cache_config->{use_cache});
95	$wiki->config('no_cache'    ,$cache_config->{no_cache});
96	$wiki->config('remove_cache',$cache_config->{remove_cache});
97
98	#==============================================================================
99	# �����ॢ���Ȥ��Ƥ��륻�å������˴�
100	#==============================================================================
101	$cgi->remove_session($wiki);
102
103	#==============================================================================
104	# �桼��������ɤ߹���
105	#==============================================================================
106	my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file'));
107	foreach my $id (keys(%$users)){
108		my ($pass,$type) = split(/\t/,$users->{$id});
109		$wiki->add_user($id,$pass,$type);
110	}
111
112	#==============================================================================
113	# �ץ饰����Υ����ȡ���Ƚ����
114	#==============================================================================
115	my @plugins = split(/\n/,&Util::load_config_text($wiki,$wiki->config('plugin_file')));
116	my $plugin_error = '';
117	foreach(sort(@plugins)){
118		$plugin_error .= $wiki->install_plugin($_);
119	}
120	# �ץ饰�����Ȥν����������ư
121	$wiki->do_hook("initialize");
122
123	#==============================================================================
124	# ���������ϥ�ɥ�θƤӽФ�
125	#==============================================================================
126	my $action  = $cgi->param("action");
127	my $content = $wiki->call_handler($action);
128
129	# �ץ饰����Υ����ȡ���˼��Ԥ������
130	$content = $plugin_error . $content if $plugin_error ne '';
131
132	#==============================================================================
133	# �쥹�ݥ�
134	#==============================================================================
135	my $output        = "";
136	my $is_handyphone = &Util::handyphone();
137	my $template_name = "";
138
139	if ($is_handyphone) {
140		$template_name = 'site_handyphone_tmpl';
141	} else {
142		$template_name = 'site_tmpl';
143	}
144
145	# �ȥåץڡ������ɤ�����Ƚ��
146	my $top  = 0;
147	if($cgi->param("page") eq $wiki->config("frontpage")){
148		$top = 1;
149	}
150
151	# �ڡ����Υ����ȥ�����
152	my $title = "";
153	if($cgi->param('action') eq "" && $wiki->page_exists($cgi->param('page'))){
154		$title = "<a href=\"".$wiki->config("script_name")."?action=SEARCH&amp;word=".
155		       &Util::url_encode($wiki->get_title())."\">".
156		       &Util::escapeHTML($wiki->get_title())."</a>";
157	} else {
158		$title = &Util::escapeHTML($wiki->get_title());
159	}
160
161	#------------------------------------------------------------------------------
162	# �إå�������
163	#------------------------------------------------------------------------------
164	my $header_tmpl = HTML::Template->new(filename => $wiki->config('tmpl_dir')."/header.tmpl",
165	                                      die_on_bad_params => 0,
166	                                      case_sensitive    => 1);
167	# ��˥塼�����
168	my @menu = ();
169	foreach(sort {$b->{weight}<=>$a->{weight}} @{$wiki->{menu}}){
170		if($_->{href} ne ""){
171			push(@menu,$_);
172		}
173	}
174	$header_tmpl->param(MENU       => \@menu,
175	                    FRONT_PAGE => $top);
176	my $header = $header_tmpl->output();
177
178	#------------------------------------------------------------------------------
179	# �եå�������
180	#------------------------------------------------------------------------------
181	my $footer_tmpl = HTML::Template->new(filename => $wiki->config('tmpl_dir')."/footer.tmpl",
182	                                      die_on_bad_params => 0,
183	                                      case_sensitive    => 1);
184
185	# ���ԡ��饤�Ȥ�ɽ�����뤫�ɤ���
186	my $admin_name = $wiki->config('admin_name');
187	my $admin_mail = $wiki->config('admin_mail_pub');
188	my $out_copyright  = 1;
189	if($admin_name eq ""){ $admin_name = $admin_mail; }
190	if($admin_name eq "" && $admin_mail eq ""){ $out_copyright = 0; }
191
192	$footer_tmpl->param(ADMIN_NAME    => $admin_name,
193	                    ADMIN_MAIL    => $admin_mail,
194	                    OUT_COPYRIGHT => $out_copyright,
195	                    FRONT_PAGE    => $top,
196	                    VERSION       => Wiki->VERSION,
197	                    PERL_VERSION  => $]);
198
199	if(exists $ENV{MOD_PERL}){
200		$footer_tmpl->param(MOD_PERL=>1);
201	}
202
203	my $footer = $footer_tmpl->output();
204
205	#------------------------------------------------------------------------------
206	# �����ȥƥ�ץ졼�Ȥν���
207	#------------------------------------------------------------------------------
208	# �ƥ�ץ졼�Ȥ��ɤ߹���
209	my $template = HTML::Template->new(filename => $wiki->config($template_name),
210	                                   die_on_bad_params => 0,
211	                                   case_sensitive    => 1);
212
213	# ���ȸ��¤����뤫�ɤ���
214	my $can_show = 0;
215	if($action ne '' || ($action eq '' && $wiki->can_show($cgi->param('page')))){
216		$can_show = 1;
217	}
218
219	# head�������ɽ�������������
220	my $head_info = "";
221	foreach (@{$wiki->{'head_info'}}){
222		$head_info .= $_."\n";
223	}
224
225	# �ƥ�ץ졼�Ȥ˥ѥ�᡼�����å�
226	$template->param(SITE_TITLE  => &Util::escapeHTML($wiki->get_title()." - ".$wiki->config('site_title')),
227	                 MENU        => $header,
228	                 TITLE       => $title,
229	                 CONTENT     => $content,
230	                 FRONT_PAGE  => $top,
231	                 FOOTER      => $footer,
232	                 EDIT_MODE   => $action,
233	                 CAN_SHOW    => $can_show,
234	                 HEAD_INFO   => $head_info,
235	                 SITE_NAME   => $wiki->config('site_title'));
236
237	my $login = $wiki->get_login_info();
238	$template->param(
239		IS_ADMIN => defined($login) && $login->{TYPE}==0,
240		IS_LOGIN => defined($login)
241	);
242
243	if ($is_handyphone) {
244		# ���������ѽ���
245		$output = $template->output;
246		&Jcode::convert(\$output,"sjis");
247	} else {
248		# �ѥ������ѽ���
249		my $usercss = &Util::load_config_text($wiki,$wiki->config('usercss_file'));
250
251		if($config->{'theme'} eq ''){
252			# �ơ��ޤ����Ѥ���Ƥ��餺������CSS�����ꤵ��Ƥ�����Ϥ�������
253			if($config->{'outer_css'} ne ''){
254				$wiki->config('css',$config->{'outer_css'});
255			# �ơ��ޤ⳰��CSS����ꤵ��Ƥ��ʤ����ϥ������륷���Ȥ���Ѥ��ʤ�
256			} else {
257				$wiki->config('css','');
258			}
259		}
260		# �ѥ�᡼�����å�
261		$template->param(HAVE_USER_CSS => $usercss ne "",
262		                 THEME_CSS     => $wiki->config('css'),
263		                 USER_CSS      => &Util::escapeHTML($usercss),
264		                 THEME_URI     => $wiki->config('theme_uri'));
265
266		# �ڡ���̾��EXIST_PAGE_�ڡ���̾�Ȥ����ѥ�᡼���˥��å�
267		# ������������å����ޤ�ڡ���̾�ϥ��åȤ��ʤ�
268		my @pagelist = $wiki->get_page_list();
269		foreach my $page (@pagelist){
270			if(index($page,"/")==-1 && $wiki->can_show($page)){
271				$template->param("EXIST_PAGE_".$page=>1);
272			}
273		}
274
275		$output = $template->output;
276
277		# �����롼��̿��
278		# <!--FSWIKI_INCLUDE PAGE="�ڡ���̾"-->
279		# �ڡ���̾��WikiName����ꤹ�롣
280		my $fswiki_include_tag = '<!--\s*FSWIKI_INCLUDE\s+PAGE\s*=\s*"([^"]*)"\s*-->';
281		while($output =~ /$fswiki_include_tag/o){
282			if($wiki->page_exists($1) && $wiki->can_show($1)){
283				# ����å���⡼��ON�ξ��
284				if($wiki->use_cache($1)){
285					my $cache = $wiki->get_page_cache($1,0);
286					if($cache ne ""){
287						$output =~ s/$fswiki_include_tag/$cache/oe;
288					} else {
289						$wiki->update_page_cache($1);
290						$cache = $wiki->get_page_cache($1,0);
291						$output =~ s/$fswiki_include_tag/$cache/oe;
292					}
293				# ����å���⡼��OFF�ξ��
294				} else {
295					$output =~ s/$fswiki_include_tag/$wiki->process_wiki($wiki->get_page($1))/oe;
296				}
297			} else {
298				$output =~ s/$fswiki_include_tag//o;
299			}
300		}
301	}
302
303	#------------------------------------------------------------------------------
304	# ���Ͻ���
305	#------------------------------------------------------------------------------
306	# �إå��ν���
307	if($is_handyphone){
308		print "Content-Type: text/html;charset=Shift_JIS\n";
309	} else {
310		print "Content-Type: text/html;charset=EUC-JP\n";
311	}
312	print "Pragma: no-cache\n";
313	print "Cache-Control: no-cache\n\n";
314
315	# HTML���
316	print $output;
317};
318
319my $msg = $@;
320$ENV{'PATH_INFO'} = undef;
321$wiki->_process_before_exit();
322
323if($msg && index($msg, 'safe_die')<0){
324	$msg = Util::escapeHTML($msg);
325	print "Content-Type: text/html\n\n";
326	print "<html><head><title>Software Error</title></head>";
327	print "<body><h1>Software Error:</h1><p>$msg</p></body></html>";
328}
329