true, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $headers, CURLOPT_TIMEOUT => 60, ]); if ($data) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); dbg("API RESP: HTTP=$code BODY=$resp"); curl_close($ch); return [$code, $resp]; } // ============================== // 🧼 USERNAME CLEANER FIX // ============================== function full_user(string $name, string $server): string { dbg("RAW POST USER=[".$name."] HEX=[".bin2hex($name)."]"); $clean = trim($name); $clean = preg_replace('/[\x{00A0}\x{200B}\x{200C}\x{200D}\x{FEFF}]/u', '', $clean); dbg("CLEAN USER=[".$clean."] HEX=[".bin2hex($clean)."]"); if (preg_match('/^@[a-z0-9=_\-\.\/\+]+:[a-z0-9\.\-]+$/i', $clean)) return $clean; if ($clean === '') return ''; if ($clean[0] !== '@') $clean = '@' . $clean; if (!str_contains($clean, ':')) $clean .= ':' . $server; dbg("FINAL USER=[".$clean."] HEX=[".bin2hex($clean)."]"); return $clean; } // ============================== // 🚦 PROCESSAMENTO DE AÇÕES // ============================== $action = $_POST['action'] ?? null; $msg = ''; if ($action && $ADMIN_TOKEN) { dbg("=== ACTION: $action ==="); dbg("POST DATA: " . json_encode($_POST)); // criar utilizador if ($action === 'add_user') { $user = full_user($_POST['user'], $SERVER_NAME); $pass = trim($_POST['pass']); [$code, $resp] = call_api("PUT", "$MATRIX_BASE/_synapse/admin/v2/users/" . urlencode($user), [ "password" => $pass, "deactivated" => false, "admin" => false ], $ADMIN_TOKEN); $msg = ($code == 200 || $code == 201) ? "✅ Criado: $user" : "❌ Erro [$code]: $resp"; } // alterar password if ($action === 'change_pass') { $user = full_user($_POST['user'], $SERVER_NAME); $pass = trim($_POST['pass']); [$code, $resp] = call_api("POST", "$MATRIX_BASE/_synapse/admin/v1/reset_password/" . urlencode($user), [ "new_password" => $pass ], $ADMIN_TOKEN); $msg = ($code == 200) ? "🔑 Senha alterada para $user" : "❌ Erro [$code]: $resp"; } // admin / unadmin if ($action === 'make_admin' || $action === 'revoke_admin') { $user = full_user($_POST['user'], $SERVER_NAME); $is_admin = $action === 'make_admin'; [$code, $resp] = call_api("PUT", "$MATRIX_BASE/_synapse/admin/v2/users/" . urlencode($user), [ "admin" => $is_admin ], $ADMIN_TOKEN); $msg = ($code == 200) ? ($is_admin ? "⬆️ $user agora é admin" : "⬇️ $user deixou de ser admin") : "❌ Erro [$code]: $resp"; } // ativar / desativar if ($action === 'deactivate_user' || $action === 'reactivate_user') { $user = full_user($_POST['user'], $SERVER_NAME); $active = $action === 'reactivate_user'; [$code, $resp] = call_api("PUT", "$MATRIX_BASE/_synapse/admin/v2/users/" . urlencode($user), [ "deactivated" => !$active ], $ADMIN_TOKEN); $msg = ($code == 200) ? ($active ? "♻️ $user reativado" : "🚫 $user desativado") : "❌ Erro [$code]: $resp"; } // apagar user if ($action === 'delete_user') { $user = full_user($_POST['user'], $SERVER_NAME); [$code, $resp] = call_api("POST", "$MATRIX_BASE/_synapse/admin/v1/deactivate/" . urlencode($user), [ "erase" => true ], $ADMIN_TOKEN); $msg = ($code == 200 || $code == 204) ? "🗑️ $user removido permanentemente" : "❌ Erro [$code]: $resp"; } // ✅ NOVA: apagar mensagens do user (mantendo o user) if ($action === 'erase_messages') { $user = full_user($_POST['user'], $SERVER_NAME); [$code, $resp] = call_api("POST", "$MATRIX_BASE/_synapse/admin/v1/user/$user/rooms", null, $ADMIN_TOKEN); $rooms = json_decode($resp, true)['rooms'] ?? []; $errors = []; foreach ($rooms as $room) { [$c, $r] = call_api("POST", "$MATRIX_BASE/_synapse/admin/v1/purge_history/" . urlencode($room['room_id']), [ "delete_local_events" => true, "reason" => "Apagadas via painel" ], $ADMIN_TOKEN); if ($c != 200) $errors[] = "$room[room_id]: $r"; } $msg = empty($errors) ? "🧹 Mensagens de $user apagadas" : "❌ Erros: " . implode("; ", $errors); } // ✅ NOVA: limpar metadados gerais if ($action === 'clear_metadata') { @unlink($DEBUG_LOG); // aqui podes adicionar mais caminhos de logs/metadados $msg = "⚡ Metadados limpos!"; } } // ============================== // 📋 LISTAGEM USERS // ============================== $users = []; if ($ADMIN_TOKEN) { $next = null; do { $url = "$MATRIX_BASE/_synapse/admin/v2/users?limit=100"; if ($next) $url .= "&from=" . urlencode($next); [$code, $resp] = call_api("GET", $url, null, $ADMIN_TOKEN); if ($code != 200) { dbg("ERRO AO LER USERS: HTTP=$code BODY=$resp"); break; } $data = json_decode($resp, true); $chunk = $data['users'] ?? $data['results'] ?? []; $users = array_merge($users, $chunk); $next = $data['next_token'] ?? null; } while ($next); } ?> Matrix Admin - Xupas

💻 Matrix Admin - Xupas

➕ Criar Utilizador

👥 Utilizadores

User Admin Ativo Último Login Ações

⚡ Limpar metadados gerais