<!DOCTYPE html> <html> <head> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/> <meta charset="UTF-8"> <meta name="theme-color" content="#4b75ff"> <link rel="icon" type="image/png" href="./favicon.png" /> <title>Control Panel | Zoraxy</title> <link rel="stylesheet" href="script/semantic/semantic.min.css"> <script src="script/jquery-3.6.0.min.js"></script> <script src="../script/ao_module.js"></script> <script src="script/semantic/semantic.min.js"></script> <script src="script/tablesort.js"></script> <style> body{ background-color:white; } .functiontab{ display:none; } .menubar{ width: 100%; padding: 0.4em; padding-left: 1.2em; padding-right: 1.2em; background-color: #f5f5f5; margin-bottom: 1em; } .menubar .logo{ height: 36px; } .menubar .item{ display: inline-block; vertical-align: middle; } .wrapper{ display: flex; flex-wrap: wrap; } .toolbar{ width: 240px; } .contentWindow{ padding: 1em; flex: 1; } </style> </head> <body> <div class="menubar"> <div class="item"> <img class="logo" src="img/logo.svg"> </div> <div class="ui right floated buttons" style="padding-top: 2px;"> <button class="ui basic icon button" onclick="logout();"><i class="sign-out icon"></i></button> </div> </div> <div id="errmsg" class="ui red message" style="display: none;"></div> <div class="wrapper"> <div class="toolbar"> <div id="mainmenu" class="ui secondary vertical pointing menu"> <a class="item active" tag="status"> <i class="info circle icon"></i>Status </a> <a class="item" tag="vdir"> <i class="folder icon"></i> Virtual Directory </a> <a class="item" tag="subd"> <i class="sitemap icon"></i> Subdomain Proxy </a> <a class="item" tag="rules"> <i class="plus square icon"></i> Create Proxy Rules </a> <a class="item" tag="setroot"> <i class="home icon"></i> Set Proxy Root </a> <div class="ui divider"></div> <a class="item" tag="cert"> <i class="lock icon"></i> TLS / SSL certificate </a> <a class="item" tag="redirectset"> <i class="level up alternate icon"></i> Redirection </a> </div> </div> <div class="contentWindow"> <!-- Status Tab --> <div id="status" class="functiontab" target="status.html" style="display: block ;"> <br><br><div class="ui active centered inline loader"></div> </div> <!-- Virtual Directory Tab --> <div id="vdir" class="functiontab" target="vdir.html"></div> <!-- Subdomain Proxy --> <div id="subd" class="functiontab" target="subd.html"></div> <!-- Create Rules --> <div id="rules" class="functiontab" target="rules.html"></div> <!-- Set proxy root --> <div id="setroot" class="functiontab" target="rproot.html"></div> <!-- Set TLS cert --> <div id="cert" class="functiontab" target="cert.html"></div> <!-- Redirections --> <div id="redirectset" class="functiontab" target="redirection.html"></div> </div> </div> </div> <br><br> <div class="ui divider"></div> <div class="ui container" style="color: grey; font-size: 90%"> <p>CopyRight Zoraxy project and its author, 2022 - <span class="year"></span></p> </div> <br><br> <script> $(".year").text(new Date().getFullYear()); /* Loader function Load all the components view from the components/ directory into their corrisponding divs */ let loadingComponents = 0; function initTabs(callback=undefined){ $('.functiontab').each(function(){ let loadTarget = $(this).attr("target"); if (loadTarget != undefined){ $(this).load("./components/" + loadTarget, function(){ loadingComponents--; }); loadingComponents++; }else{ $(this).html(`<p>Unable to load components for this tab</p>`); } }) if (callback != undefined){ waitInit(callback); } } function waitInit(callback = undefined, retryCount = 0){ if (loadingComponents > 0 && retryCount < 5){ setTimeout(function(){ waitInit(callback, retryCount++); }, 300); }else if (loadingComponents == 0){ callback(); }else{ alert("Missing component. Please check if your installation is complete.") } } initTabs(function(){ initRPStaste(); if (window.location.hash.length > 1){ let tabID = window.location.hash.substr(1); openTabById(tabID); }else{ openTabById("status"); } $(".ui.dropdown").dropdown(); $(".ui.checkbox").checkbox(); //Click on the current tab $("#mainmenu").find(".item").each(function(){ $(this).on("click", function(event){ let tabid = $(this).attr("tag"); openTabById(tabid); }); }); //Initialize all table that is sortable $('table').tablesort(); }); function logout() { $.get("/api/auth/logout", function(response) { if (response === "OK") { window.location.href = "/"; } }); } function getTabButtonById(targetTabId){ let targetTabBtn = undefined; $("#mainmenu").find(".item").each(function(){ let tabid = $(this).attr("tag"); if (tabid == targetTabId){ targetTabBtn = $(this); } }); return targetTabBtn; } //Select and open a tab by its tag id function openTabById(tabID){ let targetBtn = getTabButtonById(tabID); if (targetBtn == undefined){ alert("Invalid tabid given"); return; } $("#mainmenu").find(".item").removeClass("active"); $(targetBtn).addClass("active"); $(".functiontab").hide(); $("#" + tabID).fadeIn('fast'); $('html,body').animate({scrollTop: 0}, 'fast'); window.location.hash = tabID; } //Generic functions function deleteEndpoint(ptype, epoint){ if (confirm("Confirm remove proxy for :" + epoint + " (type: " + ptype + ")?")){ $.ajax({ url: "./del", data: {ep: epoint, ptype: ptype}, success: function(){ listVdirs(); listSubd(); } }) } } function setProxyRoot(){ var newpr = $("#proxyRoot").val(); if (newpr.trim() == ""){ $("#proxyRoot").parent().addClass('error'); return }else{ $("#proxyRoot").parent().removeClass('error'); } var rootReqTls = $("#rootReqTLS")[0].checked; //Create the endpoint by calling add $.ajax({ url: "./add", data: {"type": "root", tls: rootReqTls, ep: newpr}, success: function(data){ if (data.error != undefined){ alert(data.error); }else{ //OK initRootInfo(); $("#ProxyRootUpdate").stop().slideDown('fast').delay(3000).slideUp('fast'); } } }); } //Show error message function errmsg(message){ $("#errmsg").html(`<i class="red remove icon"></i> ${message}`); $("#errmsg").slideDown('fast').delay(5000).slideUp('fast'); } </script> </body> </html>