#!/usr/bin/perl
;# ↑ ◎ Perl5のパスを指定。このパスはプロバイダに確認。
;#
;# バナー広告総合管理 [アド・マネージメント] ver.3.03 (Share)
;# Copyright(C)1998-2000 I.Wada. All rights reserved.
;#
#-----------------------------------------------------------------------------#
# ここから初期設定です(サーバーへの設置方法は同梱の'readme.txt'をご覧下さい)#
#-----------------------------------------------------------------------------#
#
# ●印の項目は必ず変更してください。
# ○印の項目はレイアウト、オプション機能関連です。基本的に変更不要です。
# ◎印の項目はサーバー環境によって変更する必要があります。(1行目も含みます)
#
# ・ ''内に記述しますが、'を入れたい場合は 中の'は \'にして下さい。
# ・ 行の頭に"#"を付けると、その行は実行時に無視されます。(コメントアウト)
# ・ 詳しくは本サイトの解説/FAQ等を参照してください。
#
#
$Lcode = ''; # シェアウェアレジストコード
#-------- 特定機能の使用に関する設定 ------------------------------------------
#
# ◎印はサーバー環境によっては正常に動作しない場合があります。
# その場合は、その機能を無効にしてください。
$MasterKey = 'mri'; # ● マスターキー(10文字以内の半角英数字)
$TimeZone = 9; # ◎ タイムゾーン (GMTとの時差-海外時間で使用する場合のみ設定)
$UseLock = 2; # ◎ ファイルロック(1:使う/2:使う/0:使わない)
$Mailsend = 0; # ○ 広告リポートのメール送信 (1:する/0:しない)
$jcode = 'sjis'; # ○ 日本語変換コード('sjis','jis','euc'のいずれか)
$GraphTimes = 5; # ○ グラフの倍率 (**×表示|クリック回数)
$MaxSize = 15000; # ○ アップロード可能な画像サイズ上限
$CookieName = 'admgt'; # ○ クッキーの名前
$CookiePath = ''; # ○ クッキーの有効な仮想パス(通常設定不要)
$CookieExpires = 60; # ○ クッキーの有効日数 (パスワードを保存する日数)
#-------- パス/アドレス/ファイル名に関する設定 --------------------------------
#
# スクリプトと同じディレクトリは、'./'です。1つ上は、'../'です。ここでの
# 「パス」とはサーバー内での場所 '../xxxx'や '/home/foo/public_html/'を
# 「アドレス」とはインターネット全体から見た場所 'http://〜'を指します。
require 'stdio.pl'; # ○ CGI標準入出力ライブラリ"stdio.pl"のパス
require 'jcode.pl'; # ○ 文字コード変換ライブラリ"jcode.pl"のパス
$DataDir = 'data/'; # ○ データファイルがあるディレクトリのパス
$ImageDir = 'data/'; # ○ バナー画像があるディレクトリのパス
$GroupName = 'group.txt'; # ○ グループファイルのファイル名
#-------- デザイン等に関する設定(基本的に変更不要) ----------------------------
#
# 基本的に変更不要ですが、背景色やメッセージ等をサンプルとは変更したい場
# 合は変更してください。(一部の項目ではHTMLに関する知識が必要です)
$Title = 'アドマネージャー'; # ○ タイトル(などで表示)
$BgColor1 = 'DDFFDD'; # ○ テーブルの背景配色1
$BgColor2 = 'FFFFE1'; # ○ テーブルの背景配色2
$BgColor3 = 'DDFFFF'; # ○ テーブルの背景配色3
# ↓ ○ タグの設定(<>や'body'は不要です)
$body = 'text="#000000" bgcolor="#FFEEDD"';
# ↓ ○ 日付の表記方法(設定方法は同梱の "readme.txt" を参照のこと)
$TimeFormat = 'yyyy/mm/dd (ww) hh:nn';
$Header = <<'_END_OF_HTML_';
_END_OF_HTML_
$Footer = <<'_END_OF_HTML_';
_END_OF_HTML_
#/*--------------------------------------------------------------------------*
# * *
# * ・本スクリプトで初期設定が必要なのはここまでです。 *
# * ・スクリプトを改造する場合は、perlやCGIなどのそれなりの知識が必要です。 *
# * *
# *--------------------------------------------------------------------------*/
#/*------------- 基本情報の設定/関数のコール --------------------------------*/
$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";
if ($jcode eq 'euc') { $fcode = '; charset=euc-jp'; }
elsif ($jcode eq 'sjis') { $fcode = '; charset=Shift-jis'; }
elsif ($jcode eq 'jis') { $fcode = '; charset=iso-2022-jp'; }
$Version = 'AdvertisementManager/3.00';
$Script = $1 if ($ENV{'SCRIPT_NAME'} =~ /([^\\\/]+$)/);
if ($ENV{'QUERY_STRING'} eq 'UPLOAD') {
%Form = stdio::GetFile(1,2,$jcode);
} else {
%Form = stdio::QueryString(1,2,$jcode);
}
$GroupFile = $DataDir . $GroupName;
$DataFile = $DataDir . $Form{'User'} . '.adm';
$ClickFile = $DataDir . $Form{'User'} . '.clk';
#/*--- 環境変数をセット ---*/
$HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'};
$HTTP_USER_AGENT = substr($HTTP_USER_AGENT, 0, 100);
$HTTP_USER_AGENT =~ s/[\r|\r\n|\n|\t|\b]//g;
$HTTP_USER_AGENT =~ s/&/&/g;
$HTTP_USER_AGENT =~ s/"/"/g;
$HTTP_USER_AGENT =~ s/</g;
$HTTP_USER_AGENT =~ s/>/>/g;
$REMOTE_HOST = $ENV{'REMOTE_HOST'};
$REMOTE_ADDR = $ENV{'REMOTE_ADDR'};
if ($REMOTE_HOST eq $REMOTE_ADDR || !$REMOTE_HOST) {
$REMOTE_HOST = gethostbyaddr(pack('C4',split(/\./, $REMOTE_ADDR)),2) || $REMOTE_ADDR;
$REMOTE_HOST = $REMOTE_ADDR if (!$REMOTE_HOST);
}
#/*--- ユーザー認証/条件分岐 ---*/
if ($Form{'clear'}) {
stdio::SetCookie($CookieName,-1,-1,undef,$CookiePath);
} elsif ($Form{'mode'} && $Form{'mode'} ne ' 終了 ') {
if (!$Form{'User'} && $Form{'mode'} ne 'ChangeRegist' && $Form{'mode'} ne 'NewRegist') {
Errors('フォーム入力ミス','ユーザー名を入力して下さい。');
} elsif (!$Form{'passwd'}) {
Errors('フォーム入力ミス','パスワードを入力して下さい。');
}
#/*--- マスターキーと一致 ---*/
if ($Form{'passwd'} eq $MasterKey) {
stdio::SetCookie($CookieName,"User:$Form{'User'}&passwd:$Form{'passwd'}",$CookieExpires,undef,$CookiePath) if ($Form{'Cookie'});
$user = 'manager';
if ($Form{'mode'} eq 'NewForm') {
$Form{'User'} = 'new';
} elsif ($Form{'mode'} eq 'List') {
$Form{'User'} = 'all';
}
if ($Form{'User'} eq 'new') {
$Form{'mode'} = 'NewForm';
RegistForm();
} elsif ($Form{'User'} eq 'all') {
$Form{'mode'} = 'List';
PrintList();
} else {
if ($Form{'mode'} eq 'NewForm') {
RegistForm();
} elsif ($Form{'mode'} eq 'NewRegist') {
RegistFile();
} elsif ($Form{'mode'} eq 'List') {
PrintList();
} else {
Errors('システムエラー','入力されたIDのデータファイルが存在しません。') unless (-e $DataFile);
@Record = stdio::ReadFile($DataFile);
%Field = stdio::ReadData(split "\t", $Record[0]);
$Form{'mode'} = 'ChangeForm' if ($Form{'mode'} eq '変更');
if ($Form{'mode'} eq 'ChangeForm') {
RegistForm();
} elsif ($Form{'mode'} eq 'ChangeRegist') {
RegistFile();
} elsif ($Form{'mode'} eq 'Delete' || $Form{'mode'} eq '削除') {
Delete();
PrintList();
}
}
}
} else {
Errors('システムエラー','入力されたIDのデータファイルが存在しません。') unless (-e $DataFile);
@Record = stdio::ReadFile($DataFile);
%Field = stdio::ReadData(split "\t", $Record[0]);
Errors('フォーム入力ミス','パスワードが不正です。') if (!stdio::RecryptString($Form{'passwd'},$Field{'Passwd'}));
stdio::SetCookie($CookieName,"User:$Form{'User'}&passwd:$Form{'passwd'}",$CookieExpires,undef,$CookiePath) if ($Form{'Cookie'});
$user = 'sponsor';
}
#/*--- 条件分岐 ---*/
if ($Form{'mode'} eq 'Upload') {
BannerUpload();
} elsif ($Form{'mode'} eq 'AccessView') {
AccessView();
} elsif ($Form{'mode'} eq 'AccessReport') {
AccessReport();
} elsif ($Form{'mode'} eq 'CsvOutput') {
CsvOutput();
} elsif ($Form{'mode'} eq 'BannerUpload') {
BannerUpload();
} elsif ($Form{'mode'} eq 'SendMailOn' || $Form{'mode'} eq 'SendMailOff') {
SendMailSwitch();
} elsif ($Form{'mode'} eq 'noselect') {
Errors('フォーム入力ミス','コマンドを選択して下さい。');
}
MainPage();
exit(0);
}
#/*------------- ログインページ ---------------------------------------------*/
if (!$Form{'clear'}) {
%Cookie = stdio::GetCookie($CookieName);
$checked = ' checked' if ($Cookie{'User'});
}
print 'Content-type: text/html' . $fcode . "\n\n";
print <<_END_OF_HTML_;
$Title
$Header
ログイン
- [クリア]はブラウザに保存されている全てのクッキーを消去します。
$Footer
_END_OF_HTML_
exit(0);
#/*------------- メインページ -----------------------------------------------*/
sub MainPage {
#/*--- バナー画像のチェック ---*/
if (-e "$ImageDir$Form{'User'}.gif") {
$Banner = qq|
|;
} elsif (-e "$ImageDir$Form{'User'}.jpg") {
$Banner = qq|
|;
} else {
$Banner = qq|(バナー未登録)|;
}
$TimeNow = stdio::SetTime($TimeFormat,$TimeZone);
if ($Field{'View'} ne "") { $Field{'View'} .= '回'; } else { $Field{'View'} = '未設定'; }
if ($Field{'Click'} ne "") { $Field{'Click'} .= '回'; } else { $Field{'Click'} = '未設定'; }
if ($Field{'Day'} ne "") { $Field{'Day'} .= '日'; } else { $Field{'Day'} = '未設定'; }
if ($Field{'SetView'} ne "") { $Field{'SetView'} .= '回'; } else { $Field{'SetView'} = '未設定'; }
if ($Field{'SetClick'} ne "") { $Field{'SetClick'} .= '回'; } else { $Field{'SetClick'} = '未設定'; }
if ($Field{'SetDay'} ne "") { $Field{'SetDay'} .= '日'; } else { $Field{'SetDay'} = '未設定'; }
if ($Field{'TotalView'} != 0) { $ClickRate = sprintf("%.1f",$Field{'TotalClick'}/$Field{'TotalView'}*100); } else { $ClickRate = 0; }
if ($Field{'PastDay'} != 0) {
$AverageView = sprintf("%.1f",$Field{'TotalView'}/$Field{'PastDay'});
$AverageClick = sprintf("%.1f",$Field{'TotalClick'}/$Field{'PastDay'});
} else {
$AverageView = $Field{'TotalView'};
$AverageClick = $Field{'TotalClick'};
}
if ($AverageView != 0) { $AverageClickRate = sprintf("%.1f",$AverageClick/$AverageView*100); } else { $AverageClickRate = 0; }
#/*--- 終了条件の表示 ---*/
if ($Field{'Condition'} == 1) {
$Condition = '上記の全ての条件を達成しますと、バナーの掲載を終了いたします。';
} else {
$Condition = '上記の何れかの条件を達成しますと、バナーの掲載を終了いたします。';
}
#/*--- HTML表示開始 ---*/
print 'Content-type: text/html' . $fcode . "\n\n";
print <<_END_OF_HTML_;
$Title [$Form{'User'}:広告掲載情報]
$Header
バナー広告掲載状況
$Field{'Name'} 様 (ID $Form{'User'})
広告の情報
現在の掲載状況 $TimeNow
|
|
|
|
累計 |
日平均 |
| 残り保証表\示回数 |
$Field{'View'}($Field{'SetView'}) |
表\示回数 |
$Field{'TotalView'}回 |
$AverageView回 |
| 残り保証クリック回数 |
$Field{'Click'}($Field{'SetClick'}) |
クリック回数 |
$Field{'TotalClick'}回 |
$AverageClick回 |
| 残り保証掲載日数 |
$Field{'Day'}($Field{'SetDay'}) |
クリック率 |
$ClickRate% |
$AverageClickRate% |
$Condition括弧内は初期設定値です。
_END_OF_HTML_
shift(@Record);
if (@Record) {
print qq|
\n|;
print qq|日付別掲載状況\n|;
print qq|
\n|;
print qq|\n|;
print qq| \n|;
print qq| | 日付 | \n|;
print qq| 表\示回数 | \n|;
print qq| クリック回数 | \n|;
print qq| クリック率 | \n|;
print qq| グラフ | \n|;
print qq|
\n|;
foreach (@Record) {
chomp;
($Date,$View,$Click) = split "\t";
if ($View != 0) { $ClickRate = sprintf("%.1f",$Click/$View*100); } else { $ClickRate = 0; }
$GraphWidth = sprintf("%d",$View*$GraphTimes);
$GraphWidth = 1 if (!$GraphWidth);
print qq| \n|;
print qq| | $ccc $Date | \n|;
print qq| $View回 | \n|;
print qq| $Click回 | \n|;
print qq| $ClickRate% | \n|;
print qq|  | \n|;
print qq|
\n|;
}
print qq|
\n|;
}
print qq|
\n|;
SelectMenu($Form{'mode'});
print $Footer;
print qq|\n|;
print qq|\n|;
exit(0);
}
#/*------------- 登録広告一覧表示 -------------------------------------------*/
sub PrintList {
opendir(DIR, $DataDir) || Errors('ディレクトリ入出力エラー','ディレクトリのオープンができません。');
@DirFile = readdir(DIR);
closedir(DIR);
foreach (@DirFile) {
push(@File, $_) if (/\.adm$/i);
}
print 'Content-type: text/html' . $fcode . "\n\n";
print qq|\n|;
print qq|\n|;
print qq|$Title [登録広告一覧]\n|;
print qq|\n|;
print qq|\n|;
print $Header;
print qq|現在掲載中の広告一覧\n|;
print qq|
\n|;
if (!@File) {
print qq|掲載中の広告はありません。
\n|;
} else {
print qq|\n|;
print qq| \n|;
print qq| | 広告ID | \n|;
print qq| グループ | \n|;
print qq| バナー | \n|;
print qq| 広告主 | \n|;
print qq| 表\示 回数 | \n|;
print qq| クリック 回数 | \n|;
print qq| 掲載 日数 | \n|;
print qq| 登録日時 | \n|;
print qq| 詳細 | \n|;
print qq| 変更 | \n|;
print qq| 削除 | \n|;
print qq|
\n|;
foreach (@File) {
$UserID = $_;
$UserID =~ s/\.adm$//i;
next unless (/\.adm$/i);
print qq|
\n|;
}
print qq|
バナーをクリックするとフルサイズで表\示できます。
\n|;
}
SelectMenu($Form{'mode'});
print $Footer;
print qq|\n|;
print qq|\n|;
exit(0);
}
#/*------------- 個別クリック統計 -------------------------------------------*/
sub AccessView {
@ClickAddr = stdio::ReadFile($ClickFile);
@ClickAddr = reverse(@ClickAddr) if ($ClickAddr[0]);
print 'Content-type: text/html' . $fcode . "\n\n";
print qq|\n|;
print qq|\n|;
print qq|$Title [最近のクリック状況]\n|;
print qq|\n|;
print qq|\n|;
print $Header;
print qq|最近のクリック状況\n|;
print qq|
\n|;
print qq|
\n|;
if ($ClickAddr[0]) {
print qq|\n|;
print qq| \n|;
print qq| | アクセス日時 | \n|;
print qq| ホスト | \n|;
print qq| エージェント | \n|;
print qq| 参照元ページ | \n|;
print qq|
\n|;
for (0 .. 100) {
chomp;
last if (!$ClickAddr[$_]);
($Time,$Host,$Agent,$Referer) = split "\t", $ClickAddr[$_];
print qq| \n|;
print qq| | | . stdio::SetTime($TimeFormat,$TimeZone,$Time) . qq| | \n|;
print qq| $Host | \n|;
print qq| $Agent | \n|;
if ($Referer =~ /http/i) {
print qq| $Referer | \n|;
} else {
print qq| - | \n|;
}
print qq|
\n|;
}
print qq|
\n|;
}
print qq|
\n|;
SelectMenu($Form{'mode'});
print $Footer;
print qq|\n|;
print qq|\n|;
exit(0);
}
#/*------------- ホスト別クリック統計 ---------------------------------------*/
sub AccessReport{
@ClickAddr = stdio::ReadFile($ClickFile);
if ($ClickAddr[0]) {
foreach (@ClickAddr) {
chomp;
($Time,$Host,$Agent) = split "\t";
@Time = gmtime($Time + $TimeZone * 3600);
if ($Host =~ /^(\d*).(\d*).(\d*).\d*$/) { $Host = "$1.$2.$3.*"; }
elsif ($Host =~ /.*\.(.*)\.(.*)\.(.*)$/) { $Host = "*.$1.$2.$3"; }
elsif ($Host =~ /.*\.(.*)\.(.*)$/) { $Host = "*.$1.$2"; }
$HostView{$Host} ++;
$AgentView{$Agent} ++;
$TimeView[$Time[2]] ++;
}
$i = 0;
while (($Key,$Value) = each %HostView) {
$HostView[$i] = $Key . "\t" . $Value;
$i ++;
}
undef(%HostView);
$i = 0;
while (($Key,$Value) = each %AgentView) {
$AgentView[$i] = $Key . "\t" . $Value;
$i ++;
}
undef(%AgentView);
#/*--- ホスト別データをソート(並び替え) ---*/
foreach (@HostView) {
($Key,$Value) = split "\t";
$Value2 = sprintf("%04d",$Value);
push(@Temp ,"$Value2\t$_");
}
@HostView = ();
foreach (sort @Temp) {
($Value2,@Temp2) = split "\t";
push(@HostView, join("\t", @Temp2));
}
@HostView = reverse(@HostView);
undef(@Temp);
#/*--- エージェント別データをソート(並び替え) ---*/
foreach (@AgentView) {
($Key,$Value) = split "\t";
$Value2 = sprintf("%04d",$Value);
push(@Temp ,"$Value2\t$_");
}
@AgentView = ();
foreach (sort @Temp) {
($Value2,@Temp2) = split "\t";
push(@AgentView, join("\t", @Temp2));
}
@AgentView = reverse(@AgentView);
}
print 'Content-type: text/html' . $fcode . "\n\n";
print qq|\n|;
print qq|\n|;
print qq|$Title [クリックログ統計]\n|;
print qq|\n|;
print qq|\n|;
print $Header;
print qq|クリックログ統計\n|;
print qq|
\n|;
print qq|
\n|;
if ($ClickAddr[0]) {
print qq|ホスト別クリック数統計(上位50件)\n|;
print qq|
\n|;
print qq|\n|;
print qq| \n|;
print qq| | ホスト | \n|;
print qq| クリック | \n|;
print qq| グラフ | \n|;
print qq|
\n|;
for (0 .. 50) {
last if (!$HostView[$_]);
($Host,$Click) = split "\t", $HostView[$_];
$GraphWidth = sprintf("%d",$Click*$GraphTimes);
$GraphWidth = 1 if (!$GraphWidth);
print qq| \n|;
print qq| | $Host | \n|;
print qq| $Click回 | \n|;
print qq|  | \n|;
print qq|
\n|;
}
print qq|
\n|;
print qq|
\n|;
print qq|エージェント別クリック数統計(上位50件)\n|;
print qq|
\n|;
print qq|\n|;
print qq| \n|;
print qq| | エージェント | \n|;
print qq| クリック | \n|;
print qq| グラフ | \n|;
print qq|
\n|;
for (0 .. 50) {
last if (!$AgentView[$_]);
($Host,$Click) = split "\t", $AgentView[$_];
$GraphWidth = sprintf("%d",$Click*$GraphTimes);
$GraphWidth = 1 if (!$GraphWidth);
print qq| \n|;
print qq| | $Host | \n|;
print qq| $Click回 | \n|;
print qq|  | \n|;
print qq|
\n|;
}
print qq|
\n|;
print qq|
\n|;
print qq|時間帯別クリック数統計\n|;
print qq|
\n|;
print qq|\n|;
print qq| \n|;
print qq| | 時間帯 | \n|;
print qq| クリック | \n|;
print qq| グラフ | \n|;
print qq|
\n|;
for (0 .. 23) {
$GraphWidth = sprintf("%d",$TimeView[$_]*$GraphTimes);
$GraphWidth = 1 if (!$GraphWidth);
print qq| \n|;
print qq| | $_ | \n|;
if ($TimeView[$_]) {
print qq| $TimeView[$_]回 | \n|;
} else {
print qq| 0回 | \n|;
}
print qq|  | \n|;
print qq|
\n|;
}
print qq|
\n|;
print qq|
\n|;
}
print qq|
\n|;
SelectMenu($Form{'mode'});
print $Footer;
print qq|\n|;
print qq|\n|;
exit(0);
}
#/*------------- 登録広告削除 -----------------------------------------------*/
sub Delete {
unlink("$DataDir$Form{'User'}.adm") if (-e "$DataDir$Form{'User'}.adm");
unlink("$DataDir$Form{'User'}.cal") if (-e "$DataDir$Form{'User'}.cal");
unlink("$DataDir$Form{'User'}.val") if (-e "$DataDir$Form{'User'}.val");
unlink("$DataDir$Form{'User'}.clk") if (-e "$DataDir$Form{'User'}.clk");
unlink("$ImageDir$Form{'User'}.gif") if (-e "$ImageDir$Form{'User'}.gif");
unlink("$ImageDir$Form{'User'}.jpg") if (-e "$ImageDir$Form{'User'}.jpg");
unlink("$ImageDir$Form{'User'}.tmp") if (-e "$ImageDir$Form{'User'}.tmp");
@FileRecord = stdio::ReadFile($GroupFile) if (!@FileRecord);
$i = 0;
if ($FileRecord[0]) {
foreach (@FileRecord) {
($User,$Group) = split "\t";
chomp($Group);
if ($Form{'User'} eq $User) {
$find = 1;
last;
}
$i ++;
}
if ($find) {
splice(@FileRecord, $i, 1);
if (open(FILE, ">$GroupFile")) {
print FILE @FileRecord;
close(FILE);
}
}
}
}
#/*------------- CSV出力 -------------------------------------------------*/
sub CsvOutput {
shift(@Record);
print "Content-type: text/plain\n\n";
print "日付,表\示回数,クリック回数,クリック率\n";
foreach (@Record) {
chomp;
($Date,$View,$Click) = split "\t";
if ($View != 0) { $ClickRate = sprintf("%.1f",$Click/$View*100); } else { $ClickRate = 0; }
print "$Date,$View,$Click,$ClickRate\n";
}
exit(0);
}
#/*------------- メール送信スイッチ切り替え ---------------------------------*/
sub SendMailSwitch {
Errors('設定不可','メール送信機能は設定されていないため使えません。') if (!$Mailsend);
if ($Form{'mode'} eq 'SendMailOn') {
$Field{'Sendmail'} = 1;
} else {
$Field{'Sendmail'} = 0;
}
#/*--- レコードに加える ---*/
$Record[0] =
'Time' . "\b" . $Field{'Time'} . "\t"
. 'Name' . "\b" . $Field{'Name'} . "\t"
. 'Email' . "\b" . $Field{'Email'} . "\t"
. 'Url' . "\b" . $Field{'Url'} . "\t"
. 'Group' . "\b" . $Field{'Group'} . "\t"
. 'Condition' . "\b" . $Field{'Condition'} . "\t"
. 'SetView' . "\b" . $Field{'SetView'} . "\t"
. 'SetClick' . "\b" . $Field{'SetClick'} . "\t"
. 'SetDay' . "\b" . $Field{'SetDay'} . "\t"
. 'View' . "\b" . $Field{'View'} . "\t"
. 'Click' . "\b" . $Field{'Click'} . "\t"
. 'Day' . "\b" . $Field{'Day'} . "\t"
. 'TotalView' . "\b" . $Field{'TotalView'} . "\t"
. 'TotalClick' . "\b" . $Field{'TotalClick'} . "\t"
. 'TotalDay' . "\b" . $Field{'TotalDay'} . "\t"
. 'PastDay' . "\b" . $Field{'PastDay'} . "\t"
. 'Passwd' . "\b" . $Field{'Passwd'} . "\t"
. 'Sendmail' . "\b" . $Field{'Sendmail'} . "\t"
. 'Host' . "\b" . $Field{'Host'} . "\t"
. 'Addr' . "\b" . $Field{'Addr'} . "\t"
. 'Agent' . "\b" . $Field{'Agent'} . "\t"
. "\n";
#/*--- ロックのチェック ---*/
Errors('ビジー','システムがビジー状態です。') if (!stdio::LockCheck($DataFile,$UseLock));
#/*--- ファイルのロック/入出力 ---*/
$locked = stdio::FileLock($DataFile,$UseLock,@Record);
if ($locked == -1) { Errors('システムエラー','このサーバーではシンボリックリンクが使えません。'); }
elsif (!$locked) { Errors('ファイルエラー','ファイルの入出力ができません。'); }
}
#/*------------- バナー画像アップロード -------------------------------------*/
sub BannerUpload {
if ($Form{'Url'} !~ /http:\/\/.+\..+/i) {
Errors('フォーム入力ミス','リンク先URLを入力して下さい。');
} elsif (length($Form{'Banner'}) > $MaxSize) {
Errors('ファイルサイズ超過',"登録できるバナーのサイズは$MaxSizeバイトまでです。(現在、" . length($Form{'Banner'}) . 'バイト)');
} elsif ($Form{'Banner.name'} && $Form{'Banner.name'} !~ /\.gif/i && $Form{'Banner.name'} !~ /\.jpe?g/i) {
Errors('システムエラー','GIF/JPEG以外のファイルはアップロードできません。');
}
if ($Form{'Banner.name'}) {
#/*--- サーバーに記録 ---*/
open(FILE, ">$ImageDir$Form{'User'}.tmp") || Errors('ファイル入出力エラー','ファイルのオープンができません。');
binmode(FILE);
print FILE $Form{'Banner'};
close(FILE);
#/*--- リネーム/古いバナー削除 ---*/
if ($Form{'Banner.name'} =~ /\.gif$/) {
rename("$ImageDir$Form{'User'}.tmp","$ImageDir$Form{'User'}.gif");
unlink("$ImageDir$Form{'User'}.jpg") if (-e "$ImageDir$Form{'User'}.jpg");
} elsif ($Form{'Banner.name'} =~ /\.jpe?g$/) {
rename("$ImageDir$Form{'User'}.tmp","$ImageDir$Form{'User'}.jpg");
unlink("$ImageDir$Form{'User'}.jpg") if (-e "$ImageDir$Form{'User'}.gif");
}
undef($Form{'Banner'});
}
$Field{'Url'} = $Form{'Url'};
#/*--- レコードに加える ---*/
$Record[0] =
'Time' . "\b" . $Field{'Time'} . "\t"
. 'Name' . "\b" . $Field{'Name'} . "\t"
. 'Email' . "\b" . $Field{'Email'} . "\t"
. 'Url' . "\b" . $Field{'Url'} . "\t"
. 'Group' . "\b" . $Field{'Group'} . "\t"
. 'Condition' . "\b" . $Field{'Condition'} . "\t"
. 'SetView' . "\b" . $Field{'SetView'} . "\t"
. 'SetClick' . "\b" . $Field{'SetClick'} . "\t"
. 'SetDay' . "\b" . $Field{'SetDay'} . "\t"
. 'View' . "\b" . $Field{'View'} . "\t"
. 'Click' . "\b" . $Field{'Click'} . "\t"
. 'Day' . "\b" . $Field{'Day'} . "\t"
. 'TotalView' . "\b" . $Field{'TotalView'} . "\t"
. 'TotalClick' . "\b" . $Field{'TotalClick'} . "\t"
. 'TotalDay' . "\b" . $Field{'TotalDay'} . "\t"
. 'PastDay' . "\b" . $Field{'PastDay'} . "\t"
. 'Passwd' . "\b" . $Field{'Passwd'} . "\t"
. 'Sendmail' . "\b" . $Field{'Sendmail'} . "\t"
. 'Host' . "\b" . $Field{'Host'} . "\t"
. 'Addr' . "\b" . $Field{'Addr'} . "\t"
. 'Agent' . "\b" . $Field{'Agent'} . "\t"
. "\n";
#/*--- ロックのチェック ---*/
Errors('ビジー','システムがビジー状態です。') if (!stdio::LockCheck($DataFile,$UseLock));
#/*--- ファイルのロック/入出力 ---*/
$locked = stdio::FileLock($DataFile,$UseLock,@Record);
if ($locked == -1) { Errors('システムエラー','このサーバーではシンボリックリンクが使えません。'); }
elsif (!$locked) { Errors('ファイルエラー','ファイルの入出力ができません。'); }
}
#/*------------- 登録変更フォーム -------------------------------------------*/
sub RegistForm {
if ($Form{'mode'} eq 'ChangeForm') {
$HiddenField = ' ' . "\n"
. ' ' . "\n";
$PasswdMessage = ' (変更時のみ)';
$ModeTitle = '登録情報変更';
if ($Field{'Condition'} == 2) {
$Checked2 = ' checked';
} else {
$Checked1 = ' checked';
}
} else {
$HiddenField = ' ' . "\n";
$Field{'Url'}= 'http://';
$UserField = qq|■ 広告ID\n|
. qq|
\n|
. qq| \n|
. qq| \n|
. qq|
\n|
. qq| - 他のIDと重複しない広告のIDを半角英数字で入力してください。IDは変更できません。\n|
. qq|
- 広告バナーのファイル名は"広告ID.gif(jpg)"になります。\n|
. qq|
\n|
. qq|
\n|
. qq|
\n|;
$ModeTitle = '新規広告登録';
$Checked1 = ' checked';
}
print 'Content-type: text/html' . $fcode . "\n\n";
print <<_END_OF_HTML_;
$Title [$ModeTitle]
$Header
$ModeTitle
_END_OF_HTML_
SelectMenu($Form{'mode'});
print $Footer;
print qq|\n|;
print qq|\n|;
exit(0);
}
#/*------------- ファイルへ記録 ---------------------------------------------*/
sub RegistFile {
#/*--- エラーチェック ---*/
if (!$Form{'Name'}) {
Errors('フォーム入力ミス','名称を入力して下さい。');
} elsif (!$Form{'Email'}) {
Errors('フォーム入力ミス','メールアドレスを入力して下さい。');
} elsif ($Form{'Email'} !~ /[\w-]+@[\w-]+\.[\w-\.]+/) {
Errors('フォーム入力ミス','メールアドレスの形式が違います。');
} elsif ($Form{'Url'} !~ /http:\/\/.+\..+/i) {
Errors('フォーム入力ミス','URLを入力して下さい。');
} elsif ($Form{'Group'} ne "" && $Form{'Group'} !~ /[\w\s]/) {
Errors('フォーム入力ミス','グループ名は半角英数字で入力して下さい。');
} elsif (!$Form{'User'}) {
Errors('フォーム入力ミス','広告IDを入力して下さい。');
} elsif ($Form{'View'} eq "" && $Form{'Click'} eq "" && $Form{'Day'} eq "") {
Errors('フォーム入力ミス','保証条件を最低一つ入力して下さい。');
} elsif ($Form{'View'} ne "" && $Form{'View'} !~ /\d/) {
Errors('フォーム入力ミス','保証表示回数は半角英数字で入力して下さい。');
} elsif ($Form{'Click'} ne "" && $Form{'Click'} !~ /\d/) {
Errors('フォーム入力ミス','保証クリック回数は半角英数字で入力して下さい。');
} elsif ($Form{'Day'} ne "" && $Form{'Day'} !~ /\d/) {
Errors('フォーム入力ミス','保証掲載日数は半角英数字で入力して下さい。');
} elsif ($Form{'Passwd'} eq $MasterKey) {
Errors('フォーム入力ミス','ユーザーパスワードはマスターキーと重複できません。');
} elsif ($Form{'User'} eq 'new' || $Form{'User'} eq 'all') {
Errors('フォーム入力ミス','入力された広告IDは予約されているため使用できません。');
}
@Group = stdio::ReadFile($GroupFile);
@Group = () if (!$Group[0]);
#/*--- 新規登録時の設定 ---*/
if ($Form{'mode'} eq 'NewRegist') {
if (!$Form{'Passwd'}) {
Errors('フォーム入力ミス','パスワードを入力して下さい。');
} elsif ($Form{'Passwd'} ne $Form{'Passwd_Retype'}) {
Errors('フォーム入力ミス','パスワードの確認が一致しません。');
} elsif (-e $DataFile) {
Errors('フォーム入力ミス','入力されたIDは既に使用されています。');
}
#/*--- グループの設定 ---*/
push(@Group, "$Form{'User'}\t$Form{'Group'}\n") if ($Form{'Group'});
$Field{'Time'} = time;
$Field{'SetView'} = $Form{'View'};
$Field{'SetClick'} = $Form{'Click'};
$Field{'SetDay'} = $Form{'Day'};
$Field{'TotalView'} = $Field{'TotalClick'} = $Field{'TotalDay'} = $Field{'PastDay'} = 0;
$Field{'Passwd'} = stdio::CryptString($Form{'Passwd'});
#/*--- 登録変更時の設定 ---*/
} else {
#/*--- グループの設定 ---*/
if ($Form{'Group'}) {
foreach (@Group) {
($User,$Group) = split "\t";
if ($User eq $Form{'User'}) {
$find = 1;
last;
}
$i ++;
}
if ($find) {
$Group[$i] = "$Form{'User'}\t$Form{'Group'}\n";
} else {
push(@Group, "$Form{'User'}\t$Form{'Group'}\n") if ($Form{'Group'});
}
}
#/*--- パスワードの設定 ---*/
if ($Form{'Passwd'} ne $Form{'Passwd_Retype'} && $Form{'Passwd'}) {
Errors('フォーム入力ミス','パスワードの確認が一致しません。');
} elsif ($Form{'Passwd'}) {
$Field{'Passwd'} = stdio::CryptString($Form{'Passwd'});
}
}
#/*--- レコードに加える ---*/
$Record[0] =
'Time' . "\b" . $Field{'Time'} . "\t"
. 'Name' . "\b" . $Form{'Name'} . "\t"
. 'Email' . "\b" . $Form{'Email'} . "\t"
. 'Url' . "\b" . $Form{'Url'} . "\t"
. 'Group' . "\b" . $Form{'Group'} . "\t"
. 'Condition' . "\b" . $Form{'Condition'} . "\t"
. 'SetView' . "\b" . $Field{'SetView'} . "\t"
. 'SetClick' . "\b" . $Field{'SetClick'} . "\t"
. 'SetDay' . "\b" . $Field{'SetDay'} . "\t"
. 'View' . "\b" . $Form{'View'} . "\t"
. 'Click' . "\b" . $Form{'Click'} . "\t"
. 'Day' . "\b" . $Form{'Day'} . "\t"
. 'TotalView' . "\b" . $Field{'TotalView'} . "\t"
. 'TotalClick' . "\b" . $Field{'TotalClick'} . "\t"
. 'TotalDay' . "\b" . $Field{'TotalDay'} . "\t"
. 'PastDay' . "\b" . $Field{'PastDay'} . "\t"
. 'Passwd' . "\b" . $Field{'Passwd'} . "\t"
. 'Sendmail' . "\b" . $Field{'Sendmail'} . "\t"
. 'Host' . "\b" . $REMOTE_HOST . "\t"
. 'Addr' . "\b" . $REMOTE_ADDR . "\t"
. 'Agent' . "\b" . $HTTP_USER_AGENT . "\t"
. "\n";
%Field = stdio::ReadData(split "\t", $Record[0]);
#/*--- ロックのチェック ---*/
Errors('ビジー','システムがビジー状態です。') if (!stdio::LockCheck($DataFile,$UseLock));
#/*--- ファイルのロック/入出力 ---*/
$locked = stdio::FileLock($DataFile,$UseLock,@Record);
if ($locked == -1) { Errors('システムエラー','このサーバーではシンボリックリンクが使えません。'); }
elsif (!$locked) { Errors('ファイル入出力エラー','ファイルの入出力ができません。'); }
if ($Form{'Group'}) {
open(FILE, ">$GroupFile") || Errors('ファイル入出力エラー','グループファイルへの書き込みができません。');
print FILE @Group;
close(FILE);
}
}
#/*------------- セレクトメニュー表示 ---------------------------------------*/
sub SelectMenu {
$Selected{$_[0]} = ' selected';
print qq|\n|;
}
#/*------------- エラー発生時の処理 -----------------------------------------*/
sub Errors {
@ErrorMessage = @_;
$ErrorMessage[0] = 'システムエラー' if (!$ErrorMessage[0]);
$ErrorMessage[1] = '原因不明のエラー発生により強制終了されました。' if (!$ErrorMessage[1]);
$ErrorMessage[2] = '' . $ErrorMessage[2] . '
' if ($ErrorMessage[2]);
print 'Content-type: text/html' . $fcode . "\n\n";
print <<_END_OF_HTML_;
$Title [$ErrorMessage[0]]
! $ErrorMessage[0]
$ErrorMessage[1]
$ErrorMessage[2]
このプログラムはリクエスト処理中にエラーが発生したため、処理を中断しました。エラーの発生原因として、リクエスト内容の不備、アクセス権が与えられていない、誤った設定がなされている、あるいは突発的なサーバーエラー等の可能\性が考えられます。
表\示されたエラーメッセージをご確認の上、再試行してみて下さい。ブラウザでリロードすることで再試行できます。繰り返し、エラーメッセージが表\示される場合は、このサイトの管理者に連絡して下さい。
前ページへ戻る
_END_OF_HTML_
exit(1);
}
sub sigexit {
if (-e $stdio::lockfile) { unlink($stdio::lockfile); }
if (-e $stdio::tempfile) { unlink($stdio::tempfile); }
exit(1);
}