commit 6a13bf8c1d9eb779a97e9d1a045dde7e114877ac
parent ec076979bed63f8973dd3495b0822e28a0b55d19
Author: minerva-jupiter <ryouturn@gmail.com>
Date: Mon, 15 Dec 2025 17:12:24 +0900
delete credentials
Diffstat:
| M | index.html | | | 488 | +++++++++++++++++++++++++++++++++++++++---------------------------------------- |
1 file changed, 243 insertions(+), 245 deletions(-)
diff --git a/index.html b/index.html
@@ -1,245 +1,243 @@
-<!doctype html>
-<html lang="en">
- <head>
- <meta charset="UTF-8" />
- <title>Synapse Admin API Tester</title>
- </head>
- <body class="container">
- <h1>Synapse Admin API</h1>
-
- <form id="apiForm">
- <article>
- <label for="accessToken">Admin Access Token:</label>
- <input id="accessToken" type="password" required />
- </article>
- <article>
- <label for="synapseDomain">Synapse Domain:</label>
- <select id="synapseDomain" required>
- <option value="https://docker-synapse.minervajuppiter.net">
- https://docker-synapse.minervajuppiter.net/
- </option>
- </select>
- </article>
- <article>
- <label for="apiTemplate">API Template:</label>
- <select id="apiTemplate" onchange="updateApiTemplate()">
- <option value="" selected disabled>
- Select an API Template
- </option>
- <option value="listTokens">List Registration Tokens</option>
- <option value="getToken">Get Registration Token</option>
- <option value="createToken">
- Create Registration Token
- </option>
- <option value="deleteToken">
- Delete Registration Token
- </option>
- </select>
- </article>
- <article>
- <label for="method">Method:</label>
- <select id="method">
- <option value="GET">GET</option>
- <option value="POST">POST</option>
- <option value="PUT">PUT</option>
- <option value="DELETE">DELETE</option>
- </select>
- </article>
- <article>
- <label for="endpoint">Endpoint:</label>
- <input
- id="endpoint"
- type="text"
- value="/_synapse/admin/v2/users"
- required
- placeholder="/_synapse/admin/v2/users/..."
- style="width: 80%"
- />
- </article>
- <article id="payloadContainer" style="display: none">
- <label for="payload">JSON Payload:</label>
- <textarea
- id="payload"
- rows="10"
- placeholder='{"displayname": "New User Name"}'
- ></textarea>
- </article>
- <article>
- <button type="submit">Execute API Call</button>
- </article>
- </form>
-
- <hr />
-
- <div id="response-container">
- <h2>API Response</h2>
- <p>Status: <span id="response-status">---</span></p>
- <p id="error-message" style="color: red; font-weight: bold"></p>
- <h3>Body:</h3>
- <pre id="response-body">Waiting for response...</pre>
- </div>
-
- <script>
- document.addEventListener("DOMContentLoaded", () => {
- const form = document.getElementById("apiForm");
- const methodSelect = document.getElementById("method");
- const payloadContainer =
- document.getElementById("payloadContainer");
- const responseStatus =
- document.getElementById("response-status");
- const responseBody = document.getElementById("response-body");
- const errorMessage = document.getElementById("error-message");
-
- const updatePayloadVisibility = () => {
- const method = methodSelect.value;
- if (method === "POST" || method === "PUT") {
- payloadContainer.style.display = "block";
- } else {
- payloadContainer.style.display = "none";
- }
- };
- methodSelect.addEventListener(
- "change",
- updatePayloadVisibility,
- );
- updatePayloadVisibility();
-
- window.updateApiTemplate = () => {
- const apiTemplate =
- document.getElementById("apiTemplate").value;
- const methodField = document.getElementById("method");
- const endpointField = document.getElementById("endpoint");
- const payloadField = document.getElementById("payload");
- const payloadContainer =
- document.getElementById("payloadContainer");
-
- switch (apiTemplate) {
- case "listTokens":
- methodField.value = "GET";
- endpointField.value =
- "/_synapse/admin/v1/registration_tokens";
- payloadField.value = "";
- payloadContainer.style.display = "none";
- break;
- case "getToken":
- methodField.value = "GET";
- endpointField.value =
- "/_synapse/admin/v1/registration_tokens/{token}";
- payloadField.value = "";
- payloadContainer.style.display = "none";
- break;
- case "createToken":
- methodField.value = "POST";
- endpointField.value =
- "/_synapse/admin/v1/registration_tokens/new";
- payloadField.value = JSON.stringify(
- {
- uses_allowed: 1,
- expiry_time: Date.now() + 86400000,
- },
- null,
- 2,
- );
- payloadContainer.style.display = "block";
- break;
- case "deleteToken":
- methodField.value = "DELETE";
- endpointField.value =
- "/_synapse/admin/v1/registration_tokens/{token}";
- payloadField.value = "";
- payloadContainer.style.display = "none";
- break;
- default:
- methodField.value = "GET";
- endpointField.value = "";
- payloadField.value = "";
- payloadContainer.style.display = "none";
- }
- };
-
- form.addEventListener("submit", async (event) => {
- event.preventDefault();
-
- responseStatus.textContent = "Executing...";
- responseBody.textContent = "Processing...";
- errorMessage.textContent = "";
-
- const accessToken =
- document.getElementById("accessToken").value;
- const synapseDomain = document
- .getElementById("synapseDomain")
- .value.replace(/\/+$/, "");
- const method = methodSelect.value;
- const endpoint = document
- .getElementById("endpoint")
- .value.trim();
- let payload = document.getElementById("payload").value;
-
- const fullUrl = `${synapseDomain}${endpoint.startsWith("/") ? "" : "/"}${endpoint}`;
-
- const headers = {
- Authorization: `Bearer ${accessToken}`,
- "Content-Type": "application/json",
- };
-
- const config = {
- method: method,
- headers: headers,
- credentials: "include",
- };
-
- // Process payload for POST/PUT methods
- if (method === "POST" || method === "PUT") {
- if (payload) {
- try {
- config.body = JSON.stringify(
- JSON.parse(payload),
- );
- } catch (e) {
- errorMessage.textContent =
- "Error: Invalid JSON payload";
- responseStatus.textContent = "Failed";
- responseBody.textContent =
- "Invalid JSON payload format.";
- return;
- }
- }
- }
-
- try {
- const apiResponse = await fetch(fullUrl, config);
-
- let responseText = await apiResponse.text();
- let responseJson;
-
- try {
- responseJson = JSON.parse(responseText);
-
- responseBody.textContent = JSON.stringify(
- responseJson,
- null,
- 2,
- );
- } catch (e) {
- responseBody.textContent =
- responseText || "(No response body)";
- }
-
- responseStatus.textContent = `${apiResponse.status} ${apiResponse.statusText}`;
- if (!apiResponse.ok) {
- responseStatus.style.color = "red";
- } else {
- responseStatus.style.color = "green";
- }
- } catch (e) {
- errorMessage.textContent = `Fetch Error: ${e.message}`;
- responseStatus.textContent = "Network Error";
- responseStatus.style.color = "red";
- responseBody.textContent =
- "A network error occurred during the API call.";
- }
- });
- });
- </script>
- </body>
-</html>
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <title>Synapse Admin API Tester</title>
+ </head>
+ <body class="container">
+ <h1>Synapse Admin API</h1>
+
+ <form id="apiForm">
+ <article>
+ <label for="accessToken">Admin Access Token:</label>
+ <input id="accessToken" type="password" required />
+ </article>
+ <article>
+ <label for="synapseDomain">Synapse Domain:</label>
+ <select id="synapseDomain" required>
+ <option value="https://docker-synapse.minervajuppiter.net">
+ https://docker-synapse.minervajuppiter.net/
+ </option>
+ </select>
+ </article>
+ <article>
+ <label for="apiTemplate">API Template:</label>
+ <select id="apiTemplate" onchange="updateApiTemplate()">
+ <option value="" selected disabled>
+ Select an API Template
+ </option>
+ <option value="listTokens">List Registration Tokens</option>
+ <option value="getToken">Get Registration Token</option>
+ <option value="createToken">
+ Create Registration Token
+ </option>
+ <option value="deleteToken">
+ Delete Registration Token
+ </option>
+ </select>
+ </article>
+ <article>
+ <label for="method">Method:</label>
+ <select id="method">
+ <option value="GET">GET</option>
+ <option value="POST">POST</option>
+ <option value="PUT">PUT</option>
+ <option value="DELETE">DELETE</option>
+ </select>
+ </article>
+ <article>
+ <label for="endpoint">Endpoint:</label>
+ <input
+ id="endpoint"
+ type="text"
+ value="/_synapse/admin/v2/users"
+ required
+ placeholder="/_synapse/admin/v2/users/..."
+ style="width: 80%"
+ />
+ </article>
+ <article id="payloadContainer" style="display: none">
+ <label for="payload">JSON Payload:</label>
+ <textarea
+ id="payload"
+ rows="10"
+ placeholder='{"displayname": "New User Name"}'
+ ></textarea>
+ </article>
+ <article>
+ <button type="submit">Execute API Call</button>
+ </article>
+ </form>
+
+ <hr />
+
+ <div id="response-container">
+ <h2>API Response</h2>
+ <p>Status: <span id="response-status">---</span></p>
+ <p id="error-message" style="color: red; font-weight: bold"></p>
+ <h3>Body:</h3>
+ <pre id="response-body">Waiting for response...</pre>
+ </div>
+
+ <script>
+ document.addEventListener("DOMContentLoaded", () => {
+ const form = document.getElementById("apiForm");
+ const methodSelect = document.getElementById("method");
+ const payloadContainer =
+ document.getElementById("payloadContainer");
+ const responseStatus =
+ document.getElementById("response-status");
+ const responseBody = document.getElementById("response-body");
+ const errorMessage = document.getElementById("error-message");
+
+ const updatePayloadVisibility = () => {
+ const method = methodSelect.value;
+ if (method === "POST" || method === "PUT") {
+ payloadContainer.style.display = "block";
+ } else {
+ payloadContainer.style.display = "none";
+ }
+ };
+ methodSelect.addEventListener(
+ "change",
+ updatePayloadVisibility,
+ );
+ updatePayloadVisibility();
+
+ window.updateApiTemplate = () => {
+ const apiTemplate =
+ document.getElementById("apiTemplate").value;
+ const methodField = document.getElementById("method");
+ const endpointField = document.getElementById("endpoint");
+ const payloadField = document.getElementById("payload");
+ const payloadContainer =
+ document.getElementById("payloadContainer");
+
+ switch (apiTemplate) {
+ case "listTokens":
+ methodField.value = "GET";
+ endpointField.value =
+ "/_synapse/admin/v1/registration_tokens";
+ payloadField.value = "";
+ payloadContainer.style.display = "none";
+ break;
+ case "getToken":
+ methodField.value = "GET";
+ endpointField.value =
+ "/_synapse/admin/v1/registration_tokens/{token}";
+ payloadField.value = "";
+ payloadContainer.style.display = "none";
+ break;
+ case "createToken":
+ methodField.value = "POST";
+ endpointField.value =
+ "/_synapse/admin/v1/registration_tokens/new";
+ payloadField.value = JSON.stringify(
+ {
+ uses_allowed: 1,
+ expiry_time: Date.now() + 86400000,
+ },
+ null,
+ 2,
+ );
+ payloadContainer.style.display = "block";
+ break;
+ case "deleteToken":
+ methodField.value = "DELETE";
+ endpointField.value =
+ "/_synapse/admin/v1/registration_tokens/{token}";
+ payloadField.value = "";
+ payloadContainer.style.display = "none";
+ break;
+ default:
+ methodField.value = "GET";
+ endpointField.value = "";
+ payloadField.value = "";
+ payloadContainer.style.display = "none";
+ }
+ };
+
+ form.addEventListener("submit", async (event) => {
+ event.preventDefault();
+
+ responseStatus.textContent = "Executing...";
+ responseBody.textContent = "Processing...";
+ errorMessage.textContent = "";
+
+ const accessToken =
+ document.getElementById("accessToken").value;
+ const synapseDomain = document
+ .getElementById("synapseDomain")
+ .value.replace(/\/+$/, "");
+ const method = methodSelect.value;
+ const endpoint = document
+ .getElementById("endpoint")
+ .value.trim();
+ let payload = document.getElementById("payload").value;
+
+ const fullUrl = `${synapseDomain}${endpoint.startsWith("/") ? "" : "/"}${endpoint}`;
+
+ const headers = {
+ Authorization: `Bearer ${accessToken}`,
+ "Content-Type": "application/json",
+ };
+
+ const config = {
+ method: method,
+ headers: headers,
+ };
+
+ if (method === "POST" || method === "PUT") {
+ if (payload) {
+ try {
+ config.body = JSON.stringify(
+ JSON.parse(payload),
+ );
+ } catch (e) {
+ errorMessage.textContent =
+ "Error: Invalid JSON payload";
+ responseStatus.textContent = "Failed";
+ responseBody.textContent =
+ "Invalid JSON payload format.";
+ return;
+ }
+ }
+ }
+
+ try {
+ const apiResponse = await fetch(fullUrl, config);
+
+ let responseText = await apiResponse.text();
+ let responseJson;
+
+ try {
+ responseJson = JSON.parse(responseText);
+
+ responseBody.textContent = JSON.stringify(
+ responseJson,
+ null,
+ 2,
+ );
+ } catch (e) {
+ responseBody.textContent =
+ responseText || "(No response body)";
+ }
+
+ responseStatus.textContent = `${apiResponse.status} ${apiResponse.statusText}`;
+ if (!apiResponse.ok) {
+ responseStatus.style.color = "red";
+ } else {
+ responseStatus.style.color = "green";
+ }
+ } catch (e) {
+ errorMessage.textContent = `Fetch Error: ${e.message}`;
+ responseStatus.textContent = "Network Error";
+ responseStatus.style.color = "red";
+ responseBody.textContent =
+ "A network error occurred during the API call.";
+ }
+ });
+ });
+ </script>
+ </body>
+</html>