%PDF- %PDF-
Direktori : /home/rappan/www/cgi_link/ |
Current File : /home/rappan/www/cgi_link/admin.cgi |
#!/usr/bin/perl #======================================================================================= # BANNER LINK SYSTEM Script by HAL # Last Update 2007.11.08 #======================================================================================= require 'preset.cgi'; require $jcode; require 'sub.pl'; # クッキー機能のチェック &get_adcookie; $passw = $COOKIE{'pass'}; &get_date; if($ENV{'CONTENT_TYPE'} =~ m#^multipart/form-data#){ #マルチパート対応の場合 if($ENV{'REQUEST_METHOD'} eq "POST"){ $buf = ""; $read_data = ""; $remain = $ENV{'CONTENT_LENGTH'}; binmode(STDIN); while ($remain) { $remain -= sysread(STDIN, $buf, $remain); $read_data .= $buf; } $pos1 = 0; # ヘッダ部の先頭 $pos2 = 0; # ボディ部の先頭 $pos3 = 0; # ボディ部の終端 $delimiter = ""; $max_count = 0; while (1) { # ヘッダ処理 $pos2 = index($read_data,"\r\n\r\n",$pos1)+4; @headers = split("\r\n",substr($read_data,$pos1,$pos2-$pos1)); $filename=""; $name=""; $flag=0; foreach(@headers){ if ($delimiter eq "") {$delimiter = $_; }elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"; filename="([^;]*)"/i) { $name = $2; if ($3) { # 拡張子の取り出し @filefooter = split(/\./,$3); $f_footer = pop(@filefooter); $f_footer =~ tr/A-Z/a-z/; if($f_footer ne "gif" && $f_footer ne "jpg" && $f_footer ne "jpeg" && $f_footer ne "png"){ &error("許可されていない拡張子です。"); } $filename = time() ."\.".$f_footer; #ファイルを時間でリネーム } }elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"/i){$name = $2;} } # ボディ処理 $pos3 = index($read_data, "\r\n$delimiter", $pos2); $size = $pos3 - $pos2; if($filename){ if (open(OUT, "> $bn_dir$filename")) { binmode(OUT); print OUT substr($read_data, $pos2, $size); close(OUT); } $QUERY{$name} = $filename; }elsif($name){ $QUERY{$name} = substr($read_data,$pos2,$size); $QUERY{$name} =~ s/\t/ /g; } # 終了処理 $pos1 = $pos3 + length("\r\n$delimiter"); if(substr($read_data, $pos1, 4) eq "--\r\n") { # すべてのファイルの終端 last; }else{ # 次のファイルを読み出す $pos1 += 2; next; } } }else{ $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); @spall =(); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コード変換 jcode::convert(\$value,"sjis","sjis", ""); $value =~ s/\t/ /g; $QUERY{$name} = $value; } } }else{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'}); } else { $formdata = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$formdata); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\n//g; $value =~ s/\,//g; jcode::convert(\$value,"sjis","sjis", ""); $QUERY{$name} = $value; } } if($QUERY{'passwd'} ne ""){ $passw = $QUERY{'passwd'}; } if($passw ne $admin_pass){ print "Content-Type: text/html\n\n"; print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"; print <<"EOM"; <html> <head><title></title> <center> <form action="$admin_cgi" method="post"> Password <input type="password" name="passwd" size="10"> <input type="submit" value="login"> </form> </center> </body></html> EOM exit; } $cook="pass<>$passw"; &set_adcookie("60",$cook); #CGIが呼び出された条件によって処理を分岐 if($QUERY{'mode'} eq 'inputbase') { &inputbase; } elsif($QUERY{'mode'} eq 'input') { &input; } elsif($QUERY{'mode'} eq 'del') { &del; } elsif($QUERY{'mode'} eq 'logout') { &logout; } else { &html; } #===============================表示HTMLドキュメントを生成=========================== sub html { if($QUERY{'mode'} eq ""){ $QUERY{'mode'} = @junle_code[0]; } # ジャンルタイトル決定 $i = 0; $jtitle = 'admin'; foreach $modew (@junle_code) { if($QUERY{'mode'} eq $modew){ $jtitle .= "-$junle_str[$i]"; } $i++; } open(PRE,"$design_file") || &error('FILE OPEN ERROR - design'); @htmls = <PRE>; close(PRE); $html = ""; foreach (@htmls) { $html .= $_; } ($dhead,$heads,$dfoot) = split(/<!--header-->/, $html); if($QUERY{'mode'} eq "index"){ open(IND,"$index_file") || &error('FILE OPEN ERROR - index'); @htmls = <IND>; close(IND); $html = ""; foreach (@htmls) { $html .= $_; } }else{ if($QUERY{'num'} ne ""){ $num = $QUERY{'num'}; } else{ $num = 0; } if($pmax == 0){ $pmax = 999; } $next_num = $num + $pmax; $html = $dhead .'<!--header-->' .$dfoot; ($dhead,$sheet,$dfoot) = split(/<!--tr-->/, $html); ($shead,$tsheet,$sfoot) = split(/<!--td-->/, $sheet); if($QUERY{'mode'} eq "rank"){ $log_file = $rank_file; } open(LOG,"$log_file") || &error('FILE OPEN ERROR - log'); @logs = <LOG>; close(LOG); # ソート処理 if($sort_ck == 2 || $sort_ck == 3){ @sortw = (); foreach (@logs) { ($cnt,$seq,$site_name,$site_namek,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); push(@sortw,"$seq<>$site_namek<>$site_name<>$cnt<>$ad_name<>$comm<>$url<>$bn_url<>$janru<>\n"); } if($sort_ck == 2){ @sorted = sort { $b <=> $a } @sortw; } else{ @sorted = sort { $a <=> $b } @sortw; } @logs = (); foreach (@sorted) { ($seq,$site_namek,$site_name,$cnt,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); push(@logs,"$cnt<>$seq<>$site_name<>$site_namek<>$ad_name<>$comm<>$url<>$bn_url<>$janru<>\n"); } }elsif($sort_ck == 1){ @logs = reverse @logs; } $prev = ""; $i = 0; $j = 0; $sf = 0; foreach (@logs) { ($cnt,$seq,$site_name,$site_namek,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); if($bn_url eq ""){ $bn_url = $bn_dir .$nb_img; } elsif(!($bn_url =~ /http:/)){ $bn_url = $bn_dir .$bn_url; } $url = $view_cgi .'?url=' .$seq; $site_name = "<a href=\"$url\" target=\"_blank\">$site_name</a>"; $linkb = "<a href=\"$url\" target=\"_blank\"><img src=\"$bn_url\" border=\"0\"></a>"; $adminw = "<table width=100%><tr>"; $adminw .= "<td><a href=\"$admin_cgi?mode=inputbase&seq=$seq\">編集</a>"; $adminw .= "<td align=\"right\"><a href=\"javascript:WV_jumpok(\'$admin_cgi?mode=del&seq=$seq\',\'このデータを削除します。よろしいですか?\');\">削除</a>"; $adminw .= "</tr></table>"; if($QUERY{'mode'} eq "rank"){ $f = 1; $i++; }elsif($admin_view == 0){ $f = 1; $i++; }else{ @janrus = split("##",$janru); $f = 0; foreach $value (@janrus) { if($value eq $QUERY{'mode'}){ $f = 1; $i++; last; } } } if($f == 1){ if($j >= $num && $j < $next_num){ $tsheetw = $tsheet; if($QUERY{'mode'} eq "rank"){ $tsheetw =~ s/<!--rcnt-->/[ $cnt ]/g; } elsif($cnt >= time()-60*60*24*$new_day){ # NEWマーク処理 $tsheetw =~ s/<!--new-->/<img src="$new_img" align="absmiddle">/g; } $tsheetw =~ s/<!--site_name-->/$site_name/g; $tsheetw =~ s/<!--ad_name-->/$ad_name/g; $tsheetw =~ s/<!--comm-->/$comm/g; $tsheetw =~ s/<!--url-->/$url/g; $tsheetw =~ s/<!--link-->/$linkb/g; $tsheetw =~ s/<!--admin-->/$adminw/g; $sf++; if($sf == 1){ $prev .= $shead; } $prev .= $tsheetw; if($sf == $table_su){ $prev .= $sfoot; $sf = 0; } } $j++; } } if($sf != $table_su && $sf != 0){ $tsheet =~ s/<!--site_name-->/No DATA/g; $tsheet =~ s/<!--comm-->/No DATA/g; while($sf < $table_su){ $prev .= $tsheet; $sf++; } $prev .= $sfoot; } $html = $dhead .$prev .$dfoot; } $newinput = "<a href=\"$admin_cgi?mode=inputbase\"><b>新規入力</b></a> <a href=\"$admin_cgi?mode=logout\"><b>ログアウト</b></a>"; if($admin_view == 1){ $heads =~ s/<!--cgi-->/$admin_cgi/g; $heads .= $newinput; }else{ $heads = $newinput; } $p = $i / $pmax; $iw = 0; $page = ""; while($iw < $p){ $iww = $iw + 1; $numw = $iw * $pmax; if($num == $numw){ $page .= "[$iww] "; } else{ $page .= "<a href=\"$admin_cgi?mode=$QUERY{'mode'}&num=$numw\">[$iww]</a> "; } $iw++; } $html =~ s/<!--ken-->/$j/g; $html =~ s/<!--page-->/$page/g; $html =~ s/<!--header-->/$heads/g; $html =~ s/<!--cgi-->/$view_cgi/g; $html =~ s/<!--janru-->/$jtitle/g; $html =~ s/<!--admincgi-->/$admin_cgi/g; $html =~ s/<!--system-->/$systeminfo/g; print "Content-Type: text/html\n\n"; print $html; exit; } #===============================表示HTMLドキュメントを生成=========================== sub inputbase { open(PRE,"$admin_file") || &error('FILE OPEN ERROR - admin'); @htmls = <PRE>; close(PRE); $html = ""; foreach (@htmls) { $html .= $_; } $hidden = "<input type=\"hidden\" name=\"mode\" value=\"input\">"; $hidden .= "<input type=\"hidden\" name=\"seq\" value=\"$QUERY{'seq'}\">"; if($QUERY{'seq'} ne ""){ $f = 0; open(LOG,"$log_file") || &error('FILE OPEN ERROR - data'); @logs = <LOG>; close(LOG); foreach (@logs) { ($cnt,$seq,$site_name,$site_namek,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); if($seq == $QUERY{'seq'}){ $f = 1; last; } } if($f != 1){ &error('指定されたサイトは登録されていません。'); } } # ジャンルセレクト $sel = ""; $i = 0; @junles = split(/##/,$janru); foreach $sw (@junle_code) { $iw = 0; foreach $jw (@junles) { if($sw eq $jw){ $sel .= "<input type=\"checkbox\" name=\"j_$sw\" value=\"$sw\" checked>$junle_str[$i] \n"; $iw = 1; } } if($iw != 1){ $sel .= "<input type=\"checkbox\" name=\"j_$sw\" value=\"$sw\">$junle_str[$i] \n";} $i++; } $html =~ s/<!--admincgi-->/$admin_cgi?mode=inputbase/g; $html =~ s/<!--admin_cgi-->/$admin_cgi/g; $html =~ s/<!--hidden-->/$hidden/g; $html =~ s/<!--site_name-->/$site_name/g; $html =~ s/<!--site_namek-->/$site_namek/g; $html =~ s/<!--ad_name-->/$ad_name/g; $comm =~ s/<br>/\n/g; $html =~ s/<!--comm-->/$comm/g; $html =~ s/<!--url-->/$url/g; if(!($bn_url =~ /http:/)){ $bn_url = ""; } $html =~ s/<!--bn_url-->/$bn_url/g; $html =~ s/<!--janru-->/$sel/g; print "Content-Type: text/html\n\n"; print $html; exit; } #===============================入力/編集処理=========================== sub input { $QUERY{'comm'} =~ s/\r\n/<br>/g; $QUERY{'comm'} =~ s/\r/<br>/g; $QUERY{'comm'} =~ s/\n/<br>/g; $bdf = 0; $QUERY{'janru'} = ""; foreach $sw (@junle_code) { $jw = 'j_' .$sw; if($QUERY{$jw} ne ""){ $QUERY{'janru'} .= "$QUERY{$jw}" .'##'; } } if($QUERY{'janru'} eq ""){ &error('ジャンルを少なくとも一つは選択してください。'); } $QUERY{'janru'} = substr($QUERY{'janru'},0,-2); if($QUERY{'bn_url'} ne ""){ $bdf = 1; } if($QUERY{'up'} ne "" && $QUERY{'bn_url'} ne ""){ &error('直リンバナーかアップロードバナーかどちらかにしてください。'); } elsif($QUERY{'up'} ne ""){ $QUERY{'bn_url'} = $QUERY{'up'}; } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } open(LOG,"$log_file") || &error('FILE OPEN ERROR - data'); @logs = <LOG>; close(LOG); @news = (); $i = 1; foreach (@logs) { ($cnt,$seq,$site_name,$site_namek,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); if($seq != $QUERY{'seq'}){ push(@news,$_); } else{ $cntw = $cnt; if($QUERY{'up'} ne "" || $bdf == 1 && !($bn_url =~ /http:/)){ $w = $bn_dir .$bn_url; unlink $w; } elsif($bdf != 1 && ($bn_url =~ /http:/)){ $QUERY{'bn_url'} = ""; } elsif($QUERY{'bn_url'} eq ""){ $QUERY{'bn_url'} = $bn_url; } } if($seq >= $i){ $i = $seq + 1; } } if($QUERY{'seq'} eq ""){ $QUERY{'seq'} = $i; $cntw = time(); } unshift(@news,"$cntw<>$QUERY{'seq'}<>$QUERY{'site_name'}<>$QUERY{'site_namek'}<>$QUERY{'ad_name'}<>$QUERY{'comm'}<>$QUERY{'url'}<>$QUERY{'bn_url'}<>$QUERY{'janru'}<>\n"); # ソート処理 @sortw = (); foreach (@news) { ($cnt,$seq,$site_name,$site_namek,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); push(@sortw,"$site_namek<>$seq<>$site_name<>$cnt<>$ad_name<>$comm<>$url<>$bn_url<>$janru<>\n"); } @sorted = sort { $a cmp $b } @sortw; @logs = (); foreach (@sorted) { ($site_namek,$seq,$site_name,$cnt,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); push(@logs,"$cnt<>$seq<>$site_name<>$site_namek<>$ad_name<>$comm<>$url<>$bn_url<>$janru<>\n"); } open(OUT,">$log_file") || &error('FILE OPEN ERROR - data'); print OUT @logs; close(OUT); open(RNK,"$rank_file") || &error('FILE OPEN ERROR - log'); @ranks = <RNK>; close(RNK); @news = (); $f = 0; foreach (@ranks) { ($cntr,$seqr,$site_namer,$site_namekr,$ad_namer,$commr,$urlr,$bn_urlr,$janrur) = split(/<>/, $_); if($QUERY{'seq'} == $seqr){ push(@news,"$cntr<>$seqr<>$QUERY{'site_name'}<>$QUERY{'site_namek'}<>$QUERY{'ad_name'}<>$QUERY{'comm'}<>$QUERY{'url'}<>$QUERY{'bn_url'}<>$QUERY{'janru'}<>\n"); $f = 1; }else{ push(@news,$_); } } if($f == 1){ open(OUT,">$rank_file") || &error('FILE OPEN ERROR - rank'); print OUT @news; close(OUT); } &unlock; # ロック解除 # リロード処理 print "Location: $admin_cgi?\n\n"; } #===============================削除処理=========================== sub del { # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } open(LOG,"$log_file") || &error('FILE OPEN ERROR - data'); @logs = <LOG>; close(LOG); @news = (); $i = 1; foreach (@logs) { ($cnt,$seq,$site_name,$site_namek,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); if($seq != $QUERY{'seq'}){ push(@news,$_); } else{ if(!($bn_url =~ /http:/)){ $w = $bn_dir .$bn_url; unlink $w; } } } open(OUT,">$log_file") || &error('FILE OPEN ERROR - data'); print OUT @news; close(OUT); open(LOG,"$rank_file") || &error('FILE OPEN ERROR - rank'); @logs = <LOG>; close(LOG); @news = (); $i = 1; foreach (@logs) { ($cnt,$seq,$site_name,$site_namek,$ad_name,$comm,$url,$bn_url,$janru) = split(/<>/, $_); if($seq != $QUERY{'seq'}){ push(@news,$_); } } open(OUT,">$rank_file") || &error('FILE OPEN ERROR - rank'); print OUT @news; close(OUT); &unlock; # ロック解除 # リロード処理 print "Location: $admin_cgi?\n\n"; } #===============================ログアウト処理=========================== sub logout{ &set_adcookie("0",""); # リロード処理 print "Location: $admin_cgi?\n\n"; } #===============================クッキーの取得=========================== sub get_adcookie{ @pairs = split(/\;/, $ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { local($name, $value) = split(/\=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/\,/, $DUMMY{$cookie_name}); foreach $pair (@pairs) { local($name, $value) = split(/<>/, $pair); $COOKIE{$name} = $value; } } #===============================クッキーの発行(60日間有効)=========================== sub set_adcookie{ my $days = $_[0]; my $cook = $_[1]; ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$dmy,$dmy) = gmtime(time + 60*24*60*$days); $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; print "Set-Cookie: $cookie_name=$cook; expires=\"$date_gmt\"\n"; } # 時間取得 ------------------------------------------------------------------------------ sub get_date{ $ENV{'TZ'} = "JST-9"; @date = localtime(time); $date[5] += 1900; $date[4] = sprintf("%02d",$date[4] + 1); $date[3] = sprintf("%02d",$date[3]); $date[2] = sprintf("%02d",$date[2]); $date[1] = sprintf("%02d",$date[1]); $date[6] = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$date[6]]; }