/[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 - (hide annotations) (download)
Mon Dec 3 06:23:31 2001 UTC (23 years ago) by wakaba
Branch: MAIN
Branch point for: wakaba
Initial revision

1 wakaba 1.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