# lib_ini.pl 最終更新 2010/01/18 #┌───────────────────────────────── #│ 携帯対応YY-BOARD(改) #│ lib_ini.pl 通常版・マルチ掲示板対応版共用 #│ Rev2.15(M)で inilib.pl からファイル名変更 #│ for yyini.cgi #└───────────────────────────────── #------------------------------------------------- # 変数設定 #------------------------------------------------- # ブラウザ情報エスケープ $UserAgent = &env_escape($ENV{'HTTP_USER_AGENT'}); # Perl追加モジュール(ライブラリ)ディレクトリ unshift (@INC,$libDir2); #------------------------------------------------- # 設定データファイル読み込み #------------------------------------------------- sub data_load { my $str = $_[0]; # 設定編集モード:'all' 他:''または指定なし my $dummy; # マルチ掲示板対応版用 if ($room ne '') { if ($str eq 'all' && -e "$maxdata_file") { &maxdata; # 添付データ投稿受理最大サイズ取得 } $dummy = $maxdata; } open(DF,"$data_file") || &error("Open Error : $data_file"); while () { chomp; my ($dano,$dako) = split(/<>/); # 00 情報 if ($dano eq '00') { if ($dako != 2) { (close(IN) and &error("データファイルのフォーマットが正しくありません")); } # 01 基本設定 } elsif ($dano eq '01') { ($dano,$dako,$homepage,$max,$henshinNG,$resMax,$newok,$defMode,$pageView,$p_pre_log,$resView,$resViewR,$shinkiForm,$color,$autolink,$in_email,$topsort,$usertop,$master_url,$in_email_non,$email_non_mark,$in_email_form,$formCopy,$in_email_def,$in_email_open,$in_email_chd,$in_sub) = split(/<>/); # 02 掲示板のタイトル } elsif ($dano eq '02') { ($dano,$dako,$title,$tCol,$tSize,$t_img,$t_w,$t_h,$messege,$ititleView) = split(/<>/); # 03 壁紙・文字色 } elsif ($dano eq '03') { ($dano,$dako,$backgif,$bgcolor,$text,$link,$vlink,$alink,$formCol1,$formCol2,$stylesheet) = split(/<>/); # 04 PC・記事表示部 } elsif ($dano eq '04') { ($dano,$dako,$sub_len,$nam_len,$mailview,$tblCol,$subCol,$namCol,$noCol,$SubBkgrd,$br_use,$br_len,$refCol,$tblClass,$PreviewRes,$threadIchiran,$pgoku,$resVRev1,$resVRev2,$resVRev3) = split(/<>/); # 05 アイコン } elsif ($dano eq '05') { my ($tmp1,$tmp2) = (split(/<>/))[2,12]; if ($tmp1 == 1 || $str eq 'all') { ($dano,$dako,$iconMode,$imgurl,$ico1,$ico2,$telIconView,$ImageView,$img_w,$img_h,$my_icon,$my_gif,$imgdir,$telIconView2) = (split(/<>/))[0,1,2,3,4,5,6,7,8,9,10,11,16,17]; } else { ($imgurl,$imgdir) = (split(/<>/))[3,16]; } if ($tmp2 == 1 || $str eq 'all') { ($home_icon,$home_gif,$home_wid,$home_hei) = (split(/<>/))[12,13,14,15]; } # 06 アイコンアップロード機能 } elsif ($dano eq '06') { my $tmp = (split(/<>/))[2]; if (($iconMode == 1 && $tmp >= 1) || $str eq 'all') { ($dano,$dako,$iconUp,$iconCheck,$iconUpDir,$iconUpMax,$iconMaxW,$iconMaxH) = split(/<>/); } # 07 ミニカウンタ } elsif ($dano eq '07') { my $tmp = (split(/<>/))[2]; if ($str eq 'all') { ($dano,$dako,$counter,$mini_fig,$cntCol,$gif_path,$mini_w,$mini_h,$ipcheck,$kiriban,$ki_kiri,$ki_zoro,$ki_ren,$ki_teiki,$ki_nini,$ki_message,$ki_messagei,$mini_fig2,$mini_fig2_view,$mini_fig2_viewi) = split(/<>/); } elsif ($tmp >= 1) { ($dano,$dako,$counter,$mini_fig,$cntCol,$gif_path,$mini_w,$mini_h,$ipcheck,$kiriban,$mini_fig2,$mini_fig2_view,$mini_fig2_viewi) = (split(/<>/))[0,1,2,3,4,5,6,7,8,9,17,18,19]; } # 08 追加項目 } elsif ($dano eq '08') { my ($tmp1,$tmp2,$tmp3,$tmp4,$tmp5) = (split(/<>/))[2,7,12,17,22]; if ($tmp1 >= 1 || $str eq 'all') { ($plusKo1,$plusKo1Nam,$plusKo1Jyo,$plusKo1Kei,$plusKo1Sen) = (split(/<>/))[2,3,4,5,6]; } if ($tmp2 >= 1 || $str eq 'all') { ($plusKo2,$plusKo2Nam,$plusKo2Jyo,$plusKo2Kei,$plusKo2Sen) = (split(/<>/))[7,8,9,10,11]; } if ($tmp3 >= 1 || $str eq 'all') { ($plusKo3,$plusKo3Nam,$plusKo3Jyo,$plusKo3Kei,$plusKo3Sen) = (split(/<>/))[12,13,14,15,16]; } if ($tmp4 >= 1 || $str eq 'all') { ($plusKo4,$plusKo4Nam,$plusKo4Jyo,$plusKo4Kei,$plusKo4Sen) = (split(/<>/))[17,18,19,20,21]; } if ($tmp5 >= 1 || $str eq 'all') { ($plusKo5,$plusKo5Nam,$plusKo5Jyo,$plusKo5Kei,$plusKo5Sen) = (split(/<>/))[22,23,24,25,26]; } # 09 過去ログ } elsif ($dano eq '09') { my $tmp = (split(/<>/))[2]; if ($tmp == 1 || $str eq 'all') { ($dano,$dako,$pastkey,$pastmax,$pastView,$pastView_pre,$past2_use,$pastno2,$past2_kak,$extSearch,$pastMode) = split(/<>/); } # 10 セキュリティ } elsif ($dano eq '10') { ($dano,$dako,$postonly,$baseUrl,$NoRefNG,$writePass,$writePass2,$miruPass,$BaseDir,$adChk,$HosUaOut,$HosUaOuti,$telAgentPC,$telAgentTEL,$HosUaEnc,$IDOut,$AccessLog,$AccessLog2) = split(/<>/); # 11 投稿規制 } elsif ($dano eq '11') { ($dano,$dako,$nameMax,$subMax,$commMax,$regCtl,$wait,$NGWord,$ngword_file,$UrlComNG,$NoNihonNG,$ComUrlsMax,$pview,$tokoJikan1,$tokoJikan2,$regist_key,$regist_keyForm,$OneRegOne) = split(/<>/); # 12 アクセス規制 } elsif ($dano eq '12') { ($dano,$dako,$denyHost,$denyAddr,$ExtDeny,$ExtDeny_file,$ProxyChk,$ProxyChkOk,$UtnOn,$KyohiUtn,$denyHAReg,$denyHostReg,$denyAddrReg,$ProxyChkForm,$ProxyChkOkForm,$UtnOnForm,$KyohiUtnForm,$ExtUtnOn,$IDCheck1,$IDCheck2,$UACheck1,$UACheck2) = split(/<>/); # 13 WWWC } elsif ($dano eq '13') { my $tmp = (split(/<>/))[2]; if ($tmp == 1 || $str eq 'all') { ($dano,$dako,$wwwc_use,$wwwc_file,$wwwc_check,$wwwc_open) = split(/<>/); } # 14 RSS } elsif ($dano eq '14') { my $tmp = (split(/<>/))[2]; if ($tmp >= 1 || $str eq 'all') { ($dano,$dako,$rss_use,$rss_out,$bbs_url,$rss_file,$rss_check,$rss_desc,$rss_icon,$rss_w,$rss_h,$rss_style,$rssCE,$rss_image) = split(/<>/); } # 15 投稿ランキング機能 } elsif ($dano eq '15') { my $tmp = (split(/<>/))[2]; if ($tmp >= 1 || $str eq 'all') { ($dano,$dako,$WriteCnt,$WCntRank1,$WCntRank2,$WCntRank3,$WCntRank4) = split(/<>/); } # 16新着マーク } elsif ($dano eq '16') { ($dano,$dako,$new_time,$new_color,$new_color2,$new_view,$new_view2,$new_view_res,$new_view2_res,$newViewi,$newViewi2,$newViewResi,$newViewResi2) = split(/<>/); # 17 スキン表示 } elsif ($dano eq '17') { ($dano,$dako,$stdSkin,$preSkin,$newSkin,$treSkin,$resSkin,$istdSkin,$ipreSkin,$inewSkin,$itreSkin,$imsgSkin) = split(/<>/); # 18 メール通知等 } elsif ($dano eq '18') { ($dano,$dako,$mailing,$mailing2,$mailto,$sendmail,$ngreg,$oyamailing,$myRegName,$myRegMail,$sendmail_f) = split(/<>/); # 19 拡張設定 } elsif ($dano eq '19') { ($dano,$dako,$gethostbyaddr,$location,$banner1,$banner2,$norobot,$trip,$KanriMessage,$KanriMessagei,$ComSeikei,$oyaWork,$UsrDel,$nameLess,$pageLink1,$pageLink2) = split(/<>/); # 20 拡張設定2 } elsif ($dano eq '20') { ($dano,$dako,$fontChange,$fontChangeFile,$PwdRegPC,$PwdRegTel,$DoubleReg,$editNG,$deleNG,$dougaOn1,$dougaOn2,$flvplayer,$pcsi,$Unicode_old,$IMagick_old,$TwitThis,$TwitThis_gif,$TwitThis_wid,$TwitThis_hei,$catView) = split(/<>/); # 21 タグ広告等 } elsif ($dano eq '21') { ($dano,$dako,$Bbanner1,$Bbanner1View,$Bbanner2,$Bbanner2View,$Bbanner3,$Bbanner3View,$Tbanner1,$Tbanner1View,$Tbanner2,$Tbanner2View,$Tbanner3,$Tbanner3View,$GgAdS) = split(/<>/); # 31 e-PAD絵文字機能 } elsif ($dano eq '31') { my $tmp = (split(/<>/))[2]; if ($tmp == 1 || $str eq 'all') { ($dano,$dako,$epad_use,$ij_change,$emoji_picout,$img_i,$img_j,$img_e,$emodir,$em_form,$ijf) = split(/<>/); } # 32 追加モジュール } elsif ($dano eq '32') { ($dano,$dako,$Unicode,$IMagick) = split(/<>/); # 41 携帯用設定 } elsif ($dano eq '41') { ($dano,$dako,$imode_out,$defModei,$ihomepage,$imode_icon,$imode_gif,$keitaiCol,$mailcheck,$send_mail,$mail_title,$mail_body,$ipgoku,$iprelink,$imode_iconMode) = split(/<>/); # 42 携帯・記事表示部 } elsif ($dano eq '42') { ($dano,$dako,$new_log,$p_my_log,$p_msg_log,$sub_leni_pre,$sub_leni,$nam_leni_pre,$nam_leni,$com_len,$istdView,$meslast,$telurl,$imailview,$telHalf,$PreviewResi,$thdSpiPre,$thdSpiTree) = split(/<>/); # 43 携帯・文字色 } elsif ($dano eq '43') { ($dano,$dako,$tColi,$cntColi,$itext,$ibgcolor,$linki,$vlinki,$alinki,$subColi,$namColi,$noColi,$comColi2,$comColi,$refTel) = split(/<>/); # 44 携帯版メッセージ } elsif ($dano eq '44') { ($dano,$dako,$imode_msg,$imode_msg2,$messegei) = split(/<>/); # 45 携帯用タイトル画像 } elsif ($dano eq '45') { ($dano,$dako,$imode_title,$foma_title,$jsky_title,$ezweb_title,$doti_title,$h_title,$airh_title,$lmode_title,$iphone_title,$emobile_title) = split(/<>/); # 60 メール投稿受付機能 } elsif ($dano eq '60') { my $tmp = (split(/<>/))[2]; if ($tmp == 1 || $str eq 'all') { ($dano,$dako,$mailReg,$mRadChk,$mRupload,$mRpicok,$mRgentei,$mRmail,$mRname,$mRicon,$mRcolor,$mRpwd) = split(/<>/); } # 61 ファイル添付機能 } elsif ($dano eq '61') { my $tmp = (split(/<>/))[2]; if ($tmp >= 1 || ($mailReg ==1 && $mRupload == 1) || $str eq 'all') { ($dano,$dako,$upload,$res_clip,$ImageCheck,$ImageDel,$updir,$upurl,$clip_err,$maxdata,$resizeProg) = split(/<>/); } # 62 携帯からのメール添付 } elsif ($dano eq '62') { my $tmp = (split(/<>/))[2]; if (($upload >= 1 && $tmp == 1) || $mailReg ==1 || $str eq 'all') { ($dano,$dako,$iupload,$telpicok,$pop_server,$pop_port,$pop_mailadrs,$pop_user,$pop_pwd) = split(/<>/); } # 63 表示関係 } elsif ($dano eq '63') { if ($upload >= 1 || $str eq 'all') { ($dano,$dako,$imgpoint,$imgpoint2,$IconClip,$IconSoon,$MaxW,$MaxH,$ipiclink,$iPicView,$SBView,$SBViewDir,$ExtView,$imgpoint3,$iPicView2,$iPicProtect) = split(/<>/); } elsif ($dougaOn1 >= 1 || $dougaOn2 >= 1) { ($SBView,$SBViewDir) = (split(/<>/))[10,11]; } # 64 ファイル形式 } elsif ($dano eq '64') { if ($upload >= 1 || $str eq 'all') { ($dano,$dako,$gif,$jpeg,$png,$swf,$txt,$html,$lha,$zip,$cab,$pdf,$midi,$word,$excel,$ppt,$ram,$rm,$mpeg,$mp3,$mov,$wmv,$avi,$mld,$mmf,$pmd,$bp2,$gpp,$gpp2,$mp4,$flv,$m4a) = split(/<>/); } # 65 投稿画像へ文字挿入 } elsif ($dano eq '65') { my $tmp = (split(/<>/))[2]; if (($tmp == 3 && $Unicode == 1 && $IMagick == 1 && ($upload >= 1 || ($mailReg ==1 && $mRupload == 1))) || $str eq 'all') { ($dano,$dako,$moIn,$moIn_org,$moIn_text1,$moIn_font1,$moIn_pos1,$moIn_p1d,$moIn_p1m,$moIn_p1s,$moIn_w1d,$moIn_w1m,$moIn_w1s,$moIn_h1d,$moIn_h1m,$moIn_h1s,$moIn_color1,$moIn_bgcolor1,$moIn_text2,$moIn_font2,$moIn_pos2,$moIn_p2d,$moIn_p2m,$moIn_p2s,$moIn_w2d,$moIn_w2m,$moIn_w2s,$moIn_h2d,$moIn_h2m,$moIn_h2s,$moIn_color2,$moIn_bgcolor2) = split(/<>/); } elsif ($tmp == 1 && $Unicode == 1 && $IMagick == 1 && ($upload >= 1 || ($mailReg ==1 && $mRupload == 1))) { ($dano,$dako,$moIn,$moIn_org,$moIn_text1,$moIn_font1,$moIn_pos1,$moIn_p1d,$moIn_p1m,$moIn_p1s,$moIn_w1d,$moIn_w1m,$moIn_w1s,$moIn_h1d,$moIn_h1m,$moIn_h1s,$moIn_color1,$moIn_bgcolor1) = split(/<>/); } elsif ($tmp == 2 && $Unicode == 1 && $IMagick == 1 && ($upload >= 1 || ($mailReg ==1 && $mRupload == 1))) { ($dano,$dako,$moIn,$moIn_org,$moIn_text2,$moIn_font2,$moIn_pos2,$moIn_p2d,$moIn_p2m,$moIn_p2s,$moIn_w2d,$moIn_w2m,$moIn_w2s,$moIn_h2d,$moIn_h2m,$moIn_h2s,$moIn_color2,$moIn_bgcolor2) = (split(/<>/))[0,1,2,3,18,19,20,21,22,23,24,25,26,27,28,29,30,31]; } # 91 設定データ編集画面 } elsif ($dano eq '91') { ($dano,$dako,$er_link,$er_tCol,$er_tColi) = split(/<>/); # 99 マスターパスワード } elsif ($dano eq '99') { ($dano,$dako,$mspass) = split(/<>/); } } close(DF); # FOMA/i-mode 携帯識別情報送信用 $UtnOn_M = $UtnOn; if ($ExtUtnOn > $UtnOn_M) { $UtnOn_M = $ExtUtnOn; } # DoCoMoで閲覧・投稿時機種情報取得 if ($UtnOn_M == 3 && ($imode == 3 || $imode == 8)) { $DCMUtn = ' utn'; } else { $DCMUtn = ''; } if ($UtnOn_M >= 1 && ($imode == 3 || $imode == 8)) { $DCMUtnR = ' utn'; } else { $DCMUtnR = ''; } # マルチ掲示板対応版 if ($room ne '') { $maxdata = $dummy; if ($upload >= 1 && !$maxdata) { # 最大アップロードサイズ表示用 $maxdata = 100; # cgi-lib.plの初期値 if ($maxdata < 1024) { $maxdata2 = "${maxdata}KB"; } else { $maxdata2 = (int($maxdata/102.4))/10; $maxdata2 .= MB; } } # cgi-lib.plで使用 $cgi_lib'maxdata = $maxdata * 1024; # 通常版 } else { if ($upload >= 1) { # cgi-lib.plで使用 $cgi_lib'maxdata = $maxdata * 1024; # 最大アップロードサイズ表示用 if ($maxdata < 1024) { $maxdata2 = "${maxdata}KB"; } else { $maxdata2 = (int($maxdata/102.4))/10; $maxdata2 .= MB; } } } # 設定データ保存ページ変更処理 if ($Unicode_old ne '' && $Unicode eq '') { $Unicode = $Unicode_old; } if ($IMagick_old ne '' && $IMagick eq '') { $IMagick = $IMagick_old; } # 変数追加処理 if ($messegei) { # Rev1.7 $messegei =~ s/\r\n//; $messegei =~ s/\r//; $messegei =~ s/\n//; } if ($img_e) { # Rev1.72 $img_e =~ s/\r\n//; $img_e =~ s/\r//; $img_e =~ s/\n//; } # 改行復元 $stylesheet =~ s/
/\n/g; $banner1 =~ s/
/\n/g; $banner2 =~ s/
/\n/g; $Bbanner1 =~ s/
/\n/g; $Bbanner2 =~ s/
/\n/g; $Bbanner3 =~ s/
/\n/g; # 数値が不正な場合 if (!$max || $max =~ /\D/) { $max=100; } if ($resMax =~ /\D/) { $resMax=0; } if ($sub_len eq "" || $sub_len =~ /\D/) { $sub_len=20; } if ($nam_len eq "" && $sub_len) { $nam_len = $sub_len / 2; } elsif ($nam_len eq "" || $nam_len =~ /\D/) { $nam_len=10; } if ($sub_leni eq "" || $sub_leni =~ /\D/) { $sub_leni=20; } if ($nam_leni eq "" || $nam_leni =~ /\D/) { $nam_leni=10; } if ($sub_leni_pre eq "" || $sub_leni_pre =~ /\D/) { $sub_leni_pre=10; } if ($nam_leni_pre eq "" || $nam_leni_pre =~ /\D/) { $nam_leni_pre=5; } if (!$pageView || $pageView =~ /\D/) { $pageView=10; } if (!$p_pre_log || $p_pre_log =~ /\D/) { $p_pre_log=20; } if (!$mini_fig || $mini_fig =~ /\D/) { $mini_fig=6; } if (!$pastmax || $pastmax =~ /\D/) { $pastmax=300; } if (!$pastView || $pastView =~ /\D/) { $pastView=10; } if (!$pastView_pre || $pastView_pre =~ /\D/) { $pastView_pre=20; } if (!$wait || $wait =~ /\D/) { $wait=60; } if (!$new_log || $new_log =~ /\D/) { $new_log=3; } if (!$p_my_log || $p_my_log =~ /\D/) { $p_my_log=6; } if (!$p_msg_log || $p_msg_log =~ /\D/) { $p_msg_log=3; } if (!$new_time || $new_time =~ /\D/) { $new_time=24; } if (!$br_len || $br_len =~ /\D/) { $br_len=60; } if (!$resView || $resView =~ /\D/) { $resView=0; } if (!$resViewR || $resViewR =~ /\D/) { $resViewR=0; } if (!$com_len || $com_len =~ /\D/) { $com_len=0; } if (!$rss_out || $rss_out =~ /\D/) { $rss_out=10; } if ($tokoJikan1 eq '' || $tokoJikan1 =~ /\D/) { $tokoJikan1=5; } if ($tokoJikan2 eq '' || $tokoJikan2 =~ /\D/) { $tokoJikan2=30; } if ($er_tColi eq '') { $er_tColi = "red"; } # 設定項目から移動 $new_time2 = $new_time * 2; # 絵文字入力フォーム if ($em_form && !$imode) { &em_form; } # 投稿者名文字色 if (!$namCol) { $namCol = $link; } # 管理メッセージ if (!$KanriMessage) { $KanriMessage="【お知らせ】"; } if (!$KanriMessagei) { $KanriMessagei="【お知らせ】"; } # 添付可能ファイル取得 $upok = ''; if ($uploadall eq 'Yes') { $upok = 'All Files'; } elsif ($upload >= 1) { if ($gif == 1) { $upok .= 'gif '; } if ($jpeg == 1) { $upok .= 'jpg '; } if ($png == 1) { $upok .= 'png '; } if ($swf == 1) { $upok .= 'swf '; } if ($txt == 1) { $upok .= 'txt '; } if ($html == 1) { $upok .= 'html '; } if ($lha == 1) { $upok .= 'lha '; } if ($zip == 1) { $upok .= 'zip '; } if ($cab == 1) { $upok .= 'cab '; } if ($pdf == 1) { $upok .= 'pdf '; } if ($midi == 1) { $upok .= 'midi '; } if ($word == 1) { $upok .= 'Word '; } if ($excel == 1) { $upok .= 'Excel '; } if ($ppt == 1) { $upok .= 'PowerPoint '; } if ($ram == 1) { $upok .= 'ram '; } if ($rm == 1) { $upok .= 'rm '; } if ($mpeg == 1) { $upok .= 'mpeg '; } if ($mp3 == 1) { $upok .= 'mp3 '; } if ($mp4 == 1) { $upok .= 'mp4 '; } if ($mov == 1) { $upok .= 'mov '; } if ($wmv == 1) { $upok .= 'wmv '; } if ($avi == 1) { $upok .= 'avi '; } if ($flv == 1) { $upok .= 'flv '; } if ($mld == 1) { $upok .= 'mld '; } if ($mmf == 1) { $upok .= 'mmf '; } if ($pmd == 1) { $upok .= 'pmd '; } if ($bp2 == 1) { $upok .= '2bp '; } if ($gpp == 1) { $upok .= '3gpp '; } if ($gpp2 == 1) { $upok .= '3gpp2 '; } $upok =~ s/ $//; } # 以後変数を追加した場合 # $変数 =~ s/\r\n//g; # $変数 =~ s/\r//g; # $変数 =~ s/\n//g; # とする # 行末の改行を変数と認識してしまうため # chop; しとけば平気なのかな!? # chomp; に変更 at Rev2.1(M) # マルチ掲示板用変数・変更削除不可 if ($room ne '') { $multi_link = "room=$room&"; $multi_form = ""; } # バージョン情報 require "${libDir}version.pl"; } #------------------------------------------------- # 環境変数 エスケープ #------------------------------------------------- sub env_escape { local ($_) = @_; s/&/&/g; s/"/"/g; s/'/'/g; s//>/g; # s/\(/(/g; # s/\)/)/g; s/\032|\r|\n|\0//g; $_; } #------------------------------------------------- # 携帯端末別の分岐 #------------------------------------------------- sub agent { my ($agent) = $UserAgent; # H" if ($agent =~ /PDXGW/i) { $imode = 1; $meta = ''; $input_kanji = " istyle=1"; $input_alphabet = " istyle=3"; $input_numeric = " istyle=4"; $button = 'accesskey'; # ドットi } elsif ($agent =~ /ASTEL/i) { $imode = 2; $meta = ''; $input_kanji = " astyle=\"hiragana\""; $input_alphabet = " astyle=\"alphabet\""; $input_numeric = " astyle=\"numeric\""; $button = 'accesskey'; # FOMA } elsif ($agent =~ /DoCoMo\/2\.0/i) { $imode = 8; $meta = ''; $input_kanji = " istyle=1"; $input_alphabet = " istyle=3"; $input_numeric = " istyle=4"; $button = 'accesskey'; # i-mode } elsif ($agent =~ /DoCoMo/i) { $imode = 3; $meta = ''; $input_kanji = " istyle=1"; $input_alphabet = " istyle=3"; $input_numeric = " istyle=4"; $button = 'accesskey'; # SBM } elsif ($agent =~ /J-PHONE/i) { my $bra = (split(/\//,$agent))[1]; if ($bra !~ /^\d/ || $bra eq "2.0" || $bra eq "1.0") { $method = 'GET'; } ## $model = $2; # 機種 ## if ($model =~ /5\d/) { $model=51; } else { $model=0; } $imode = 5; $meta = ''; $input_kanji = " mode=\"hiragana\""; $input_alphabet = " mode=\"alphabet\""; $input_numeric = " mode=\"numeric\""; $button = 'DIRECTKEY'; # iPhone / iPod touch } elsif ($agent =~ /iPhone/i || $agent =~ /iPod/i) { $imode = 10; $meta = ''; # ここから下は意味ある!? $input_kanji = " mode=\"hiragana\""; $input_alphabet = " mode=\"alphabet\""; $input_numeric = " mode=\"numeric\""; $button = 'DIRECTKEY'; # SBM 3G } elsif ($agent =~ /Vodafone/i || $agent =~ /SoftBank/i || $ENV{'HTTP_X_JPHONE_MSNAME'}) { $imode = 52; $meta = ''; $input_kanji = " mode=\"hiragana\""; $input_alphabet = " mode=\"alphabet\""; $input_numeric = " mode=\"numeric\""; $button = 'DIRECTKEY'; # EZweb } elsif ($agent =~ /UP\.Browser/i) { $imode = 4; $meta = "\n"; $meta .= ''; $input_kanji = " istyle=1"; $input_alphabet = " istyle=3"; $input_numeric = " istyle=4"; $button = 'accesskey'; # AirH"PHONE } elsif ($agent =~ /DDIPOCKET|WILLCOM/i) { $imode = 6; $meta = ''; $input_kanji = " istyle=1"; $input_alphabet = " istyle=3"; $input_numeric = " istyle=4"; $button = 'accesskey'; # Lモード } elsif ($agent =~ /L-mode/i) { $imode = 7; $meta = ''; $input_kanji = " istyle=1"; $input_alphabet = " istyle=3"; $input_numeric = " istyle=4"; # EMOBILE } elsif ($agent =~ /emobile/i || $ENV{'HTTP_X_EM_UID'}) { $imode = 9; $meta = ''; $input_kanji = " istyle=1"; $input_alphabet = " istyle=3"; $input_numeric = " istyle=4"; $button = 'accesskey'; } if ($imode > 0) { require "${libDir}yyini_tel.pl"; # 上記の以外のケータイ及びPC } else { require "${libDir}yyini_pc.pl"; $imode = 0; } } # 携帯電話用タイトル画像・絵文字メッセージ sub agent2 { my $ok = "絵文字が使用出来ます
(使いすぎにご注意)"; my $ok2 = "i-modeの絵文字が使用出来ます
(使いすぎにご注意)"; my $ng = "投稿に絵文字は使用出来ません"; # H" if ($imode == 1) { $it_img = $h_title; $epad_msg = $ng; # ドットi } elsif ($imode == 2) { $it_img = $doti_title; $epad_msg = $ng; # FOMA } elsif ($imode == 8) { $it_img = $foma_title; if ($epad_use) { $epad_msg = $ok; } else { $epad_msg = $ng; } # i-mode } elsif ($imode == 3) { $it_img = $imode_title; if ($epad_use) { $epad_msg = $ok; } else { $epad_msg = $ng; } # SBM } elsif ($imode == 5) { $it_img = $jsky_title; if ($epad_use) { $epad_msg = $ok; } else { $epad_msg = $ng; } # iPhone / iPod touch } elsif ($imode == 10) { $it_img = $iphone_title; $epad_msg = $ng; # SBM 3G } elsif ($imode == 52) { $it_img = $jsky_title; $epad_msg = $ng; # EZweb } elsif ($imode == 4) { $it_img = $ezweb_title; if ($epad_use) { $epad_msg = $ok; } else { $epad_msg = $ng; } # AirH"PHONE } elsif ($imode == 6) { $it_img = $airh_title; if ($epad_use) { $epad_msg = $ok2; } else { $epad_msg = $ng; } # Lモード } elsif ($imode == 7) { $it_img = $lmode_title; $epad_msg = $ng; # EMOBILE } elsif ($imode == 9) { $it_img = $emobile_title; $epad_msg = $ng; # 上記の以外のケータイ及びPC } else { $it_img = ""; } # 携帯端末用の設定変更 if ($imode > 0) { if ($counter > 0) { $counter = 1; } $pageView = $p_my_log; if ($norobot == 1) { $meta .= "\n\n"; } } } #------------------------------------------------- # アクセス制限 #------------------------------------------------- sub axsCheck { my ($soft) = @_; # 対象CGI # IP,ホスト取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr && ($host eq "" || $host eq $addr)) { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } # IPチェック my $flg=0; foreach ( split(/\s+/, $denyAddr) ) { s/\./\\\./g; s/\*/\.\*/g; if ($addr =~ /^$_/i) { $flg = 1; last; } } if ($flg) { if ($mode eq 'regist' && $ngreg >= 1) { require "${libDir}ngreg.pl"; &ngreg('アクセス制限'); } if ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'アクセス制限'); } &error("アクセスを許可されていません"); # ホストチェック } elsif ($host) { foreach ( split(/\s+/, $denyHost) ) { s/\./\\\./g; s/\*/\.\*/g; if ($host =~ /$_$/i) { $flg = 1; last; } } if ($flg) { if ($mode eq 'regist' && $ngreg >= 1) { require "${libDir}ngreg.pl"; &ngreg('アクセス制限'); } if ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'アクセス制限'); } &error("アクセスを許可されていません"); } } if ($host eq "") { $host = $addr; } # 統合アクセス制限 if ($ExtDeny == 1) { # 携帯識別情報による統合アクセス制限 # FOMA/i-mode 投稿閲覧拒否 # SBM/EZweb/EM 投稿閲覧拒否 if ((($imode == 8 || $imode == 3) && $ExtUtnOn == 3) || (($imode =~ /^5/ || $imode == 4 || $imode == 9) && $ExtUtnOn >= 2)) { &UtnCheck('ext',$soft); } open(IN,"$ExtDeny_file") || &error("Open Error: $ExtDeny_file"); while () { if ($_ =~ /^#/) { next; } if ($_ =~ /^!/) { next; } $_ =~ s/\r\n$//; $_ =~ s/\n$//; $_ =~ s/\r$//; if (!$_) { next; } s/(\W)/\\$1/g; s/\*/\.\*/g; if ($host =~ /$_/i || $addr =~ /$_/i) { $flg=1; last; } } close(IN); if ($flg) { if ($mode eq 'regist' && $ngreg >= 1) { require "${libDir}ngreg.pl"; &ngreg('統合アクセス制限'); } if ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'統合アクセス制限'); } &error("アクセス権がありません"); } } } #------------------------------------------------- # 投稿等制限 #------------------------------------------------- sub axsCheck2 { my ($soft) = @_; # 対象CGI # IPチェック my $flg=0; foreach ( split(/\s+/, $denyAddrReg) ) { s/\./\\\./g; s/\*/\.\*/g; if ($addr =~ /^$_/i) { $flg = 1; last; } } # ホストチェック if (!$flg && $host) { foreach ( split(/\s+/, $denyHostReg) ) { s/\./\\\./g; s/\*/\.\*/g; if ($host =~ /$_$/i) { $flg = 1; last; } } } # 指定のみ許可の場合 if ($denyHAReg == 1) { if ($flg) { $flg = 0; } else { $flg = 1; } } if ($flg) { if ($mode eq 'regist' && $ngreg >= 1) { require "${libDir}ngreg.pl"; &ngreg('投稿等制限'); } if ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'投稿等制限'); } &error("この操作を許可されていません"); } } #------------------------------------------------- # 絵文字受理 #------------------------------------------------- sub emoji_2 { local($_) = @_; # 10進表記で投稿された場合 → 独自フォーマット化 s/\&\;\#(63\d{3})\;/'[i'.sprintf("%x", $1).']'/eg; # i-mode → 独自フォーマット化 s/\G((?:[\x80-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF8\xF9][\x40-\x7E\x80-\xFC])/$1.'[i'.unpack('H4', $2).']'/ego; # SBM(j-sky) → 独自フォーマット化 s/(\x1B\x24[E-GO-Q][\x21-\x7A]+)\x0F/&j2o_2($1)/eg; # au(EZweb) → 独自フォーマット化 s/\G((?:[\x80-\x9F\xE0-\xF2\xF4-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF3][\x40-\x7E\x80-\xFC])/$1.'[e'.unpack('H4', $2).']'/ego; s/\G((?:[\x80-\x9F\xE0-\xF3\xF5-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF4][\x40-\x7E\x80-\x8D])/$1.'[e'.unpack('H4', $2).']'/ego; s/\G((?:[\x80-\x9F\xE0-\xF5\xF8-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF6\xF7][\x40-\x7E\x80-\xFC])/$1.'[e'.unpack('H4', $2).']'/ego; $_; } #------------------------------------------------- # 絵文字 v(j) → 独自 #------------------------------------------------- sub j2o_2 { local($_) = @_; # タグ復元 s/&/&/g; s/"/"/g; s/<//g; s/\x1B\x24[E-GO-Q]([^\x0F]+)\x0F/$1/; s/\x1B\x24([E-GO-Q])([\x21-\x7A]+)/&j2o2_2($1,$2)/eg; $_; } sub j2o2_2 { local($f1, $f2) = @_; $f2 =~ s/([\x21-\x7A])/'[j'.$f1.unpack('H2',$1).']'/eg; $f2; } #------------------------------------------------- # エラー処理 #------------------------------------------------- # 書式 &error($error,$soft); # $error : エラーメッセージ # $soft : 対象CGI(アクセス拒否の記録用) sub error { my ($error,$soft) = @_; # アクセス拒否の記録 if ($soft && $AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,$error); } # 添付ファイルが仮登録されていたら削除 # プレビュー後 if ($in{'FileName'} && $in{'tail'}) { if (-e "$updir$in{'FileName'}$in{'tail'}") { unlink("$updir$in{'FileName'}$in{'tail'}"); } if (-e "$updir$in{'FileName'}-org$in{'tail'}") { unlink("$updir$in{'FileName'}-org$in{'tail'}"); } if (-e "${updir}s$in{'FileName'}.jpg") { unlink("${updir}s$in{'FileName'}.jpg"); } } if ($in{'FileName2'} && $in{'tail2'}) { if (-e "$updir$in{'FileName2'}$in{'tail2'}") { unlink("$updir$in{'FileName2'}$in{'tail2'}"); } if (-e "$updir$in{'FileName2'}-org$in{'tail2'}") { unlink("$updir$in{'FileName2'}-org$in{'tail2'}"); } if (-e "${updir}s$in{'FileName2'}.jpg") { unlink("${updir}s$in{'FileName2'}.jpg"); } } if ($in{'FileName3'} && $in{'tail3'}) { if (-e "$updir$in{'FileName3'}$in{'tail3'}") { unlink("$updir$in{'FileName3'}$in{'tail3'}"); } if (-e "$updir$in{'FileName3'}-org$in{'tail3'}") { unlink("$updir$in{'FileName3'}-org$in{'tail3'}"); } if (-e "${updir}s$in{'FileName3'}.jpg") { unlink("${updir}s$in{'FileName3'}.jpg"); } } # プレビューなし CGI.pm使用時 if ($upfile[3] && $upfile[0]) { if (-e "$updir$upfile[3]$upfile[0]") { unlink("$updir$upfile[3]$upfile[0]"); } if (-e "$updir$upfile[3]-org$upfile[0]") { unlink("$updir$upfile[3]-org$upfile[0]"); } if (-e "${updir}s$upfile[3].jpg") { unlink("${updir}s$upfile[3].jpg"); } } if ($upfile[8] && $upfile[5]) { if (-e "$updir$upfile[8]$upfile[5]") { unlink("$updir$upfile[8]$upfile[5]"); } if (-e "$updir$upfile[8]-org$upfile[5]") { unlink("$updir$upfile[8]-org$upfile[5]"); } if (-e "${updir}s$upfile[8].jpg") { unlink("${updir}s$upfile[8].jpg"); } } if ($upfile[13] && $upfile[10]) { if (-e "$updir$upfile[13]$upfile[10]") { unlink("$updir$upfile[13]$upfile[10]"); } if (-e "$updir$upfile[13]-org$upfile[10]") { unlink("$updir$upfile[13]-org$upfile[10]"); } if (-e "${updir}s$upfile[13].jpg") { unlink("${updir}s$upfile[13].jpg"); } } &header if (!$headflag); if ($imode == 0) { if (!$uemini_flag) { &uemini_link; &ue_msg("#ff3366","#FFFFFF","ERROR !"); print qq |

\n|; } print <


ERROR !

$error


EOM } else { &uemini_ilink if (!$uemini_flag); print qq |
\n|; print qq |ERROR!
$error\n|; print qq |\n|; } exit; } #------------------------------------------------- # HTMLヘッダ #------------------------------------------------- # 書式:&header('ImageUp','rss','skin'); # 'ImageUp':JavaScriptでのイメージ、絵文字入力フォーム表示 # 'ImageUp_JS':JavaScriptでのイメージ、絵文字入力フォーム表示・記事表示中 # 'JS':記事表示中 # 'rss':RSS用のリンクを出力 # 'skin':スキンで表示 sub header { $headflag=1; if ($imode == 0) { my ($file,$flag,$title2); # HTMLタイトル取得(取得元ファイルを定義) if ($mode eq 'res' || $mode eq 'allno' || $mode eq 'allno2') { $file = $logfile; $flag++; } elsif ($mode eq 'past' && $in{'pas'} eq 'view') { open(IN,"$nofile") || &error("Open Error: $nofile"); my $pastno = ; close(IN); $in{'pastlog'} =~ s/\D//g; if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; } $file = sprintf("%s%04d\.cgi", $pastdir,$in{'pastlog'}); } else { $file = ""; } # HTMLタイトル取得 if ($file) { open(IN,"$file") || &error("Open Error : $file"); my $top = if ($flag); while () { my ($no,$sub,$mytime) = (split(/<>/))[0,5,12]; # 疑似削除記事・管理人未認証記事 if ($in{'no'} == $no && $mytime =~ /^0|^9/) { last; } elsif ($in{'no'} == $no) { if (length($sub) > 34) { $sub = &sj_substr($sub,0,30); $sub = $sub . '...'; } $title2 = $sub . '/' . $title; last; } } close(IN); if (!$title2) { $title2 = $title; } } else { $title2 = $title; } my $out = <<"EOM"; EOM if ($mode eq 'edit' || $mode eq 'regist' || $mode eq 'shinki') { $out .= <<"EOM"; EOM } if ($rss_use >= 1 && $_[1] eq "rss") { $out .= <<"EOM"; EOM } if ($norobot == 1) { $out .= <<"EOM"; EOM } my $stylesheet = &tag_on($stylesheet); $out .= <<"EOM"; EOM # JavaScriptヘッダ my $js_flag=0; if ($_[0] eq "ImageUp_JS" || $_[0] eq "JS") { $out .= "\n"; } if ($_[0] eq "ImageUp" || $_[0] eq "ImageUp_JS") { # イメージ参照 if ($ImageView == 1) { $out .= "\n"; } # 文字サイズ変更スクリプト if ($fontChange == 1 && ($_[0] eq "ImageUp_JS" || $_[0] eq "JS")) { $out .= qq |\n|; } # Shadowbox.jsで表示 # Shadowbox 2.x if ($SBView == 1 && ($_[0] eq "ImageUp_JS" || $_[0] eq "JS")) { $out .= <<"EOM"; EOM # Shadowbox 3.x } elsif ($SBView == 2 && ($_[0] eq "ImageUp_JS" || $_[0] eq "JS")) { $out .= <<"EOM"; EOM } # 動画再生窓 ポップアップ if (($dougaOn1 >= 1 || $dougaOn2 == 2 || $ExtView == 1) && ($_[0] eq "ImageUp_JS" || $_[0] eq "JS")) { $out .= <<"EOM"; EOM } $out .= "$title2\n\n"; if ($backgif) { $out .= "\n"; } else { $out .= "\n"; } if ($_[2] eq 'skin') { return $out; } # elsif ($mode eq 'edit' || $mode eq 'regist' || $mode eq 'shinki') { # print "Content-type: text/html\n"; # print "Pragma: no-cache\n"; # print "Cache-Control: no-cache\n"; # print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n"; # print $out; } else { print "Content-type: text/html\n\n"; print $out; } # ケータイ header } else { my ($ibgcolor2,$itext2,$linki2,$vlinki2,$alinki2); if ($ibgcolor) { $ibgcolor2 = " bgcolor=\"$ibgcolor\""; } else { $ibgcolor2 = ""; } if ($itext) { $itext2 = " text=\"$itext\""; } else { $itext2 = ""; } if ($linki) { $linki2 = " link=\"$linki\""; } else { $linki2 = ""; } if ($vlinki) { $vlinki2 = " vlink=\"$vlinki\""; } else { $vlinki2 = ""; } if ($alinki) { $alinki2 = " alink=\"$alinki\""; } else { $alinki2 = ""; } my $out = <<"EOM"; $meta $title EOM if ($_[2] eq 'skin') { return $out; } else { print "Content-type: text/html\n\n"; print $out; } } } #------------------------------------------------- # crypt暗号 #------------------------------------------------- sub encrypt { my ($inpw) = @_; my @char = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; my $salt = $char[int(rand(@char))] . $char[int(rand(@char))]; my $encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); $encrypt; } #------------------------------------------------- # crypt照合 #------------------------------------------------- sub decrypt { my ($in, $dec) = @_; my $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2); if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) { return (1); } else { return (0); } } #------------------------------------------------- # ページ位置表示 #------------------------------------------------- sub mvbtn2 { my ($i,$view) = @_; my ($x,$y) = (1,0); while ($i > 0) { if ($page == $y) { if ($imode == 0) { print qq |[現在位置:$x|; } else { print qq |[現在位置]
$x|; } } $x++; $y += $view; $i -= $view; } $x--; if ($imode == 0) { print qq |/$xページ]|; } else { print qq |/$xページ|; } } #------------------------------------------------- # URLエンコード #------------------------------------------------- sub url_enc { local($_) = @_; s/(\W)/'%' . unpack('H2', $1)/eg; s/\s/+/g; $_; } #------------------------------------------------- # URLエンコード (UTF-8) #------------------------------------------------- sub url_enc_utf8 { my $str = shift; $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; $str; } #------------------------------------------------- # substr()の全角分断対策 #------------------------------------------------- # http://www.url-battle.com/cgi/qa/wforum.cgi?mode=allread&pastlog=0001&no=189&page=30&act=past#189 より # sj_substr($str, $offset, $len) sub sj_substr { my ($temp,$offset,$len) = @_; my ($i,$ch); if ($offset >= length($temp)) { $temp = ""; return $temp; } for ($i = 0; $i < $offset; $i++) { $ch = ord(substr($temp, $i, 1)); if (($ch >= 0x80) && ($ch <= 0x9f)) { $i++; } } if ($i > $offset) { $offset++; } if ($offset + $len > length($temp)) { $len = length($temp) - $offset; } for ($i = $offset; $i < $offset + $len; $i++) { $ch = ord(substr($temp, $i, 1)); if (($ch >= 0x80) && ($ch <= 0x9f)) { $i++; } } if ($i > $offset + $len) { $len--; } $temp = substr($temp, $offset, $len); # エスケープした文字列の分断対策 $temp =~ s/&a?m?p?$//; $temp =~ s/&q?u?o?t?$//; $temp =~ s/&l?t?$//; $temp =~ s/&g?t?$//; $temp =~ s/&#?3?9?$//; return $temp; } #------------------------------------------------- # 閉じられていないタグ以下を削除 #------------------------------------------------- # Special Thanks to Perl正規表現雑技 # http://www.din.or.jp/~ohzaki/regex.htm sub tag_chk { my ($str) = @_; ## $str =~ s/(.+)(<(br|a)\b(?:(?!<\/\2>).)*$)/$1/i; ## $str =~ s/(.*)(<(br|a)\b(?:(?!<\/\2>).)*$)/$1/i; $str =~ s/(.*)(<(a)\b(?:(?!<\/\2>).)*$)/$1/i; $str =~ s/?$//i; $str; } #------------------------------------------------- # メールアドレスを変換 #------------------------------------------------- # 書式 $nam = &eml_henkan($eml,$nam,$no,$temp); # $temp(ユーザーメール送信時:1/その他:0または無指定) sub eml_henkan { my ($str,$str2,$str3,$temp) = @_; my ($view); my ($email,$email2) = split(/<:>/,$str); # Eメール非表示 if ($email ne '' && $email2 == 1) { return "$str2$email_non_mark"; } # メールフォーム選択でメールフォーム無効 elsif ($email ne '' && $email2 == 2 && $in_email_form eq '') { return "$str2$email_non_mark"; } # Eメール入力なし elsif ($email eq '') { return $str2; } # Eメール入力あり else { $str = $email; } if ($email2 == 2) { $view = 2; } # メールフォーム選択 elsif ($email2 == 3) { $view = 1; } # 公開(通常表示)選択 elsif ($imode) { $view = $imailview; } else { $view = $mailview; } # メールフォームを表示 if (($view == 2 || $view == 3) && !$temp) { # メールフォーム制限 my $DCMUtn; if (($UtnOnForm == 1 || $ExtUtnOn >= 1) && ($imode == 3 || $imode == 8)) { $DCMUtn = ' utn'; } if ($mode eq "past") { $str2 = "$str2"; } else { $str2 = "$str2"; } # JavaScriptで表示 # 迷惑メール根絶!メールアドレス収集業者対策/メールアドレスの暗号化(符号化)を参考にさせていただきました。 # http://ninja.index.ne.jp/~toshi/soft/untispam.shtml } elsif (($view == 1 || $temp == 1) && !$imode) { $str = &Enc_UntiSpam($str); my $tmp = $str2; $tmp =~ s/<.+?>//g; # タグ(絵文字画像)を削除 if ($tmp eq '') { $tmp = "投稿者"; } # 絵文字のみの投稿者名の場合 if (length($tmp) > 20) { # 長さ調整 $tmp = &sj_substr($tmp,0,18); $tmp .= '..'; } $str2 = "$str2"; # 標準 } else { # メールアドレスの@を@に、.を.に変換して表示 $str =~ s/\@/@/g; $str =~ s/\././g; # 「mailto:」を変換して表示 my $agent = $UserAgent; if ($agent =~ /SH901i/i) { $str2 = "$str2"; } else { $str2 = "$str2"; } } $str2; } #------------------------------------------------- # perl側のエンコード(符号化)サブルーチン #------------------------------------------------- # http://ninja.index.ne.jp/~toshi/soft/untispam.shtmlより # ENC&DEC用の指標(重複しない様にaANで16バイト分を定義する) # 基本形 : "0123456789abcdef" $enc_list = "Tfj8a9xNoLkm2Z43"; # 呼び出し方 $enccode = &Enc_UntiSpam( $address ); # $enccode : エンコードされた"mailto:"付きストリング # $address : エンコード元のメールアドレス(ストリング) sub Enc_UntiSpam { my( $adr ) = @_; my( $i, $dd, $res, $dif ); $adr =~ s/@/@/g; $adr =~ s/./\./g; $adr = "mailto:".$adr; $dif = int(rand(127)); # 嵩上げ分乱数値の生成 $res = substr($enc_list,$dif/0x10,1).substr($enc_list,$dif%0x10,1); for( $i = 0 ; $i < length( $adr ) ; $i ++ ) { $dd = ord(substr($adr,$i,1))+$dif; $res .= substr($enc_list,$dd/0x10,1).substr($enc_list,$dd%0x10,1); } return( $res ); } #------------------------------------------------- # URLを変換 #------------------------------------------------- # 書式 $url = &url_henkan($url); sub url_henkan { my ($url) = @_; if ($miruPass && $home_icon) { $url = "HomePage"; } elsif ($miruPass) { $url = "<Home>"; } elsif ($home_icon) { $url = "HomePage"; } else { $url = "<Home>"; } return $url; } #------------------------------------------------- # NEWマークの計算 #------------------------------------------------- sub get_newsign { my ($mytime,$str) = @_; local ($newsign); my ($new1,$new2); # 携帯 if ($imode) { # 一般 if ($str ne 'res') { $new1 = &tag_on($newViewi); $new2 = &tag_on($newViewi2); } # 一覧表示のレス else { $new1 = &tag_on($newViewResi); $new2 = &tag_on($newViewResi2); } # PC } else { # 一般 if ($str ne 'res') { $new1 = &tag_on($new_view); $new2 = &tag_on($new_view2); } # 一覧表示のレス else { $new1 = &tag_on($new_view_res); $new2 = &tag_on($new_view2_res); } } $mytime =~ s/^8/1/; # 返信禁止記事 $mytime =~ s/^7/1/; # 保存記事 $mytime =~ s/AD$//; # 管理メッセージ $mytime =~ s/EDNG$//; # 修正・削除禁止 my $times = time; if (($times - $mytime) < 0) { $newsign = ""; } elsif (($times - $mytime) < $new_time*3600) { if ($imode) { $newsign = $new1; } # 携帯 else { $newsign = "$new1"; } # PC } elsif ((($times - $mytime) < $new_time2*3600) && $new2 ne '') { if ($imode) { $newsign = $new2; } # 携帯 else { $newsign = "$new2"; } # PC } else { $newsign = ""; } if ($imode && $newsign) { # $newsign = $newsign; $newsign = " " . $newsign; } return $newsign; } #------------------------------------------------- # ログへ変数追加時のチェック #------------------------------------------------- # $mytime、$chkが記録されていない場合、 # 行の最後にある改行が変数と認識されてしまうので、その部分を削除する # 記事修正時の変数出力前にチェックする # 表示時にはチェックしなくても大丈夫だろう # 標準のYY-BOARDからTambo改への、添付機能有りへの移行時に必要になる sub time_check { my ($str) = $_[0]; if ($str eq "\n" || $str eq "\r" || $str eq "\r\n") { $str = ""; } return $str; } #------------------------------------------------- # 上部のミニリンク #------------------------------------------------- sub uemini_link { $uemini_flag = 1; # ページ内リンク用 if ($pageLink2) { print qq ||; } if ($miruPass && $in{'mPass'}) { # 閲覧者限定時 print <
EOM if ($room ne '') { print qq |$multi_form\n|; } print <
EOM if ($room ne '') { print qq |$multi_form\n|; } print < EOM if ($newok == 1){ print <
EOM if ($room ne '') { print qq |$multi_form\n|; } print < EOM } print <
EOM if ($room ne '') { print qq |$multi_form\n|; } print < EOM if ($pageLink1) { print qq |[$pageLink1]\n|; } print < EOM } elsif ($miruPass) { # 閲覧者限定時(入室パスワード未送付) print qq |[掲示板へ戻る]\n|; } elsif ($newok == 1) { # 通常時 print qq |[掲示板に戻る] [一覧表\示に戻る] [新着表\示に戻る] [ツリー表\示に戻る]\n|; if ($pageLink1) { print qq |[$pageLink1]\n|; } } else { # 通常時 print qq |[掲示板に戻る] [一覧表\示に戻る] [ツリー表\示に戻る]\n|; if ($pageLink1) { print qq |[$pageLink1]\n|; } } } #------------------------------------------------- # 上部のミニリンク(i-mode用) #------------------------------------------------- # &uemini_ilink(1) 上部へ表示(ページ下部へのリンク付き) # &uemini_ilink(2) 下部へ表示(ページ上部へのリンク付き) sub uemini_ilink { my ($a) = $_[0]; # ページ内リンク用 if ($a == 1 && $pageLink2) { $a = 1; } elsif ($a == 2 && $pageLink1) { $a = 2; } else { $a = 0; } $uemini_flag = 1; print qq ||; if ($a == 1) { print qq ||; } if ($miruPass && $in{'mPass'}) { # 閲覧者限定時 # DoCoMo用formタグ my $utnform1 = "
"; if ($imode_out != 0 && $newok != 1) { print qq |$utnform1\n|; if ($room ne '') { print qq |$multi_form\n|; } print < EOM } else { print qq |$utnform1\n|; if ($room ne '') { print qq |$multi_form\n|; } print qq |\n|; if ($imode_out == 0) { print qq ||; } print qq ||; if ($newok == 1) { print qq ||; } print qq |\n|; my $btn; if ($a == 1) { if ($button) { $btn = " $button=\"8\""; } print qq |$pageLink1|; } elsif ($a == 2) { if ($button) { $btn = " $button=\"2\""; } print qq |$pageLink2|; } print qq |\n|; } } elsif ($miruPass) { # 閲覧者限定時(入室パスワード未送付) print qq |[掲示板へ戻る]|; } else { # 通常時 if ($imode_out == 0) { if ($newok == 1) { print qq |[標準][一覧][新着][ツリー]|; } else { print qq |[標準][一覧][ツリー]|; } } else { if ($newok == 1) { print qq |[一覧][新着][ツリー]|; } else { print qq |[掲示板へ戻る][ツリー]|; } } my $btn; if ($a == 1) { if ($button) { $btn = " $button=\"8\""; } print qq |$pageLink1|; } elsif ($a == 2) { if ($button) { $btn = " $button=\"2\""; } print qq |$pageLink2|; } # print qq |\n|; } if ($a == 2) { print qq ||; } print qq |
\n|; } #------------------------------------------------- # アイコンとaltの設定 #------------------------------------------------- sub icon_mode { my ($str); my ($str2) = $_[0]; # アイコン配列取得 my @ico1 = &geticon1; # アイコンファイル名 my @ico2 = &geticon2('3'); # アイコン名 # ケータイ用アイコンを配列に付加 if ($str2 eq $imode_gif) { push(@ico1,"$imode_gif"); push(@ico2,"ケータイ"); } foreach (0 .. $#ico1) { if ($ico1[$_] eq "$str2") { $str = "$ico2[$_]"; last; } } return $str; } #------------------------------------------------- # 変数に含まれているか確認する #------------------------------------------------- # 書式 $tmp_flag = &nakami_check($color,$keitaiCol); # $colorの中に$keitaiColが含まれているか調べる # 含まれていなければ 0 を、含まれていれば 1 を返す sub nakami_check { my ($str2,$str3) = @_; # 変数の中身を配列に置き換える my @str = split(/\s+/, $str2); my $i=0; foreach (@str) { if ($_ eq $str3) { $i=1; last; } } return $i; } #------------------------------------------------- # 疑似削除した記事の処理 #------------------------------------------------- sub dude { $nam = '削除'; $eml = ''; $sub = '削除'; $com = '削除されました'; $url = ''; $col = '#000000'; $ico = ''; $mytime = '0'; $chk = '0'; $tail = ''; $vw = ''; $vh = ''; $plus1 = '削除'; $plus2 = '削除'; $plus3 = '削除'; $plus4 = '削除'; $plus5 = '削除'; $ulnam = ''; $tail2 = ''; $vw2 = ''; $vh2 = ''; $ulnam2 = ''; $tail3 = ''; $vw3 = ''; $vh3 = ''; $ulnam3 = ''; } #------------------------------------------------- # 管理人未認証の記事 #------------------------------------------------- sub chkMae { $nam = "未認証"; $eml = ""; $sub = "未認証"; $com = "管理人の認証までお待ちください"; $url = ""; $col = '#000000'; $ico = ''; $mytime = '0'; $chk = '0'; $tail = ''; $vw = ''; $vh = ''; $plus1 = '未認証'; $plus2 = '未認証'; $plus3 = '未認証'; $plus4 = '未認証'; $plus5 = '未認証'; $ulnam = ''; $tail2 = ''; $vw2 = ''; $vh2 = ''; $ulnam2 = ''; $tail3 = ''; $vw3 = ''; $vh3 = ''; $ulnam3 = ''; } #------------------------------------------------- # URL文字列の折り返し表示 #------------------------------------------------- sub com_br { local($_) = @_; my $pattern = 'https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\,]+'; # autolink有効時 if ($autolink) { s/($pattern)<\/a>/&com_br2($1)/ego; # autolink無効時 } else { s/($pattern)/&com_br3($1)/ego; } $_; } # autolink有効時 sub com_br2 { local($_) = @_; my ($tmp); if (!$br_len) { $br_len=60; } if (length($_) > $br_len+5) { $tmp = &com_br4($_); } else { $tmp = $_; } my $str = "$tmp<\/a>"; $str; } # autolink無効時 sub com_br3 { local($_) = @_; if (!$br_len) { $br_len=60; } if (length($_) > $br_len+5) { $_ = &com_br4($_); } $_; } # 共通 sub com_br4 { local($_) = @_; my $str = ''; my $i = 0; my $a = $_; if (!$br_len) { $br_len=60; } while (length($a) >= $br_len) { if ($str) { $str .= "
"; } $a = substr("$_", $i*$br_len, $br_len); $str .= "$a"; $i++; } $str; } #------------------------------------------------- # 引用部文字色変更 #------------------------------------------------- sub com_ref { my ($str) = @_; my ($color); if ($imode) { $color = $refTel; } else { $color = $refCol; } my $str2 = ''; my $tmp = 0; if (!$imode) { $str .= '/end/'; # 最後に改行が続くとその部分が削除されちゃう } foreach ( split(/
/, $str) ) { if ($tmp) { $str2 .= '
'; } else { $tmp = 1; } if ($_ =~ /^>/ || $_ =~ /^>/) { $_ = "$_<\/font>"; } $str2 .= $_; } $str2 =~ s/<\/font>
/
/g; # 2行連続をひとつに if (!$imode) { $str2 =~ s/\/end\/$//; # 付けたのを消す $str2 =~ s/\/end\/<\/font>$/<\/font>/; # 付けたのを消す 1行のみの返信 } return $str2; } #------------------------------------------------- # 携帯用時間文字列の省略 #------------------------------------------------- sub time_change { if ($_[0] eq 'tree') { # ツリー表示時 my $tmp = $mytime; $tmp =~ s/^8/1/; # 返信禁止記事 $tmp =~ s/^7/1/; # 保存記事 $tmp =~ s/AD$//; # 管理メッセージ my $tmp2 = time; # 現在時刻情報取得 $tmp2 -= $tmp; if ($tmp2 > 86400) { $dat = substr($dat,5,5); } # 24時間以上経過 # if ($tmp2 > 86400) { $dat = substr($dat,2,8); } # 24時間以上経過 else { $dat = substr($dat,16,5); } # 24時間以内 } else { # $dat = substr($dat,5,5) . " " . substr($dat,16,5); $dat = substr($dat,2,8) . " " . substr($dat,16,5); } } #------------------------------------------------- # タグ復元 #------------------------------------------------- sub tag_on { my $str = $_[0]; $str =~ s/&/&/g; $str =~ s/"/"/g; $str =~ s/<//g; $str =~ s/'/'/g; return $str; } #------------------------------------------------- # 時間取得 #------------------------------------------------- sub get_time { $ENV{'TZ'} = "JST-9"; $times = time; my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times); my @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min); } #------------------------------------------------- # 時刻取得 #------------------------------------------------- sub get_time2 { $ENV{'TZ'} = "JST-9"; my $times = time; my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times); my @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min,$sec); } #------------------------------------------------- # IDの表示 #------------------------------------------------- # 書式 # スキン表示(PC):&IDOut($hos,'skin'); # 携帯:&IDOut($hos,$flag2); $flag2が1だと閲覧者限定でcom_seigen sub IDOut { my ($ho,$UA,$utn) = split(/<:>/,$_[0]); my ($str) = $_[1]; # FOMAの個体識別情報を編集 # (機種が違ってもFOMAカードが同じだとIDが同じになるため) if (index($utn,"ser") >= 0 && index($utn,"icc") >= 0) { $utn = substr($utn,3,15) . substr($utn,-6,5); } # EZWebの最後の.ne.jpを削除 $utn =~ s/\.ne\.jp$//; # 個体識別情報またはクッキー情報が保存されていなければ作成 if (!$utn) { $ho = &HosUaEnc($ho); if ($UA) { $UA = &HosUaEnc($UA); $utn = substr($ho,0,5) . substr($UA,-5) . substr($ho,-5) . substr($UA,0,5); } else { $utn = substr($ho,-5) . substr($ho,0,5) . substr($ho,0,5) . substr($ho,-5); } } # 暗号化 $utn = &HosUaEnc($utn); if ($str eq 'skin') { return $utn; } else { if ($imode) { if ($HosUaOuti || $str ne '1') { print qq |
|; } print qq |ID:$utn\n|; } else { print qq |
\n|; print qq |ID:$utn|; print qq |
\n|; } } } #------------------------------------------------- # ホスト名、UserAgent、IDの暗号化 #------------------------------------------------- sub HosUaEnc { my ($str)=@_; $str =~ s/\W//g; $str = substr($str, -20); my $salt = substr($str.'ciao', 3, 2); $str = substr(crypt($str, $salt), -10); return $str; } #------------------------------------------------- # 携帯の機種名取得 #------------------------------------------------- sub telAgent { my ($str)=@_; # メール投稿 if ($str eq "メール投稿") { return $str; } # H" if ($str =~ /PDXGW/i) { $str = 'H"'; # ドットi } elsif ($str =~ /ASTEL/i) { $str = (split(/\//,$str))[2]; if (!$str) { $str = 'ASTEL'; } # FOMA } elsif ($str =~ /DoCoMo\/2\.0/i) { $str = (split(/[\/\s\(\)]+/,$str))[2]; # phone.plより if (!$str) { $str = 'FOMA'; } # i-mode } elsif ($str =~ /DoCoMo/i) { $str = (split(/\//,$str))[2]; if (!$str) { $str = 'DoCoMo'; } # SBM/SBM 3G } elsif ($str =~ /J-PHONE|Vodafone|SoftBank/i) { $str = (split(/\//,$str))[2]; if (!$str) { $str = 'SBM'; } # SBM 3G } elsif ($str =~ /^MOT/i) { if ($str =~ /MOT-V980/) { $str = 'V702MO'; } elsif ($str =~ /MOT-C980/) { $str = 'V702sMO'; } else { $str = 'SBM'; } # EZweb } elsif ($str =~ /UP\.Browser/i) { # 最初の - の後ろに機種名が来る # phone.plより $str = ( $str =~ m#^[^\-]+\-([A-Z]\w+)#i )[0]; # 機種名テーブル # http://www.au.kddi.com/ezfactory/tec/spec/4_4.htmlより if ($str && -e "${emodir}ezkishu.dat") { open(EZ,"${emodir}ezkishu.dat"); while () { chomp; if ($_ eq '' || $_ =~ m/^#/) { next; } my ($kishu,$did) = split(/\:/); if ($str eq $did) { $str = $kishu; last; } } close(EZ); } else { $str = 'EZweb'; } # AirH"PHONE } elsif ($str =~ /DDIPOCKET|WILLCOM/i) { $str = (split(/\//,$str))[2]; if (!$str) { $str = 'WILLCOM'; } # Lモード } elsif ($str =~ /L-mode/i) { $str = 'L-mode'; # EMOBILE } elsif ($str =~ /emobile/i) { if ($str =~ /H11T/i) { $str = 'H11T'; } elsif ($str =~ /H11HW/i) { $str = 'H11HW'; } elsif ($str =~ /S11HT/i) { $str = 'S11HT'; } elsif ($str =~ /S12HT/i) { $str = 'S12HT'; } else { $str = 'EMOBILE'; } # PC } elsif ($str =~ /Mozilla|Opera|Sleipnir/i) { $str = 'PC'; # その他 } else { $str = '不明'; } return $str; } #------------------------------------------------- # プロキシ制限 #------------------------------------------------- # LQアクセス制限ライブラリを参考にさせていただきました。 # http://www2s.biglobe.ne.jp/~cru/library/lq/index.html # $str 'form' : '' # $soft 対象CGI sub ProxyChk { my ($str,$soft) = @_; my $proxy=0; if (!$imode) { # プロキシサーバが出す環境変数 if ($ENV{'HTTP_X_FORWARDED_FOR'} || $ENV{'HTTP_VIA'} || $ENV{'HTTP_FORWARDED'} || $ENV{'HTTP_PROXY_CONNECTION'} # || $ENV{'HTTP_CACHE_CONTROL'} # IE5.5が出す || $ENV{'HTTP_CACHE_INFO'} || $ENV{'HTTP_CLIENT_IP'} || $ENV{'HTTP_X_LOCKING'} || $ENV{'HTTP_XROXY_CONNECTION'} || $ENV{'HTTP_XONNECTION'} || $ENV{'HTTP_SP_HOST'} # || $ENV{'HTTP_TE'} # ニンテンドーDSブラウザが出す ) { $proxy=1; } # jpドメイン以外制限 my $z; if ($str eq 'form' && $ProxyChkForm >= 2) { $z = 1; } if ($str ne 'form' && ($ProxyChk==2 || $ProxyChk==3 || $ProxyChk==5 || $ProxyChk==6)) { $z = 1; } if (!$proxy && ($host ne $addr) && $z) { if ($host !~ /(\.jp|\.bbtec\.net|\.il24\.net|\.mediatti\.net|\.bitcat\.net|\.fiberbit\.net|\.hot-cha\.tv|ns\.i-products\.net|\.quolia\.com|\.zero-isp\.net)$/i) { $proxy=2; } } # ホスト名取得不可制限 $z = 0; if ($str eq 'form' && $ProxyChkForm == 3) { $z = 1; } if ($str ne 'form' && ($ProxyChk==3 || $ProxyChk==6)) { $z = 1; } if (!$proxy && $z) { if ($host eq $addr) { $proxy=3; } } # 例外ホスト my $PCOk = $str eq 'form' ? $ProxyChkOkForm : $ProxyChkOk; if ($proxy && $PCOk) { foreach (split(/\s+/, $PCOk) ) { s/(\W)/\\$1/g; s/\*/\.\*/g; if ($host =~ /$_/i || $addr =~ /$_/i) { $proxy=0; last; } } } if ($proxy >= 1) { my $error=''; if ($mode eq 'regist' && $ngreg >= 1 && $proxy == 1) { $error = 'プロキシ制限'; } elsif ($mode eq 'regist' && $ngreg >= 1 && $proxy == 2) { $error = 'jpドメイン以外制限'; } elsif ($mode eq 'regist' && $ngreg >= 1 && $proxy == 3) { $error = 'ホスト名取得不可制限'; } if ($error) { require "${libDir}ngreg.pl"; &ngreg($error); } if ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'プロキシ等制限'); } &error("回線エラーです($proxy)"); } } } #------------------------------------------------- # 絵文字処理 # 長さ調整 #------------------------------------------------- # 書式 $sub = &emoji_length($sub,3,'pc',$sub_len); # 書式 $sub = &emoji_length($sub,2,'tel',$sub_len[,色(変数)]); sub emoji_length { my ($str,$plus,$ki,$l_max,$iro) = @_; my $long = $l_max*2 + $plus; my $long2 = $l_max*2; # 絵文字処理 if ($epad_use) { if ($l_max) { $str = &emoji_shori($str,$plus,$ki,$long,$long2,$iro); } elsif ($ki eq 'pc') { $str = &o2p($str); } else { $str = &emoji_henkan_tel($str,$iro); } # 長さ調整 } elsif (length($str) > $long && $l_max) { $str = &sj_substr($str,0,$long2); if ($ki eq 'pc') { $str .= "..."; } else { $str .= ".."; } } return $str; } #------------------------------------------------- # 入室認証 #------------------------------------------------- sub miruPass { my ($soft) = @_; # 対象CGI my ($temp,$cpwd); my $target = $soft eq 'reg' ? $regist : $script; if (!$miruPass) { &error("入室パスワードは無効です"); } if ($in{'mPass'}) { my $check = &decrypt($in{'mPass'}, $miruPass); if ($check == 1) { $temp = "1"; } else { $temp = "パスワードが違います"; } } # パスワード認証 if ($temp eq "1") { # クッキー発行(PC/EZweb/SBM 3G/AirH"PHONE/FOMA) if ((!$imode || $imode == 4 || $imode == 52 || $imode == 6 || $imode == 8 || $imode == 10) && $in{'cookon'} == 1) { &set_cookie('GATE',$in{'mPass'}); } return; # アクセス拒否の記録 } elsif ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'入室パスワード未認証'); } # クッキー取得(PC/EZweb/SBM 3G/AirH"PHONE/FOMA) if (!$imode || $imode == 4 || $imode == 52 || $imode == 6 || $imode == 8 || $imode == 10) { ($cpwd) = &get_cookie('GATE'); } &header; if (!$imode) { &ue_msg("#0000A0","#FFFFFF","入室認証"); print <

入室にはパスワードが必要です

EOM if ($temp) { print qq |$temp\n|; } print < EOM while ( my ($key,$val) = each(%in) ) { if ($val ne '') { print qq |\n|; } } print <
クッキーを受け取る EOM } else { # DoCoMo用formタグ my $utnform = "
"; my $cform; if ($cpwd) { $cform = ""; } else { $cform = ""; } print <【入室認証】
入室にはパスワードが必要です EOM if ($temp) { print qq |
-$temp-\n|; } print <$utnform EOM while ( my ($key,$val) = each(%in) ) { if ($val ne '') { print qq |\n|; } } print < EOM # (EZweb/SBM 3G/AirH"PHONE/FOMA) if ($imode == 4 || $imode == 52 || $imode == 6 || $imode == 8 || $imode == 10) { print qq |
クッキー受付
\n|; } print < EOM } print < EOM exit; } #------------------------------------------------- # オートリンクをjump経由にする #------------------------------------------------- sub jump_link { my ($com) = @_; my $pattern = 'https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\,]+'; my $pattern2 = 'https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\,\<\>]+'; if ($imode) { $com =~ s/
($pattern)<\/a>/$1<\/a>/go; } else { $com =~ s/($pattern2)<\/a>/$2<\/a>/go; } return $com; } #------------------------------------------------- # 投稿時間差確認用フォーム出力変数取得 #------------------------------------------------- # いずれも変数が送信されて来るのは投稿確認時 sub a1a2Get { my ($a1,$a2,$a3); my $b; if ($_[0] eq 'form') { $b = $in{'6Qsp5Bvb'}; } # メールフォーム else { $b = $in{'L76nI5Dm'}; } # 投稿時 if ($b ne '') { $a1 = $b; $b =~ s/\W//g; } elsif (!$imode) { $a1 = &encrypt(substr($host,1,5) . substr($UserAgent,-15)); } else { $a1 = &encrypt(substr($UserAgent,-20)); } if ($in{$b} >= 1) { $a2 = $in{$b}; } else { $a2 = time; } $a3 = $a1; $a3 =~ s/\W//g; return ($a1,$a2,$a3); } #------------------------------------------------- # アイコン配列取得(アイコンファイル名) #------------------------------------------------- # ケータイアイコンは必要に応じて戻ってから取得 sub geticon1 { # アイコンを展開 my @icon = split(/\s+/, $ico1); # 登録アイコン取得 if ($iconUp > 0) { # my @regicon = &icoPlus('1'); # push(@icon,@regicon); push(@icon,&icoPlus('1')); } # 管理者用アイコンを配列に付加 if ($my_icon) { push(@icon,$my_gif); } return @icon; } #------------------------------------------------- # アイコン配列取得(アイコン名) #------------------------------------------------- # 書式 # 通常 # @ico2 = &geticon2; # (○○さん)専用を付加しない時 # @ico2 = &geticon2('3'); # ケータイアイコンは必要に応じて戻ってから取得 sub geticon2 { # アイコンを展開 my @icon = split(/\s+/, $ico2); # 登録アイコン取得 if ($iconUp > 0) { # my (@regicon); # if ($_[0] eq '3') { @regicon = &icoPlus('3'); } # else { @regicon = &icoPlus('2'); } # push(@icon,@regicon); if ($_[0] eq '3') { push(@icon,&icoPlus('3')); } else { push(@icon,&icoPlus('2')); } } # 管理者用アイコンを配列に付加 if ($my_icon) { push(@icon,"管理者用"); } return @icon; } #------------------------------------------------- # 登録アイコン取得 #------------------------------------------------- # 書式 # アイコンファイル名取得時 # @regicon = &icoPlus('1'); # アイコン名取得時 # @regicon = &icoPlus('2'); # (○○さん)専用付加 # @regicon = &icoPlus('3'); # (○○さん)専用付加せず # アイコンの配列を返す sub icoPlus { my ($str)=@_; my @ico=(); open(ICON,"$iconUp_file") || &error("Can't open : $iconUp_file"); my $top = ; while () { my ($chk,$nam,$iconNam,$filename,$myico) = (split(/<>/))[1,3,4,5,7]; if (!$iconCheck || $chk == 1) { if ($str == 1) { push(@ico,$filename); } elsif ($str >= 2) { if ($myico && $str == 2) { $iconNam = $iconNam . "($namさん専用)"; } push(@ico,$iconNam); } } } close(ICON); return @ico; } #------------------------------------------------- # 投稿ランキング ランク名取得 #------------------------------------------------- # 書式 # 記事表示時 # $plus1 = &WCntGet($nam2,$plus1,'1'); # 投稿ランキング表示時 # my $rank = &WCntGet($nam,$count); # $tmp 3つめの添え字 # なし or 0:投稿ランキング表示時 # 1 2 3 4 5:追加項目の番号 sub WCntGet { my ($nam,$cnt,$tmp) = @_; my @WCntRank1 = split(/\s+/, $WCntRank1); # 投稿回数 my @WCntRank2 = split(/\s+/, $WCntRank2); # ランク名 my @WCntRank3 = split(/\s+/, $WCntRank3); # 投稿者名 my @WCntRank4 = split(/\s+/, $WCntRank4); # 表\示文字 my $str; # 出力値 # 管理者等 if (@WCntRank3 >= 1) { foreach (0 .. $#WCntRank3) { # if ($nam eq $WCntRank3[$_]) { if ($nam =~ /$WCntRank3[$_]/) { $str = $WCntRank4[$_]; last; } } } # ランク名 if (!$str && @WCntRank1 >= 1) { foreach (0 .. $#WCntRank1) { if ($cnt >= $WCntRank1[$_]) { $str = $WCntRank2[$_]; } } } if ($tmp) { # my $str2; # 表示形式指定 # 例:!wcnt!回/!rank! # if ($tmp == 1 && $plusKo1Sen =~ /!wcnt!/ && $plusKo1Sen =~ /!rank!/) { $str2 = $plusKo1Sen; } # elsif ($tmp == 2 && $plusKo2Sen =~ /!wcnt!/ && $plusKo2Sen =~ /!rank!/) { $str2 = $plusKo2Sen; } # elsif ($tmp == 3 && $plusKo3Sen =~ /!wcnt!/ && $plusKo3Sen =~ /!rank!/) { $str2 = $plusKo3Sen; } # if ($str2) { # $str2 =~ s/!wcnt!/$cnt/; # $str2 =~ s/!rank!/$str/; # $str = $str2; # } else { if ($str) { # $str = $cnt . '[' . $str . ']'; $str = "$cnt回/$str"; } else { $str = "$cnt回/−"; } # } } else { if ($str eq '' && !$imode) { $str = '−'; } elsif ($str ne '' && $imode) { $str = '/' . $str; } } return $str; } #------------------------------------------------- # 移動ボタン 閲覧者限定・ワード検索時 #------------------------------------------------- # $target 対象cgi名 # $back 前ページ番号 # $next 次ページ番号 # $view ページあたり表示記事数 # $word 検索文字列 # $cond AND/OR # $str all:統合ワード検索 (skin:スキン表示(未使用)) # $hdn 追加送信項目 # $hdn_ab 追加送信項目 統合ワード検索の前ページ # $hdn_an 追加送信項目 統合ワード検索の次ページ sub mvbtn_s { my ($target,$back,$next,$view,$word,$cond,$str,$hdn,$hdn_ab,$hdn_an) = @_; my ($mtd,$out); if (!$imode) { $mtd = 'POST'; } else { $mtd = $method; } my $utnform; # DoCoMo用formタグ $utnform = qq |
|; if (!$imode) { $out .= qq |\n\n|; } if ($back ne '') { my $btn = $button ? " $button=\"4\"" : ''; $out .= qq |$utnform\n|; if (!$imode) { $out .= qq |\n|; } $out .= qq |\n|; } if ($next ne '') { my $btn = $button ? " $button=\"6\"" : ''; $out .= qq |$utnform\n|; if (!$imode) { $out .= qq |\n|; } $out .= qq |\n|; } if (!$imode) { $out .= qq |\n
\n|; } if ($room ne '') { $out .= qq |$multi_form\n|; } if ($hdn ne '') { foreach (split(/&/,$hdn)) { my ($n,$v) = split(/=/); $out .= qq |\n|; } } if ($str eq 'all' && $hdn_ab ne '') { foreach (split(/&/,$hdn_ab)) { my ($n,$v) = split(/=/); if ($n ne '' && $v ne '') { $out .= qq |\n|; } } } $out .= < EOM if (!$imode) { $out .= qq |\n|; } if ($room ne '') { $out .= qq |$multi_form\n|; } if ($hdn ne '') { foreach (split(/&/,$hdn)) { my ($n,$v) = split(/=/); $out .= qq |\n|; } } if ($str eq 'all' && $hdn_an ne '') { foreach (split(/&/,$hdn_an)) { my ($n,$v) = split(/=/); if ($n ne '' && $v ne '') { $out .= qq |\n|; } } } $out .= < EOM if (!$imode) { $out .= qq |
\n|; } if ($str eq 'skin') { return $out; } else { print $out; } } #------------------------------------------------- # 携帯個体識別情報取得(ログ保存・IDチェック用) #------------------------------------------------- # phone.pl - 携帯電話キャリア自動判別ライブラリ を参考にさせて頂きました # http://www.kawa.net/works/perl/phone/pnews.html sub UtnGet { my $temp = $UserAgent; my $utn = ''; my $Agent = ''; # FOMA if ($imode == 8) { $temp =~ /(.+\/.+)\((.+)\)/; $utn = $2; $Agent = $1; if ($Agent) { $Agent .= '('; } my @utn = split(/;/, $utn); $utn = ''; foreach (@utn) { if ($_ =~ /ser.{15}/) { $utn .= "$_/"; } # FOMA端末製造番号 elsif ($_ =~ /icc.{20}/) { $utn .= "$_/"; } # FOMAカード製造番号 elsif ($Agent) { $Agent .= "$_;"; } } if ($Agent) { $Agent .= ')'; } # i-mode } elsif ($imode == 3) { $temp =~ /(.+\/.+)\/(ser.{11})/; $utn = $2; # 製造番号 $Agent = $1; # SBM } elsif ($imode =~ /^5/) { $utn = $ENV{'HTTP_X_JPHONE_UID'}; # UID送信未承諾の場合は、NULL が届くかもしれない # その場合は変数未定義とする(phone.plより) $utn = undef if ( $utn eq "NULL" ); if ($utn) { $utn .= "/"; } # 端末シリアル番号取得 $temp =~ /(.*\/)(SN.+?)(\s.*)/i; $Agent = $1 . $3; $utn .= $2; # 端末シリアル番号 if ($utn) { $utn .= "/"; } # UID、端末シリアル番号ともに取得出来ない場合 if (!$utn) { $utn = $ENV{'HTTP_X_JPHONE_MSNAME'}; } $utn = undef if ( $utn eq "NULL" ); # EZweb } elsif ($imode == 4) { $utn = $ENV{'HTTP_X_UP_SUBNO'}; # 4桁以上の数字で始まり、ezweb.ne.jp か ido.ne.jp で終わる # それ以外は変数未定義とする(phone.plより) $utn = undef unless ($utn =~ /^\d{4}.*(ezweb|ido)\.ne\.jp$/i); # EMOBILE } elsif ($imode == 9) { $utn = $ENV{'HTTP_X_EM_UID'}; # "u"から始まる18Byteの文字列 $utn = undef unless ($utn =~ /^u.{17}$/); } if (!$Agent) { $Agent = $UserAgent; } return ($Agent,$utn); } #------------------------------------------------- # IDチェック #------------------------------------------------- # 書式:&IDCheck($str,$soft); # $str # 1 :投稿制限 # 2 :投稿閲覧制限 # $soft # 対象CGI sub IDCheck { my ($str,$soft) = @_; my $NGID = $str == 2 ? $IDCheck2 : $IDCheck1; if ($NGID eq '') { return; } # 携帯個体識別情報取得 my ($Agent,$utn); if ($imode) { ($Agent,$utn) = &UtnGet; } else { $Agent = $UserAgent; $utn = ""; } # クッキー取得 my $cookid; if ($imode == 0) { (undef,undef,undef,undef,undef,undef,$cookid) = &get_cookie; # (EZweb/SBM 3G/AirH"PHONE/FOMA) } elsif ($imode == 4 || $imode == 52 || $imode == 6 || $imode == 8) { (undef,undef,undef,undef,$cookid) = &get_cookie; } # ID情報設定 if ($cookid eq '') { my ($t_host,$t_make); if ($host eq "") { $t_host = $addr; } else { $t_host = $host; } if ($host eq $addr) { $t_host =~ s/\d{1,3}\.\d{1,3}$//; # 後ろの数字二組削除 } if ($utn) { $t_make = substr($utn,0,10) . substr($t_host,-10); } elsif ($in{'pwd'}) { $t_make = substr($in{'pwd'},0,10) . substr($t_host,-10); } else { $t_make = substr($Agent,-10) . substr($t_host,-10); } $cookid = &HosUaEnc($t_make); } # 携帯個体識別情報未取得ならIDをログに保存 if (!$utn) { $utn = $cookid; } # ID取得 my $ID = &IDOut("$host<:>$Agent<:>$utn",'skin'); # チェック my $error; foreach (split(/\s+/, $NGID)) { if (index($ID,$_) >= 0) { $error=1; last; } } # 拒否するID if ($error) { if ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'ID制限'); } &error("接続不能\なIDです($str)"); } } #------------------------------------------------- # UserAgentチェック #------------------------------------------------- # 書式:&UACheck($str,$soft); # $str # 1 :投稿制限 # 2 :投稿閲覧制限 # $soft # 対象CGI sub UACheck { my ($str,$soft) = @_; my $NGUA = $str == 2 ? $UACheck2 : $UACheck1; if ($NGUA eq '') { return; } # チェック my $error; foreach (split(/?/, $NGUA)) { if (index($UserAgent,$_) >= 0) { $error=1; last; } } # 拒否するUserAgent if ($error) { if ($AccessLog2 == 1) { require "${libDir}accesslog.pl"; &accesslog($soft,'UA制限'); } &error("接続不能\なUAです($str)"); } } 1;