<?php
/**
 * =====================================================
 * PPQCMS 版权完整性校验 (Integrity Guard v2)
 * -----------------------------------------------------
 * v1 缺陷: 5 个文件合并成一个 blob 后统一找标识
 *          -> 客户只改其中 1 个文件, 别的 4 个还有该标识, 不触发
 * v2 改进: A级文件逐个独立校验自己的专属标识
 *          -> 改任一 A级文件里的任一标识, 立刻触发
 *
 * A级 (作者资产, 客户没理由改) -> 严格校验
 *   Php/Admin/Home/index.php   品牌语 + 6 条特性 + 联系方式
 *   PPQSQL/collect_lib.php     盗版停用桩 + UA 标识
 *   index.php                  主入口注释 + 水印代码
 *   Php/Admin/header.php       后台主题 CSS id
 *   Php/Public/Integrity.php   本文件(钥匙哈希)
 *
 * B级 (客户配置/模板, 客户正常会改) -> 不校验, 避免误伤
 *   PPQSQL/Admin/Basic/AdminBasic.php   网站标题/关键词/邮箱
 *   PPQSQL/Admin/Ad/AdminCouplets.php   对联广告
 *   Template/**                          模板视觉
 *
 * 触发后果: 顶部横幅 + 底部水印 + 采集/绑定停用
 * =====================================================
 */

if (!defined('PPQ_INTEGRITY_LOADED')) {
    define('PPQ_INTEGRITY_LOADED', true);

    // 原作者豁免钥匙(母密钥哈希)
    define('PPQ_OWNER_KEY', '431982cb46e9d968f7668c6e537ed51d6d661bb3fcddbd6477b8109a28e6e873');

    // 全局盗版标记
    $GLOBALS['PPQ_PIRACY'] = false;
    $GLOBALS['PPQ_PIRACY_DETAIL'] = array();

    /**
     * 原作者豁免: PPQSQL/.auth 含正确钥匙则完全放行
     */
    function ppq_owner_verified() {
        $auth = defined('PPQ_ROOT') ? PPQ_ROOT . 'PPQSQL/.auth' : __DIR__ . '/../PPQSQL/.auth';
        if (!file_exists($auth)) return false;
        $v = trim(@file_get_contents($auth));
        return $v === PPQ_OWNER_KEY;
    }

    // 原作者已验证 -> 直接放行, 不校验不挂横幅不禁用
    if (ppq_owner_verified()) {
        // 放行, 啥都不做
    } else {

    /**
     * A级文件 -> 专属标识映射
     * 每个文件必须独立包含它自己的全部标识
     */
    function ppq_file_marks() {
        return array(
            // 后台介绍页: 品牌语 + 6 条特性 + 联系方式(整行HTML) + 合作语
            // 联系方式用整行 HTML 做标识: 改 URL 或改链接文本任一处都触发
            'Php/Admin/Home/index.php' => array(
                'PPQCMS · 啪啪雀CMS · 博采众长 · 全新开发',
                '真正的灵活：资源点可以自由切换',
                '真自动采集：系统每日自动增量更新',
                '极致轻量化：文件型存储',
                '原生多语言：后台一键配置',
                '纯净安全：加固防御无后门',
                '<a href="https://papaq.xyz" target="_blank"><i class="fa fa-globe"></i> papaq.xyz</a>',
                '<a href="https://ppqzy.com" target="_blank"><i class="fa fa-shopping-cart"></i> ppqzy.com</a>',
                '<a href="https://t.me/papaq1222" target="_blank"><i class="fa fa-telegram"></i> papaq1222</a>',
                '欢迎各大资源点联系合作',
            ),
            // 采集库: 盗版停用桩 + 请求 UA 标识
            'PPQSQL/collect_lib.php' => array(
                '未授权副本，采集功能已停用',
                'Mozilla/5.0 (compatible; PPQCMS/1.0)',
            ),
            // 根入口: 主入口注释 + 水印代码
            'index.php' => array(
                'PPQCMS 主入口',
                'ppq-piracy-warn',
            ),
            // 后台顶栏: 统一主题 CSS id
            'Php/Admin/header.php' => array(
                'ppq-admin-theme',
            ),
            // 本文件: 钥匙哈希常量(被删则由根 index.php 兜底触发)
            'Php/Public/Integrity.php' => array(
                '431982cb46e9d968f7668c6e537ed51d6d661bb3fcddbd6477b8109a28e6e873',
            ),
        );
    }

    /**
     * 逐文件独立校验
     * 返回 array('ok'=>bool, 'detail'=>array)
     */
    function ppq_check_integrity() {
        $root = defined('PPQ_ROOT') ? PPQ_ROOT : __DIR__ . '/../../';
        $map = ppq_file_marks();
        $detail = array();

        foreach ($map as $rel => $marks) {
            $f = $root . $rel;
            if (!file_exists($f)) {
                $detail[] = array('file' => $rel, 'missing' => array('[文件不存在]'));
                continue;
            }
            $content = @file_get_contents($f);
            if ($content === false || $content === '') {
                $detail[] = array('file' => $rel, 'missing' => array('[文件为空或不可读]'));
                continue;
            }
            $miss = array();
            foreach ($marks as $m) {
                if (stripos($content, $m) === false) {
                    $miss[] = $m;
                }
            }
            if (!empty($miss)) {
                $detail[] = array('file' => $rel, 'missing' => $miss);
            }
        }
        return array('ok' => empty($detail), 'detail' => $detail);
    }

    /**
     * 顶部盗版横幅 (v2 加码, 文档流内, 不遮挡内容)
     */
    function ppq_piracy_banner() {
        return '<div id="ppq-piracy-banner" style="position:relative;z-index:99998;'
            . 'background:#c00;color:#fff;font-size:15px;font-weight:bold;line-height:1.5;'
            . 'padding:12px 14px;text-align:center;font-family:sans-serif;letter-spacing:.5px;">'
            . '未授权副本 · 此站点使用的 PPQCMS 未获正版授权 · 核心功能已受限<br>'
            . '<span style="font-size:13px;font-weight:normal;">'
            . '请联系 <a href="https://papaq.xyz" target="_blank" style="color:#ffd700;text-decoration:underline;">papaq.xyz</a>'
            . ' 获取正版授权'
            . '</span></div>';
    }

    /**
     * 底部盗版水印 (v1 原有, 保留)
     */
    function ppq_piracy_watermark() {
        return '<div id="ppq-piracy-warn" style="position:fixed;left:0;right:0;bottom:0;z-index:99999;'
            . 'background:#111;color:#ff5252;font-size:14px;line-height:1.6;padding:10px 14px;text-align:center;'
            . 'font-family:sans-serif;border-top:2px solid #ff5252;letter-spacing:.3px;">'
            . '此为盗版/未授权副本 · 请勿使用以防受骗 · 请联系 啪啪雀 '
            . '<a href="https://papaq.xyz" target="_blank" style="color:#4fc3f7;text-decoration:underline;">papaq.xyz</a>'
            . ' 举报获取正版</div>';
    }

    /**
     * 输出缓冲回调: 顶部横幅插到 <body> 后, 底部水印插到 </body> 前
     */
    function ppq_ob_callback($buffer) {
        if (empty($GLOBALS['PPQ_PIRACY'])) return $buffer;
        if (stripos($buffer, '<body') === false) return $buffer;

        // 顶部横幅(文档流内, 不遮挡内容)
        if (strpos($buffer, 'ppq-piracy-banner') === false) {
            $buffer = preg_replace_callback(
                '/(<body[^>]*>)/i',
                function ($m) { return $m[1] . ppq_piracy_banner(); },
                $buffer,
                1
            );
        }
        // 底部水印
        if (strpos($buffer, 'ppq-piracy-warn') === false) {
            if (stripos($buffer, '</body>') !== false) {
                $buffer = str_ireplace('</body>', ppq_piracy_watermark() . '</body>', $buffer);
            } else {
                $buffer .= ppq_piracy_watermark();
            }
        }
        return $buffer;
    }

    // 执行校验并挂载防护
    $res = ppq_check_integrity();
    if (!$res['ok']) {
        $GLOBALS['PPQ_PIRACY'] = true;
        $GLOBALS['PPQ_PIRACY_DETAIL'] = $res['detail'];
        if (!defined('PPQ_OB_STARTED')) {
            define('PPQ_OB_STARTED', true);
            ob_start('ppq_ob_callback');
        }
    }

    } // end else (非原作者)
}
