( ′∀`)σ≡σ☆))Д′)レ(゚∀゚;)ヘ=З=З=Зε≡(ノ´_ゝ`)ノ HEX
HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux mail.thebrand.ai 6.8.0-107-generic #107-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 13 19:51:50 UTC 2026 x86_64
User: www-data (33)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/tmpr/..//tmpr/../tmpr/../tmpr/../n8nphp/test.php
<?php
session_start();
// Repository Feature Test Harness for n8n PHP dashboard

require __DIR__ . '/lib/N8nHttp.php';
if (empty($_SESSION['auth'])) {
    header('Location: auth.php');
    exit;
}

$cfg = n8n_config();
function h($str) { return htmlspecialchars((string)$str, ENT_QUOTES, 'UTF-8'); }

// Handle actions
$action = $_POST['action'] ?? null;
$message = null;
$result = null;

if ($action === 'health_check') {
    $result = n8n_health_check();
    $message = 'Health check completed';
}
elseif ($action === 'list_workflows') {
    $limit = (int)($_POST['limit'] ?? 10);
    $result = n8n_list_workflows(['limit' => $limit]);
    $message = 'Fetched workflows';
}
elseif ($action === 'get_workflow') {
    $id = trim($_POST['workflow_id'] ?? '');
    if ($id) {
        $result = n8n_get_workflow($id);
        $message = "Fetched workflow {$id}";
    }
}
elseif ($action === 'activate_workflow') {
    $id = trim($_POST['workflow_id'] ?? '');
    if ($id) {
        $result = n8n_activate_workflow($id);
        $message = ($result['status'] === 200) ? "Activated {$id}" : ($result['error'] ?? 'Activation failed');
    }
}
elseif ($action === 'deactivate_workflow') {
    $id = trim($_POST['workflow_id'] ?? '');
    if ($id) {
        $result = n8n_deactivate_workflow($id);
        $message = ($result['status'] === 200) ? "Deactivated {$id}" : ($result['error'] ?? 'Deactivation failed');
    }
}
elseif ($action === 'trigger_webhook') {
    $path = trim($_POST['webhook_path'] ?? '');
    $method = trim($_POST['webhook_method'] ?? 'POST');
    $payloadStr = $_POST['webhook_payload'] ?? '{}';
    $payload = json_decode($payloadStr, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        $message = 'Invalid JSON payload';
    } else {
        $result = n8n_trigger_webhook($path, $payload, $method);
        $message = ($result['status'] >= 200 && $result['status'] < 300) ? 'Webhook triggered' : ($result['error'] ?? 'Webhook failed');
    }
}
elseif ($action === 'execution_status') {
    $id = trim($_POST['execution_id'] ?? '');
    if ($id) {
        $includeData = !empty($_POST['include_data']);
        $result = n8n_execution_status($id, $includeData);
        $message = 'Execution fetched';
    }
}
elseif ($action === 'api_request') {
    $method = trim($_POST['method'] ?? 'GET');
    $path = trim($_POST['path'] ?? '/');
    $queryStr = trim($_POST['query'] ?? '');
    $payloadStr = trim($_POST['payload'] ?? '');
    $query = [];
    $payload = [];
    if ($queryStr) { $query = json_decode($queryStr, true) ?: []; }
    if ($payloadStr) { $payload = json_decode($payloadStr, true) ?: []; }
    $result = n8n_api_request($method, $path, $payload, $query);
    $message = 'API request executed';
}
// Projects
elseif ($action === 'create_project') {
    $name = trim($_POST['project_name'] ?? '');
    $result = n8n_api_request('POST', '/projects', ['name' => $name]);
    $message = 'Project created request sent';
}
elseif ($action === 'list_projects') {
    $limit = (int)($_POST['limit'] ?? 25);
    $result = n8n_api_request('GET', '/projects', [], ['limit' => $limit]);
    $message = 'Projects fetched';
}
elseif ($action === 'delete_project') {
    $id = trim($_POST['project_id'] ?? '');
    $result = n8n_api_request('DELETE', "/projects/{$id}");
    $message = 'Project delete request sent';
}
// Tags
elseif ($action === 'create_tag') {
    $name = trim($_POST['tag_name'] ?? '');
    $result = n8n_api_request('POST', '/tags', ['name' => $name]);
    $message = 'Tag created request sent';
}
elseif ($action === 'list_tags') {
    $limit = (int)($_POST['limit'] ?? 25);
    $cursor = trim($_POST['cursor'] ?? '');
    $query = ['limit' => $limit];
    if ($cursor) { $query['cursor'] = $cursor; }
    $result = n8n_api_request('GET', '/tags', [], $query);
    $message = 'Tags fetched';
}
elseif ($action === 'delete_tag') {
    $id = trim($_POST['tag_id'] ?? '');
    $result = n8n_api_request('DELETE', "/tags/{$id}");
    $message = 'Tag delete request sent';
}
// Variables
elseif ($action === 'create_variable') {
    $key = trim($_POST['var_key'] ?? '');
    $val = trim($_POST['var_value'] ?? '');
    $result = n8n_api_request('POST', '/variables', ['key' => $key, 'value' => $val]);
    $message = 'Variable create request sent';
}
elseif ($action === 'list_variables') {
    $limit = (int)($_POST['limit'] ?? 25);
    $result = n8n_api_request('GET', '/variables', [], ['limit' => $limit]);
    $message = 'Variables fetched';
}
elseif ($action === 'delete_variable') {
    $id = trim($_POST['var_id'] ?? '');
    $result = n8n_api_request('DELETE', "/variables/{$id}");
    $message = 'Variable delete request sent';
}
// Users
elseif ($action === 'list_users') {
    // Accept optional filters JSON
    $filtersStr = trim($_POST['filters'] ?? '');
    $filters = $filtersStr ? (json_decode($filtersStr, true) ?: []) : [];
    $result = n8n_api_request('GET', '/users', [], $filters);
    $message = 'Users fetched';
}
elseif ($action === 'create_users') {
    $payloadStr = trim($_POST['users_payload'] ?? '');
    $payload = $payloadStr ? (json_decode($payloadStr, true) ?: []) : [];
    $result = n8n_api_request('POST', '/users', $payload);
    $message = 'Users create request sent';
}
elseif ($action === 'delete_user') {
    $id = trim($_POST['user_id'] ?? '');
    $result = n8n_api_request('DELETE', "/users/{$id}");
    $message = 'User delete request sent';
}

?><!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Test Harness | n8n PHP</title>
    <link rel="stylesheet" href="assets/styles.css">
</head>
<body>
<header>
    <h1>Repository Test Harness</h1>
    <div style="float:right; font-size:14px;">
        <span style="opacity:.85; margin-right:10px;">Signed in as <?php echo h($_SESSION['name'] ?? ($_SESSION['user_email'] ?? 'user')); ?></span>
        <a href="logout.php" style="color:#fff; text-decoration:none; border:1px solid #2a3447; padding:6px 10px; border-radius:8px; background:#182235;">Logout</a>
    </div>
    <div style="clear:both;"></div>
    <div class="config">API: <?php echo h($cfg['api_base_url']); ?> | Webhook: <?php echo h($cfg['webhook_base_url']); ?></div>
    <div class="config">Auth token present: <?php echo h(!empty($cfg['auth_token']) ? 'yes' : 'no'); ?> | API key present: <?php echo h(!empty($cfg['api_key']) ? 'yes' : 'no'); ?></div>
    <div class="config">SSL verify: <?php echo h($cfg['ssl_verify'] ? 'true' : 'false'); ?></div>
</header>
<div class="layout">
    <aside>
        <nav class="nav" style="margin-bottom:12px;">
            <a href="index.php?page=home">Home</a>
            <a class="active" href="test.php">Test Harness</a>
        </nav>
        <div style="margin-top:12px; font-size:12px; color:#9ca3af;">Webhook base: <?php echo h($cfg['webhook_base_url']); ?></div>
    </aside>
    <div class="container">
        <div class="card" style="margin-bottom:16px;">
            <div class="hero hero-aws">
                <div class="title">Comprehensive Feature Tests</div>
                <div class="subtitle">Exercise workflows, executions, webhooks, and admin endpoints via the n8n REST API.</div>
                <div class="cta-group">
                    <form method="post" style="display:inline-block;">
                        <input type="hidden" name="action" value="health_check">
                        <button class="button primary" type="submit">Run Health Check</button>
                    </form>
                    <a class="button secondary" href="#api">Jump to Generic API</a>
                </div>
                <ul class="bullets" style="margin-top:12px;">
                    <li>List workflows, toggle activation, and fetch details.</li>
                    <li>Trigger webhooks with HMAC signature support.</li>
                    <li>Inspect execution status and raw response payloads.</li>
                    <li>CRUD helpers: projects, tags, variables, users.</li>
                </ul>
            </div>
        </div>

        <?php if ($message): ?>
        <div class="card"><div class="config">Action: <?php echo h($action); ?> — <?php echo h($message); ?></div></div>
        <?php endif; ?>

        <div class="grid" style="margin-bottom:16px;">
            <div class="card">
                <h2>Workflows</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="list_workflows">
                    <div class="row">
                        <input type="number" name="limit" placeholder="Limit" value="10">
                    </div>
                    <button type="submit">List</button>
                </form>
                <form method="post" class="form" style="margin-top:10px;">
                    <input type="hidden" name="action" value="get_workflow">
                    <div class="row"><input type="text" name="workflow_id" placeholder="Workflow ID"></div>
                    <button type="submit">Get Details</button>
                </form>
                <form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
                    <input type="hidden" name="action" value="activate_workflow">
                    <input type="text" name="workflow_id" placeholder="Workflow ID" style="flex:1;">
                    <button type="submit">Activate</button>
                </form>
                <form method="post" class="form" style="margin-top:6px; display:flex; gap:8px;">
                    <input type="hidden" name="action" value="deactivate_workflow">
                    <input type="text" name="workflow_id" placeholder="Workflow ID" style="flex:1;">
                    <button type="submit">Deactivate</button>
                </form>
            </div>

            <div class="card">
                <h2>Webhook Trigger</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="trigger_webhook">
                    <div class="row"><input type="text" name="webhook_path" placeholder="Path (e.g., webhook/test)" required></div>
                    <div class="row">
                        <select name="webhook_method">
                            <option value="POST">POST</option>
                            <option value="GET">GET</option>
                        </select>
                    </div>
                    <div class="row"><textarea name="webhook_payload" placeholder='JSON payload'>{"hello":"world"}</textarea></div>
                    <button type="submit">Trigger</button>
                    <div class="config">Base: <?php echo h($cfg['webhook_base_url']); ?></div>
                </form>
            </div>
        </div>

        <div class="grid" style="margin-bottom:16px;">
            <div class="card">
                <h2>Execution Status</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="execution_status">
                    <div class="row"><input type="text" name="execution_id" placeholder="Execution ID" required></div>
                    <div class="row"><label><input type="checkbox" name="include_data" value="1"> Include Data</label></div>
                    <button type="submit">Fetch</button>
                </form>
            </div>

            <div class="card" id="api">
                <h2>Generic API Request</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="api_request">
                    <div class="two-col">
                        <div class="row">
                            <select name="method">
                                <option>GET</option>
                                <option>POST</option>
                                <option>PUT</option>
                                <option>PATCH</option>
                                <option>DELETE</option>
                            </select>
                        </div>
                        <div class="row"><input type="text" name="path" placeholder="/workflows"></div>
                    </div>
                    <div class="row"><textarea name="query" placeholder='Query (JSON), e.g. {"limit":25}'></textarea></div>
                    <div class="row"><textarea name="payload" placeholder='Payload (JSON)'></textarea></div>
                    <button type="submit">Send</button>
                    <div class="config">Base: <?php echo h($cfg['api_base_url']); ?></div>
                </form>
            </div>
        </div>

        <div class="grid">
            <div class="card">
                <h2>Projects</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="create_project">
                    <div class="row"><input type="text" name="project_name" placeholder="Name" required></div>
                    <button type="submit">Create</button>
                </form>
                <form method="post" class="form" style="margin-top:10px;">
                    <input type="hidden" name="action" value="list_projects">
                    <div class="row"><input type="number" name="limit" placeholder="Limit" value="25"></div>
                    <button type="submit">List</button>
                </form>
                <form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
                    <input type="hidden" name="action" value="delete_project">
                    <input type="text" name="project_id" placeholder="Project ID" style="flex:1;">
                    <button type="submit">Delete</button>
                </form>
            </div>

            <div class="card">
                <h2>Tags</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="create_tag">
                    <div class="row"><input type="text" name="tag_name" placeholder="Name" required></div>
                    <button type="submit">Create</button>
                </form>
                <form method="post" class="form" style="margin-top:10px;">
                    <input type="hidden" name="action" value="list_tags">
                    <div class="two-col">
                        <div class="row"><input type="number" name="limit" placeholder="Limit" value="25"></div>
                        <div class="row"><input type="text" name="cursor" placeholder="Cursor"></div>
                    </div>
                    <button type="submit">List</button>
                </form>
                <form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
                    <input type="hidden" name="action" value="delete_tag">
                    <input type="text" name="tag_id" placeholder="Tag ID" style="flex:1;">
                    <button type="submit">Delete</button>
                </form>
            </div>
        </div>

        <div class="grid" style="margin-top:16px;">
            <div class="card">
                <h2>Variables</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="create_variable">
                    <div class="two-col">
                        <div class="row"><input type="text" name="var_key" placeholder="Key" required></div>
                        <div class="row"><input type="text" name="var_value" placeholder="Value" required></div>
                    </div>
                    <button type="submit">Create</button>
                </form>
                <form method="post" class="form" style="margin-top:10px;">
                    <input type="hidden" name="action" value="list_variables">
                    <div class="row"><input type="number" name="limit" placeholder="Limit" value="25"></div>
                    <button type="submit">List</button>
                </form>
                <form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
                    <input type="hidden" name="action" value="delete_variable">
                    <input type="text" name="var_id" placeholder="Variable ID" style="flex:1;">
                    <button type="submit">Delete</button>
                </form>
            </div>

            <div class="card">
                <h2>Users</h2>
                <form method="post" class="form">
                    <input type="hidden" name="action" value="list_users">
                    <div class="row"><textarea name="filters" placeholder='Optional filters JSON, e.g. {"limit":20}'></textarea></div>
                    <button type="submit">List</button>
                </form>
                <form method="post" class="form" style="margin-top:10px;">
                    <input type="hidden" name="action" value="create_users">
                    <div class="row"><textarea name="users_payload" placeholder='Array of users JSON, e.g. [{"email":"a@example.com","firstName":"A"}]'></textarea></div>
                    <button type="submit">Create</button>
                </form>
                <form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
                    <input type="hidden" name="action" value="delete_user">
                    <input type="text" name="user_id" placeholder="User ID" style="flex:1;">
                    <button type="submit">Delete</button>
                </form>
            </div>
        </div>

        <div class="card" style="margin-top:16px;">
            <h2>Result</h2>
            <?php if ($result): ?>
                <pre><?php echo h(json_encode($result, JSON_PRETTY_PRINT)); ?></pre>
            <?php else: ?>
                <p>No action executed yet. Submit any form above to see the result.</p>
            <?php endif; ?>
        </div>

        <footer>
            <div>API: <?php echo h($cfg['api_base_url']); ?> | Webhook: <?php echo h($cfg['webhook_base_url']); ?></div>
        </footer>
    </div>
</div>
</body>
</html>