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&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