<?php
// error_reporting(-1); // デバッグ用に
date_default_timezone_set('Asia/Tokyo');    // 時間は日本でいいよね

// 最低限、$toAddと$listDataは設定しないと動かないです。
// でも、そんなに項目多くないんだから、全部設定しましょ。
// そういえば、これから送られるメールはUTF-8なのです。
// メーラーによっては設定変えないと文字化けするかもね。

// たぽろだのURL (必須)
// 別に無くても良いけど、書かないと送信したあと、たぽろだに戻れなくなるよ。
$tapoloda 'http://example.org/script/tapoloda.cgi';

// 管理者ページのURL (任意)
// 通報メールの本文中リンクに使うのです。
$adminUrl 'http://example.org/script/admin.cgi';

// list.txtへのパス (必須)
// これが無いと本当にあるアイテムか分からない。
$listData '../updata/list.txt';

// 商品情報ファイルのあるディレクトリ (必須)
// 詳細な情報を取得するのに使用します。
$dataDir  '../updata/';

// 通報先メールアドレス (必須)
// このメールアドレスに通報しますよ。
// ちゃんと実在するアドレスじゃないと駄目なのです。
// $toAddr = 'info@example.org';
$toAddr '';

// 送信元アドレス (任意)
// fromはfrom。実在する方が良いけど、適当でもどうにかなったり。
$fromAddr 'tapoloda-abuse@example.org';

// 連絡先としてメールアドレスを表示する(1)か否(0)か (任意)
// 返事の必要な問い合わせ等のために、通報フォーム上に通報先メールアドレスを表示します。
// メールアドレスは@が_at_に変換されて表示されます。
// 特別な理由がなければ、表示したほうがいいでしょう。
// 設定しない場合、連絡先は表示されません。
$mail 1;

// 接頭辞 (任意)
// 送信されるメールの件名に使用されます。
// 実際に届くメールの件名は {接頭辞}{ファイルID} となります。
// 例: [tapoloda abuse] 20100917.121305te4kp28f
// 長くても20文字以内におさめた方が無難だと思います。。。
$prefix '[tapoloda abuse]';

// ------- 設定はここまで -------

/*
 * Copyright (c) 2010, hitobashira.org
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this 
 *    list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice, 
 *    this list of conditions and the following disclaimer in the documentation 
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of the hitobashira.org nor the names of its contributors may 
 *    be used to endorse or promote products derived from this software without 
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 *
 */


// ここから下はあまり下手に弄らない方が良いかも。
// というか、酷いコードだから見ない方が賢明じゃなかなぁ。

// 設定がちゃんとされているか確認
if (empty($toAddr)) exit('通報先メールアドレスが登録されていません。');

$m_made    null;
$m_contact null;
if (
strpos($toAddr'@') === false$mail null;
if (
strpos($toAddr'.') === false$mail null
if (
$mail) {
    
// madeのアドレスは@が含まれていないとw3cのvaldatorで怒られるので、
    // @はそのままにして、アドレスの最後にある.を_dot_に変換しています。
    
$m_made    substr_replace($mail'_dot_'strrpos($mail'.'), 1);
    
$made      "\n    <link rev=\"made\" href=\"mailto:{$m_made}\" />";
    
$m_contact str_replace('@''_at_'$mail);
    
$contact   "<br />\n管理者からの連絡が必要な場合、<a href=\"mailto:{$m_contact}?body=_at_は@に変換してください。\">E-Mail</a>にてご連絡ください。";
}

// HTMLのヘッダ部分とか
echo <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
    <title>通報</title>
    <meta http-equiv="content-style-type" content="text/css" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
{$made}
</head>
<body>
<div>
EOF;

// item idを取得
if (!empty($_POST['item_id'])) {
    
$item_id htmlspecialchars($_POST['item_id']);
} elseif (!empty(
$_GET['id'])) {
    
$item_id htmlspecialchars($_GET['id']);
} else {
  exit(
'あれ、何を通報しようとしたんですか? - ERROR: IDが指定されていません');
}

// idから情報を取得
$handle = @fopen($listData"r");
$item_name null;
if (
$handle) {
    while (!
feof($handle)) {
        
$buffer fgets($handle);
        
$buffer mb_convert_encoding($buffer'UTF-8''SJIS');
        
$itemData explode("\t"$buffer);
        
        if (
$itemData[0][0] == '#') {
            
// コメントアウトされた行はスキップ
            
continue;
        }
        
        if (
$itemData[1] == $item_id) {
            
$item_name  $itemData[1];    // ファイルのid
            
$item_term  $itemData[2];    // 購入期限
            
$item_file  $itemData[3];    // 元ファイル名
            
$item_title $itemData[6];    // 商品名
            
$item_owner $itemData[8];    // アップロード者名
            
$item_desc  $itemData[13];   // 説明
            
break;
        }
    }
    
    if (
is_null($item_name)) {
        exit(
'あれ、迷子になったみたいです。 - ERROR: 指定されたIDの商品が見つかりません');
    }
    
    
fclose($handle);
} else {
    
// list.txtが開けなかった。
    
exit('あれ、データが見つからなかったよ。 - ERROR: リストデータの取得に失敗しました');
}

if (
$item_term <= date('Ymd.His')) {
    exit(
'もう販売してないような。 - ERROR: 既に販売期限をすぎています');
}

// modeが指定されてるってことはきっとチェックとか。
if(!empty($_POST['mode'])){
    
$mode htmlspecialchars($_POST['mode']);
    if(empty(
$_POST['body'])){
        
// 最低限、なんで通報するのかは書いて欲しい。
        
$mode 'edit'// 編集画面にもどしちゃましょ。。
        
$nobody '<span style="color:red">このファイルの何が問題なのかを教えてください。(本文がありません)</span><br />';
    }else{
        
$body htmlspecialchars($_POST['body']);
        
$br_body nl2br($body);
    } 
} else {
    
$mode 'edit';
    
$body null;   // 一応nullで初期化しておくとNoticeが出なくて幸せ。
    
$nobody null;
}

switch (
$mode){
    case 
'send':
        
// 確認してくれたらしいのでメール送りましょ。
    
        // 実際に送られるメールの件名。このままで困る事はあんまりないんじゃないなぁ。
        
$subject "[tapoloda abuse]{$item_id}";
        
        
// item_descは<br>付いてるので。
        
$item_desc preg_replace('/<br>\n$/'''$item_desc1);
        
$item_desc preg_replace('/<br>/'"\n"$item_desc);
        
        
// アップロード者のメールアドレスとかを持ってくる。
        
$fp fopen("{$dataDir}{$item_id}.txt"'r');
        if (
$fp) {
            
$flag false;
            while (!
feof($fp)) {
                
$line fgets($fp);
                if (
$line[0] == 'O') {
                    
$flag true;
                    break;
                }
            }
            if (
$flag) {
                
$dataTxt explode("\t"$line);
                
$user_mail $dataTxt[1];
                
$user_ip   $dataTxt[2];
                
$user_host gethostbyaddr($user_ip);
            } else {
                
$user_mail '(データの取得に失敗しました)';
                
$user_ip   '(データの取得に失敗しました)';
                
$user_host '(データの取得に失敗しました)';
            }
        } else {
            
$user_mail '(データファイルが開けませんでした)';
            
$user_ip   '(データファイルが開けませんでした)';
            
$user_host '(データファイルが開けませんでした)';
        }
        
        if (empty(
$adminUrl)) $adminurl null;
        
        
// 日本語で1行1000文字以上入力されるとつむけどどうでもいいや。
        
$body  wordwrap($body70);
        
$body .= "\n\n";
        
$body .= "詳細: {$adminUrl}?mode=edt&id={$item_id}&p=t \n";
        
$body .= "論理削除: {$adminUrl}?mode=ldp&id={$item_id}&p=t \n";
        
$body .= "物理削除: {$adminUrl}?mode=pdp&id={$item_id}&p=t \n";
        
$body .= "DL: {$adminUrl}?mode=dwn&id={$item_id} \n";
        
$body .= "\n";
        
$body .= "アイテム情報: \n";
        
$body .= "アイテム名 [ {$item_title} ] \n";
        
$body .= "ファイル名 [ {$item_file} ] \n";
        
$body .= "説明 [ {$item_desc} ] \n";
        
$body .= "\n";
        
$body .= "アップロード者情報: \n";
        
$body .= "アップロード者名 [ {$item_owner} ] \n";
        
$body .= "メールアドレス [ {$user_mail} ] \n";
        
$body .= "IPアドレス [ {$user_ip} ] \n";
        
$body .= "ホスト [ {$user_host} ] \n";
        
$body .= "\n";
        
$body .= "通報者情報: \n";
        
$body .= "IPアドレス [ {$_SERVER['REMOTE_ADDR']} ] \n";
        
$body .= "ホスト [ " gethostbyaddr($_SERVER['REMOTE_ADDR']) . " ] \n";
        
$body .= "UA [ {$_SERVER['HTTP_USER_AGENT']} ] \n";
        
$body .= "通報日時 [ " date('Y/m/d H:i:s T(P)') ." ] \n";
        
        
$headers "From: {$fromAddr}\r\n" .
                   
"Mime-Version: 1.0\r\n" .
                   
"Content-Type: Text/Plain; charset=utf-8\r\n" 
                   
'X-Mailer: PHP/' phpversion();
        
$sendmail mail($toAddr$subject$body$headers);
        if(!
$sendmail){
            
// 送信に失敗したからエラーだしましょ。
            
exit("なんかメールの送信に失敗しちゃったみたいです><;<br />\nもう一度試して駄目だったら{$m_contact}にメールしてください。");
        }else{
            
// 成功したから戻るリンクもいるよね。
            
echo("通報に成功したっぽいです(゚∀゚)<br />\n");
            if (!empty(
$tapoloda)) echo("<a href=\"{$tapoloda}\">一覧に戻る?</a>");
        }
        break;
        
    case 
'check':
        
// 入力した内容が合ってるか確認してもらわないと。
        
echo <<<EOF
<table border="1" cellspacing="0" cellpadding="3" style="width:550px;word-break:break-all;table-layout:fixed;">
    <caption>Check!</caption>
    <tr>
        <th>ID</th>
        <td>
{$item_id}</td>
    </tr>
    <tr>
        <th>Title</th>
        <td>
{$item_title}</td>
    </tr>
    <tr>
        <th>Body</th>
        <td>
{$br_body}</td>
    </tr>
</table>

<form method="post" action="
{$_SERVER['SCRIPT_NAME']}">
    <input type="hidden" name="item_id" value="
{$item_id}" />
    <input type="hidden" name="body" value="
{$body}" />
    <input type="submit" name="mode" value="edit" />
    <input type="submit" name="mode" value="send" />
</form>

EOF;

        break;

    case 
'edit':        
    default:
        
// まず最初は通報内容とか書いてもらわないと。
        
echo <<<EOF
        {$nobody}
        <p>選択されたファイルを管理者に通報します。
{$contact}</p>
<form method="post" action="
{$_SERVER['SCRIPT_NAME']}" style="width:550px;">
    <fieldset>
        <legend>Abuse</legend>
        Item ID: 
{$item_id}<br />
        <input type="hidden" name="item_id" value="
{$item_id}" />
        Item Title: 
{$item_title}<br />
        Body:<br />
        <span style="font-size:x-small"></span>通報内容を出来るだけ詳しく(必須)<br />
        <textarea cols="55" rows="10" name="body">
{$body}</textarea><br />
        <input type="submit" name="mode" value="check" />
    </fieldset>
</form>

        
EOF;
}

// なんか下の方に表示させるのです。
echo <<<EOF
<div style="font-size: small">
注意事項:<br />
・通報されたファイルの削除を保障する物では有りません。<br />
・通報はあくまでも参考情報として扱われます。<br />
・通報後即座に削除されるわけではありません。<br />
・確認後に処理するので若干の時間が掛かります。<br />
・<span style="color:red">管理者が一人である以上、24時間体制の対応は不可能です。</span><br />
</div>

<div style="font-size: x-small;text-align: right">
<!-- 別にどうでも良い表示だから消してもいいけどね。 -->
<a href="http://tapoloda.hitobashira.org/">tapoloda abuse form v3.1.0 by hitobashira.org</a>
</div>

</div>
</body>
</html>
EOF;