1 ############################################################
3 # źÉÕ¥Õ¥¡¥¤¥ë¤Î¥¢¥¯¥·¥ç¥ó¥Ï¥ó¥É¥é¡£
5 ############################################################
6 package plugin::attach::AttachHandler;
9 use plugin::attach::Files;
10 #===========================================================
12 #===========================================================
16 return bless $self,$class;
19 #===========================================================
21 #===========================================================
25 my $cgi = $wiki->get_CGI;
27 my $pagename = $cgi->param("page");
29 $pagename = $wiki->config("frontpage");
32 $wiki->set_title("¥Õ¥¡¥¤¥ë¤ÎźÉÕ",1);
34 if($cgi->param("UPLOAD") ne "" || $cgi->param("CONFIRM") ne "" || $cgi->param("DELETE") ne ""){
35 unless($wiki->can_modify_page($pagename)){
36 return $wiki->error(RC_FORBIDDEN, "ÊÔ½¸¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
40 if($cgi->param("DELETE") ne ""){
41 unless(&plugin::attach::Files::can_attach_delete($wiki, $pagename)){
42 return $wiki->error(RC_FORBIDDEN, "¥Õ¥¡¥¤¥ë¤Îºï½ü¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
46 #-------------------------------------------------------
48 if($cgi->param("UPLOAD") ne ""){
49 my $filename = $cgi->param("file");
50 $filename =~ s/\\/\//g;
51 $filename = substr($filename,rindex($filename,"/")+1);
52 $filename =~ tr/";\x00-\x1f/': /;
53 &Jcode::convert(\$filename,'euc');
56 return $wiki->error(RC_BAD_REQUEST, "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
59 my $hundle = $cgi->upload("file");
61 return $wiki->error(RC_BAD_REQUEST, "¥Õ¥¡¥¤¥ë¤¬Æɤ߹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿¡£");
64 my $uploadfile = $wiki->config('attach_dir')."/".&Util::url_encode($pagename).".".&Util::url_encode($filename);
65 if(-e $uploadfile && !&plugin::attach::Files::can_attach_update($wiki, $pagename)){
66 return $wiki->error(RC_FORBIDDEN, "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
69 open(DATA,">$uploadfile") or die $!;
71 while(read($hundle,$_,16384)){ print DATA $_; }
74 # attach¥×¥é¥°¥¤¥ó¤«¤éźÉÕ¤µ¤ì¤¿¾ì¹ç
75 if(defined($cgi->param("count"))){
76 my @lines = split(/\n/,$wiki->get_page($pagename));
79 my $count=$cgi->param("count");
82 if(index($_," ")==0||index($_,"\t")==0){
86 if(index($_,"{{attach}}")!=-1 && $flag==0){
87 if($form_count==$count){
88 $content = $content."{{ref ".$filename."}}\n";
94 $content = $content.$_."\n";
97 $wiki->save_page($pagename,$content);
102 &write_log($wiki,"UPLOAD",$pagename,$filename);
104 $wiki->redirect($pagename);
106 #-------------------------------------------------------
108 } elsif($cgi->param("CONFIRM") ne ""){
109 my $file = $cgi->param("file");
111 return $wiki->error(RC_BAD_REQUEST, "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
116 $buf .= "<a href=\"".$wiki->create_page_url($pagename)."\">".
117 Util::escapeHTML($pagename)."</a>¤«¤é".Util::escapeHTML($file)."¤òºï½ü¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©\n".
118 "<form action=\"".$wiki->create_url()."\" method=\"POST\">\n".
119 " <input type=\"submit\" name=\"DELETE\" value=\"ºï ½ü\">".
120 " <input type=\"hidden\" name=\"action\" value=\"ATTACH\">".
121 " <input type=\"hidden\" name=\"page\" value=\"".Util::escapeHTML($pagename)."\">".
122 " <input type=\"hidden\" name=\"file\" value=\"".Util::escapeHTML($file)."\">".
126 #-------------------------------------------------------
128 } elsif($cgi->param("DELETE") ne ""){
129 my $file = $cgi->param("file");
131 return $wiki->error(RC_BAD_REQUEST, "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
135 &write_log($wiki,"DELETE",$pagename,$file);
137 unlink($wiki->config('attach_dir')."/".&Util::url_encode($pagename).".".&Util::url_encode($file));
138 $wiki->redirect($pagename);
140 #-------------------------------------------------------
143 my $file = $cgi->param("file");
145 return $wiki->error(RC_BAD_REQUEST, "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
147 unless($wiki->page_exists($pagename)){
148 return $wiki->error(RC_NOT_FOUND ,"¥Ú¡¼¥¸¤¬Â¸ºß¤·¤Þ¤»¤ó¡£");
150 unless($wiki->can_show($pagename)){
151 return $wiki->error(RC_FORBIDDEN, "¥Ú¡¼¥¸¤Î»²¾È¸¢¸Â¤¬¤¢¤ê¤Þ¤»¤ó¡£");
153 my $filepath = $wiki->config('attach_dir')."/".&Util::url_encode($pagename).".".&Util::url_encode($file);
154 unless(-e $filepath){
155 return $wiki->error(RC_NOT_FOUND, "¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¡£");
158 my $contenttype = &get_mime_type($wiki,$file);
159 my $ua = $ENV{"HTTP_USER_AGENT"};
160 my $disposition = ($contenttype =~ /^image\// && $ua !~ /MSIE/ ? "inline" : "attachment");
162 open(DATA, $filepath) or die $!;
163 print "Content-Type: $contenttype\n";
164 print Util::make_content_disposition($file, $disposition);
166 while(read(DATA,$_,16384)){ print $_; }
170 &write_log($wiki,"DOWNLOAD",$pagename,$file);
171 &count_up($wiki,$pagename,$file);
177 #===========================================================
178 # ¥À¥¦¥ó¥í¡¼¥É¥«¥¦¥ó¥È¤ò¥¤¥ó¥¯¥ê¥á¥ó¥È
179 #===========================================================
185 Util::sync_update_config(undef,$wiki->config('log_dir')."/".$wiki->config('download_count_file'),
188 unless(defined($hash->{$page."::".$file})){
189 $hash->{$page."::".$file} = 1;
191 $hash->{$page."::".$file}++;
198 #===========================================================
200 #===========================================================
206 if($wiki->config('log_dir') eq "" || $wiki->config('attach_log_file') eq ""){
209 my $ip = $ENV{"REMOTE_ADDR"};
210 my $ref = $ENV{"HTTP_REFERER"};
211 my $ua = $ENV{"HTTP_USER_AGENT"};
212 if($ip eq ""){ $ip = "-"; }
213 if($ref eq ""){ $ref = "-"; }
214 if($ua eq ""){ $ua = "-"; }
215 my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
216 my $date = sprintf("%04d/%02d/%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
218 my $logfile = $wiki->config('log_dir')."/".$wiki->config('attach_log_file');
219 Util::file_lock($logfile);
220 open(LOG,">>$logfile") or die $!;
222 print LOG $mode." ".&Util::url_encode($page)." ".&Util::url_encode($file)." ".
223 $date." ".$ip." ".$ref." ".$ua."\n";
225 Util::file_unlock($logfile);
228 #===========================================================
229 # MIME¥¿¥¤¥×¤ò¼èÆÀ¤·¤Þ¤¹
230 #===========================================================
234 my $type = lc(substr($file,rindex($file,".")+1));
236 my $hash = &Util::load_config_hash($wiki,$wiki->config('mime_file'));
237 my $ctype = $hash->{$type};
240 $ctype = "application/octet-stream";