/[suikacvs]/okuchuu/blue-oceans/board-t/fbeditor.cgi
Suika

Contents of /okuchuu/blue-oceans/board-t/fbeditor.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Mon Dec 3 06:23:31 2001 UTC (22 years, 11 months ago) by wakaba
Branch: wakaba
CVS Tags: initial
Changes since 1.1: +0 -0 lines

1 #!/usr/local/bin/perl
2
3 #このスクリプトはじゃわ@中澤重人さん<jawa@big.or.jp> の
4 # FlasH BBS Pro 1.41 をベースに、
5 #水無月ばけら<bakera@star.email.ne.jp> が改造を施したものです。
6
7 $max_tree = 10; # リストに表示するツリーの数
8 $jcode = '../jcode.pl';
9 $retry = 3;
10
11 # [ メイン処理 ]
12
13 &check_code;
14 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; }
15 local(@pairs) = split(/&/,$buffer);
16 foreach $pair (@pairs) {
17 local($name,$value) = split(/=/,$pair);
18 $value =~ tr/+/ /;
19 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
20 if ($name eq 'tree_del') { $tree_del[$value] = 1; $del_flag = 1; }
21 elsif ($name eq 'del') { $del[$value] = 1; $del_flag = 1; }
22 elsif ($name eq 'edit_no') { $edit_no = $value; $edit_flag = 1; }
23 elsif ($name eq 'edit_tn') { $edit_tn = $value; $edit_flag = 1; }
24 else { $FORM{$name} = &change_code($value); }
25 }
26 $ID = $FORM{'id'};
27 if ($ID eq 'html'){
28 $password = "";
29 }else{
30 $ID = 'flashbbs';
31 $password = "";
32 }
33 if ($password ne $FORM{'pass'}) { &password_check; }
34
35 $log_dir = '../bbs_log/';
36 $logfile = "$log_dir$ID.log";
37
38 if ($FORM{'mode'} eq 'download') { &download; }
39 if ($FORM{'mode'} eq 'repair') { &repair; }
40 if ($FORM{'mode'} eq 'regist') { &regist; }
41 if ($del_flag) { &delete; }
42 if ($edit_flag) { &edit; } else { &ichiran; }
43 exit;
44
45 # [ パスワードのチェック ]
46
47 sub password_check {
48 &html_header("アクセス制限");
49 print<<"_EOF_";
50 <form action="./fbeditor.cgi" method="post">
51 <p>id: <input type="text" name="id" size="10"></p>
52 <p>pass: <input type="password" name="pass" size="10"></p>
53 <p><input type="submit" value="起動する"></p>
54 </form>
55 _EOF_
56 &html_footer;
57 exit;
58 }
59
60 # [ 一覧表示 ]
61 #
62
63 sub ichiran {
64 &read_all;
65 &html_header("一覧表\示");
66 $size = (stat($logfile))[7];
67 $tree = $FORM{'tree'};
68 if ($tree > @logs) { $tree = 0; }
69 if (!$tree) { $tree = 0; }
70 $tree = int($tree/$max_tree)*$max_tree;
71 print<<"_EOF_";
72 <form action="./fbeditor.cgi" method="post">
73 <input type="hidden" name="pass" value="$FORM{'pass'}">
74 <input type="hidden" name="id" value="$ID">
75 <p>ログファイルの容量は、約 $size バイト になっています。現在、<select name="tree">
76 _EOF_
77 for ($i=0;$i<@logs;$i+=$max_tree) {
78 $j=$i/$max_tree+1;
79 if ($tree == $i) {
80 print" <option value=\"$i\" selected>$j ページを\n";
81 } else {
82 print" <option value=\"$i\">$j ページを\n";
83 }
84 }
85 print<<"_EOF_";
86 </select>編集しています。</p><hr>
87 <hr>
88 _EOF_
89 $end_tree = $tree + $max_tree;
90 if ($end_tree > @logs) { $end_tree = @logs; }
91 for ($i=$tree;$i<$end_tree;$i++) {
92 @datas = &divide_log($logs[$i]);
93 $kiji = @datas;
94 $tn = (&divide_data($logs[$i]))[0];
95 print "<h3>ツリー No.$i</h3>";
96 print "<p>(記事数 $kiji) <input type=\"checkbox\" name=\"tree_del\" value=\"$tn\">[ツリー削除]<br>";
97 foreach (@datas) {
98 local($no,$res,$lx,$tn,$title,$name,$email,$date,$act) = &divide_data($_);
99 print "削<input type=\"checkbox\" name=\"del\" value=\"$no\">";
100 for ($s=0; $s<$lx; $s++) { print " "; }
101 print "[$no]<a href=\"fbeditor.cgi?id=$ID&edit_no=$no&edit_tn=$tn&tree=$FORM{'tree'}&pass=$FORM{'pass'}\">$title</a> : $name <span class=\"date\">($date)</span><br>";
102 }
103 print '</p><p class="submit"><input type="submit" value="削除開始"> <input type="reset"></p><hr>';
104 }
105 print<<"_EOF_";
106 </form>
107 <form action="./fbeditor.cgi" method="post">
108 <input type="hidden" name="id" value="$ID">
109 <input type="hidden" name="pass" value="$FORM{'pass'}">
110 <input type="hidden" name="mode" value="download">
111 <input type="submit" value="ダウンロード">
112 </form>
113 <form action="./fbeditor.cgi" method="post">
114 <input type="hidden" name="id" value="$ID">
115 <input type="hidden" name="pass" value="$FORM{'pass'}">
116 <input type="hidden" name="mode" value="repair">
117 <input type="submit" value=" 最適化処理 ">
118 </form>
119
120 _EOF_
121 &html_footer;
122 }
123
124 # [ 削除処理 ]
125 #
126
127 sub delete {
128 &read_all;
129 foreach $data (@logs) {
130 if (!$tree_del[(&divide_data($data))[0]]) {
131 @kiji_datas = &divide_log($data);
132 $tree_data = '';$flag = 0;
133 foreach $data (@kiji_datas) {
134 if ($del[(&divide_data($data))[0]]) {
135 local($no,$res,$lx,$tn,$temp,$temp,$temp,$date,$act,$file_pwd,$rhost,$ipad,$temp) = &divide_data($data);
136 $data = "$no<>$res<>$lx<>$tn<><em>[管理者削除]</em><><em>管理者</em><><>null<>9<>Null<><><>この記事は削除されました。";
137 }
138 if ($flag) { $tree_data .= "<#>"; } else { $flag = 1; }
139 $tree_data .= $data;
140 }
141 push (@new,"$tree_data\n");
142 }
143 }
144 &write_file($count,$last_nj,@new);
145 }
146
147 # [ 編集処理 ]
148 #
149
150 sub edit {
151 &read_all;
152 &html_header("編集");
153 $kiji_data = &search_no2data($edit_no,&divide_log(&search_no2data($edit_tn,@logs)));
154 local($no,$res,$lx,$tn,$title,$name,$email,$date,$act,$tm_pwd,$rhost,$ipad,$comment) = &divide_data($kiji_data);
155 $kiji_size = length($kiji_data);
156 $comment_size = length($comment);
157 $comment =~ s/<BR>/\n/g;
158 print<<"_EOF_";
159 <form action="./fbeditor.cgi" method="post">
160 <p>編集項目を全て編集した後、[内容更新]を押して下さい。
161 <input type="hidden" name="id" value="$ID">
162 <input type="hidden" name="pass" value="$FORM{'pass'}">
163 <input type="hidden" name="mode" value="regist">
164 <input type="hidden" name="tree" value="$FORM{'tree'}">
165 <input type="hidden" name="no" value="$no">
166 <input type="hidden" name="tn" value="$tn"></p>
167 <p>タイトル:<input type="text" name="title" size="42" maxlength="80" value="$title"><br>ハンドル:<input type="text" name="name" size="42" maxlength="42" value="$name"><br>
168 Eメール:<input type="text" name=email size="42" maxlength="120" value="$email"><br>
169 <textarea name="comment" rows="8" cols="60">$comment</textarea></p>
170 <p class="submit"><input type="submit" value="内容更新">
171 <input type="reset"></p>
172 <p>記事情報: 記事番号=$no, 親記事番号=$res, 記事モード=$act</p>
173 <p>投稿者情報: 登録日時=$date, リモートホスト=$rhost, IPアドレス=$ipad</p>
174 <p>記事サイズ=約 $kiji_size bytes, コメントサイズ=約 $comment_size bytes</p>
175 </form>
176 _EOF_
177 &html_footer;
178 }
179
180 # [ 登録処理 ]
181 #
182
183 sub regist {
184 &read_all;
185 local($title,$name,$email,$comment) = ($FORM{'title'},$FORM{'name'},$FORM{'email'},$FORM{'comment'});
186 $title =~ s/\r\n//g;
187 $title =~ s/\r|\n//g;
188 $name =~ s/\r\n//g;
189 $name =~ s/\r|\n//g;
190 $email =~ s/\r\n//g;
191 $email =~ s/\r|\n//g;
192 $comment =~ s/\r\n/<BR>/g;
193 $comment =~ s/\r|\n/<BR>/g;
194 if (length($title) > 80) {
195 &error(1,"タイトルの記入漏れ、又は文字数制限を過えています。");
196 } elsif (!$title) { $title = "無題"; }
197 if ((!$name) || (length($name) > 42)) {
198 &error(1,"名前の記入漏れ、又は文字数制限を過えています。");
199 }
200 if ((($email !~ /(.*)\@(.*)\.(.*)/) && ($email)) || (length($email) > 120)) {
201 &error(1,"メールアドレスの間違い、又は文字数制限を過えています。");
202 }
203 if (!$comment) {
204 &error(1,"メッセージの記入漏れです。");
205 }
206 foreach $data (@logs) {
207 if ($FORM{'tn'} == (&divide_data($data))[0]) {
208 @kiji_datas = &divide_log($data);
209 $tree_data = '';$flag = 0;
210 foreach $data (@kiji_datas) {
211 if ($FORM{'no'} == (&divide_data($data))[0]) {
212 local($no,$res,$lx,$tn,$temp,$temp,$temp,$date,$act,$file_pwd,$rhost,$ipad,$temp) = &divide_data($data);
213 $data = "$no<>$res<>$lx<>$tn<>$title<>$name<>$email<>$date<>0<>$file_pwd<>$rhost<>$ipad<>$comment";
214 }
215 if ($flag) { $tree_data .= "<#>"; } else { $flag = 1; }
216 $tree_data .= $data;
217 }
218 push (@new,"$tree_data\n");
219 } else {
220 push (@new,$data);
221 }
222 }
223 &write_file($count,$last_nj,@new);
224 }
225
226 # [ ダウンロード ]
227 #
228
229 sub download {
230 print "Content-type: application/octet-stream\n\n";
231 open(LOG,$logfile) or &error('読み込みエラー','ログの読み込みが出来ません。管理者に連絡してください。');
232 print <LOG>;
233 close(LOG);
234 exit;
235 }
236
237 # [ 最適化処理 ]
238 #
239
240 sub repair {
241 foreach $tree (@logs) {
242 @datas = &divide_log($tree);
243 foreach (@datas) {
244 local($no) = &divide_data($_);
245 $line = substr("0000",length($line)).$line;
246 push(@num,"$no=$line");
247 $line++;
248 }
249 }
250 @num = sort(@num);
251 for($i=0;$i<@num;$i++) {
252 ($no,$line) = (split(/=/,$num[$i]));
253 $num = $i + 1;
254 $num3[$no] = $num;
255 $num = substr("0000",length($num)).$num;
256 push(@num2,"$line=$num");
257 }
258 @num2 = sort(@num2);
259 $line = 0;
260 foreach $tree (@logs) {
261 @datas = &divide_log($tree);
262 $flag = 0; $tree_data = '';
263 foreach (@datas) {
264 local($no,$res,$lx,$tn,$title,$name,$email,$date,$act,$file_pwd,$rhost,$ipad,$comment) = &divide_data($_);
265 ($temp,$no) = (split(/=/,$num2[$line++]));
266 if ($res ne 'root') { $res = $num3[$res]; }
267 $tn = $num3[$tn];
268 $kiji_data = "$no<>$res<>$lx<>$tn<>$title<>$name<>$email<>$date<>0<>$file_pwd<>$rhost<>$ipad<>$comment";
269 if ($flag){ $tree_data = "$tree_data<#>$kiji_data"; }
270 else { $tree_data = $kiji_data; $flag = 1; }
271 }
272 push(@new,"$tree_data\n");
273 }
274
275 &write_file($line,$last_nj,@new);
276 &read_all;
277 }
278
279 # [ ヘッダー部分表示 ]
280 #
281
282 sub html_header {
283 local($sub_title) = $_[0];
284 print "Content-type: text/html; charset=$charset_code\n\n";
285 print<<"_EOF_";
286 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
287 "http://www.w3.org/TR/html40/strict.dtd">
288 <html lang="ja">
289 <head>
290 <title>FlasH BBS Pro Editor [$sub_title]</title>
291 <style type="text/css"><!--p,h3{margin:0}p.submit{text-align:center}--></style>
292 </head>
293 <body>
294 <h1>FlasH BBS Pro Editor</h1>
295 <h2>$sub_title</h2>
296 _EOF_
297 }
298
299 # [ 著作権等の表示(必ずこのまま表示すること) ]
300 #
301
302 sub html_footer {
303 print<<"_EOF_";
304 <hr>
305 <p><!-- 著作権表\示 (必ず表\示してください。) -->
306 FlasH BBS Pro Editor v1.40 [<a href="http://www7.big.or.jp/~jawa/">Shigeto Nakazawa</a>]
307 </p>
308 </body></html>
309 _EOF_
310 }
311
312 # [ データ処理関連汎用サブ ]
313 #
314
315 sub divide_log {
316 local($data) = $_[0];
317 chop($data);
318 return split(/<#>/,$data);
319 }
320 sub divide_data {
321 return split(/<>/,$_[0]);
322 }
323 sub search_no2data {
324 local($no,@datas) = @_;
325 local($data);
326 foreach $data (@datas) {
327 if ($no == (&divide_data($data))[0]) { return $data; }
328 }
329 return 0;
330 }
331
332 # [ 文字コード関連 ]
333 #
334
335 sub check_code {
336 if (!(-r $jcode)) { &error(1,"jcode.pl がありません"); }
337 require $jcode;
338 local($text) = ord(substr("中澤",0,1));
339 if ($text == 0xc3) { $mojicode = "euc"; $charset_code = "EUC-JP"; }
340 elsif ($text == 0x92) { $mojicode = "sjis";$charset_code = "Shift_JIS"; }
341 else { &error(1,"サポートしてない文字コードです"); }
342 }
343 sub change_code {
344 local($text)=$_[0];
345 &jcode'convert(*text,$mojicode);
346 if ($mojicode eq 'sjis') { &jcode'h2z_sjis(*text); }
347 if ($mojicode eq 'euc') { &jcode'h2z_euc(*text); }
348 $text =~ s/</&lt;/g;
349 $text =~ s/>/&gt;/g;
350 return $text;
351 }
352
353 # [ 自動リンク処理(独自方式 v1.9 LE)]
354 #
355
356 sub auto_link {
357 local($text) = $_[0];
358 &jcode'convert(*text,'euc');
359 $text =~ s/(http:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%]+)/<A HREF=\"$1\">$1<\/A>/ig;
360 $text =~ s/(ftp:\/\/[\w\.\~\-\/]+)/<A HREF=\"$1\">$1<\/A>/ig;
361 $text =~ s/([\w\.\-]+)\@([\w\.\-]+)/<A HREF=\"mailto\:$1\@$2\">$1\@$2<\/A>/ig;
362 &jcode'convert(*text,$mojicode);
363 return $text;
364 }
365
366 # [ 記録ファイルの処理 ]
367 #
368
369 sub write_file {
370 my($count,$this_nj,@lines) = @_;
371
372 #プロセスID からテンポラリファイル名を生成
373 $pros = $$;
374 $pros = time unless $pros;
375 $tmp_file = "$ID$pros.tmp";
376
377 #他のテンポラリファイルを検索
378 opendir(DIR,$log_dir) or &error('システムエラー','作業ディレクトリのオープンに失敗しました。管理者が何かを忘れている可能性があります。');
379 @list = readdir(DIR);
380 closedir(DIR);
381 unless (@list) { &error('システムエラー','作業ディレクトリが完全に空です。'); }
382 @lists = grep(/$ID.*\.tmp/,@list);
383
384 #テンポラリファイルがある場合
385 my($retry_counter) = $retry;
386 while (@lists) {
387 if (--$retry_counter <= 0) {
388 #しびれを切らした
389 foreach (@lists) {
390 #テンポラリファイルを抹殺
391 unlink("$log_dir$_") if (-e "$log_dir$_");
392 }
393 &error('ビジー','ただ今混雑しています。時間をおいて再度実行してください。');
394 }
395 sleep(1);
396 opendir(DIR,"$log_dir");
397 @list = readdir(DIR);
398 closedir(DIR);
399 @lists = grep(/$ID.*\.tmp/,@list);
400 }
401
402 #テンポラリファイルに書き込む
403 open(WRITE,">$log_dir$tmp_file") or &error('書き込みエラー','記録ファイルの書き込みが出来ません。管理者に連絡してください。');
404 print WRITE "$count\n";
405 print WRITE "$this_nj\n";
406 print WRITE @lines;
407 close(WRITE);
408
409 #もう一度他のテンポラリファイルを検索
410 opendir(DIR,$log_dir);
411 @list = readdir(DIR);
412 closedir(DIR);
413 @lists = grep(/$ID.*\.tmp/,@list);
414 @lists = grep(!/$tmp_file/,@lists);#自分自身は除外
415 if (@lists) {
416 #他で書き込み中であれば書き込みを中止して終了
417 unlink("$log_dir$tmp_file") if (-e "$log_dir$tmp_file");
418 &error('書き込みの競合','同時に複数の書き込みが行われようとしたため、処理を中止しました。すこし時間をおいてから、再度ご利用下さい。');
419 }
420
421 rename("$log_dir$tmp_file",$logfile) or &error('書き込みの競合','書き込みに失敗しました。再度実行してください。');
422 chmod 0666, $logfile;
423 }
424
425 # [ エラー処理 ]
426 #
427
428 sub error {
429 ($err,$err_msg) = @_;
430 if ($err) {
431 print "Content-type: text/html; charset=$charset_code\n\n";
432 print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html lang="ja"><body>';
433 }
434 print<<"_EOF_";
435 <p>エラー:$err_msg</p>
436 </body></html>
437 _EOF_
438 exit;
439 }
440
441 sub read_all{
442 open(LOG,$logfile) or &error('読み込みエラー','ログの読み込みが出来ません。管理者に連絡してください。');
443 $count = <LOG>;
444 chop($count);
445 $last_nj = <LOG>;
446 chop($last_nj);
447 @logs = <LOG>;
448 close(LOG);
449 }

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24