#!/usr/local/bin/perl
# ↑ここをサーバの環境に合わせて書き換えてください。
# ほとんどの場合、 /usr/local/bin/perl か /usr/bin/perl です。
# ---
# This file is described by Shift-JIS.
# PROFILER version 0.0.6 / 自己紹介登録CGI
# copyright (c) 1999-2001 by Masahiko Tokita
# e-mail : BQB04357@nifty.ne.jp
# 配布元 : http://www.users.yun.co.jp/~tokita/
# $Id: profiler.txt,v 1.9 2001/08/05 05:23:46 mik Exp $
# $Source: /cvs/profiler/profiler.txt,v $
#
# [利用規定]
# このプログラムはGNU GPL Ver.2に基づいて配布します。
# 著作権は放棄していませんが、配布・転載・改造は自由です。
# 転載・再配布をされる場合も、必ずコピーライトを明記して下さい。
# このプログラムを使用した結果について、製作者は一切の責任を負いません。
# [基本構成] ( )内は設定する必要があるパーミッション値
#
# ※ディレクトリの構成は環境よって異なります。
#
# /任意のディレクトリ/
# |
# |- jcode.pl (604)
# |- profiler.cgi (705) CGI本体(このファイル)
# |
# |- /data/ (707)
# |
# |- profiler.dat (707) データファイル。
# | 初期導入時に自動で作成します。
# |- ここに排他制御のためのファイルや一次ファイルが作られます。
#
#
# [注意]
# このファイルは Shift-JIS で書かれています。出力するコードも Shift-JIS です。
# サーバにアップロードするときは、 ASCII でコードは無変換で行ってください。
# [更新履歴]
#2001/03/18
# 削除時に選択外の自己紹介も消えてまう不具合を修正。
# 管理者の場合でも複数選択で削除はできないようにした。
# (削除する時は1件ずつ行う) 0.0.4 → 0.0.5
#2000/10/09
# 検索機能を追加。
# 修正すると、リストのトップにあがるように変更 0.0.3n → 0.0.4
#2000/07/24
# ランセンスをGPLに変更
#2000/05/14
# ロック処理を変更。ロックファイルが残ってしまった場合の対応
# 二重書き込み対応
# ソース整理 0.0.3m → 0.0.3n
#2000/02/06
# typo を修正しましました。久保田さん thanks!
#2000/01/04
# データを改ざんできる問題を修正しました。0.0.3l → 0.0.3m
#1999/12/28
# テーブルの背景色を変更。
#1999/12/17
# 文言一部変更。 0.0.3k → 0.0.3l
#1999/12/16
# 何件から何件までを表示するようにしました。
# 登録または修正時に文字数をチェックするようにしました。
# テーブルタグの指定をスタイルシートで行うようにしました。
#1999/11/25
# 画像ファイルの URL のみの登録はエラーとして登録しないようにしました。
# 0.0.3j → 0.0.3k
#1999/11/20
# クッキーを間違えて読む不具合を修正しました。 0.0.3i → 0.0.3j
#1999/11/18
# 登録または修正があったとき管理者にメールを送れるようにしました。
# 0.0.3h → 0.0.3i
#1999/11/14
# 文言一部変更。
#1999/11/12
# クッキーを使うか選択できるようにしました。 0.0.3g → 0.0.3h
#1999/11/07
# デフォルトの perl のパスを /usr/bin/perl から /usr/local/bin/perl に変更。
#1999/11/04
# 登録フォームに項目を追加。
#1999/11/02
# このファイルの文字コードを EUC から SHIFT-JIS にしました。0.0.3f → 0.0.3g
#1999/11/01
# 自己紹介情報を不正に変更できる問題を修正しました。
# 修正フォームで項目を追加できるようにしました。 0.0.3e → 0.0.3f
#1999/10/29
# デフォルトの profiler.dat の位置を data/ の下に変更しました。
# profiler.dat を自動で作成するようにしました。
# 自己診断機能を追加しました。
#1999/10/25
# デザイン一部変更。ドキュメント修正。入力項目追加。0.0.3d → 0.0.3e
#1999/10/22
# ソースファイル整理。効率改善少々。0.0.3c → 0.0.3d
#1999/10/20
# ソースファイル整理。
#1999/10/18
# ドキュメントを一部修正しました。
# 修正画面表示で自己紹介情報を複数選択時、たまは選択しなかったときの
# エラーチェックが間違っていたのを修正しました。0.0.3b →0.0.3c
#1999/10/17
# ページ表示するようにしました。0.0.3a → 0.0.3b
#1999/10/15
# gzip で圧縮して送信する機能を追加しました。
#1999/10/11
# 削除を行ったとき、パスワードが同じ自己紹介情報を消してしまう不具合を
# 修正しました。
# フォームを自己紹介のみとし、フォームのHTMLファイルを廃止しました。
# クッキーでパスワードを記録するようにしました。0.0.2i → 0.0.3a
#1999/10/10
# 修正画面を表示したときにロックされたままになる不具合を修正しました。
# 写真張りつけ機能を追加しました。0.0.2h → 0.0.2i
#1999/10/07
# ドキュメントを追加しました。 0.0.2g → 0.0.2h
#1999/10/05
# 修正ボタンを押したときにエラーとなる不具合を修正しました。0.0.2f → 0.0.2g
#1999/09/26
# 修正機能を追加しました。0.0.2e → 0.0.2f
#1999/09/15
# 表示と登録のみできる版の完成。 0.0.1a
###########################################################
#
# 定義いろいろ
#
#
#############################
#
# 色、デザイン
# 必要に応じて変更してください
# タイトル。ブラウザのタイトルバーに出る名前です。
$title = 'PROFILER 0.0.6';
# メインタイトル。いちばん上に表示するタイトルです。
$maintitle = '自己紹介';
# トップページなど戻り先の URL
$ret_url = '../index.html';
# 戻り先の名前
$ret_name = 'トップページへ';
# 「各自己紹介へジャンプ」の所のリンクの表示列数。
$yoko = 4;
# 1ページあたりに表示する自己紹介の数。
$profOfPage = 10;
# 背景、文字の色などを定義
# HTML の BODY タグです。自己紹介の表示、登録時に使います。
$body = '
';
# 自己紹介の TABLE タグ
$table = '';
# 写真の TABLE タグ
$photo_table = '';
# 1項目(名前が入るところ)の背景色
# 空白を設定するとデフォルトの背景色になります
$header_color = '#EEEEEE';
# 2項目以降の背景色
$td_color = '#D0D0D0';
# スタイルシート
# 通常表示(自己紹介の一覧)で使います
# body : BODY タグ
# td.h : 自己紹介の1項目のテーブル(名前が入ることろ)
# td : 自己紹介の2項目以降のテーブル
# td.n : レイアウト用のテーブル
# a:link : リンクの色
# a:visited : 表示済みリンク
# a:active : アクセス中のリンク
# a:hover : カーソルが上に来た時のリンク
$css = '
body { color: #111166 }
table tr td { background-color: #e0e0f0; }
table tr td.h { background-color: #d0d0e0; font-weight: bold; }
table tr td.n { background-color: white ;}
a:link { text-decoration: none; color : blue }
a:visited { text-decoration: none; color : blue }
a:active { text-decoration: none; color : gray }
a:hover { text-decoration: none; color : red }
';
# 色、デザイン定義はここまで
#############################
#
# プログラムの動作の定義
# 必要に応じて変更してください
# 登録できる最大の自己紹介の数
# 0 を設定すると無制限に登録できる。
$maxprof = 0;
# 登録できる文字数(byte)の上限です。
# 0 を指定すると制限なしです。デフォルトは 10000 byte。
$maxsize = 10000;
# 登録または修正があったときに管理者にメールを送信する。
# この機能はサーバーが UNIX な OS であり、CGI から sendmail を
# 実行できるときに使えます。
# 0 : メールを送信しない(デフォルト)
# 1 : メールを送信する
$use_mail = 0;
# sendmail のパス。通常は /usr/sbin/sendmail か /usr/lib/sendmail です。
$sendmail = '/usr/sbin/sendmail';
# 管理者のメールアドレス。メール送信を使う場合は必ず変更してください。
$admin_address = 'foo@example.com';
# gzip で圧縮して送信
# この機能を使うにはサーバ側で gzip がインストールされていて、
# CGI から gzip を実行できるときに使えます。
# 0 : 圧縮しない(デフォルト)
# 1 : 圧縮する
$use_gzip = 0;
# gzip のパス 通常は /bin/gzip (PC UNIXに多い) か、/usr/local/bin/gzip です。
$gzip_path = '/bin/gzip';
#############################
#
# プログラムに必要な初期定義
# 変更しないでください
# version number
$version = '0.0.6';
$thisfile = 'profiler.cgi';
$datadir = 'data';
$lockfile = "$datadir/lockfile";
$profile = "$datadir/profiler.dat";
$jcodepl = 'jcode.pl';
# メールアドレスにマッチする正規表現 :-)
$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;/?:@&=+$,%#]+};
# 現在の時間
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$timekey = sprintf( "%04d%02d%02d%02d%02d%02d",
$year+1900, $mon+1, $mday, $hour, $min, $sec );
# ファイルロックのフラグ
$fflag = '';
# crypt で使う salt
$salt = '12';
# jcode.pl を取り込む
# jcode.pl があるかチェック
if ( ! -f $jcodepl ) {
&putHeader;
&HTMLMsg( "$jcodepl が見つかりません。
$jcodepl をアップロードしてください。" );
exit;
}
require $jcodepl;
# 自己紹介情報を $pos 件目から $profOfPage 件表示する。
$pos = 0;
# 登録データのサイズ
$datasize = 0;
###########################################################
#
# メイン処理
#
&main;
exit;
sub main {
local( $buf, $i, $j, $_ );
local( $key, $value, $key2, $value2, @pairs );
# データを読み込む
if ( $ENV{'REQUEST_METHOD'} eq 'POST' ) {
read( STDIN, $buf, $ENV{'CONTENT_LENGTH'} );
}
else {
# GET 形式で読み込み
$buf = $ENV{'QUERY_STRING'};
}
# 通常表示
if ( $buf eq '' ) {
&putHeader;
&showProfile;
}
# データが送られてきたとき
else {
convertData( $buf );
# ページ指定付き自己紹介表示
if ( $postdata{ 'action' } eq 'show' ) {
$pos = $postdata{ 'pos' };
&putHeader;
&showProfile;
}
# 登録フォームの表示
if ( $postdata{ 'action' } eq 'form' ) {
&putHeader;
&showForm;
}
# 自己紹介情報登録
elsif ( $postdata{ 'action' } eq 'regist' ) {
®ist;
&putHeader;
&showProfile;
}
# 自己紹介情報修正
elsif ( $postdata{ 'action' } eq 'updatego' ) {
&updatego;
&putHeader;
&showProfile;
}
# 自己紹介情報修正画面表示
elsif ( $postdata{ 'submit' } eq '修正' or $postdata{ 'action' } eq 'update' ) {
&putHeader;
&update;
}
# 自己紹介情報削除
elsif ( $postdata{ 'action' } eq 'delete' ) {
&putHeader;
&delete;
&showProfile;
}
# 管理者パスワード変更フォーム表示
elsif ( $postdata{ 'action' } eq 'admin' ) {
&putHeader;
&admin;
}
# 管理者パスワード変更
elsif ( $postdata{ 'action' } eq 'passwd' ) {
&putHeader;
&passwd;
&showProfile;
}
# 検索用フォーム表示
elsif ( $postdata{ 'action' } eq 'findform' ) {
&putHeader;
&showFindForm;
}
# 検索用フォーム表示
elsif ( $postdata{ 'action' } eq 'find' ) {
&putHeader;
&find;
}
}
}
###########################################################
#
# サブルーチン
#
#############################
#
# 自己紹介の一覧表示
#
sub showProfile {
local( $i, $j, $_, @s, $start, $end );
local( $key, $img_url, $cpassword );
local( @lines, $header );
# クッキーを読む
&readCookie( 'profiler' );
$cpassword = $COOKIE{'password'};
if ( open( PROFILE, $profile ) == 0 ) {
✓ # エラーの原因を自己診断する。
exit;
}
@lines = ;
$header = shift( @lines );
close( PROFILE );
if ( ! ( $header =~ /PROFILER .*:.*/ ) ) {
&showKeyRegistForm;
exit;
}
# 総登録件数
$numOfProf = $#lines + 1;
# 表示開始位置を調整する
$pos = $#lines - $profOfPage + 1 if $#lines < $pos;
$pos = 0 if $pos < 0;
# $start 件目から $end 件目を表示する
$start = $pos + 1;
$end = $profOfPage + $pos;
$end = $numOfProf if $#lines < $end;
print <
$title
$body
$maintitle
HTML
if ( $maxprof == 0 || $numOfProf < $maxprof ) {
print " [ 登録 ]\n";
}
print <検索 ]
[ $ret_name ]
登録件数は $numOfProf 件です
HTML
print "$start 件目から $end 件目を表\示
\n" if $numOfProf;
print "
\n";
print "各自己紹介へジャンプ
\n";
print "
\n";
# 各自己紹介情報へのリンクを表示
print " \n";
print " \n";
for ( $i=0; $i<=$#lines; $i++ ) {
next unless $lines[ $i ] =~ /^\d*,[^,]*,[^,]*,"(.*)"/;
print " \n";
@s = split( /","/, $1 );
$s[ 1 ] = &toHTML_no( $s[ 1 ] );
if ( $pos <= $i and $i < $pos + $profOfPage ) {
print " $s[ 1 ] さん \n";
}
else {
print " $s[ 1 ] さん \n";
}
print " | \n";
if ( ($i % $yoko) == ($yoko - 1) ) {
print "
\n";
print " \n";
}
}
print "
\n";
print "
\n";
local( $back_pos, $next_pos );
$back_pos = $pos - $profOfPage;
$next_pos = $pos + $profOfPage;
print <
HTML
print "
|
|
- 登録した後で修正を行うことができます。
- 修正は、各自己紹介の右上のチェックボックスをチェックし、
修正ボタンを押します。
- そのあと修正フォームが表\示されます。
- 複数チェックした場合はエラーとなります。
|
|
|
- 削除は、各自己紹介の右上のチェックボックスをチェックし、
パスワードを入力して、削除ボタンを押します。
- 管理者は全ての自己紹介を削除することが出来ます。
|
HTML_TEXT
}
#############################
#
# データ変換
#
sub convertData {
my( $buf ) = @_;
local( $i, $j, $key, $key2, $value, $value2, @pairs );
# データ解析
@pairs = split( /&/, $buf );
foreach ( @pairs ) {
($key, $value) = split( /=/, $_ );
&decodeData( *key );
&decodeData( *value );
$postdata{ $key } = $value;
push( @targets, $value ) if $key eq 'target';
}
# 自己紹介情報解析
for ( $i=0, $j=0; $i < (@pairs-1); $i++ ) {
($key, $value) = split( /=/, $pairs[ $i ] );
($key2, $value2) = split( /=/, $pairs[ $i + 1 ] );
&decodeData( *key );
&decodeData( *value );
&decodeData( *key2 );
&decodeData( *value2 );
if ( $key eq 'index' and $key2 eq 'value' and
$value ne '' and $value2 ne '' ) {
$profiledata[ $j++ ] = $value;
$profiledata[ $j++ ] = $value2;
$i++;
$datasize += length( $value );
$datasize += length( $value2 );
}
}
}
#############################
#
# 自己紹介情報を1件表示する
#
sub putProfile {
local( $_ ) = @_;
local( @s, $key, $img_url, $i, $len, $name );
print " \n";
return unless /^(\d*),[^,]*,([^,]*),"(.*)"/;
$len = $1;
($key, $img_url) = split( /\\/, $2 );
@s = split( /","/, $3 );
$name = &toHTML( $s[ 1 ] );
if ( $img_url ne '' ) {
print " $photo_table\n";
print " \n";
print " | \n";
print " $name\n";
print " | \n";
print "
\n";
print " \n";
print " \n";
print "  | \n";
print "
\n";
print "
\n";
}
print " $table\n";
for ( $i=0; $i<$len; $i+=2 ) {
$s[ $i ] = &toHTML( $s[ $i ] );
$s[ $i + 1 ] = &toHTML( $s[ $i + 1 ] );
if ( $i == 0 ) {
print " \n";
print " | \n";
print " $s[ 0 ]\n";
print " | \n";
print " \n";
print " \n";
print " | \n";
print "
\n";
next;
}
print " \n";
print " | \n";
print " $s[ $i ]\n";
print " | \n";
print " \n";
print " $s[ $i+1 ]\n";
print " | \n";
print "
\n";
}
print " \n\n";
print "
\n";
}
#############################
#
# 自己紹介登録
#
sub regist {
local( $i, $j, $_, $password, @lines, $header, $msg, $code, $mpass, $key );
local( $all );
if ( $postdata{ 'password' } eq '' ) {
&putHeader;
&HTMLMsg( 'パスワードを入力してください', $ret_url );
exit;
}
if ( $#profiledata == -1) {
&putHeader;
&HTMLMsg( '項目は少なくとも1件以上は入力してください', $ret_url );
exit;
}
if ( $maxsize and $maxsize < $datasize ) {
&putHeader;
&HTMLMsg( "登録上限文字数($maxsize)を超えています。" );
exit;
}
foreach ( @profiledata ) {
if ( /(.*)\"\,\"(.*)/ ) {
&putHeader;
&HTMLMsg( '登録できない文字の並び「","」があります。' );
exit;
}
}
if ( &lock == 0 ) {
&putHeader;
&HTMLMsg(
'ただ今混雑しています
' .
'この画面でしばらく待ってから
' .
'ブラウザの[更新]ボタンを押してください
',
$ret_url );
exit;
}
if ( open( PROFILE, $profile ) == 0 ) {
&putHeader;
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
@lines = ;
chomp( $header = shift( @lines ) );
if ( ! $header =~ /PROFILER .*:.*/ ) {
close( PROFILE );
&showKeyRegistForm;
&unlock;
exit;
}
($code, $mpass, $key) = split( /:/, $header );
$key++;
close( PROFILE );
# 二重書き込みの対応
for ( $i=0; $i < $#profiledata; $i+=2 ) {
$profiledata[ $i ] =~ s/\r\n/\r/g;
$profiledata[ $i ] =~ s/\n/\r/g;
$profiledata[ $i + 1 ] =~ s/\r\n/\r/g;
$profiledata[ $i + 1 ] =~ s/\n/\r/g;
}
$all = join( '","', @profiledata );
$lines[ 0 ] =~ /^\d*,[^,]*,[^,]*,"(.*)"/;
if ( $all eq $1 ) {
&unlock;
&putHeader;
&HTMLMsg( "二重書き込みです", $ret_url );
exit;
}
print PROFILER "$all\n";
if ( open( PROFILE, '>' . $profile ) == 0 ) {
&putHeader;
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
$password = crypt( $postdata{ 'password' }, $salt );
print PROFILE "$code:$mpass:$key\n";
print PROFILE "$#profiledata,$password,$key\\$postdata{ 'image'},";
for ( $i=0; $i < $#profiledata; $i+=2 ) {
$profiledata[ $i ] =~ s/\r\n/\r/g;
$profiledata[ $i ] =~ s/\n/\r/g;
$profiledata[ $i + 1 ] =~ s/\r\n/\r/g;
$profiledata[ $i + 1 ] =~ s/\n/\r/g;
print PROFILE "\"$profiledata[ $i ]\",\"$profiledata[ $i + 1 ]\"";
print PROFILE ',' if $i != $j-2;
}
print PROFILE "\n";
print PROFILE @lines;
close( PROFILE );
&unlock();
# メールを送信する
if ( $use_mail ) {
&send_mail( "PROFILER message\n$profiledata[ 1 ] さんの自己紹介が追加されました");
}
# クッキーを書き込む
if ( $postdata{ 'usecookie' } eq 'ON' ) {
&set_cookies( $postdata{ 'password' } );
$ENV{ 'HTTP_COOKIE' } = "profiler=password:$postdata{'password'}";
}
}
#############################
#
# 削除
#
sub delete {
local( @lines, $header, $len, $pass, $key, $img_url, $target, $admin, @s );
local( $dflag ) = 0;
if ( scalar( @targets ) == 0 ) {
&HTMLMsg( '自己紹介が選択されていません' );
exit;
}
if ( 1 < scalar( @targets ) ) {
&HTMLMsg( '複数選択されています' );
exit;
}
if ( $postdata{ 'password' } eq '' ) {
&HTMLMsg( '入力が不正です', $ret_url );
exit;
}
if ( &lock == 0 ) {
&HTMLMsg( 'ただ今混雑しています', $ret_url );
exit;
}
if ( open( PROFILE, $profile ) == 0 ) {
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
@lines = ;
$header = shift( @lines );
@s = split( /:/, $header );
chomp( $s[ 1 ] );
$admin = 1 if $s[ 1 ] eq crypt( $postdata{ 'password' }, $salt );
if ( open( PROFILE, '>' . $profile ) == 0 ) {
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
print PROFILE $header;
$target = $targets[ 0 ];
foreach ( @lines ) {
@s = split( /,/, $_ );
$len = shift( @s );
$pass = shift( @s );
($key, $img_url) = split( /\\/, shift( @s ) );
if ( $target ne '' and
( $pass eq crypt( $postdata{ 'password' }, $salt ) or $admin ) and
$key == $target ) {
$dflag = 1;
next;
}
print PROFILE $_;
}
close( PROFILE );
&unlock();
# パスワード合わず1件も削除しなかった
unless ( $dflag ) {
&unlock;
&HTMLMsg( 'パスワードが違います' );
exit;
}
}
#############################
#
# 管理者パスワード初期設定フォームを表示
#
sub showKeyRegistForm {
print <
PROFILER $version / 管理者パスワード初期設定
管理者パスワード初期設定
WELCOME TO PROFILER
PROFILER $version
HTML
}
#############################
#
# 管理者パスワード変更フォームを表示
#
sub admin {
print <
PROFILER $version / 管理者パスワード変更
管理者パスワード変更
PROFILER $version
HTML
}
#############################
#
# 管理者パスワード変更
#
sub passwd {
local( $password, $header, @lines, $code, $key );
if ( $postdata{ 'newpass' } eq '' or
$postdata{ 'newpass' } ne $postdata{ 'newpass2' } ) {
&HTMLMsg( '入力が不正です', $ret_url );
exit;
}
if ( &lock == 0 ) {
&HTMLMsg( 'ただ今混雑しています', $ret_url );
exit;
}
if ( open( PROFILE, $profile ) == 0 ) {
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
@lines = ;
chomp( $header = shift( @lines ) );
close( PROFILE );
($code, $password, $key) = split( /:/, $header );
if ( $code eq "PROFILER $version" and $password ne crypt( $postdata{ 'oldpass' }, $salt ) ) {
&HTMLMsg( "パスワードが違います", $ret_url );
close( PROFILE );
&unlock;
exit;
}
$password = crypt( $postdata{ 'newpass' }, $salt );
if ( open( PROFILE, '>' . $profile ) == 0 ) {
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
print PROFILE "PROFILER $version:$password:$key\n";
print PROFILE @lines;
close( PROFILE );
&unlock();
}
#############################
#
# 自己紹介情報修正画面表示
#
sub update {
local( @lines, $header, $key, $password, $img_url, $cpassword, $row );
if ( $#targets == -1 ) {
&HTMLMsg( '自己紹介が選択されていません', $ret_url );
exit;
}
if ( 0 < $#targets ) {
&HTMLMsg( '複数選択しています', $ret_url );
exit;
}
if ( open( PROFILE, $profile ) == 0 ) {
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
@lines = ;
$header = shift( @lines );
close( PROFILE );
if ( ! $header =~ /PROFILER .*:.*/ ) {
&showKeyRegistForm;
exit;
}
# クッキーを読む
&readCookie( 'profiler' );
$cpassword = $COOKIE{'password'};
$key = '';
$password = '';
print <
PROFILER / 自己紹介修正
$body
自己紹介修正
- このフォームで自己紹介を修正できます。
- 入力しなかった項目は表\示時に省略されます。
- パスワードは必ず入力してください。削除する時に使います。
- 各項目右のリンクをクリックすると、その下に新しい項目が追加されます。
- HTMLのタグは無視します。
[画像ファイル張り付け機能\]
- 自分の写真を表\示させることができます。
- あらがじめ画像ファイルがインターネット上にアップロードされている必要があります。
- 自分のホームページなどにアップロードしてください。
- 画像ファイルは jpg か gif で サイズは原則として縦横 200x200 位にしてください。
- 下の項目の"写真へのURLをここへ書いてください"に正確なURLを書いてください。
|
自己紹介一覧へ
PROFILER $version
HTML
}
#############################
#
# 自己紹介情報修正
#
sub updatego {
local( $i, $_, $password, @lines, $header, $len, $key, $img_url );
if ( $postdata{ 'password' } eq '' ) {
&putHeader;
&HTMLMsg( 'パスワードを入力してください', $ret_url );
exit;
}
foreach ( @profiledata ) {
if ( /(.*)\"\,\"(.*)/ ) {
&putHeader;
&HTMLMsg( '登録できない文字の並び「","」があります。', $ret_url );
exit;
}
}
if ( $#profiledata == -1) {
&putHeader;
&HTMLMsg( '項目は少なくとも1件以上は入力してください', $ret_url );
exit;
}
if ( $maxsize and $maxsize < $datasize ) {
&putHeader;
&HTMLMsg( "登録上限文字数($maxsize)を超えています。" );
exit;
}
if ( &lock == 0 ) {
&putHeader;
&HTMLMsg( 'ただ今混雑しています', $ret_url );
exit;
}
if ( open( PROFILE, $profile ) == 0 ) {
&putHeader;
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
@lines = ;
$header = shift( @lines );
close( PROFILE );
# パスワードチェック
foreach ( @lines ) {
next unless /^\d*,([^,]*),([^,]*),"(.*)"/;
($key, $img_url) = split( /\\/, $2 );
if ( $key eq $postdata{ 'target' } ) {
$password = $1;
last;
}
}
if ( $key eq '' ) {
&unlock;
&putHeader;
&HTMLMsg( "データファイルが異常です。管理者にお問い合わせください。", $ret_url );
exit;
}
if ( crypt( $postdata{ 'password' }, $salt ) ne $password ) {
&unlock;
&putHeader;
&HTMLMsg( "パスワードが違います", $ret_url );
exit;
}
# パスワードチェックここまで
if ( ! $header =~ /PROFILER .*:.*/ ) {
&showKeyRegistForm;
exit;
}
if ( open( PROFILE, '>' . $profile ) == 0 ) {
&putHeader;
&HTMLMsg( "$profile が開けません", $ret_url );
&unlock;
exit;
}
$password = crypt( $postdata{ 'password' }, $salt );
print PROFILE $header;
print PROFILE "$#profiledata,$password,$key\\$postdata{ 'image' },";
for ( $i=0; $i < $#profiledata; $i+=2 ) {
$profiledata[ $i ] =~ s/\r\n/\r/g;
$profiledata[ $i ] =~ s/\n/\r/g;
$profiledata[ $i + 1 ] =~ s/\r\n/\r/g;
$profiledata[ $i + 1 ] =~ s/\n/\r/g;
print PROFILE "\"$profiledata[ $i ]\",\"$profiledata[ $i + 1 ]\"";
print PROFILE ',' if $i != $j-2;
}
print PROFILE "\n";
foreach ( @lines ) {
next unless /^\d*,[^,]*,([^,]*),".*"/;
($key, $img_url) = split( /\\/, $1 );
next if $key eq $postdata{ 'target' };
print PROFILE $_;
}
close( PROFILE );
&unlock();
# メールを送信する
if ( $use_mail ) {
&send_mail( "PROFILER message\n$profiledata[ 1 ] さんの自己紹介が修正されました");
}
# キックー書き込む
if ( $postdata{ 'usecookie' } eq 'ON' ) {
&set_cookies( $postdata{ 'password' } );
$ENV{ 'HTTP_COOKIE' } = "profiler=password:$postdata{'password'}";
}
}
#############################
#
# 検索フォーム表示
#
sub showFindForm {
print <<"HTML";
PROFILER $version / 自己紹介検索
$body
自己紹介検索
[ 自己紹介一覧へ戻る ]
■検索したいキーワードを入力し、検索条件を選択し「検索する」を押してください。
■複数のキーワードを入力するときは、半角スペースで区切って下さい。
|
PROFILER $version
HTML
}
#############################
# 用語検索
sub find {
local( $header );
if( open( PROFILE, $profile ) == 0 ) {
✓ # エラーの原因を自己診断する。
exit;
}
$_ = ; # ヘッダーを読み飛ばす
@lines = ;
close( PROFILE );
print <<"HTML";
PROFILER $version / 自己紹介検索
$body
自己紹介検索結果
[ 自己紹介一覧へ戻る ]
■検索したいキーワードを入力し、検索条件を選択し「検索する」を押してください。
■複数のキーワードを入力するときは、半角スペースで区切って下さい。
|
HTML
# ワード検索の実行と結果表示
if ($postdata{'word'} ne "") {
# 入力内容を整理
$cond = $postdata{'cond'};
$word = $postdata{'word'};
$word =~ s/ / /g;
$word =~ s/\t/ /g;
@pairs = split(/ /,$word);
# 検索処理
$i = 0;
foreach $line (@lines) {
$line =~ /^\d*,[^,]*,[^,]*,"(.*)"/;
$flag = 0;
foreach $pair (@pairs){
if (index($1,$pair) >= 0){
$flag = 1;
last if $cond eq 'or';
} else {
if ($cond eq 'and') {
$flag = 0; last;
}
}
}
if ($flag == 1) {
push(@new,$1);
push(@number,$i);
}
$i++;
}
# 検索終了
$count = @new;
print "
検索結果:$count件\n";
print "
\n";
$i = 0;
foreach $line (@new) {
@s = split( /","/, $line );
$s[ 1 ] = &toHTML_no( $s[ 1 ] );
# 結果を表示
print "- $s[1] さん
\n";
print "
\n
\n";
$i++;
}
print "
\n";
}
print <<"HTML"
yogo $version
HTML
}
#############################
# データをデコード
sub decodeData{
local(*queryString) = @_ if @_;
# +を空白に置き換える
$queryString =~ s/\+/ /g;
# 16進数を変換する
$queryString =~ s/%(..)/pack("c",hex($1))/ge;
&jcode'convert(*queryString,'sjis');
return 1;
}
#############################
# HTML でメッセージを表示する
sub HTMLMsg {
local( $msg ) = @_;
print <
PROFILER $version メッセージ
$msg
HTML
}
#############################
# 排他制御のためにデータファイルをロックする
sub lock {
return 1 if $fflag; # すでに自分でロック済の場合
my $now = time();
if ( -e $lockfile ) {
# ロック中だった場合、60秒より前のロックだったら
# 時刻を現在に設定し正常終了
if ( $now - (stat(_))[9] > 60 ) {
utime( $now, $now, $lockfile );
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/"/"/g;
$s =~ s/\r\n/
\r/g;
$s =~ s/\n/
\r/g;
$s =~ s/\r/
\r/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/"/"/g;
$s =~ s/\r\n/
\r/g;
$s =~ s/\n/
\r/g;
$s =~ s/\r/
\r/g;
return $s;
}
#############################
# 文字列の中からある文字が何個あるか調べる。
sub countChar {
local( $ch, $str ) = @_;
local( $i, $cnt );
$cnt = 0;
for ( $i=0; $i
PROFILER $version / 自己診断
PROFILER $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 $profile ) {
print "$profile が存在しません。
\n";
print "$profile を作成します。
\n";
unless ( open( PROFILE, '>' . $profile ) ) {
print "$profile の作成に失敗しました。
\n";
}
else {
# ここまで来てやっと成功
close( PROFILE );
print "$profile の作成に成功しました。
\n";
print "下のリンクをクリックするか、ブラウザで再読み込みを行ってください。
\n";
print "管理者パスワード初期設定へ\n";
}
}
else {
print "原因不明エラーです。\n";
}
print " \n";
print "