#! /usr/local/bin/perl
# ↑この上のPerlのパスを書き換えるのはお約束ですね
#==========================================================================================
#
# マルチボード掲示板システム 『MultiBBS』ver 1.3 : 新規登録専用スクリプト
#
# Copyright Shinobu Suzuki 1998. All rights reserved.
#-----------------------------------------------------------------------------------------
# HomePage : http://www.aikis.or.jp/~s-suzuki/cgilabo/
# E-mail : s-suzuki@aikis.or.jp
# Version : 1.32
# Update : 1999/02/27
#-----------------------------------------------------------------------------------------
# ■MultiBBSの掲示板作成専用のスクリプトです
# ■admin.cgiを使った作成とちがって、管理者パスワードの入力の必要がありません
# ■sendmailを用いて、作成時にメールが届くようにできます
# ****
# ■このスクリプトは config.cgi を参照しています
#==========================================================================================
# CERN HTTPDなどのサーバーの場合で、ファイル関係のエラーが
# 出る場合、設置するディレクトリのフルパスを指定してみて下
# さい。なお、最後は / で終わること。
# 例) $path = "/home/users/s-suzuki/public_html/bbs/";
#----------------------------------------------------------
$path = "";
#----------------------------------------------------------
# 共通設定ファイルの指定
#----------------------------------------------------------
require "$path"."config.cgi";
#----------------------------------------------------------
# 日本語コード変換ライブラリの指定
#----------------------------------------------------------
require "$path"."jcode.pl";
#----------------------------------------------------------
# ここからは動作設定
#----------------------------------------------------------
$indexname = '戻る'; # regist.cgiからの戻り先
$index = './'; # regist.cgiからの戻り先(URL)
#----------------------------------------------------------
# sendmailを使った通知機能
# ※設置するプロバイダのsendmailが使える場合のみ
#----------------------------------------------------------
$send_mail = '0'; # sendmailを利用したメール通知(0:しない,1:する)
$sendmail = '/usr/lib/sendmail'; # sendmailのパス(例)
$mailto = 'aaaa@aaaa.ne.jp'; # 通知先のメールアドレス
$subject = 'MultiBBS:新規作成の通知'; # メールタイトル
#=====================================================================
# これより、処理の開始
#=====================================================================
&form; # フォーム入力されたデータの解析と格納
#-----------------------------------------------------
# フォームから渡されてきた引数の解析
#-----------------------------------------------------
if ( $FORM{'task'} eq 'check_bord' ) {
&check_bord;
}
else {
&make_bord;
}
exit;
#=====================================================================
# 処理はここまで(以下は、サブルーチン)
#=====================================================================
#-----------------------------------------------------
# 掲示板の新規作成画面
#-----------------------------------------------------
sub make_bord {
#-----------------------------------
# 開設されているボード数のチェック
#-----------------------------------
if ( $max_bord ne "0" ) {
if ( $path ne "" ) {
opendir(DIR,"$path"."log/");
}
else {
opendir(DIR,"./log/");
}
@readlist = grep(/.cfg/, readdir(DIR));
closedir(DIR);
$i = 0;
foreach $bord (@readlist) {
$i++;
}
if ( $i >= $max_bord ) {
&error('これ以上ボードを作成できません。');
}
}
print "Content-type: text/html\n\n";
print "\n";
print "
\n";
print "MultiBBS:新規作成\n";
print "\n\n";
print "\n\n";
print "MultiBBS:ボードの新規作成
\n";
print "
\n\n";
print "\n";
print "\n";
print "\n";
}
#-----------------------------------------------------
# ボードデータの新規作成
#-----------------------------------------------------
sub check_bord {
if ( $path ne "" ) {
$cfg_file = "$path"."log/"."$FORM{'bordname'}".".cfg";
$log_file = "$path"."log/"."$FORM{'bordname'}".".log";
}
else {
$cfg_file = "./log/$FORM{'bordname'}".".cfg";
$log_file = "./log/$FORM{'bordname'}".".log";
}
# 入力されたデータのチェック
$pwd_len=length("$FORM{'pass1'}");
if ( $FORM{'pass1'} ne $FORM{'pass2'} ) {
&error("入力されたパスワードが一致しません。");
}
elsif ( $FORM{'pass1'} =~ /\s/ || $FORM{'pass1'} =~ /\W/ ) {
&error("パスワードは半角英数字のみ利用できます。");
}
elsif ( $pwd_len > 8 || $pwd_len < 4 ) {
&error("パスワードの長さは4〜8文字です。");
}
elsif ( $FORM{'bordname'} =~ /\s/ || $FORM{'bordname'} =~ /\W/ ) {
&error("ボード名は半角英数字のみ利用できます。");
}
if ( $FORM{'page'} > $page_max || $FORM{'page'} < 0 ) {
&error("1ページの表示数は0〜$page_maxです。");
}
$now = time;
($p1, $p2) = unpack("C2", "admin");
$wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
$nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
$pwd = crypt( $FORM{'pass1'}, $nsalt);
if ($FORM{'bordname'} eq "") {
&error("ボード名が記入されていません。");
}
if ($FORM{'title'} eq "" ) {
&error("タイトルが記入されていません。");
}
if ($FORM{'user_name'} eq "" ) {
&error("主催者名が記入されていません。");
}
if ($FORM{'user_email'} eq "" ) {
&error("主催者のE-Mailが記入されていません。");
}
#-----------------------------------------------------------
if ( !cheack_jp($FORM{'user_email'}) ) {
&error("JPドメインのMAILアドレスが必要です。");
}
if ( !cheack_email($FORM{'user_email'}) ) {
&error("無料・転送系のアドレスは無効です。");
}
#-----------------------------------------------------------
if ( open(CFG,"$cfg_file") ) {
close(CFG);
&error("このボード名はすでに利用されています。他のボード名で利用してください。");
}
if ( $FORM{'max'} > $log_max || $FORM{'max'} < $log_min ) {
&error("保存するログ数が正しくありません。($log_min〜$log_max)");
}
if (!open(CFG,">$cfg_file")) {
&error("ボード定義ファイルを作成できません。");
}
if (!open(LOG,">$log_file")) {
close(CFG);
&error("ログファイルを作成できません。");
}
close(LOG);
print CFG "title,$FORM{'title'},\n";
print CFG "user_pass,$pwd,\n";
print CFG "user_name,$FORM{'user_name'},\n";
print CFG "user_email,$FORM{'user_email'},\n";
print CFG "security,$security,\n";
print CFG "max,$FORM{'max'},\n";
print CFG "page,$FORM{'page'},\n";
if ( $bg_mode eq "1" ) {
print CFG "bg_image,$FORM{'bg_image'},\n";
}
if ( $title_mode eq "1" ) {
print CFG "title_image,$FORM{'title_image'},\n";
}
if ($FORM{'bg_col'} ne "" ) {
print CFG "bg_col,$FORM{'bg_col'},\n";
}
else {
print CFG "bg_col,$bg_col,\n";
}
if ($FORM{'title_col'} ne "" ) {
print CFG "title_col,$FORM{'title_col'},\n";
}
else {
print CFG "title_col,$title_col,\n";
}
if ($FORM{'subject_col'} ne "" ) {
print CFG "subject_col,$FORM{'subject_col'},\n";
}
else {
print CFG "subject_col,$subject_col,\n";
}
if ($FORM{'name_col'} ne "" ) {
print CFG "name_col,$FORM{'name_col'},\n";
}
else {
print CFG "name_col,$name_col,\n";
}
if ($FORM{'text_col'} ne "" ) {
print CFG "text_col,$FORM{'text_col'},\n";
}
else {
print CFG "text_col,$text_col,\n";
}
if ($FORM{'link_col'} ne "" ) {
print CFG "link_col,$FORM{'link_col'},\n";
}
else {
print CFG "link_col,$link_col,\n";
}
if ($FORM{'alink_col'} ne "" ) {
print CFG "alink_col,$FORM{'alink_col'},\n";
}
else {
print CFG "alink_col,$alink_col,\n";
}
if ($FORM{'vlink_col'} ne "" ) {
print CFG "vlink_col,$FORM{'vlink_col'},\n";
}
else {
print CFG "vlink_col,$vlink_col,\n";
}
print CFG "linkname1,$FORM{'linkname1'},\n";
print CFG "link1,$FORM{'link1'},\n";
print CFG "linkname2,$FORM{'linkname2'},\n";
print CFG "link2,$FORM{'link2'},\n";
print CFG "linkname3,$FORM{'linkname3'},\n";
print CFG "link3,$FORM{'link3'},\n";
print CFG "readme,$FORM{'readme'},\n";
print CFG "readme2,$FORM{'readme2'},\n";
close(CFG);
chmod 0666, $cfg_file;
chmod 0666, $log_file;
#--------------------------------------------------
# sendmailを使って通知
#--------------------------------------------------
if( $send_mail eq "1" ) {
&sendmail;
}
print "Content-type: text/html\n\n";
print "\n\nMultiBBS:ボードの作成\n\n\n";
print "\n\n";
print "MultiBBS:ボードの作成\n
\n\n";
print "\n";
print "新しいボードの作成が完了しました。
";
print "主催者パスワードはボード管理に必要となりますので、忘れないようにしてください。";
print "(このパスワードでボードデザインの変更や、メッセージの編集・削除ができます)\n";
print "
\n\n";
print "\n
\n
\n\n\n";
exit;
}
#-----------------------------------------------------------------
# フォーム投稿されたデータを解析し、配列にリストする
#-----------------------------------------------------------------
sub form {
#--------------------------------------------------
# フォーム入力されたデータを$bufferに格納
#--------------------------------------------------
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
#--------------------------------------------------
# $bufferに格納されたFORM形式のデータを取り出す
#--------------------------------------------------
@formtemp = split(/&/,$buffer);
foreach $pair (@formtemp) {
($name, $value) = split(/=/, $pair);
}
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#--------------------------------------------------
# 処理の都合上、改行コード等を文字列から排除する
# 改行コードを
に変換する(97.01.29)
#--------------------------------------------------
$value =~ s/\r\n/
/g;
$value =~ s/\n/
/g;
$value =~ s/\,//g;
#--------------------------------------------------
# 書き込まれたくないタグが含まれる内容を消去する
#--------------------------------------------------
$value =~ s/