#!/usr/local/bin/perl # This file is described by Shift-JIS. # yogo version 0.0.6 / 用語集 # copyright (c) 2000 by Masahiko Tokita # e-mail : BQB04357@nifty.ne.jp # 配布元 : http://www.users.yun.co.jp/~tokita/ # # [利用規定] # このプログラムはGNU GPL Ver.2に基づいて配布します。 # 著作権は放棄していませんが、配布・転載・改造は自由です。 # 転載・再配布をされる場合も、必ずコピーライトを明記して下さい。 # このプログラムを使用した結果について、製作者は一切の責任を負いません。 # 構成 ( )は設定するパーミッション値 # # ※ディレクトリの構成は環境よってことなります。 # # /任意のディレクトリ # | # |- jcode.pl (604) # |- yogo.cgi (705) CGI本体(このファイル) # | # |- /data/ (707) データ用ディレクトリ # | # |-- dic.dat (707) データファイル。 # | 初期導入時に自動で作成します。 # |-- ここに排他制御のためのファイルや一次ファイルが作られます。 # # # [注意] # このファイルは Shift-JIS で書かれています。出力するコードも Shift-JIS です。 # そのため windows の notepad などで編集できます。 # サーバにアップロードするときは、 ASCII でコードは無変換で行ってください。 # 更新履歴 # 2001/01/08 # 検索画面から編集を押したときエラーとなる不具合を修正。 # 0.0.5 → 0.0.6 # 2000/09/03 # 削除時に指定以外の用語が削除されてしまう不具合を修正。 # 用語へのリンクの表示の不具合を修正。 # 0.0.4 → 0.0.5 # 2000/07/09 # 検索機能を追加した # 0.0.3 → 0.0.4 # 2000/05/15 # ロック処理を変更。ロックファイルが残ってしまった場合の対応 # 2000/02/04 # ロック処理について改善 # ソース整理たくさん 0.0.1 → 0.0.2 # 2000/01/25 # typo を修正。key さん、thanks! # 2000/01/04 # version 0.0.1 完成 # 1999/12/31 # 登録、表示、修正、削除ができるようになった # 1999/12/27 # とりあえず製作に着手 ########################################################### # # 定義いろいろ # ############################# # # 色、デザイン # 必要に応じて変更してください # タイトル。ブラウザのタイトルバーに出る名前です。 $title = '用語集'; # メインタイトル。いちばん上に表示するタイトルです。 $maintitle = '用語集'; # トップページなど戻り先の URL $ret_url = '../index.html'; # 戻り先の名前 $ret_name = 'トップページへ'; # HTML の body タグ。用語一覧と用語登録画面で使います。 $body = ''; # 各用語へのリンクの表示列数 $yoko = 3; # 各用語へのリンクの表示行数 $tate = 10; ############################# # # プログラムの動作の定義 # 必要に応じて変更してください # 登録または修正があったときに管理者にメールを送信する。 # この機能はサーバーが UNIX な OS であり、CGI から sendmail を # 実行できるときに使えます。 # 0 : メールを送信しない(デフォルト) # 1 : メールを送信する $use_mail = 0; # sendmail のパス。通常は /usr/bin/sendmail か /usr/lib/sendmail # /usr/sbin/sendmail です。 $sendmail = '/usr/lib/sendmail'; # 管理者のメールアドレス。※必ず変更してください #$admin_address = 'foo@bar.com'; # gzip で圧縮して送信 # この機能を使うにはサーバ側で gzip がインストールされている必要が # あります。 # 0 : 圧縮しない(デフォルト) # 1 : 圧縮する $usegzip = 0; # gzip のパス $gzippath = '/bin/gzip'; ############################# # # プログラムに必要な初期定義 # 変更しないでください # version number $version = '0.0.6'; # このファイルの名前 $thisfile = 'yogo.cgi'; # データを格納するディレクトリの名前 $datadir = 'data'; # ロックファイルの名前 $lockfile = "$datadir/lockfile"; # データファイルの名前 $dicfile = "$datadir/dic.dat"; # 作業用ファイルの名前 $tmpfile = "$datadir/tmp.dat"; # 文字コード変換ライブラリ $jcodepl = 'jcode.pl'; # include jcode.pl if ( ! -f $jcodepl ) { &putHeader; &HTMLMsg( "$jcodepl が見つかりません。", "$jcodepl をアップロードしてください。" ); exit; } require $jcodepl; # crypt に必要な塩 :) $salt = '12'; # メールアドレスにマッチする正規表現 :p $mail_regex = q{(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\} . q{\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][} . q{^\\\x80-\xff\n\015"]*)*")(?:\.(?:[^(\040)<>@,;:".\\\[\]\000-\037\x} . q{80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\\} . q{xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*"))*@(?:[^(\0} . q{40)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000} . q{-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])} . q{(?:\.(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;} . q{:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x} . q{80-\xff])*\]))*}; # URL にマッチする正規表現 $http_URL_regex = q{s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+}; ########################################################### # # メイン処理 # &main; exit; sub main { local( $buf, $key, $value, @pairs ); # データを読み込む if ( $ENV{'REQUEST_METHOD'} eq 'POST' ) { # POST の場合 read( STDIN, $buf, $ENV{'CONTENT_LENGTH'} ); } else { # GET の場合 $buf = $ENV{'QUERY_STRING'}; } # データが送られてきていないとき if ( $buf eq '' ) { # 通常表示 &putHeader; &showDic; } # データが送られてきたとき else { # データ解析 @pairs = split( /&/, $buf ); foreach ( @pairs ) { ($key, $value) = split( /=/, $_ ); &decodeData( *key ); &decodeData( *value ); $postdata{ $key } = $value; } # 用語登録画面を表示 if ( $postdata{ 'action' } eq 'form' ) { &putHeader; &showForm; } # 新しい用語を登録 elsif ( $postdata{ 'action' } eq 'regist' ) { ®ist; &putHeader; &showDic; } # 用語編集画面を表示 elsif ( $postdata{ 'action' } eq 'edit' ) { &putHeader; &edit; } # 用語修正 elsif ( $postdata{ 'action' } eq 'update' ) { &update; &putHeader; &showDic; } # 用語削除 elsif ( $postdata{ 'action' } eq 'delete' ) { &putHeader; &delete; &showDic; } # 管理者パスワード初期設定フォームを表示 elsif ( $postdata{ 'action' } eq 'showKeyRegistForm' ) { &putHeader; &showKeyRegistForm(); } # 管理者パスワード変更フォーム表示 elsif ( $postdata{ 'action' } eq 'admin' ) { &putHeader; &admin; } # 管理者パスワード変更 elsif ( $postdata{ 'action' } eq 'passwd' ) { &putHeader; &passwd; &showDic; } # 検索用フォーム表示 elsif ( $postdata{ 'action' } eq 'findform' ) { &putHeader; &showFindForm; } # 検索用フォーム表示 elsif ( $postdata{ 'action' } eq 'find' ) { &putHeader; &find; } } } ############################# # 用語一覧表示 sub showDic { local( $header, @foo, $i, $yoko_count ); if ( open( DIC, $dicfile ) == 0 ) { ✓ # エラーの原因を自己診断する。 exit; } $header = ; if ( ! ( $header =~ /^yogo:/ ) ) { &showKeyRegistForm; exit; } print <<"HTML"; $title $body

$maintitle


[ 新しい用語を登録 ] [ 用語検索 ] [ $ret_name ]

HTML # 各用語へのリンクを表示 print "\n"; print "\n"; print "
\n"; for ( $i=0, $yoko_count=0; $_=; $i++ ) { @foo = split( /\t/, $_ ); print "$foo[ 1 ]
\n"; if ( $tate-1 == $i % $tate) { $yoko_count++; if ( $yoko == $yoko_count ) { print "

\n"; $yoko_count = 0; next; } print "\n"; } } print "
\n"; print "
\n"; print "
\n"; print "
[ 新しい用語を登録 ] [ 用語検索 ] [ $ret_name ]

管理者用
YOGO $version
HTML close( DIC ); } ############################# # 用語登録画面表示 sub showForm { # クッキーを読む &readCookie( 'yogo' ); print <<"HTML" $title $body

用語登録

用語一覧へ戻る

用  語
意味・使用例
投稿者名
パスワード (必ず入力する。用語の編集用。)
クッキー情報を保存
■このフォームから用語を登録します。
■投稿者名は省略可能\です。
HTML } ############################# # 新しい言葉を登録 sub regist { local( $pass, $code, $password, $key ); if ( $postdata{'yogo'} eq '' ) { &putHeader; HTMLMsg( '用語が入力されていません', '用語を入力してください' ); exit; } if ( $postdata{'imi'} eq '' ) { &putHeader; HTMLMsg( '意味が入力されていません', '意味を入力してください' ); exit; } if ( $postdata{'pass'} eq '' ) { &putHeader; HTMLMsg( 'パスワードが入力されていません', 'パスワードを入力してください' ); exit; } if ( &lock == 0 ) { &putHeader; &HTMLMsg( 'ただ今混雑しています', 'この画面のまましばらく待ってから
' . 'ブラウザの[更新]ボタンを押してください' ); exit; } if ( open( DIC, $dicfile ) == 0 ) { &putHeader; &HTMLMsg( "$dicfile が開けません" ); &unlock; exit; } if ( open( TMP, '>' . $tmpfile ) == 0 ) { close( DIC ); &unlock; &putHeader; &HTMLMsg( "$tmpfile が開けません" ); exit; } $header = ; ( $code, $password, $key ) = split( /:/, $header ); printf( TMP "yogo:%s:%d\n", $password, ++$key ); # 用語の先頭についているスペース、SHIFT-JISのスペースを削除 # (データは&decodeDataにてSHIFT-JISに変換済み) while ( $postdata{'yogo'} =~ s/^ //g or $postdata{'yogo'} =~ s/^\201\100//g ) { } $postdata{'imi'} =~ s/\r\n/\r/g; $postdata{'imi'} =~ s/\n/\r/g; $pass = crypt( $postdata{'pass'}, $salt ); # 用語を書き込む while ( ) { @foo = split( /\t/, $_ ); # 文字列として比較して、登録する用語が大きかったらループ抜ける if ( $postdata{'yogo'} lt $foo[ 1 ] ) { last; } print TMP; } # 登録する用語を書き込む print TMP "$key\t$postdata{'yogo'}\t$postdata{'imi'}\t$postdata{'name'}\t$pass\n"; # 前のループで読んでいた分を書き込む print TMP; # 残りを書き込む while ( ) { print TMP; } close( DIC ); close( TMP ); if ( open( DIC, '>' . $dicfile ) == 0 ) { &putHeader; &HTMLMsg( "$dicfile が開けません" ); &unlock; exit; } if ( open( TMP, $tmpfile ) == 0 ) { close( DIC ); &unlock; &putHeader; &HTMLMsg( "$tmpfile が開けません" ); exit; } # テンプファイルからデータファイルへコピーする while ( ) { print DIC; } close( DIC ); close( TMP ); &unlock; # メールを送信する if ( $use_mail ) { &send_mail( "\[YOGO\]New yogo added", "yogo message\n新しい用語 \"$postdata{'yogo'}\" が追加されました"); } # クッキーを書き込む if ( $postdata{ 'cookie' } eq 'on' ) { # 書き込み &set_cookie( "yogo", "pass\:$postdata{ 'pass' },name\:$postdata{ 'name' }" ); # この後用語一覧を表示するときに使う $ENV{ 'HTTP_COOKIE' } = "yogo=pass:$postdata{'pass'}"; } } ############################# # 用語編集画面を表示 sub edit { local( $flag, @foo ); # クッキーを読む &readCookie( 'yogo' ); if ( &lock == 0 ) { &HTMLMsg( 'ただ今混雑しています', 'ただいま混雑しております。しばらくしてから変更してください' ); exit; } if ( open( DIC, $dicfile ) == 0 ) { &HTMLMsg( "$dicfile が開けません" ); &unlock; exit; } # ヘッダーを読み飛ばす ; $flag = ''; while ( ) { @foo = split( /\t/, $_ ); if ( $postdata{ 'key' } eq $foo[ 0 ] ) { $flag = 1; last; } } close( DIC ); &unlock; # 選択したデータが見つからなかった場合 if ( $flag eq '' ) { &unlock; &HTMLMsg( 'データファイルが異常です' ); exit; } print <<"HTML" $title $body

用語編集

用語一覧へ戻る

用語削除

用語 $foo[ 1 ] を削除する
パスワード
■管理者パスワードで全ての用語を削除できます。

用語修正

用  語 $foo[ 1 ]
意味・使用例
投稿者名
パスワード
■投稿者名のみ省略可能\です。
HTML } ############################# # 用語修正 sub update { local( $header, @foo ); if ( $postdata{'yogo'} eq '' ) { &putHeader; HTMLMsg( '用語が入力されていません', '用語を入力してください' ); exit; } if ( $postdata{'imi'} eq '' ) { &putHeader; HTMLMsg( '意味が入力されていません', '意味を入力してください' ); exit; } if ( $postdata{'pass'} eq '' ) { &putHeader; HTMLMsg( 'パスワードが入力されていません', 'パスワードを入力してください' ); exit; } if ( &lock == 0 ) { &putHeader; &HTMLMsg( 'ただ今混雑しています', 'ただいま混雑しております。しばらくしてから変更してください' ); exit; } if ( open( DIC, $dicfile ) == 0 ) { &unlock; &putHeader; &HTMLMsg( "$dicfile が開けません" ); exit; } if ( open( TMP, '>' . $tmpfile ) == 0 ) { close( DIC ); &unlock; &putHeader; &HTMLMsg( "$tmpfile が開けません" ); exit; } $header = ; print TMP $header; # 用語の先頭についているスペース、SHIFT-JISのスペースを削除 # (データは&decodeDataにてSHIFT-JISに変換済み) while ( $postdata{'yogo'} =~ s/^ //g or $postdata{'yogo'} =~ s/^\201\100//g ) { } # 改行を全て "\r" に変換 $postdata{'imi'} =~ s/\r\n/\r/g; $postdata{'imi'} =~ s/\n/\r/g; # 書き込む while ( ) { chomp; @foo = split( /\t/, $_ ); if ( $postdata{'key'} eq $foo[ 0 ] ) { # 該当の用語の場合 # パスワードチェック if ( crypt( $postdata{'pass'}, $salt ) ne $foo[ 4 ] ) { close( DIC ); close( TMP ); &unlock; &putHeader; &HTMLMsg( 'パスワードが違います' ); exit; } print TMP "$postdata{'key'}\t$postdata{'yogo'}\t$postdata{'imi'}\t$postdata{'name'}\t$foo[ 4 ]\n"; } else { # 該当の用語以外 print TMP "$_\n"; } } close( DIC ); close( TMP ); if ( open( DIC, '>' . $dicfile ) == 0 ) { &unlock; &putHeader; &HTMLMsg( "$dicfile が開けません" ); exit; } if ( open( TMP, $tmpfile ) == 0 ) { close( DIC ); &unlock; &putHeader; &HTMLMsg( "$tmpfile が開けません" ); exit; } # 一次ファイルからデータファイルへコピーする while ( ) { print DIC; } close( DIC ); close( TMP ); &unlock; # メールを送信する if ( $use_mail ) { &send_mail( "\[YOGO\]yogo updated", "yogo message\n用語 \"$postdata{'yogo'}\" が修正されました"); } # クッキーを書き込む if ( $postdata{ 'cookie' } eq 'on' ) { # 書き込み &set_cookie( "yogo", "pass\:$postdata{ 'pass' },name\:$postdata{ 'name' }" ); # この後用語一覧を表示するときに使う $ENV{ 'HTTP_COOKIE' } = "yogo=pass:$postdata{'pass'}"; } } ############################# # 用語削除 sub delete { local( $kanri_pass, @foo, $yogo ); if ( &lock == 0 ) { &HTMLMsg( 'ただ今混雑しています', 'ただいま混雑しております。しばらくしてから変更してください' ); exit; } if ( open( DIC, $dicfile ) == 0 ) { &HTMLMsg( "$dicfile が開けません" ); &unlock; exit; } if ( open( TMP, '>' . $tmpfile ) == 0 ) { close( DIC ); &unlock; &HTMLMsg( "$tmpfile が開けません" ); exit; } $_ = ; print TMP; @foo = split( /:/, $_ ); $kanri_pass = $foo[ 1 ]; # 書き込む while ( ) { chomp; @foo = split( /\t/, $_ ); if ( $postdata{'key'} eq $foo[ 0 ] ) { # 該当の用語の場合 # パスワードチェック if ( crypt( $postdata{'pass'}, $salt ) ne $foo[ 4 ] and crypt( $postdata{'pass'}, $salt ) ne $kanri_pass ) { close( DIC ); close( TMP ); &unlock; &HTMLMsg( 'パスワードが違います' ); exit; } $yogo = $foo[ 1 ]; } else { # 該当の用語以外 print TMP "$_\n"; } } close( DIC ); close( TMP ); if ( open( DIC, '>' . $dicfile ) == 0 ) { &HTMLMsg( "$dicfile が開けません" ); &unlock; exit; } if ( open( TMP, $tmpfile ) == 0 ) { close( DIC ); &unlock; &HTMLMsg( "$tmpfile が開けません" ); exit; } # 一次ファイルからデータファイルへコピーする while ( ) { print DIC; } close( DIC ); close( TMP ); &unlock; # メールを送信する if ( $use_mail ) { &send_mail( "\[YOGO\]yogo deleted", "yogo message\n用語\"$yogo\" が削除されました"); } } ############################# # # 管理者パスワード初期設定フォームを表示 # sub showKeyRegistForm { print <<"HTML"; yogo $version / 管理者パスワード初期設定

管理者パスワード初期設定

パスワード
パスワード(もう一度)
yogo $version
HTML } ############################# # # 管理者パスワード変更フォームを表示 # sub admin { print <<"HTML"; yogo $version / 管理者パスワード変更
管理者パスワード変更
いままでのパスワード
新しいパスワード
新しいパスワード(もう一度)
yogo $version
HTML } ############################# # # 管理者パスワード変更 # sub passwd { local( $code, $password, $key, $foo, $bar ); if ( $postdata{ 'newpass' } eq '' or $postdata{ 'newpass' } ne $postdata{ 'newpass2' } ) { &HTMLMsg( '入力が不正です' ); exit; } if ( &lock == 0 ) { &HTMLMsg( 'ただ今混雑しています', 'ただいま混雑しております。しばらくしてから変更してください' ); exit; } if ( open( DIC, $dicfile ) == 0 ) { &HTMLMsg( "$dicfile が開けません" ); &unlock; exit; } if ( open( TMP, '>' . $tmpfile ) == 0 ) { close( DIC ); &unlock; &HTMLMsg( "$tmpfile が開けません" ); exit; } $_ = ; chomp; ($code, $password, $key ) = split( /:/, $_ ); if ( $code eq "yogo" and $password ne crypt( $postdata{ 'oldpass' }, $salt ) ) { # パスワードが違う場合 &HTMLMsg( "パスワードが違います" ); close( DIC ); close( TMP ); &unlock; exit; } # 新しいパスワードを crypt で変換する。 $password = crypt( $postdata{ 'newpass' }, $salt ); # ヘッダー書き込み print TMP "yogo:$password:$key\n"; # データを一次ファイルへ書き込む while ( ) { print TMP; } close( DIC ); close( TMP ); if ( open( DIC, '>' . $dicfile ) == 0 ) { &HTMLMsg( "$dicfile が開けません" ); &unlock; exit; } if ( open( TMP, $tmpfile ) == 0 ) { close( DIC ); &unlock; &HTMLMsg( "$tmpfile が開けません" ); exit; } # 一次ファイルからデータファイルへコピーする while ( ) { print DIC; } close( DIC ); close( TMP ); &unlock; } ############################# # # 検索フォーム表示 # sub showFindForm { print <<"HTML"; yogo $version / 用語検索 $body

用語検索

用語集へ戻る
キーワード
検索条件AND OR
■検索したいキーワードを入力し、検索条件を選択し「検索する」を押してください。
■複数のキーワードを入力するときは、半角スペースで区切って下さい。

yogo $version

HTML } ############################# # 用語検索 sub find { local( $header ); if( open( DIC, $dicfile ) == 0 ) { ✓ # エラーの原因を自己診断する。 exit; } $_ = ; # ヘッダーを読み飛ばす $_ = ; # 上と同じ @lines = ; close( DIC ); print <<"HTML"; yogo $version / 用語検索 $body

用語検索結果

用語集へ戻る
キーワード
検索条件AND OR
■検索したいキーワードを入力し、検索条件を選択し「検索する」を押してください。
■複数のキーワードを入力するときは、半角スペースで区切って下さい。
HTML # ワード検索の実行と結果表示 if ($postdata{'word'} ne "") { # 入力内容を整理 $cond = $postdata{'cond'}; $word = $postdata{'word'}; $word =~ s/ / /g; $word =~ s/\t/ /g; @pairs = split(/ /,$word); shift(@lines); # 検索処理 foreach $line (@lines) { $flag = 0; foreach $pair (@pairs){ if (index($line,$pair) >= 0){ $flag = 1; if ($cond eq 'or') { last; } } else { if ($cond eq 'and'){ $flag = 0; last; } } } if ($flag == 1) { push(@new,$line); } } # 検索終了 $count = @new; print "
検索結果:$count件

\n"; print "

    \n"; foreach $line (@new) { ($num,$yogo,$imi,$name) = split(/\t/,$line); # 結果を表示 $yogo = &toHTML_no( $yogo ); $imi = &toHTML( $imi ); $name = &toHTML_no( $name ); print "
  1. $yogo $name 編集
    \n"; print "$imi\n"; print "
    \n
    \n"; } print "
\n"; } print <<"HTML"

yogo $version

HTML } ############################# # ヘッダー表示 sub putHeader { if( $usegzip and $ENV{'HTTP_ACCEPT_ENCODING'}=~/gzip/ ){ # 圧縮して送信 print "Content-type: text/html\n"; print "Content-encoding: gzip\n\n"; open(STDOUT,"| $gzippath -1 -c"); }else{ # 普通のヘッダー print "Content-type: text/html\n\n"; } } ############################# # データをデコード sub decodeData{ local(*queryString) = @_ if @_; # +を空白に置き換える $queryString =~ s/\+/ /g; # 16進数を変換する $queryString =~ s/%(..)/pack("c",hex($1))/ge; # SHIFT-JIS へ変換 &jcode'convert(*queryString,'sjis'); # TAB が来たらスペースに置きかえる $queryString =~ s/\t/ /g; return 1; } ############################# # HTML でメッセージを表示する sub HTMLMsg { local( $msg1, $msg2 ) = @_; print <<"HTML"; yogo $version メッセージ

$msg1

$msg2 HTML } ############################# # # 自己診断 # ファイルのパーミッションなどのチェック sub check { print <<"HTML"; yogo $version / 自己診断

yogo $version / 自己診断

HTML if ( ! -d $datadir ) { print "ディレクトリ $datadir が存在しません。
\n"; print "$thisfile があるディレクトリの直下にディレクトリ $datadir を作成して、書き込み権、実行権を付けてください。
\n"; } elsif ( ! -w $datadir ) { print "ディレクトリ $datadir が書き込み可能\となっていません。
\n"; print "書き込み権、実行権を付けてください。
\n"; } elsif ( ! -x $datadir ) { print "ディレクトリ $datadir が実行可能となっていません。
\n"; print "$datadir に、実行権を付けてください。
\n"; } elsif ( ! -f $jcodepl ) { print "$jcodepl が見つかりません。
\n"; print "$jcodepl をアップロードしてください。
\n"; } elsif ( ! -f $dicfile ) { print "$dicfile が存在しません。
\n"; print "$dicfile を作成します。
\n"; unless ( open( DIC, '>' . $dicfile ) ) { print "$dicfile の作成に失敗しました。
\n"; } else { # ここまで来てやっと成功 close( DIC ); print "$dicfile の作成に成功しました。
\n"; print "下のリンクをクリックするか、ブラウザで再読み込みを行ってください。
\n"; print "管理者パスワード初期設定へ\n"; } } else { print "原因不明エラーです。\n"; } print " \n"; print "\n"; exit; } ############################# # 排他制御のためにデータファイルをロックする sub lock { return 1 if $fflag; # すでに自分でロック済の場合 my $now = time(); if ( -e $lockfile ) { # ロック中だった場合、30秒より前のロックだったら # 時刻を現在に設定し正常終了 if ( $now - (stat(_))[9] > 30 ) { utime( $now, $now, $lockfile ); $fflag = 1; return 1; } else { for ( $_=0; -e $lockfile; $_++ ) { if ( 3 <= $_ ) { # 最大3回×1秒待つ return 0; } sleep( 1 ); # 1秒待つ } open (LOCK,">$lockfile"); close(LOCK); $fflag = 1; return 1; } return 0; } open (LOCK,">$lockfile"); close(LOCK); $fflag = 1; return 1; } ############################# # ロックを解除する sub unlock { unlink($lockfile); } ############################# # toHTML : # HTML に出力できるように文字列を変換する # '&' to '&' # '<' to '<' # '>' to '>' # '"' to '&quat;' # 改行を "\n" に変換 # URL とメールアドレスをリンクに変換 # sub toHTML { local( $s ) = @_; $s =~ s/&/&/g; $s =~ s//>/g; $s =~ s/"/"/g; $s =~ s/\r\n/
\n/g; $s =~ s/\n/
\n/g; $s =~ s/\r/
\n/g; $s =~ s/($http_URL_regex)/$1<\/A>/g; $s =~ s/($mail_regex)/$1<\/A>/g; return $s; } ############################# # toHTML_no : # toHTMLの自動リンクなし版 # sub toHTML_no { local( $s ) = @_; $s =~ s/&/&/g; $s =~ s//>/g; $s =~ s/"/"/g; $s =~ s/\r\n/
\n/g; $s =~ s/\n/
\n/g; $s =~ s/\r/
\n/g; return $s; } ############################# # クッキーを読む sub readCookie { local( $cname ) = @_; local( @pairs, $pair, $key, $val ); @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($key,$val) = split(/=/,$pair,2); $key =~ s/ //g; if ($key eq $cname) { @pairs = split(/,/,$val); foreach $pair (@pairs) { ($key,$val) = split(/:/,$pair,2); $COOKIE{$key} = $val; } last; } } } ############################# # クッキーを書く sub set_cookie{ #Copyright(C) to-ru@big.or.jp (1.20以降 2000年対応 NEWバージョン) local($name,$value) = @_; local($sec,$min,$hour,$mday,$mon,$year,$wday,$date); local($days) = 900; # Expire Date(有効期間。デフォルト180日) ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time+$days*24*60*60))[0,1,2,3,4,5,6]; $sec = "0$sec" if($sec < 10); $min = "0$min" if($min < 10); $hour = "0$hour" if($hour < 10); $mday = "0$mday" if($mday < 10); $year += 1900; $year += 100 if($year < 1970); # 2000年対策 $wday = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat")[$wday]; $mon = ("Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec")[$mon]; $date = "$wday, $mday\-$mon\-$year $hour:$min:$sec GMT"; print "Set-Cookie: $name=$value; expires=$date\n"; # クッキー出力 } ############################# # メール送信 sub send_mail { local( $sub, $msg ) = @_; local( $send_msg ); $send_msg = <<"MSG"; MIME-Version: 1.0 From: $admin_address To: $admin_address Subject: $sub Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit \n $msg MSG #メールで標準の形態、漢字コードJIS、改行コードLFに変換する。 $mail_mes=~ s/\r\n/\n/g; #改行コードを変換 $mail_mes=~ s/\r/\n/g; #改行コードを変換 &jcode'convert($mail_mes, 'jis'); #漢字コードをJISに #メールを送出 open ( MAIL, "|$sendmail " . $admin_address ); print MAIL "$send_msg"; close ( MAIL ); } ############################# # The end of yogo