Initial commit: DSH Web Manager
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package api
|
||||
|
||||
import "net/http"
|
||||
|
||||
func runtimeSessionScript(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodGet {
|
||||
fail(w, 405, "method not allowed")
|
||||
return
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
|
||||
w.Header().Set("Cache-Control", "no-store")
|
||||
w.Write([]byte(runtimeSessionJS))
|
||||
}
|
||||
|
||||
const runtimeSessionJS = `(function () {
|
||||
const prefix = location.pathname.match(/^\/dsh\/[^/]+(?=\/|$)/);
|
||||
if (prefix) {
|
||||
const originalFetch = window.fetch;
|
||||
const bridge = /^\/api\/dsh-free-search-settings\/(describe|mutate|credentials-status|credentials-set|credentials-unset|check-update|update|raw-search)$/;
|
||||
window.fetch = async function (input, init) {
|
||||
let url;
|
||||
try { url = new URL(input instanceof Request ? input.url : input, document.baseURI); } catch (_) {}
|
||||
if (url && url.origin === location.origin && bridge.test(url.pathname)) {
|
||||
url.pathname = prefix[0] + url.pathname;
|
||||
if (input instanceof Request) {
|
||||
const request = new Request(input, init);
|
||||
return originalFetch.call(this, new Request(url, request));
|
||||
}
|
||||
input = url;
|
||||
}
|
||||
return originalFetch.call(this, input, init);
|
||||
};
|
||||
}
|
||||
let pending;
|
||||
async function renew() {
|
||||
if (pending) return pending;
|
||||
pending = (async function () {
|
||||
const csrf = document.cookie.split("; ").find(c => c.startsWith("dsh_csrf="));
|
||||
if (!csrf) return;
|
||||
const response = await fetch("/api/refresh", {method:"POST", credentials:"same-origin", headers:{"X-CSRF-Token":csrf.slice(9)}});
|
||||
if (response.status === 401 || response.status === 403) {
|
||||
const check = await fetch("/api/me", {credentials:"same-origin"});
|
||||
if (check.status === 401) location.reload();
|
||||
}
|
||||
})().catch(function () {}).finally(function () { pending = undefined; });
|
||||
return pending;
|
||||
}
|
||||
setInterval(renew, 240000);
|
||||
window.addEventListener("pageshow", renew);
|
||||
window.addEventListener("online", renew);
|
||||
document.addEventListener("visibilitychange", function () { if (!document.hidden) renew(); });
|
||||
})();`
|
||||
Reference in New Issue
Block a user