OSDN Git Service

パーミッション変更
[fswiki/fswiki.git] / wiki.cgi
1 #!/usr/bin/perl
2 ###############################################################################
3 #
4 # FreeStyleWiki ¥Õ¥í¥ó¥È¥¨¥ó¥ÉCGI¥¹¥¯¥ê¥×¥È
5 #
6 ###############################################################################
7 BEGIN {
8         if(exists $ENV{MOD_PERL}){
9                 # ¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤ÎÊѹ¹
10                 chdir($ENV{FSWIKI_HOME});
11         }
12 }
13 # ModPerl::Registry(Prefork)¤Ç¤Ï¼Â¹Ô»þ¤ËÊѹ¹¤µ¤ì¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ë
14 if(exists $ENV{MOD_PERL}){
15         chdir($ENV{FSWIKI_HOME});
16 }
17
18 #==============================================================================
19 # ¥â¥¸¥å¡¼¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É
20 #==============================================================================
21 use Cwd;
22 use lib './lib';
23 # ModPerl::Registry(Prefork)¤Ç¤Ï@INC¤¬½é´ü²½¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤¬¤¢¤ë
24 unshift @INC, './lib' if(exists $ENV{MOD_PERL});
25 use strict;
26 #use CGI::Carp qw(fatalsToBrowser);
27 #use CGI2;
28 use Wiki;
29 use Util;
30 use Jcode;
31 use HTML::Template;
32
33 # ¤³¤ì¤ò¤ä¤é¤Ê¤¤¤ÈApache::Registory¤ÇÆ°¤«¤Ê¤¤
34 if(exists $ENV{MOD_PERL}){
35         eval("use Digest::Perl::MD5;");
36         eval("use plugin::core::Diff;");
37         eval("use plugin::pdf::PDFMaker;");
38         &Jcode::load_module("Jcode::Unicode") unless $Jcode::USE_ENCODE;
39 }
40
41 #==============================================================================
42 # CGI¤ÈWiki¤Î¥¤¥ó¥¹¥¿¥ó¥¹²½
43 #==============================================================================
44 my $wiki = Wiki->new('setup.dat');
45 my $cgi = $wiki->get_CGI();
46
47 Util::override_die();
48 eval {
49         # SessionÍѥǥ£¥ì¥¯¥È¥ê¤ÏFarm¤Ç¤â¶¦Ä̤˻ÈÍѤ¹¤ë
50         $wiki->config('session_dir',$wiki->config('log_dir')) if (!$wiki->config('session_dir'));
51         
52         #==============================================================================
53         # Farm¤È¤·¤ÆÆ°ºî¤¹¤ë¾ì¹ç
54         #==============================================================================
55         my $path_info  = $cgi->path_info();
56         my $path_count = 0;
57         if(length($path_info) > 0){
58                 # Farm¤¬¤¢¤ë¤«³Îǧ¤¹¤ë
59                 unless($path_info =~ m<^(/[A-Za-z0-9]+)*/?$> and -d $wiki->config('data_dir').$path_info){
60                         CORE::die("Wiki¤¬Â¸ºß¤·¤Þ¤»¤ó¡£");
61                 }
62                 
63                 # PATH_INFO¤ÎºÇ¸å¤¬/¤À¤Ã¤¿¤é/¤Ê¤·¤ÎURL¤ËžÁ÷¤¹¤ë
64                 if($path_info =~ m|/$|) {
65                         $path_info =~ s|/$||;
66                         $wiki->redirectURL($cgi->url().$path_info);
67                 }
68                 $path_info =~ m</([^/]+)$>;
69                 $wiki->config('script_name', $1);
70                 $wiki->config('data_dir'   , $wiki->config('data_dir'  ).$path_info);
71                 $wiki->config('config_dir' , $wiki->config('config_dir').$path_info);
72                 $wiki->config('backup_dir' , $wiki->config('backup_dir').$path_info);
73                 $wiki->config('log_dir'    , $wiki->config('log_dir'   ).$path_info);
74
75                 if(!($wiki->config('theme_uri') =~ /^(\/|http:|https:|ftp:)/)){
76                         my @paths = split(/\//,$path_info);
77                         $path_count = $#paths;
78                         for(my $i=0;$i<$path_count;$i++){
79                                 $wiki->config('theme_uri','../'.$wiki->config('theme_uri'));
80                         }
81                 }
82         }
83
84         #==============================================================================
85         # ÀßÄê¤òÈ¿±Ç¡Ê¤â¤¦¤Á¤ç¤Ã¤È¥¹¥Þ¡¼¥È¤Ë¤ä¤ê¤¿¤¤¤Í¡Ë
86         #==============================================================================
87         my $config = &Util::load_config_hash($wiki,$wiki->config('config_file'));
88         foreach my $key (keys(%$config)){
89                 $wiki->config($key,$config->{$key});
90         }
91         # ¸ÄÊ̤ËÀßÄ꤬ɬÍפʤâ¤Î¤À¤±¾å½ñ¤­
92         $wiki->config('css',
93                 $wiki->config('theme_uri')."/".$config->{theme}."/".$config->{theme}.".css");
94         $wiki->config('site_tmpl',
95                 $wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}.".tmpl");
96         $wiki->config('site_handyphone_tmpl',
97                 $wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}."_handyphone.tmpl");
98         $wiki->config('site_smartphone_tmpl',
99                 $wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}."_smartphone.tmpl");
100
101         #==============================================================================
102         # ¥¿¥¤¥à¥¢¥¦¥È¤·¤Æ¤¤¤ë¥»¥Ã¥·¥ç¥ó¤òÇË´þ
103         #==============================================================================
104         $cgi->remove_session($wiki);
105
106         #==============================================================================
107         # ¥æ¡¼¥¶¾ðÊó¤ÎÆɤ߹þ¤ß
108         #==============================================================================
109         my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file'));
110         foreach my $id (keys(%$users)){
111                 my ($pass,$type) = split(/\t/,$users->{$id});
112                 $wiki->add_user($id,$pass,$type);
113         }
114
115         #==============================================================================
116         # ¥×¥é¥°¥¤¥ó¤Î¥¤¥ó¥¹¥È¡¼¥ë¤È½é´ü²½
117         #==============================================================================
118         my @plugins = split(/\n/,&Util::load_config_text($wiki,$wiki->config('plugin_file')));
119         my $plugin_error = '';
120         foreach(sort(@plugins)){
121                 $plugin_error .= $wiki->install_plugin($_);
122         }
123         # ¥×¥é¥°¥¤¥ó¤´¤È¤Î½é´ü²½½èÍý¤òµ¯Æ°
124         $wiki->do_hook("initialize");
125
126         #==============================================================================
127         # ¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¤Î¸Æ¤Ó½Ð¤·
128         #==============================================================================
129         my $action  = $cgi->param("action");
130         my $content = $wiki->call_handler($action);
131
132         # ¥×¥é¥°¥¤¥ó¤Î¥¤¥ó¥¹¥È¡¼¥ë¤Ë¼ºÇÔ¤·¤¿¾ì¹ç
133         $content = $plugin_error . $content if $plugin_error ne '';
134
135         #==============================================================================
136         # ¥ì¥¹¥Ý¥ó¥¹
137         #==============================================================================
138         my $output        = "";
139         my $is_handyphone = &Util::handyphone();
140         my $is_smartphone = &Util::smartphone();
141         my $template_name = "";
142
143         if ($is_handyphone) {
144                 $template_name = 'site_handyphone_tmpl';
145         } elsif ($is_smartphone) {
146                 $template_name = 'site_smartphone_tmpl';
147         } else {
148                 $template_name = 'site_tmpl';
149         }
150
151         # ¥È¥Ã¥×¥Ú¡¼¥¸¤«¤É¤¦¤«¤òȽÄê
152         my $top  = 0;
153         if($cgi->param("page") eq $wiki->config("frontpage")){
154                 $top = 1;
155         }
156
157         # ¥Ú¡¼¥¸¤Î¥¿¥¤¥È¥ë¤ò·èÄê
158         my $title = "";
159         if($cgi->param('action') eq "" && $wiki->page_exists($cgi->param('page')) && $wiki->is_installed('search')){
160                 $title = "<a href=\"".$wiki->create_url({action=>"SEARCH",word=>$wiki->get_title()})."\">".
161                        &Util::escapeHTML($wiki->get_title())."</a>";
162         } else {
163                 $title = &Util::escapeHTML($wiki->get_title());
164         }
165
166         #------------------------------------------------------------------------------
167         # ¥Ø¥Ã¥À¤ÎÀ¸À®
168         #------------------------------------------------------------------------------
169         my $header_tmpl = HTML::Template->new(filename => $wiki->config('tmpl_dir')."/header.tmpl",
170                                               die_on_bad_params => 0,
171                                               case_sensitive    => 1);
172         # ¥á¥Ë¥å¡¼¤ò¼èÆÀ
173         my @menu = ();
174         foreach(sort {$b->{weight}<=>$a->{weight}} @{$wiki->{menu}}){
175                 if($_->{href} ne ""){
176                         push(@menu,$_);
177                 }
178         }
179         $header_tmpl->param(MENU       => \@menu,
180                             FRONT_PAGE => $top);
181         my $header = $header_tmpl->output();
182
183         #------------------------------------------------------------------------------
184         # ¥Õ¥Ã¥¿¤ÎÀ¸À®
185         #------------------------------------------------------------------------------
186         my $footer_tmpl = HTML::Template->new(filename => $wiki->config('tmpl_dir')."/footer.tmpl",
187                                               die_on_bad_params => 0,
188                                               case_sensitive    => 1);
189
190         # ¥³¥Ô¡¼¥é¥¤¥È¤òɽ¼¨¤¹¤ë¤«¤É¤¦¤«
191         my $admin_name = $wiki->config('admin_name');
192         my $admin_mail = $wiki->config('admin_mail_pub');
193         my $out_copyright  = 1;
194         if($admin_name eq ""){ $admin_name = $admin_mail; }
195         if($admin_name eq "" && $admin_mail eq ""){ $out_copyright = 0; }
196
197         $footer_tmpl->param(ADMIN_NAME    => $admin_name,
198                             ADMIN_MAIL    => $admin_mail,
199                             OUT_COPYRIGHT => $out_copyright,
200                             FRONT_PAGE    => $top,
201                             VERSION       => Wiki->VERSION,
202                             PERL_VERSION  => $]);
203
204         if(exists $ENV{MOD_PERL}){
205                 $footer_tmpl->param(MOD_PERL=>$ENV{MOD_PERL});
206         }
207
208         my $footer = $footer_tmpl->output();
209
210         #------------------------------------------------------------------------------
211         # ¥µ¥¤¥È¥Æ¥ó¥×¥ì¡¼¥È¤Î½èÍý
212         #------------------------------------------------------------------------------
213         # ¥Æ¥ó¥×¥ì¡¼¥È¤ÎÆɤ߹þ¤ß
214         my $template = HTML::Template->new(filename => $wiki->config($template_name),
215                                            die_on_bad_params => 0,
216                                            case_sensitive    => 1);
217
218         # »²¾È¸¢¸Â¤¬¤¢¤ë¤«¤É¤¦¤«
219         my $can_show = 0;
220         if($action ne '' || ($action eq '' && $wiki->can_show($cgi->param('page')))){
221                 $can_show = 1;
222         }
223
224         # head¥¿¥°Æâ¤Ëɽ¼¨¤¹¤ë¾ðÊó¤òºîÀ®
225         my $head_info = "";
226         foreach (@{$wiki->{'head_info'}}){
227                 $head_info .= $_."\n";
228         }
229
230         # ¥Æ¥ó¥×¥ì¡¼¥È¤Ë¥Ñ¥é¥á¡¼¥¿¤ò¥»¥Ã¥È
231         $template->param(SITE_TITLE  => &Util::escapeHTML($wiki->get_title()." - ".$wiki->config('site_title')),
232                          MENU        => $header,
233                          TITLE       => $title,
234                          CONTENT     => $content,
235                          FRONT_PAGE  => $top,
236                          FOOTER      => $footer,
237                          EDIT_MODE   => $action,
238                          CAN_SHOW    => $can_show,
239                          HEAD_INFO   => $head_info,
240                          SITE_NAME   => $wiki->config('site_title'));
241
242         my $login = $wiki->get_login_info();
243         $template->param(
244                 IS_ADMIN => defined($login) && $login->{type}==0,
245                 IS_LOGIN => defined($login)
246         );
247
248         if ($is_handyphone) {
249                 # ·ÈÂÓÅÅÏÃÍѽèÍý
250                 $output = $template->output;
251                 &Jcode::convert(\$output,"sjis");
252         } else {
253                 # ¥Ñ¥½¥³¥óÍѽèÍý
254                 my $usercss = &Util::load_config_text($wiki,$wiki->config('usercss_file'));
255                 
256                 if($config->{'theme'} eq ''){
257                         # ¥Æ¡¼¥Þ¤¬»ÈÍѤµ¤ì¤Æ¤ª¤é¤º¡¢³°ÉôCSS¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¤½¤ì¤ò»ÈÍÑ
258                         if($config->{'outer_css'} ne ''){
259                                 $wiki->config('css',$config->{'outer_css'});
260                         # ¥Æ¡¼¥Þ¤â³°ÉôCSS¤â»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¥¹¥¿¥¤¥ë¥·¡¼¥È¤ò»ÈÍѤ·¤Ê¤¤
261                         } else {
262                                 $wiki->config('css','');
263                         }
264                 }
265                 # ¥Ñ¥é¥á¡¼¥¿¤ò¥»¥Ã¥È
266                 $template->param(HAVE_USER_CSS => $usercss ne "",
267                                  THEME_CSS     => $wiki->config('css'),
268                                  USER_CSS      => &Util::escapeHTML($usercss),
269                                  THEME_URI     => $wiki->config('theme_uri'));
270                 
271                 # ¥Ú¡¼¥¸Ì¾¤òEXIST_PAGE_¥Ú¡¼¥¸Ì¾¤È¤¤¤¦¥Ñ¥é¥á¡¼¥¿¤Ë¥»¥Ã¥È
272                 # ¤¿¤À¤·¡¢¥¹¥é¥Ã¥·¥å¤ò´Þ¤à¥Ú¡¼¥¸Ì¾¤Ï¥»¥Ã¥È¤·¤Ê¤¤
273                 my @pagelist = $wiki->get_page_list();
274                 foreach my $page (@pagelist){
275                         if(index($page,"/")==-1 && $wiki->can_show($page)){
276                                 $template->param("EXIST_PAGE_".$page=>1);
277                         }
278                 }
279                 
280                 $output = $template->output;
281                 
282                 # ¥¤¥ó¥¯¥ë¡¼¥ÉÌ¿Îá
283                 # <!--FSWIKI_INCLUDE PAGE="¥Ú¡¼¥¸Ì¾"-->
284                 # ¥Ú¡¼¥¸Ì¾¤ÇWikiName¤ò»ØÄꤹ¤ë¡£
285                 my $fswiki_include_tag = '<!--\s*FSWIKI_INCLUDE\s+PAGE\s*=\s*"([^"]*)"\s*-->';
286                 while($output =~ /$fswiki_include_tag/o){
287                         if($wiki->page_exists($1) && $wiki->can_show($1)){
288                                 $output =~ s/$fswiki_include_tag/$wiki->process_wiki($wiki->get_page($1))/oe;
289                         } else {
290                                 $output =~ s/$fswiki_include_tag//o;
291                         }
292                 }
293         }
294         
295         #------------------------------------------------------------------------------
296         # ½ÐÎϽèÍý
297         #------------------------------------------------------------------------------
298         # ¥Ø¥Ã¥À¤Î½ÐÎÏ
299         if($is_handyphone){
300                 print "Content-Type: text/html;charset=Shift_JIS\n";
301         } else {
302                 print "Content-Type: text/html;charset=EUC-JP\n";
303         }
304         print "Pragma: no-cache\n";
305         print "Cache-Control: no-cache\n\n";
306          
307         # HTML¤Î½ÐÎÏ
308         print $output;
309 };
310
311 my $msg = $@;
312 $ENV{'PATH_INFO'} = undef;
313 $wiki->_process_before_exit();
314
315 if($msg && index($msg, 'safe_die')<0){
316         $msg = Util::escapeHTML($msg);
317         print "Content-Type: text/html\n\n";
318         print "<html><head><title>Software Error</title></head>";
319         print "<body><h1>Software Error:</h1><p>$msg</p></body></html>";
320 }
321 Util::restore_die();