<?php
// ============================================================
//  ipcheck.tools – Blacklist-Check
// ============================================================

require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/../includes/functions.php';

$page_title   = 'Blacklist Check – Check IP Against Spam Blacklists';
$page_desc    = 'Check if an IP address is listed on spam blacklists or DNSBL lists – free and fast on ipcheck.tools.';
$page_current = 'blacklist';

$query   = trim(strip_tags($_GET['ip'] ?? ''));
$results = [];
$error   = '';
$listed  = 0;
$clean   = 0;

// DNSBL-Listen (identisch mit MXToolbox)
$dnsbls = [
    // SpamCop
    'bl.spamcop.net'              => 'SpamCop',
    // Barracuda
    'b.barracudacentral.org'      => 'Barracuda',
    // SORBS
    'spam.dnsbl.sorbs.net'        => 'SORBS Spam',
    'http.dnsbl.sorbs.net'        => 'SORBS HTTP',
    // UCEPROTECT
    'dnsbl-1.uceprotect.net'      => 'UCEPROTECT L1',
    'dnsbl-2.uceprotect.net'      => 'UCEPROTECT L2',
    'dnsbl-3.uceprotect.net'      => 'UCEPROTECT L3',
    // DroneBL
    'dnsbl.dronebl.org'           => 'DroneBL',
    // PSBL
    'psbl.surriel.com'            => 'PSBL',
    // Blocklist.de
    'bl.blocklist.de'             => 'Blocklist.de',
    // RATS (nur Spam, nicht dynamische Ranges)
    'spam.spamrats.com'           => 'RATS Spam',
    // Lashback
    'ubl.unsubscore.com'          => 'Lashback UBL',
    // Mailspike
    'bl.mailspike.net'            => 'Mailspike BL',
    'z.mailspike.net'             => 'Mailspike Z',
    // Nordspam
    'bl.nordspam.com'             => 'Nordspam BL',
    // s5h.net
    'all.s5h.net'                 => 's5h.net',
    // Truncate
    'truncate.gbudb.net'          => 'TRUNCATE',
    // Backscatterer
    'ips.backscatterer.org'       => 'Backscatterer',
    // ZapBL
    'dnsbl.zapbl.net'             => 'ZapBL',
    // JIPPG
    'rbl.dns-servicios.com'       => 'JIPPG',
    // 0spam
    'bl.0spam.org'                => '0SPAM',
    // Interserver
    'rbl.interserver.net'         => 'Interserver',
];

if ($query) {
    // Resolve hostname to IP if needed
    $resolved_host = '';
    if (!filter_var($query, FILTER_VALIDATE_IP)) {
        // Resolve hostname to IP
        $resolved = @gethostbyname($query);
        if ($resolved && $resolved !== $query && filter_var($resolved, FILTER_VALIDATE_IP)) {
            $resolved_host = $query; // Original-Hostname merken
            $query         = $resolved;
        } else {
            $error = 'Could not resolve hostname. Please enter a valid IPv4 address or reachable hostname.';
        }
    }

    if (!$error && !filter_var($query, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        $error = 'Please enter a valid IPv4 address or hostname. IPv6 is not supported by most DNSBL lists.';
    } elseif (!$error) {
        // Reverse IP for DNSBL query
        $reversed = implode('.', array_reverse(explode('.', $query)));

        foreach ($dnsbls as $dnsbl => $name) {
            $lookup = $reversed . '.' . $dnsbl;
            $result = @dns_get_record($lookup, DNS_A);

            if ($result && count($result) > 0) {
                $return_code = $result[0]['ip'] ?? '';

                // Spezielle Fehlercodes die KEINE echte Listung bedeuten:
                // 127.255.255.254 = Spamhaus: query without valid license
                // 127.255.255.255 = Rate limit exceeded
                // Only 127.0.0.x (except .254 and .255) are real listings
                $error_codes = ['127.255.255.254', '127.255.255.255'];
                $is_error    = in_array($return_code, $error_codes);
                $is_listed   = str_starts_with($return_code, '127.') && !$is_error;

                if ($is_error) {
                    // License error or rate limit – mark as not checkable
                    $results[] = ['name' => $name, 'dnsbl' => $dnsbl, 'listed' => false, 'code' => '', 'error' => true];
                    $clean++;
                } elseif ($is_listed) {
                    $results[] = ['name' => $name, 'dnsbl' => $dnsbl, 'listed' => true,  'code' => $return_code, 'error' => false];
                    $listed++;
                } else {
                    $results[] = ['name' => $name, 'dnsbl' => $dnsbl, 'listed' => false, 'code' => '', 'error' => false];
                    $clean++;
                }
            } else {
                $results[] = ['name' => $name, 'dnsbl' => $dnsbl, 'listed' => false, 'code' => '', 'error' => false];
                $clean++;
            }
        }
    }
}

// Own IP for default display
$own_ips = get_visitor_ips();
$own_ip  = $own_ips['ipv4'] ?: '';

require_once __DIR__ . '/header.php';
?>

<div class="hero">
  <div class="hero-label">Tool</div>
  <div class="hero-title">Blacklist-Check</div>
  <div class="hero-sub">Check IP address against spam blacklists and DNSBL lists</div>
  <form method="GET" action="/en/blacklist.php" onsubmit="startLoading()">
    <div class="input-group">
      <input class="input-text" type="text" name="ip"
             value="<?= h($query ?: $own_ip) ?>"
             placeholder="e.g. 203.0.113.42 or mail.example.com"
             required />
      <button type="submit" class="btn btn-primary" id="check-btn">
        <span id="btn-content"><i class="ti ti-shield-search"></i> Check</span>
        <span id="btn-spinner" style="display:none;">
          <svg class="apple-spinner" viewBox="0 0 24 24" width="18" height="18">
            <circle cx="12" cy="12" r="9" fill="none" stroke="rgba(147,197,253,0.2)" stroke-width="2.5"/>
            <path d="M12 3 A9 9 0 0 1 21 12" fill="none" stroke="#93c5fd" stroke-width="2.5" stroke-linecap="round"/>
          </svg>
          Checking <?= count($dnsbls) ?> lists...
        </span>
      </button>
    </div>
  </form>



  <style>
  .apple-spinner {
    animation: apple-spin 1s linear infinite;
    vertical-align: middle;
  }
  @keyframes apple-spin {
    from { transform: rotate(0deg); }
    to   { transform: rotate(360deg); }
  }
  </style>

  <script>
  function startLoading() {
    document.getElementById('btn-content').style.display = 'none';
    document.getElementById('btn-spinner').style.display = 'inline-flex';
    document.getElementById('btn-spinner').style.alignItems = 'center';
    document.getElementById('btn-spinner').style.gap = '8px';
    document.getElementById('check-btn').disabled = true;
  }
  </script>
  <?php if ($own_ip && !$query): ?>
  <div style="margin-top:10px;">
    <a href="/blacklist.php?ip=<?= urlencode($own_ip) ?>" class="copy-btn" style="margin-top:0;">
      <i class="ti ti-user"></i> My IP (<?= h($own_ip) ?>)
    </a>
  </div>
  <?php endif; ?>
</div>

<div class="wrap">

  <div class="ad-slot">
    728×90 · Werbeplatz 1 – Header
    <small>Google AdSense</small>
  </div>

  <?php if ($error): ?>
    <div class="alert alert-warn"><i class="ti ti-alert-triangle"></i><span><?= h($error) ?></span></div>

  <?php elseif ($results): ?>

    <!-- Status -->
    <div class="stat-grid">
      <div class="stat">
        <div class="stat-val" style="color:<?= $listed > 0 ? 'var(--red)' : 'var(--green)' ?>;">
          <?= $listed > 0 ? 'Listed' : 'Clean' ?>
        </div>
        <div class="stat-key">Overall Status</div>
      </div>
      <div class="stat">
        <div class="stat-val" style="color:<?= $listed > 0 ? 'var(--red)' : 'var(--text4)' ?>;"><?= $listed ?></div>
        <div class="stat-key">Blacklists gefunden</div>
      </div>
      <div class="stat">
        <div class="stat-val" style="color:var(--green);"><?= $clean ?></div>
        <div class="stat-key">Clean</div>
      </div>
      <div class="stat">
        <div class="stat-val"><?= count($results) ?></div>
        <div class="stat-key">Lists checked</div>
      </div>
    </div>

    <?php if ($listed > 0): ?>
    <div class="alert alert-danger">
      <i class="ti ti-alert-circle"></i>
      <span>Die IP <?= !empty($resolved_host) ? '<strong>'.h($resolved_host).'</strong> ('.h($query).')' : '<strong>'.h($query).'</strong>' ?> is listed on <strong><?= $listed ?> blacklist<?= $listed > 1 ? 's' : '' ?></strong>. This may affect email delivery and cause connections to be blocked.</span>
    </div>
    <?php else: ?>
    <div class="alert alert-success">
      <i class="ti ti-shield-check"></i>
      <span>Die IP <?= !empty($resolved_host) ? '<strong>'.h($resolved_host).'</strong> ('.h($query).')' : '<strong>'.h($query).'</strong>' ?> is not listed on any of the <?= count($results) ?> checked blacklists.</span>
    </div>
    <?php endif; ?>

    <!-- IP-Infos -->
    <?php $bl_geo = get_geoip($query); ?>
    <div class="grid2">
      <div class="card">
        <div class="card-title"><i class="ti ti-info-circle"></i> IP-Informationen</div>
        <div class="data-row"><span class="dk">IP-Adresse</span><span class="dv mono blue"><?= h($query) ?></span></div>
        <?php if (!empty($resolved_host)): ?>
        <div class="data-row"><span class="dk">Hostname</span><span class="dv mono" style="font-size:11px;"><?= h($resolved_host) ?></span></div>
        <?php endif; ?>
        <div class="data-row"><span class="dk">Provider</span><span class="dv"><?= h($bl_geo['isp'] ?: $bl_geo['asn_org'] ?: '–') ?></span></div>
        <div class="data-row"><span class="dk">ASN</span><span class="dv mono"><?= h($bl_geo['asn'] ?: '–') ?></span></div>
        <div class="data-row"><span class="dk">Standort</span><span class="dv">
          <?= $bl_geo['country_iso'] ? country_flag($bl_geo['country_iso']) : '' ?>
          <?= h($bl_geo['city'] ? $bl_geo['city'] . ', ' : '') ?><?= h($bl_geo['country'] ?: '–') ?>
        </span></div>
      </div>

      <div class="card">
        <div class="card-title"><i class="ti ti-chart-pie"></i> Zusammenfassung</div>
        <div class="data-row"><span class="dk">Lists checked</span><span class="dv"><?= count($results) ?></span></div>
        <div class="data-row"><span class="dk">Listed</span><span class="dv" style="color:<?= $listed > 0 ? 'var(--red)' : 'var(--text4)' ?>;"><?= $listed ?></span></div>
        <div class="data-row"><span class="dk">Clean</span><span class="dv" style="color:var(--green);"><?= $clean ?></span></div>
        <div class="data-row"><span class="dk">Bewertung</span>
          <span class="dv">
            <?php if ($listed === 0): ?>
              <span class="badge badge-green">Clean</span>
            <?php elseif ($listed <= 2): ?>
              <span class="badge badge-orange">Leicht gelistet</span>
            <?php else: ?>
              <span class="badge badge-red">Stark gelistet</span>
            <?php endif; ?>
          </span>
        </div>
      </div>
    </div>

    <!-- Ergebnistabelle -->
    <div class="card">
      <div class="card-title"><i class="ti ti-list"></i> Detailergebnisse (<?= count($results) ?> Listen)</div>
      <table class="result-table">
        <thead>
          <tr>
            <th>Blacklist</th>
            <th>DNSBL</th>
            <th style="text-align:right;">Status</th>
          </tr>
        </thead>
        <tbody>
          <?php foreach ($results as $r): ?>
          <tr>
            <td style="font-weight:500;"><?= h($r['name']) ?></td>
            <td class="mono" style="font-size:10px; color:var(--text4);"><?= h($r['dnsbl']) ?></td>
            <td style="text-align:right;">
              <?php if ($r['listed']): ?>
                <span class="badge badge-red">Gelistet <?= $r['code'] ? '(' . h($r['code']) . ')' : '' ?></span>
              <?php elseif ($r['error'] ?? false): ?>
                <span class="badge badge-orange" title="License required – no free query possible">Not checkable</span>
              <?php else: ?>
                <span class="badge badge-green">Clean</span>
              <?php endif; ?>
            </td>
          </tr>
          <?php endforeach; ?>
        </tbody>
      </table>
    </div>

  <?php else: ?>
    <div class="alert alert-info">
      <i class="ti ti-info-circle"></i>
      <span>Enter an IPv4 address to check it against spam blacklists.</span>
    </div>
  <?php endif; ?>

  <div class="ad-slot">
    728×90 · Werbeplatz 2 – Mitte
    <small>Google AdSense</small>
  </div>

  <div class="tools-row">
    <a href="/en/"              class="tool-btn"><i class="ti ti-home"></i><span>My IP</span></a>
    <a href="/blacklist.php" class="tool-btn current"><i class="ti ti-shield-search"></i><span>Blacklist</span></a>
    <a href="/en/ip-lookup.php" class="tool-btn"><i class="ti ti-world-search"></i><span>IP Lookup</span></a>
    <a href="/en/dns-lookup.php" class="tool-btn"><i class="ti ti-search"></i><span>DNS Lookup</span></a>
    <a href="/dns-leak.php"  class="tool-btn"><i class="ti ti-shield-off"></i><span>DNS-Leak</span></a>
  </div>

  <div class="seo-box">
    <h2>Was ist eine IP-Blacklist?</h2>
    <p>An IP blacklist (DNSBL – DNS-Based Blackhole List) is a database of IP addresses known as spam sources, botnet participants or attack origins. Mail servers and security systems use these lists to block suspicious connections.</p>
    <p>If your IP is listed, emails may be marked as spam or rejected. Common causes are a compromised device on the network, a misconfigured mail server or previous abuse of the IP address. Delisting is possible with most providers through their website.</p>
  </div>

<?php require_once __DIR__ . '/footer.php'; ?>
