OSDN Git Service

削除されたページを完全に削除できるようにした。
[fswiki/fswiki.git] / plugin / attach / AttachHandler.pm
1 ############################################################
2 #
3 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤Î¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¡£
4 #
5 ############################################################
6 package plugin::attach::AttachHandler;
7 use strict;
8 use plugin::attach::Files;
9 #===========================================================
10 # ¥³¥ó¥¹¥È¥é¥¯¥¿
11 #===========================================================
12 sub new {
13         my $class = shift;
14         my $self = {};
15         return bless $self,$class;
16 }
17
18 #===========================================================
19 # ¥¢¥¯¥·¥ç¥ó¤Î¼Â¹Ô
20 #===========================================================
21 sub do_action {
22         my $self = shift;
23         my $wiki = shift;
24         my $cgi = $wiki->get_CGI;
25         
26         my $pagename = $cgi->param("page");
27         if($pagename eq ""){
28                 $pagename = $wiki->config("frontpage");
29         }
30         
31         $wiki->set_title("¥Õ¥¡¥¤¥ë¤ÎźÉÕ",1);
32         
33         if($cgi->param("UPLOAD") ne "" || $cgi->param("CONFIRM") ne "" || $cgi->param("DELETE") ne ""){
34                 unless($wiki->can_modify_page($pagename)){
35                         return $wiki->error("ÊÔ½¸¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
36                 }
37         }
38         
39         if($cgi->param("DELETE") ne ""){
40                 unless(&plugin::attach::Files::can_attach_delete($wiki, $pagename)){
41                         return $wiki->error("¥Õ¥¡¥¤¥ë¤Îºï½ü¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
42                 }
43         }
44         
45         #-------------------------------------------------------
46         # ¥¢¥Ã¥×¥í¡¼¥É¼Â¹Ô
47         if($cgi->param("UPLOAD") ne ""){
48                 my $filename = $cgi->param("file");
49                 $filename =~ s/\\/\//g;
50                 $filename = substr($filename,rindex($filename,"/")+1);
51                 $filename =~ tr/";\x00-\x1f/': /;
52                 &Jcode::convert(\$filename,'euc');
53                 
54                 if($filename eq ""){
55                         return $wiki->error("¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
56                 }
57                 
58                 my $hundle = $cgi->upload("file");
59                 unless($hundle){
60                         return $wiki->error("¥Õ¥¡¥¤¥ë¤¬Æɤ߹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿¡£");
61                 }
62                 
63                 my $uploadfile = $wiki->config('attach_dir')."/".&Util::url_encode($pagename).".".&Util::url_encode($filename);
64                 if(-e $uploadfile && !&plugin::attach::Files::can_attach_update($wiki, $pagename)){
65                         return $wiki->error("¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
66                 }
67                 
68                 open(DATA,">$uploadfile") or die $!;
69                 binmode(DATA);
70                 while(read($hundle,$_,16384)){ print DATA $_; }
71                 close(DATA);
72                                 
73                 # attach¥×¥é¥°¥¤¥ó¤«¤éźÉÕ¤µ¤ì¤¿¾ì¹ç
74                 if(defined($cgi->param("count"))){
75                         my @lines = split(/\n/,$wiki->get_page($pagename));
76                         my $flag = 0;
77                         my $form_count = 1;
78                         my $count=$cgi->param("count");
79                         my $content = "";
80                         foreach(@lines){
81                                 if(index($_," ")==0||index($_,"\t")==0){
82                                         $content .= $_."\n";
83                                         next;
84                                 }
85                                 if(index($_,"{{attach}}")!=-1 && $flag==0){
86                                         if($form_count==$count){
87                                                 $content = $content."{{ref ".$filename."}}\n";
88                                                 $flag = 1;
89                                         } else {
90                                                 $form_count++;
91                                         }
92                                 }
93                                 $content = $content.$_."\n";
94                         }
95                         if($flag==1){
96                                 $wiki->save_page($pagename,$content);
97                         }
98                 }
99                 
100                 # ¥í¥°¤Îµ­Ï¿
101                 &write_log($wiki,"UPLOAD",$pagename,$filename);
102                 
103                 $wiki->redirect($pagename);
104                 
105         #-------------------------------------------------------
106         # ºï½ü³Îǧ
107         } elsif($cgi->param("CONFIRM") ne ""){
108                 my $file = $cgi->param("file");
109                 if($file eq ""){
110                         return $wiki->error("¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
111                 }
112                 
113                 my $buf = "";
114                 
115                 $buf .= "<a href=\"".$wiki->create_page_url($pagename)."\">".
116                         Util::escapeHTML($pagename)."</a>¤«¤é".Util::escapeHTML($file)."¤òºï½ü¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©\n".
117                         "<form action=\"".$wiki->create_url()."\" method=\"POST\">\n".
118                         "  <input type=\"submit\" name=\"DELETE\" value=\"ºï ½ü\">".
119                         "  <input type=\"hidden\" name=\"action\" value=\"ATTACH\">".
120                         "  <input type=\"hidden\" name=\"page\" value=\"".Util::escapeHTML($pagename)."\">".
121                         "  <input type=\"hidden\" name=\"file\" value=\"".Util::escapeHTML($file)."\">".
122                         "</form>";
123                 return $buf;
124         
125         #-------------------------------------------------------
126         # ºï½ü¼Â¹Ô
127         } elsif($cgi->param("DELETE") ne ""){
128                 my $file = $cgi->param("file");
129                 if($file eq ""){
130                         return $wiki->error("¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
131                 }
132                 
133                 # ¥í¥°¤Îµ­Ï¿
134                 &write_log($wiki,"DELETE",$pagename,$file);
135
136                 unlink($wiki->config('attach_dir')."/".&Util::url_encode($pagename).".".&Util::url_encode($file));
137                 $wiki->redirect($pagename);
138                 
139         #-------------------------------------------------------
140         # ¥À¥¦¥ó¥í¡¼¥É
141         } else {
142                 my $file = $cgi->param("file");
143                 if($file eq ""){
144                         return $wiki->error("¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
145                 }
146                 unless($wiki->page_exists($pagename)){
147                         return $wiki->error("¥Ú¡¼¥¸¤¬Â¸ºß¤·¤Þ¤»¤ó¡£");
148                 }
149                 unless($wiki->can_show($pagename)){
150                         return $wiki->error("¥Ú¡¼¥¸¤Î»²¾È¸¢¸Â¤¬¤¢¤ê¤Þ¤»¤ó¡£");
151                 }
152                 my $filepath = $wiki->config('attach_dir')."/".&Util::url_encode($pagename).".".&Util::url_encode($file);
153                 unless(-e $filepath){
154                         return $wiki->error("¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¡£");
155                 }
156                 
157                 my $contenttype = &get_mime_type($wiki,$file);
158                 my $ua = $ENV{"HTTP_USER_AGENT"};
159                 my $disposition = ($contenttype =~ /^image\// && $ua !~ /MSIE/ ? "inline" : "attachment");
160
161                 open(DATA, $filepath) or die $!;
162                 print "Content-Type: $contenttype\n";
163                 print Util::make_content_disposition($file, $disposition);
164                 binmode(DATA);
165                 while(read(DATA,$_,16384)){ print $_; }
166                 close(DATA);
167                                 
168                 # ¥í¥°¤Îµ­Ï¿
169                 &write_log($wiki,"DOWNLOAD",$pagename,$file);
170                 &count_up($wiki,$pagename,$file);
171                 
172                 exit();
173         }
174 }
175
176 #===========================================================
177 # ¥À¥¦¥ó¥í¡¼¥É¥«¥¦¥ó¥È¤ò¥¤¥ó¥¯¥ê¥á¥ó¥È
178 #===========================================================
179 sub count_up {
180         my $wiki = shift;
181         my $page = shift;
182         my $file = shift;
183         
184         Util::sync_update_config(undef,$wiki->config('log_dir')."/".$wiki->config('download_count_file'),
185         sub {
186                 my $hash = shift;
187                 unless(defined($hash->{$page."::".$file})){
188                         $hash->{$page."::".$file} = 1;
189                 } else {
190                         $hash->{$page."::".$file}++;
191                 }
192                 return $hash;
193         }
194         );
195 }
196
197 #===========================================================
198 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤Î¥í¥°
199 #===========================================================
200 sub write_log(){
201         my $wiki = shift;
202         my $mode = shift;
203         my $page = shift;
204         my $file = shift;
205         if($wiki->config('log_dir') eq "" || $wiki->config('attach_log_file') eq ""){
206                 return;
207         }
208         my $ip  = $ENV{"REMOTE_ADDR"};
209         my $ref = $ENV{"HTTP_REFERER"};
210         my $ua  = $ENV{"HTTP_USER_AGENT"};
211         if($ip  eq ""){ $ip  = "-"; }
212         if($ref eq ""){ $ref = "-"; }
213         if($ua  eq ""){ $ua  = "-"; }
214         my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
215         my $date = sprintf("%04d/%02d/%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
216         
217         my $logfile = $wiki->config('log_dir')."/".$wiki->config('attach_log_file');
218         Util::file_lock($logfile);
219         open(LOG,">>$logfile") or die $!;
220         binmode(LOG);
221         print LOG $mode." ".&Util::url_encode($page)." ".&Util::url_encode($file)." ".
222                   $date." ".$ip." ".$ref." ".$ua."\n";
223         close(LOG);
224         Util::file_unlock($logfile);
225 }
226
227 #===========================================================
228 # MIME¥¿¥¤¥×¤ò¼èÆÀ¤·¤Þ¤¹
229 #===========================================================
230 sub get_mime_type {
231         my $wiki = shift;
232         my $file = shift;
233         my $type = lc(substr($file,rindex($file,".")+1));
234         
235         my $hash  = &Util::load_config_hash($wiki,$wiki->config('mime_file'));
236         my $ctype = $hash->{$type};
237         
238         if($ctype eq "" ){
239                 $ctype = "application/octet-stream";
240         }
241         
242         return $ctype;
243 }
244
245 1;