%PDF- %PDF-
Direktori : /www/varak.net/dmarc.varak.net/public/js/ |
Current File : //www/varak.net/dmarc.varak.net/public/js/main.js |
/** * dmarc-srg - A php parser, viewer and summary report generator for incoming DMARC reports. * Copyright (C) 2020-2025 Aleksey Andreev (liuch) * * Available at: * https://github.com/liuch/dmarc-srg * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 3 of the License. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ class Router { } Router.start = function() { Router._initial_header = document.querySelector("h1").textContent; document.getElementsByTagName("body")[0].addEventListener("keydown", function(event) { if (event.defaultPrevented) return; if (event.code == "Escape" && !event.shiftKey && !event.ctrlKey && !event.altKey) { let cbs = document.querySelectorAll(".close-btn.active"); for (let i = cbs.length - 1; i >= 0; --i) { if (window.getComputedStyle(cbs[i]).display !== "none") { cbs[i].click(); event.preventDefault(); break; } } document.querySelectorAll("div.popup-menu:not(.hidden)").forEach(function(m) { m.classList.add("hidden"); }); } }); window.addEventListener("click", function(event) { if (!event.target.closest("div.popup-menu")) { document.querySelectorAll("div.popup-menu:not(.hidden)").forEach(function(m) { m.classList.add("hidden"); }); } }); document.getElementById("main-menu-block").addEventListener("click", function(event) { let el = event.target; if (el.tagName === "A") { let href = el.getAttribute("href"); if (href !== "" && href !== "#") { event.preventDefault(); window.history.pushState(null, "", href); Router.go(); MenuBar.instance().updateCurrent(); } } }); window.addEventListener("popstate", function(event) { let m = Router._url2module(); if (m) { let p = m.pointer; if (p && p.onpopstate) { if (p.title) { Router.update_title(p.title()); } p.onpopstate(event.state); } else { Router.go(); MenuBar.instance().updateCurrent(); } } }); document.querySelector(".menu-box .about a").addEventListener("click", function(event) { event.preventDefault(); setTimeout(function() { let dlg = new AboutDialog({ authors: [ { name: "Aleksey Andreev", url: "https://github.com/liuch", years: "2020-2025" } ], documentation: [ { ancor: "README on GitHub", url: "https://github.com/liuch/dmarc-srg/blob/master/README.md" } ], source_code: [ { ancor: "DmarcSrg on GitHub", url: "https://github.com/liuch/dmarc-srg" } ] }); document.getElementById("main-block").appendChild(dlg.element()); dlg.show().finally(function() { dlg.element().remove(); }); }, 0); }); const menu = MenuBar.instance().init(); Router.go(); menu.updateCurrent(); }; Router.go = function(url) { Status.instance().update({ page: this._page_name(url), settings: [ "ui.datetime.offset", "ui.ipv4.url", "ui.ipv6.url", "report-view.filter.initial-value" ] }).then(function(d) { if (d) { Router._update_menu(d.authenticated); Router._update_user(); if (d.settings) { if (d.settings["ui.datetime.offset"]) { Common.tuneDateTimeOutput(d.settings["ui.datetime.offset"]); } Common.ipv4_url = d.settings["ui.ipv4.url"] || ''; Common.ipv6_url = d.settings["ui.ipv6.url"] || ''; Common.rv_filter = d.settings["report-view.filter.initial-value"] || null; } if (d.error_code !== -2) { try { Common.checkResult(d); } catch (err) { Common.displayError(err); } let module = Router._url2module(url); if (module) { if (!module.pointer) module.start(module); let p = module.pointer; if (p.oncleardata) p.oncleardata(); else Router._clear_data(); if (p.title) Router.update_title(p.title()); if (p.display) p.display(); if (p.update) p.update(); } } if (d.state && d.state !== "Ok" && !d.error_code && d.message) { Notification.add({ type: "warn", text: d.message, delay: 20000, name: "st-err" }); } if (d.version !== Router._app_ver) { Router._app_ver = d.version; Router.update_title(); } if (d.php_version) { Router.php_version = d.php_version; } } }); }; Router.app_name = function(version) { let name = "DmarcSrg"; if (version && Router._app_ver) { name += " " + Router._app_ver; } return name; } Router.update_title = function(str) { let title1 = Router.app_name(false); let title2 = str || Router._title || null; if (str) { Router._title = str; } document.title = title1 + (title2 && (": " + title2) || ""); let h1 = document.querySelector("h1"); if (str === "") { h1.textContent = Router._initial_header || ""; } else if (str) { h1.textContent = title2 || ""; } }; Router._update_menu = function(authenticated) { let aa = document.getElementById("auth-action"); if (aa) aa.remove(); if (User && User.auth_type !== "base") { MenuBar.instance().element(".users").classList.add("hidden"); } if (authenticated === "yes") { aa = MenuBar.instance().insertItem("Log out", "#", -1); aa.id = "auth-action"; aa.addEventListener("click", event => { event.preventDefault(); if (!aa.classList.contains("disabled")) { aa.classList.add("disabled"); window.fetch("logout.php", { method: "POST", cache: "no-store", headers: Object.assign(HTTP_HEADERS, HTTP_HEADERS_POST), credentials: "same-origin", body: JSON.stringify({}) }).then(resp => { if (!resp.ok) throw new Error("Failed to log out"); return resp.json(); }).then(data => { Common.checkResult(data); User.name = null; User.level = null; Status.instance().reset(); Router._clear_data(); Router._update_menu("no"); Router._update_user(); Router.update_title(""); }).catch(err => { Common.displayError(err); aa.classList.remove("disabled"); Notification.add({ type: "error", text: err.message, name: "auth" }); }); } }); } else if (authenticated === "no") { aa = MenuBar.instance().insertItem("Log in", "#", -1); aa.id = "auth-action"; aa.addEventListener("click", event => { event.preventDefault(); LoginDialog.start(); }); } }; Router._update_user = function() { const levels = new Map([ [ "admin", false ], [ "manager", false ] ]); switch (User.level) { case null: case "admin": levels.set("admin", true); //no break; case "manager": levels.set("manager", true); break; } levels.forEach(function(value, key) { document.body.classList[value ? "add" : "remove"]("level-" + key); }); } Router._clear_data = function() { document.getElementById("main-block").replaceChildren(); document.getElementById("detail-block").replaceChildren(); }; Router._modules = { list: { start: function(m) { m.pointer = new ReportList(); } }, report: { start: function(m) { m.pointer = ReportWidget.instance(); } }, admin: { start: function(m) { m.pointer = new Admin(); } }, files: { start: function(m) { m.pointer = new Files(); } }, users: { start: function(m) { m.pointer = new UserList(); } }, domains: { start: function(m) { m.pointer = new DomainList(); } }, logs: { start: function(m) { m.pointer = new Logs(); } }, summary: { start: function(m) { m.pointer = new Summary(); } }, settings: { start: function(m) { m.pointer = new Settings(); } } }; Router._page_name = function(url) { const r = /([^\/]*)$/.exec(url || document.location.pathname); return r && this._routes[r[1]] || null; } Router._url2module = function(url) { const pname = this._page_name(url); return pname && this._modules[pname] || null; }; Router._routes = { "": "list", "list.php": "list", "logs.php": "logs", "admin.php": "admin", "users.php": "users", "files.php": "files", "report.php": "report", "domains.php": "domains", "summary.php": "summary", "settings.php": "settings" }; window.onload = Router.start;