12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241 |
- <!DOCTYPE html>
- <html>
- <head>
- <!-- Notes: This should be open in its original path-->
- <link rel="stylesheet" href="../script/semantic/semantic.min.css">
- <script src="../script/jquery-3.6.0.min.js"></script>
- <script src="../script/semantic/semantic.min.js"></script>
- <style>
- .disabled.table{
- opacity: 0.5;
- pointer-events: none;
-
- }
- .expiredDomain{
- color: rgb(238, 31, 31);
- }
- .validDomain{
- color: rgb(49, 192, 113);
- }
- </style>
- </head>
- <body>
- <br>
- <div class="ui container">
- <div class="ui header">
- <div class="content">
- Certificates Auto Renew Settings
- <div class="sub header">Fetch and renew your certificates with Automated Certificate Management Environment (ACME) protocol</div>
- </div>
- </div>
- <div class="ui basic segment">
- <p style="float: right; color: #21ba45; display:none;" id="enableToggleSucc"><i class="green checkmark icon"></i> Setting Updated</p>
- <div class="ui toggle checkbox">
- <input type="checkbox" id="enableCertAutoRenew">
- <label>Enable Certificate Auto Renew</label>
- </div>
- <br>
- <h3>ACME Email</h3>
- <p>Email is required by many CAs for renewing via ACME protocol</p>
- <div class="ui fluid action input">
- <input id="caRegisterEmail" type="text" placeholder="[email protected]">
- <button class="ui icon basic button" onclick="saveEmailToConfig(this);">
- <i class="blue save icon"></i>
- </button>
- </div>
- <small>If you don't want to share your private email address, you can also fill in an email address that point to a mailbox not exists on your domain.</small>
- </div>
- <div class="ui basic segment" style="background-color: #f7f7f7; border-radius: 1em;">
- <div class="ui accordion advanceSettings">
- <div class="title">
- <i class="dropdown icon"></i>
- Advance Renew Policy
- </div>
- <div class="content">
- <p>Renew all certificates with ACME supported CAs</p>
- <div class="ui toggle checkbox">
- <input type="checkbox" id="renewAllSupported" onchange="setAutoRenewIfCASupportMode(this.checked);">
- <label>Renew All Certs</label>
- </div><br>
- <button id="renewNowBtn" onclick="renewNow();" class="ui basic right floated button" style="margin-top: -2em;"><i class="yellow refresh icon"></i> Renew Now</button>
- <div class="ui horizontal divider"> OR </div>
- <p>Select the certificates to automatic renew in the list below</p>
- <table id="domainCertFileTable" class="ui very compact unstackable basic disabled table">
- <thead>
- <tr>
- <th>Domain Name</th>
- <th>Match Rule</th>
- <th>Auto-Renew</th>
- </tr>
- </thead>
- <tbody id="domainTableBody"></tbody>
- </table>
- <small><i class="ui red info circle icon"></i> Domain in red are expired</small><br>
- <div class="ui yellow message">
- Certificate Renew only works on the certification authority (CA) supported by Zoraxy. Check Zoraxy wiki for more information on supported list of CAs.
- </div>
- <button class="ui basic right floated button" onclick="saveAutoRenewPolicy();"><i class="blue save icon"></i> Save Changes</button>
- <button id="renewSelectedButton" onclick="renewNow();" class="ui basic right floated disabled button"><i class="yellow refresh icon"></i> Renew Selected</button>
- <br><br>
- </div>
- </div>
- </div>
- <div class="ui divider"></div>
- <h3>Generate New Certificate</h3>
- <p>Enter a new / existing domain(s) to request new certificate(s)</p>
- <div class="ui form">
- <div class="field">
- <label>Domain(s)</label>
- <input id="domainsInput" type="text" placeholder="example.com" onkeyup="checkIfInputDomainIsMultiple();">
- <small>If you have more than one domain in a single certificate, enter the domains separated by commas (e.g. s1.dev.example.com,s2.dev.example.com)</small>
- </div>
- <div class="field multiDomainOnly" style="display:none;">
- <label>Matching Rule</label>
- <input id="filenameInput" type="text" placeholder="Enter filename (no file extension)">
- <small>Matching rule to let Zoraxy pick which certificate to use (Also be used as filename). Usually is the longest common suffix of the entered addresses. (e.g. dev.example.com)</small>
- </div>
- <div class="field multiDomainOnly" style="display:none;">
- <button class="ui basic fluid button" onclick="autoDetectMatchingRules();">Auto Detect Matching Rule</button>
- </div>
- <div class="field">
- <label>Certificate Authority (CA)</label>
- <div class="ui selection dropdown" id="ca">
- <input type="hidden" name="ca">
- <i class="dropdown icon"></i>
- <div class="default text">Let's Encrypt</div>
- <div class="menu">
- <div class="item" data-value="Let's Encrypt">Let's Encrypt</div>
- <div class="item" data-value="Buypass">Buypass</div>
- <div class="item" data-value="ZeroSSL">ZeroSSL</div>
- <div class="item" data-value="Custom ACME Server">Custom ACME Server</div>
- <!-- <div class="item" data-value="Google">Google</div> -->
- </div>
- </div>
- </div>
- <div class="field" id="dnsChallenge">
- <div class="ui checkbox">
- <input type="checkbox" id="useDnsChallenge" onchange="toggleDnsChallenge()">
- <label>Use a DNS Challenge<br>
- </div>
- </div>
- <div class="field dnsChallengeOnly" style="display:none;">
- <label>DNS Provider</label>
- <div class="ui selection dropdown" id="dnsProvider">
- <input type="hidden" name="dnsProvider">
- <i class="dropdown icon"></i>
- <div class="default text">Please Choose...</div>
- <div class="menu">
- <!-- List of supported DNS providers with acme-lego 4.16 -->
- <!-- The file proivders-scraper-util.js can be used to generate the list of providers -->
- <div class="item" data-value="edgedns">Akamai EdgeDNS</div>
- <div class="item" data-value="alidns">Alibaba Cloud DNS</div>
- <div class="item" data-value="allinkl">all-inkl</div>
- <div class="item" data-value="lightsail">Amazon Lightsail</div>
- <div class="item" data-value="route53">Amazon Route 53</div>
- <div class="item" data-value="arvancloud">ArvanCloud</div>
- <div class="item" data-value="auroradns">Aurora DNS</div>
- <div class="item" data-value="autodns">Autodns</div>
- <div class="item" data-value="azure">Azure (deprecated)</div>
- <div class="item" data-value="azuredns">Azure DNS</div>
- <div class="item" data-value="bindman">Bindman</div>
- <div class="item" data-value="bluecat">Bluecat</div>
- <div class="item" data-value="brandit">Brandit</div>
- <div class="item" data-value="bunny">Bunny</div>
- <div class="item" data-value="checkdomain">Checkdomain</div>
- <div class="item" data-value="civo">Civo</div>
- <div class="item" data-value="cloudru">Cloud.ru</div>
- <div class="item" data-value="clouddns">CloudDNS</div>
- <div class="item" data-value="cloudflare">Cloudflare</div>
- <div class="item" data-value="cloudns">ClouDNS</div>
- <div class="item" data-value="cloudxns">CloudXNS</div>
- <div class="item" data-value="conoha">ConoHa</div>
- <div class="item" data-value="constellix">Constellix</div>
- <div class="item" data-value="cpanel">CPanel/WHM</div>
- <div class="item" data-value="derak">Derak Cloud</div>
- <div class="item" data-value="desec">deSEC.io</div>
- <div class="item" data-value="designate">Designate DNSaaS for Openstack</div>
- <div class="item" data-value="digitalocean">Digital Ocean</div>
- <div class="item" data-value="dnsmadeeasy">DNS Made Easy</div>
- <div class="item" data-value="dnshomede">dnsHome.de</div>
- <div class="item" data-value="dnsimple">DNSimple</div>
- <div class="item" data-value="dnspod">DNSPod (deprecated)</div>
- <div class="item" data-value="dode">Domain Offensive (do.de)</div>
- <div class="item" data-value="domeneshop">Domeneshop</div>
- <div class="item" data-value="dreamhost">DreamHost</div>
- <div class="item" data-value="duckdns">Duck DNS</div>
- <div class="item" data-value="dyn">Dyn</div>
- <div class="item" data-value="dynu">Dynu</div>
- <div class="item" data-value="easydns">EasyDNS</div>
- <div class="item" data-value="efficientip">Efficient IP</div>
- <div class="item" data-value="epik">Epik</div>
- <div class="item" data-value="exoscale">Exoscale</div>
- <div class="item" data-value="exec">External program</div>
- <div class="item" data-value="freemyip">freemyip.com</div>
- <div class="item" data-value="gcore">G-Core</div>
- <div class="item" data-value="gandi">Gandi</div>
- <div class="item" data-value="gandiv5">Gandi Live DNS (v5)</div>
- <div class="item" data-value="glesys">Glesys</div>
- <div class="item" data-value="godaddy">Go Daddy</div>
- <div class="item" data-value="gcloud">Google Cloud</div>
- <div class="item" data-value="googledomains">Google Domains</div>
- <div class="item" data-value="hetzner">Hetzner</div>
- <div class="item" data-value="hostingde">Hosting.de</div>
- <div class="item" data-value="hosttech">Hosttech</div>
- <div class="item" data-value="httpreq">HTTP request</div>
- <div class="item" data-value="httpnet">http.net</div>
- <div class="item" data-value="hurricane">Hurricane Electric DNS</div>
- <div class="item" data-value="hyperone">HyperOne</div>
- <div class="item" data-value="ibmcloud">IBM Cloud (SoftLayer)</div>
- <div class="item" data-value="iijdpf">IIJ DNS Platform Service</div>
- <div class="item" data-value="infoblox">Infoblox</div>
- <div class="item" data-value="infomaniak">Infomaniak</div>
- <div class="item" data-value="iij">Internet Initiative Japan</div>
- <div class="item" data-value="internetbs">Internet.bs</div>
- <div class="item" data-value="inwx">INWX</div>
- <div class="item" data-value="ionos">Ionos</div>
- <div class="item" data-value="ipv64">IPv64</div>
- <div class="item" data-value="iwantmyname">iwantmyname</div>
- <div class="item" data-value="joker">Joker</div>
- <div class="item" data-value="acme-dns">Joohoi's ACME-DNS</div>
- <div class="item" data-value="liara">Liara</div>
- <div class="item" data-value="linode">Linode (v4)</div>
- <div class="item" data-value="liquidweb">Liquid Web</div>
- <div class="item" data-value="loopia">Loopia</div>
- <div class="item" data-value="luadns">LuaDNS</div>
- <div class="item" data-value="mailinabox">Mail-in-a-Box</div>
- <div class="item" data-value="metaname">Metaname</div>
- <div class="item" data-value="mydnsjp">MyDNS.jp</div>
- <div class="item" data-value="mythicbeasts">MythicBeasts</div>
- <div class="item" data-value="namedotcom">Name.com</div>
- <div class="item" data-value="namecheap">Namecheap</div>
- <div class="item" data-value="namesilo">Namesilo</div>
- <div class="item" data-value="nearlyfreespeech">NearlyFreeSpeech.NET</div>
- <div class="item" data-value="netcup">Netcup</div>
- <div class="item" data-value="netlify">Netlify</div>
- <div class="item" data-value="nicmanager">Nicmanager</div>
- <div class="item" data-value="nifcloud">NIFCloud</div>
- <div class="item" data-value="njalla">Njalla</div>
- <div class="item" data-value="nodion">Nodion</div>
- <div class="item" data-value="ns1">NS1</div>
- <div class="item" data-value="otc">Open Telekom Cloud</div>
- <div class="item" data-value="oraclecloud">Oracle Cloud</div>
- <div class="item" data-value="ovh">OVH</div>
- <div class="item" data-value="plesk">plesk.com</div>
- <div class="item" data-value="porkbun">Porkbun</div>
- <div class="item" data-value="pdns">PowerDNS</div>
- <div class="item" data-value="rackspace">Rackspace</div>
- <div class="item" data-value="rcodezero">RcodeZero</div>
- <div class="item" data-value="regru">reg.ru</div>
- <div class="item" data-value="rfc2136">RFC2136</div>
- <div class="item" data-value="rimuhosting">RimuHosting</div>
- <div class="item" data-value="sakuracloud">Sakura Cloud</div>
- <div class="item" data-value="scaleway">Scaleway</div>
- <div class="item" data-value="selectel">Selectel</div>
- <div class="item" data-value="servercow">Servercow</div>
- <div class="item" data-value="shellrent">Shellrent</div>
- <div class="item" data-value="simply">Simply.com</div>
- <div class="item" data-value="sonic">Sonic</div>
- <div class="item" data-value="stackpath">Stackpath</div>
- <div class="item" data-value="tencentcloud">Tencent Cloud DNS</div>
- <div class="item" data-value="transip">TransIP</div>
- <div class="item" data-value="safedns">UKFast SafeDNS</div>
- <div class="item" data-value="ultradns">Ultradns</div>
- <div class="item" data-value="variomedia">Variomedia</div>
- <div class="item" data-value="vegadns">VegaDNS</div>
- <div class="item" data-value="vercel">Vercel</div>
- <div class="item" data-value="versio">Versio.[nl|eu|uk]</div>
- <div class="item" data-value="vinyldns">VinylDNS</div>
- <div class="item" data-value="vkcloud">VK Cloud</div>
- <div class="item" data-value="vscale">Vscale</div>
- <div class="item" data-value="vultr">Vultr</div>
- <div class="item" data-value="webnames">Webnames</div>
- <div class="item" data-value="websupport">Websupport</div>
- <div class="item" data-value="wedos">WEDOS</div>
- <div class="item" data-value="yandex360">Yandex 360</div>
- <div class="item" data-value="yandexcloud">Yandex Cloud</div>
- <div class="item" data-value="yandex">Yandex PDD</div>
- <div class="item" data-value="zoneee">Zone.ee</div>
- <div class="item" data-value="zonomi">Zonomi</div>
- </div>
- </div>
- </div>
- <div class="field dnsChallengeOnly" style="display:none;">
- <label>Credentials File Content</label>
- <textarea id="dnsCredentials" placeholder=""></textarea>
- <small>For more information on the supported DNS Providers and their attirbutes look <a href="https://go-acme.github.io/lego/dns/" target="_blank">here</a>! </small>
- <div class="ui negative message">
- <i class="icon exclamation triangle"></i>
- These credentials will be stored as plaintext in the database and in environment variables!
- </div>
- </div>
- <div class="field" id="caInput" style="display:none;">
- <label>ACME Server URL</label>
- <input id="caURL" type="text" placeholder="https://example.com/acme/dictionary">
- </div>
- <div class="field" id="kidInput" style="display:none;">
- <label>EAB Credentials (KID) for current provider</label>
- <input id="eab_kid" type="text" placeholder="Leave this field blank to keep the current configuration">
- </div>
- <div class="field" id="hmacInput" style="display:none;">
- <label>EAB HMAC Key for current provider</label>
- <input id="eab_hmac" type="text" placeholder="Leave this field blank to keep the current configuration">
- </div>
- <div class="field" id="skipTLS" style="display:none;">
- <div class="ui checkbox">
- <input type="checkbox" id="skipTLSCheckbox">
- <label>Ignore TLS/SSL Verification Error<br><small>E.g. self-signed, expired certificate (Not Recommended)</small></label>
- </div>
- </div>
- <button id="obtainButton" class="ui basic button" type="submit"><i class="yellow refresh icon"></i> Get Certificate</button>
- </div>
- <div class="ui divider"></div>
- <small>First time setting up HTTPS?<br>Try out our <a href="../tools/https.html" target="_blank">wizard</a></small>
- <button class="ui basic button" style="float: right;" onclick="parent.hideSideWrapper();"><i class="remove icon"></i> Cancel</button>
- <br><br><br><br>
- </div>
- <script>
- let expiredDomains = [];
- let enableTrigerOnChangeEvent = true;
- $(".accordion").accordion();
- $(".dropdown").dropdown();
- $(".checkbox").checkbox();
- function setAutoRenewIfCASupportMode(useAutoMode = true){
- if (useAutoMode){
- $("#domainCertFileTable").addClass("disabled");
- $("#renewNowBtn").removeClass("disabled");
- $("#renewSelectedButton").addClass("disabled");
- }else{
- $("#domainCertFileTable").removeClass("disabled");
- $("#renewNowBtn").addClass("disabled");
- $("#renewSelectedButton").removeClass("disabled");
- }
- }
- function initRenewerConfigFromFile(){
- //Set the renew switch state
- $.get("/api/acme/autoRenew/enable", function(data){
- if (data == true){
- $("#enableCertAutoRenew").parent().checkbox("set checked");
- }
- $("#enableCertAutoRenew").on("change", function(){
- if (!enableTrigerOnChangeEvent){
- return;
- }
- toggleAutoRenew();
- })
- });
- //Load the email from server side
- $.get("/api/acme/autoRenew/email", function(data){
- if (data != "" && data != undefined && data != null){
- $("#caRegisterEmail").val(data);
- }
- });
- //Load the domain selection options
- $.get("/api/acme/autoRenew/renewPolicy", function(data){
- if (data == true){
- $("#renewAllSupported").parent().checkbox("set checked");
- }else{
- $("#renewAllSupported").parent().checkbox("set unchecked");
- }
- });
- }
- initRenewerConfigFromFile();
- function saveEmailToConfig(btn){
- $.ajax({
- url: "/api/acme/autoRenew/email",
- data: {set: $("#caRegisterEmail").val()},
- success: function(data){
- if (data.error != undefined){
- parent.msgbox(data.error, false, 5000);
- }else{
- parent.msgbox("Email updated");
- $(btn).html(`<i class="green check icon"></i>`);
- $(btn).addClass("disabled");
- setTimeout(function(){
- $(btn).html(`<i class="blue save icon"></i>`);
- $(btn).removeClass("disabled");
- }, 3000);
- }
- }
- });
- }
- function toggleAutoRenew(){
- var enabled = $("#enableCertAutoRenew").parent().checkbox("is checked");
- $.post("/api/acme/autoRenew/enable?enable=" + enabled, function(data){
- if (data.error){
- parent.msgbox(data.error, false, 5000);
- if (enabled){
- enableTrigerOnChangeEvent = false;
- $("#enableCertAutoRenew").parent().checkbox("set unchecked");
- enableTrigerOnChangeEvent = true;
- }
- if (parent && parent.setACMEEnableStates){
- parent.setACMEEnableStates(!enabled);
- }
- }else{
- $("#enableToggleSucc").stop().finish().fadeIn("fast").delay(3000).fadeOut("fast");
- if (parent && parent.setACMEEnableStates){
- parent.setACMEEnableStates(enabled);
- }
- }
- });
-
-
- }
- //Render the domains table that exists in this zoraxy host
- function renderDomainTable(domainFileList) {
- // Get the table body element
- var tableBody = $('#domainTableBody');
-
- // Clear the table body
- tableBody.empty();
-
- // Iterate over the domain names
- var counter = 0;
- for (const [srcfile, domains] of Object.entries(domainFileList)) {
- // Create a table row
- var row = $('<tr>');
-
- // Create the domain name cell
- var domainClass = "validDomain";
- for (var i = 0; i < domains.length; i++){
- let thisDomain = domains[i];
- if (expiredDomains.includes(thisDomain)){
- domainClass = "expiredDomain";
- }
- }
-
- var domainCell = $('<td class="' + domainClass +'">').html(domains.join("<br>"));
- row.append(domainCell);
- var srcFileCell = $('<td>').text(srcfile);
- row.append(srcFileCell);
-
- // Create the auto-renew checkbox cell
- let domainsEncoded = encodeURIComponent(JSON.stringify(domains));
- var checkboxCell = $(`<td domain="${domainsEncoded}" srcfile="${srcfile}">`);
- var checkbox = $(`<input name="${srcfile}">`).attr('type', 'checkbox');
- checkboxCell.append(checkbox);
- row.append(checkboxCell);
-
- // Add the row to the table body
- tableBody.append(row);
- counter++;
- }
- if (Object.keys(domainFileList).length == 0){
- //No certificate in this system
- tableBody.append(`<tr>
- <td colspan="3"><i class="ui green circle check icon"></i> No certificate in use</td>
- </tr>`);
- }
- }
- //Initiate domain table. If you needs to update the expired domain as well
- //call from initDomainFileList() instead
- function initDomainTable(){
- $.get("/api/cert/listdomains?compact=true", function(data){
- if (data.error != undefined){
- parent.msgbox(data.error, false);
- }else{
- renderDomainTable(data);
- }
- initAutoRenewPolicy();
- })
- }
- function initDomainFileList() {
- $.ajax({
- url: "/api/acme/listExpiredDomains",
- method: "GET",
- success: function(response) {
- // Render domain table
- expiredDomains = response.domain;
- initDomainTable();
- //renderDomainTable(response.domain);
- },
- error: function(error) {
- console.log("Failed to fetch expired domains:", error);
- }
- });
- }
- initDomainFileList();
- // Button click event handler for obtaining certificate
- $("#obtainButton").click(function() {
- $("#obtainButton").addClass("loading").addClass("disabled");
- updateCertificateEAB();
- updateCertificateDNS();
- obtainCertificate();
- });
- $("input[name=ca]").on('change', function() {
- if(this.value == "Custom ACME Server") {
- $("#caInput").show();
- $("#kidInput").show();
- $("#hmacInput").show();
- $("#skipTLS").show();
- $("#dnsChallenge").hide();
- } else if (this.value == "ZeroSSL") {
- $("#kidInput").show();
- $("#hmacInput").show();
- $("#dnsChallenge").hide();
- } else if (this.value == "Buypass") {
- $("#kidInput").show();
- $("#hmacInput").show();
- $("#dnsChallenge").hide()
- }else {
- $("#caInput").hide();
- $("#skipTLS").hide();
- $("#kidInput").hide();
- $("#hmacInput").hide();
- $("#dnsChallenge").show();
- }
- })
- $("input[name=dnsProvider]").on('change', function() {
- // The file proivders-scraper-util.js can be used to generate the list of providers
- switch(this.value){
- case "edgedns":
- $("#dnsCredentials").val("AKAMAI_ACCESS_TOKEN=\nAKAMAI_CLIENT_SECRET=\nAKAMAI_CLIENT_TOKEN=\nAKAMAI_EDGERC=\nAKAMAI_EDGERC_SECTION=\nAKAMAI_HOST=");
- break;
- case "alidns":
- $("#dnsCredentials").val("ALICLOUD_ACCESS_KEY=\nALICLOUD_RAM_ROLE=\nALICLOUD_SECRET_KEY=\nALICLOUD_SECURITY_TOKEN=");
- break;
- case "allinkl":
- $("#dnsCredentials").val("ALL_INKL_LOGIN=\nALL_INKL_PASSWORD=");
- break;
- case "lightsail":
- $("#dnsCredentials").val("AWS_ACCESS_KEY_ID=\nAWS_ACCESS_KEY_ID_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nAWS_SECRET_ACCESS_KEY=\nAWS_SECRET_ACCESS_KEY_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nDNS_ZONE=");
- break;
- case "route53":
- $("#dnsCredentials").val("AWS_ACCESS_KEY_ID=\nAWS_ACCESS_KEY_ID_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nAWS_ASSUME_ROLE_ARN=\nAWS_ASSUME_ROLE_ARN_FILE=\nAWS_EXTERNAL_ID=\nAWS_EXTERNAL_ID_FILE=\nAWS_HOSTED_ZONE_ID=\nAWS_PROFILE=\nAWS_PROFILE_FILE=\nAWS_REGION=\nAWS_REGION_FILE=\nAWS_SDK_LOAD_CONFIG=\nAWS_SDK_LOAD_CONFIG_FILE=\nAWS_SECRET_ACCESS_KEY=\nAWS_SECRET_ACCESS_KEY_FILE=\nAWS_SHARED_CREDENTIALS_FILE=");
- break;
- case "arvancloud":
- $("#dnsCredentials").val("ARVANCLOUD_API_KEY=");
- break;
- case "auroradns":
- $("#dnsCredentials").val("AURORA_API_KEY=\nAURORA_SECRET=");
- break;
- case "autodns":
- $("#dnsCredentials").val("AUTODNS_API_PASSWORD=\nAUTODNS_API_USER=");
- break;
- case "azure":
- $("#dnsCredentials").val("AZURE_CLIENT_ID=\nAZURE_CLIENT_SECRET=\nAZURE_ENVIRONMENT=\nAZURE_RESOURCE_GROUP=\nAZURE_SUBSCRIPTION_ID=\nAZURE_TENANT_ID=\ninstance metadata service=");
- break;
- case "azuredns":
- $("#dnsCredentials").val("AZURE_CLIENT_CERTIFICATE_PATH=\nAZURE_CLIENT_ID=\nAZURE_CLIENT_SECRET=\nAZURE_TENANT_ID=");
- break;
- case "bindman":
- $("#dnsCredentials").val("BINDMAN_MANAGER_ADDRESS=");
- break;
- case "bluecat":
- $("#dnsCredentials").val("BLUECAT_CONFIG_NAME=\nBLUECAT_DNS_VIEW=\nBLUECAT_PASSWORD=\nBLUECAT_SERVER_URL=\nBLUECAT_USER_NAME=");
- break;
- case "brandit":
- $("#dnsCredentials").val("BRANDIT_API_KEY=\nBRANDIT_API_USERNAME=");
- break;
- case "bunny":
- $("#dnsCredentials").val("BUNNY_API_KEY=");
- break;
- case "checkdomain":
- $("#dnsCredentials").val("CHECKDOMAIN_TOKEN=");
- break;
- case "civo":
- $("#dnsCredentials").val("CIVO_TOKEN=");
- break;
- case "cloudru":
- $("#dnsCredentials").val("CLOUDRU_KEY_ID=\nCLOUDRU_SECRET=\nCLOUDRU_SERVICE_INSTANCE_ID=");
- break;
- case "clouddns":
- $("#dnsCredentials").val("CLOUDDNS_CLIENT_ID=\nCLOUDDNS_EMAIL=\nCLOUDDNS_PASSWORD=");
- break;
- case "cloudflare":
- $("#dnsCredentials").val("CF_API_EMAIL=\nCF_API_KEY=\nCF_DNS_API_TOKEN=\nCF_ZONE_API_TOKEN=\nCLOUDFLARE_API_KEY=\nCLOUDFLARE_DNS_API_TOKEN=\nCLOUDFLARE_EMAIL=\nCLOUDFLARE_ZONE_API_TOKEN=");
- break;
- case "cloudns":
- $("#dnsCredentials").val("CLOUDNS_AUTH_ID=\nCLOUDNS_AUTH_PASSWORD=");
- break;
- case "cloudxns":
- $("#dnsCredentials").val("CLOUDXNS_API_KEY=\nCLOUDXNS_SECRET_KEY=");
- break;
- case "conoha":
- $("#dnsCredentials").val("CONOHA_API_PASSWORD=\nCONOHA_API_USERNAME=\nCONOHA_TENANT_ID=");
- break;
- case "constellix":
- $("#dnsCredentials").val("CONSTELLIX_API_KEY=\nCONSTELLIX_SECRET_KEY=");
- break;
- case "cpanel":
- $("#dnsCredentials").val("CPANEL_BASE_URL=\nCPANEL_TOKEN=\nCPANEL_USERNAME=");
- break;
- case "derak":
- $("#dnsCredentials").val("DERAK_API_KEY=");
- break;
- case "desec":
- $("#dnsCredentials").val("DESEC_TOKEN=");
- break;
- case "designate":
- $("#dnsCredentials").val("OS_APPLICATION_CREDENTIAL_ID=\nOS_APPLICATION_CREDENTIAL_NAME=\nOS_APPLICATION_CREDENTIAL_SECRET=\nOS_AUTH_URL=\nOS_PASSWORD=\nOS_PROJECT_NAME=\nOS_REGION_NAME=\nOS_USERNAME=\nOS_USER_ID=");
- break;
- case "digitalocean":
- $("#dnsCredentials").val("DO_AUTH_TOKEN=");
- break;
- case "dnsmadeeasy":
- $("#dnsCredentials").val("DNSMADEEASY_API_KEY=\nDNSMADEEASY_API_SECRET=");
- break;
- case "dnshomede":
- $("#dnsCredentials").val("DNSHOMEDE_CREDENTIALS=");
- break;
- case "dnsimple":
- $("#dnsCredentials").val("DNSIMPLE_OAUTH_TOKEN=");
- break;
- case "dnspod":
- $("#dnsCredentials").val("DNSPOD_API_KEY=");
- break;
- case "dode":
- $("#dnsCredentials").val("DODE_TOKEN=");
- break;
- case "domeneshop":
- $("#dnsCredentials").val("DOMENESHOP_API_SECRET=\nDOMENESHOP_API_TOKEN=");
- break;
- case "dreamhost":
- $("#dnsCredentials").val("DREAMHOST_API_KEY=");
- break;
- case "duckdns":
- $("#dnsCredentials").val("DUCKDNS_TOKEN=");
- break;
- case "dyn":
- $("#dnsCredentials").val("DYN_CUSTOMER_NAME=\nDYN_PASSWORD=\nDYN_USER_NAME=");
- break;
- case "dynu":
- $("#dnsCredentials").val("DYNU_API_KEY=");
- break;
- case "easydns":
- $("#dnsCredentials").val("EASYDNS_KEY=\nEASYDNS_TOKEN=");
- break;
- case "efficientip":
- $("#dnsCredentials").val("EFFICIENTIP_DNS_NAME=\nEFFICIENTIP_HOSTNAME=\nEFFICIENTIP_PASSWORD=\nEFFICIENTIP_USERNAME=");
- break;
- case "epik":
- $("#dnsCredentials").val("EPIK_SIGNATURE=");
- break;
- case "exoscale":
- $("#dnsCredentials").val("EXOSCALE_API_KEY=\nEXOSCALE_API_SECRET=");
- break;
- case "exec":
- $("#dnsCredentials").val("EXEC_MODE=\nRAW=\nEXEC_PATH=");
- break;
- case "freemyip":
- $("#dnsCredentials").val("FREEMYIP_TOKEN=");
- break;
- case "gcore":
- $("#dnsCredentials").val("GCORE_PERMANENT_API_TOKEN=");
- break;
- case "gandi":
- $("#dnsCredentials").val("GANDI_API_KEY=");
- break;
- case "gandiv5":
- $("#dnsCredentials").val("GANDIV5_API_KEY=\nGANDIV5_PERSONAL_ACCESS_TOKEN=");
- break;
- case "glesys":
- $("#dnsCredentials").val("GLESYS_API_KEY=\nGLESYS_API_USER=");
- break;
- case "godaddy":
- $("#dnsCredentials").val("GODADDY_API_KEY=\nGODADDY_API_SECRET=");
- break;
- case "gcloud":
- $("#dnsCredentials").val("Application Default Credentials=\nGCE_PROJECT=\nGCE_SERVICE_ACCOUNT=\nGCE_SERVICE_ACCOUNT_FILE=");
- break;
- case "googledomains":
- $("#dnsCredentials").val("GOOGLE_DOMAINS_ACCESS_TOKEN=");
- break;
- case "hetzner":
- $("#dnsCredentials").val("HETZNER_API_KEY=");
- break;
- case "hostingde":
- $("#dnsCredentials").val("HOSTINGDE_API_KEY=");
- break;
- case "hosttech":
- $("#dnsCredentials").val("HOSTTECH_API_KEY=\nHOSTTECH_PASSWORD=");
- break;
- case "httpreq":
- $("#dnsCredentials").val("HTTPREQ_ENDPOINT=\nHTTPREQ_MODE=\nRAW=");
- break;
- case "httpnet":
- $("#dnsCredentials").val("HTTPNET_API_KEY=");
- break;
- case "hurricane":
- $("#dnsCredentials").val("HURRICANE_TOKENS=");
- break;
- case "hyperone":
- $("#dnsCredentials").val("HYPERONE_API_URL=\nHYPERONE_LOCATION_ID=\nHYPERONE_PASSPORT_LOCATION=\nHYPERONE_POLLING_INTERVAL=\nHYPERONE_PROPAGATION_TIMEOUT=\nHYPERONE_TTL=");
- break;
- case "ibmcloud":
- $("#dnsCredentials").val("SOFTLAYER_API_KEY=\nSOFTLAYER_USERNAME=");
- break;
- case "iijdpf":
- $("#dnsCredentials").val("IIJ_DPF_API_TOKEN=\nIIJ_DPF_DPM_SERVICE_CODE=");
- break;
- case "infoblox":
- $("#dnsCredentials").val("INFOBLOX_HOST=\nINFOBLOX_PASSWORD=\nINFOBLOX_USERNAME=");
- break;
- case "infomaniak":
- $("#dnsCredentials").val("INFOMANIAK_ACCESS_TOKEN=");
- break;
- case "iij":
- $("#dnsCredentials").val("IIJ_API_ACCESS_KEY=\nIIJ_API_SECRET_KEY=\nIIJ_DO_SERVICE_CODE=");
- break;
- case "internetbs":
- $("#dnsCredentials").val("INTERNET_BS_API_KEY=\nINTERNET_BS_PASSWORD=");
- break;
- case "inwx":
- $("#dnsCredentials").val("INWX_PASSWORD=\nINWX_USERNAME=");
- break;
- case "ionos":
- $("#dnsCredentials").val("IONOS_API_KEY=\n<prefix>.<secret>=");
- break;
- case "ipv64":
- $("#dnsCredentials").val("IPV64_API_KEY=");
- break;
- case "iwantmyname":
- $("#dnsCredentials").val("IWANTMYNAME_PASSWORD=\nIWANTMYNAME_USERNAME=");
- break;
- case "joker":
- $("#dnsCredentials").val("JOKER_API_KEY=\nJOKER_API_MODE=\nJOKER_PASSWORD=\nJOKER_USERNAME=");
- break;
- case "acme-dns":
- $("#dnsCredentials").val("ACME_DNS_API_BASE=\nACME_DNS_STORAGE_PATH=");
- break;
- case "liara":
- $("#dnsCredentials").val("LIARA_API_KEY=");
- break;
- case "linode":
- $("#dnsCredentials").val("LINODE_TOKEN=");
- break;
- case "liquidweb":
- $("#dnsCredentials").val("LWAPI_PASSWORD=\nLWAPI_USERNAME=");
- break;
- case "loopia":
- $("#dnsCredentials").val("LOOPIA_API_PASSWORD=\nLOOPIA_API_USER=");
- break;
- case "luadns":
- $("#dnsCredentials").val("LUADNS_API_TOKEN=\nLUADNS_API_USERNAME=");
- break;
- case "mailinabox":
- $("#dnsCredentials").val("MAILINABOX_BASE_URL=\nMAILINABOX_EMAIL=\nMAILINABOX_PASSWORD=");
- break;
- case "metaname":
- $("#dnsCredentials").val("METANAME_ACCOUNT_REFERENCE=\nMETANAME_API_KEY=");
- break;
- case "mydnsjp":
- $("#dnsCredentials").val("MYDNSJP_MASTER_ID=\nMYDNSJP_PASSWORD=");
- break;
- case "mythicbeasts":
- $("#dnsCredentials").val("MYTHICBEASTS_PASSWORD=\nMYTHICBEASTS_USERNAME=");
- break;
- case "namedotcom":
- $("#dnsCredentials").val("NAMECOM_API_TOKEN=\nNAMECOM_USERNAME=");
- break;
- case "namecheap":
- $("#dnsCredentials").val("NAMECHEAP_API_KEY=\nNAMECHEAP_API_USER=");
- break;
- case "namesilo":
- $("#dnsCredentials").val("NAMESILO_API_KEY=");
- break;
- case "nearlyfreespeech":
- $("#dnsCredentials").val("NEARLYFREESPEECH_API_KEY=\nNEARLYFREESPEECH_LOGIN=");
- break;
- case "netcup":
- $("#dnsCredentials").val("NETCUP_API_KEY=\nNETCUP_API_PASSWORD=\nNETCUP_CUSTOMER_NUMBER=");
- break;
- case "netlify":
- $("#dnsCredentials").val("NETLIFY_TOKEN=");
- break;
- case "nicmanager":
- $("#dnsCredentials").val("NICMANAGER_API_EMAIL=\nNICMANAGER_API_LOGIN=\nNICMANAGER_API_PASSWORD=\nNICMANAGER_API_USERNAME=");
- break;
- case "nifcloud":
- $("#dnsCredentials").val("NIFCLOUD_ACCESS_KEY_ID=\nNIFCLOUD_SECRET_ACCESS_KEY=");
- break;
- case "njalla":
- $("#dnsCredentials").val("NJALLA_TOKEN=");
- break;
- case "nodion":
- $("#dnsCredentials").val("NODION_API_TOKEN=");
- break;
- case "ns1":
- $("#dnsCredentials").val("NS1_API_KEY=");
- break;
- case "otc":
- $("#dnsCredentials").val("OTC_DOMAIN_NAME=\nOTC_IDENTITY_ENDPOINT=\nOTC_PASSWORD=\nOTC_PROJECT_NAME=\nOTC_USER_NAME=");
- break;
- case "oraclecloud":
- $("#dnsCredentials").val("OCI_COMPARTMENT_OCID=\nOCI_PRIVKEY_FILE=\nOCI_PRIVKEY_PASS=\nOCI_PUBKEY_FINGERPRINT=\nOCI_REGION=\nOCI_TENANCY_OCID=\nOCI_USER_OCID=");
- break;
- case "ovh":
- $("#dnsCredentials").val("OVH_APPLICATION_KEY=\nOVH_APPLICATION_SECRET=\nOVH_CONSUMER_KEY=\nOVH_ENDPOINT=");
- break;
- case "plesk":
- $("#dnsCredentials").val("PLESK_PASSWORD=\nPLESK_SERVER_BASE_URL=\nPLESK_USERNAME=");
- break;
- case "porkbun":
- $("#dnsCredentials").val("PORKBUN_API_KEY=\nPORKBUN_SECRET_API_KEY=");
- break;
- case "pdns":
- $("#dnsCredentials").val("PDNS_API_KEY=\nPDNS_API_URL=");
- break;
- case "rackspace":
- $("#dnsCredentials").val("RACKSPACE_API_KEY=\nRACKSPACE_USER=");
- break;
- case "rcodezero":
- $("#dnsCredentials").val("RCODEZERO_API_TOKEN=");
- break;
- case "regru":
- $("#dnsCredentials").val("REGRU_PASSWORD=\nREGRU_USERNAME=");
- break;
- case "rfc2136":
- $("#dnsCredentials").val("RFC2136_NAMESERVER=\nRFC2136_TSIG_ALGORITHM=\nRFC2136_TSIG*=\nRFC2136_TSIG_KEY=\nRFC2136_TSIG*=\nRFC2136_TSIG_SECRET=\n RFC2136_TSIG*=");
- break;
- case "rimuhosting":
- $("#dnsCredentials").val("RIMUHOSTING_API_KEY=");
- break;
- case "sakuracloud":
- $("#dnsCredentials").val("SAKURACLOUD_ACCESS_TOKEN=\nSAKURACLOUD_ACCESS_TOKEN_SECRET=");
- break;
- case "scaleway":
- $("#dnsCredentials").val("SCW_PROJECT_ID=\nSCW_SECRET_KEY=");
- break;
- case "selectel":
- $("#dnsCredentials").val("SELECTEL_API_TOKEN=");
- break;
- case "selectelv2":
- $("#dnsCredentials").val("SELECTELV2_ACCOUNT_ID=\nSELECTELV2_PASSWORD=\nSELECTELV2_PROJECT_ID=\nSELECTELV2_USERNAME=");
- break;
- case "servercow":
- $("#dnsCredentials").val("SERVERCOW_PASSWORD=\nSERVERCOW_USERNAME=");
- break;
- case "shellrent":
- $("#dnsCredentials").val("SHELLRENT_TOKEN=\nSHELLRENT_USERNAME=");
- break;
- case "simply":
- $("#dnsCredentials").val("SIMPLY_ACCOUNT_NAME=\nSIMPLY_API_KEY=");
- break;
- case "sonic":
- $("#dnsCredentials").val("SONIC_API_KEY=\nSONIC_USER_ID=");
- break;
- case "stackpath":
- $("#dnsCredentials").val("STACKPATH_CLIENT_ID=\nSTACKPATH_CLIENT_SECRET=\nSTACKPATH_STACK_ID=");
- break;
- case "tencentcloud":
- $("#dnsCredentials").val("TENCENTCLOUD_SECRET_ID=\nTENCENTCLOUD_SECRET_KEY=");
- break;
- case "transip":
- $("#dnsCredentials").val("TRANSIP_ACCOUNT_NAME=\nTRANSIP_PRIVATE_KEY_PATH=");
- break;
- case "safedns":
- $("#dnsCredentials").val("SAFEDNS_AUTH_TOKEN=");
- break;
- case "ultradns":
- $("#dnsCredentials").val("ULTRADNS_PASSWORD=\nULTRADNS_USERNAME=");
- break;
- case "variomedia":
- $("#dnsCredentials").val("VARIOMEDIA_API_TOKEN=");
- break;
- case "vegadns":
- $("#dnsCredentials").val("SECRET_VEGADNS_KEY=\nSECRET_VEGADNS_SECRET=\nVEGADNS_URL=");
- break;
- case "vercel":
- $("#dnsCredentials").val("VERCEL_API_TOKEN=");
- break;
- case "versio":
- $("#dnsCredentials").val("VERSIO_PASSWORD=\nVERSIO_USERNAME=");
- break;
- case "vinyldns":
- $("#dnsCredentials").val("VINYLDNS_ACCESS_KEY=\nVINYLDNS_HOST=\nVINYLDNS_SECRET_KEY=");
- break;
- case "vkcloud":
- $("#dnsCredentials").val("VK_CLOUD_PASSWORD=\nVK_CLOUD_PROJECT_ID=\nVK_CLOUD_USERNAME=");
- break;
- case "vscale":
- $("#dnsCredentials").val("VSCALE_API_TOKEN=");
- break;
- case "vultr":
- $("#dnsCredentials").val("VULTR_API_KEY=");
- break;
- case "webnames":
- $("#dnsCredentials").val("WEBNAMES_API_KEY=");
- break;
- case "httpreq":
- $("#dnsCredentials").val("HTTPREQ_ENDPOINT=\nHTTPREQ_MODE=\nRAW=");
- break;
- case "websupport":
- $("#dnsCredentials").val("WEBSUPPORT_API_KEY=\nWEBSUPPORT_SECRET=");
- break;
- case "wedos":
- $("#dnsCredentials").val("WEDOS_USERNAME=\nWEDOS_WAPI_PASSWORD=");
- break;
- case "yandex360":
- $("#dnsCredentials").val("YANDEX360_OAUTH_TOKEN=\nYANDEX360_ORG_ID=");
- break;
- case "yandexcloud":
- $("#dnsCredentials").val("YANDEX_CLOUD_FOLDER_ID=\nYANDEX_CLOUD_IAM_TOKEN=\ndns.admin=");
- break;
- case "yandex":
- $("#dnsCredentials").val("YANDEX_PDD_TOKEN=");
- break;
- case "zoneee":
- $("#dnsCredentials").val("ZONEEE_API_KEY=\nZONEEE_API_USER=");
- break;
- case "zonomi":
- $("#dnsCredentials").val("ZONOMI_API_KEY=");
- break;
- }
- })
- // Get filename form domains and input
- function getFilename() {
- var domains = $("#domainsInput").val();
- var filename = $("#filenameInput").val();
- if (filename.trim() == "" && !domains.includes(",")){
- //Zoraxy filename are the matching name for domains.
- //Use the same as domains
- filename = domains;
- }else if (filename != "" && !domains.includes(",")){
- //Invalid settings. Force the filename to be same as domain
- //if there are only 1 domain
- filename = domains;
- }else if (filename == "" && domains.includes(",")){
- parent.msgbox("Filename cannot be empty for certs containing multiple domains.", false, 5000);
- $("#obtainButton").removeClass("loading").removeClass("disabled");
- return;
- }
- //Filename cannot contain wildcards, and wildcards are possible with DNS challenges
- filename = filename.replace("*", "_");
- return filename;
- }
-
- // Update EAB values for autorenewal
- function updateCertificateEAB() {
- var ca = $("#ca").dropdown("get value");
- var caURL = "";
- if (ca == "Custom ACME Server") {
- ca = "custom";
- caURL = $("#caURL").val();
- }else if(ca == "Buypass") {
- caURL = "https://api.buypass.com/acme/directory";
- }else if(ca == "ZeroSSL") {
- caURL = "https://acme.zerossl.com/v2/DV90";
- }
- if(caURL == "") {
- return;
- }
- var kid = $("#eab_kid").val();
- var hmac = $("#eab_hmac").val();
-
- if(kid == "" || hmac == "") {
- return;
- }
- console.log(caURL + " " + kid + " " + hmac);
- $.ajax({
- url: "/api/acme/autoRenew/setEAB",
- method: "GET",
- data: {
- acmeDirectoryURL: caURL,
- kid: kid,
- hmacEncoded: hmac,
- },
- success: function(response) {
- //$("#obtainButton").removeClass("loading").removeClass("disabled");
- if (response.error) {
- console.log("Error:", response.error);
- // Show error message
- parent.msgbox(response.error, false, 12000);
- } else {
- console.log("Certificate EAB updated successfully");
- // Show success message
- parent.msgbox("Certificate EAB updated successfully");
-
- // Renew the parent certificate list
- parent.initManagedDomainCertificateList();
- }
- },
- error: function(error) {
- //$("#obtainButton").removeClass("loading").removeClass("disabled");
- console.log("Failed to update EAB configuration:", error);
- parent.msgbox("Failed to update EAB configuration");
- }
- });
- }
- // Update DNS values for autorenewal
- function updateCertificateDNS() {
- var dns = $("#useDnsChallenge")[0].checked;
- var dnsProvider = "";
- var dnsCredentials = "";
- if (dns) {
- dnsProvider = $("#dnsProvider").dropdown("get value");
- dnsCredentials = $("#dnsCredentials").val();
- if(dnsProvider == "") {
- parent.msgbox("DNS Provider cannot be empty", false, 5000);
- $("#obtainButton").removeClass("loading").removeClass("disabled");
- return;
- }
-
- if(dnsCredentials == "") {
- parent.msgbox("DNS Credentials cannot be empty", false, 5000);
- $("#obtainButton").removeClass("loading").removeClass("disabled");
- return;
- }
- } else {
- return;
- }
- var filename = getFilename();
- if (filename == '') {
- return;
- }
- $.ajax({
- url: "/api/acme/autoRenew/setDNS",
- method: "POST",
- data: {
- filename: filename,
- dnsProvider: dnsProvider,
- dnsCredentials: dnsCredentials,
- },
- success: function(response) {
- //$("#obtainButton").removeClass("loading").removeClass("disabled");
- if (response.error) {
- console.log("Error:", response.error);
- // Show error message
- parent.msgbox(response.error, false, 12000);
- } else {
- console.log("Certificate DNS Credentials updated successfully");
- // Show success message
- parent.msgbox("Certificate DNS Credentials updated successfully");
- }
- },
- error: function(error) {
- //$("#obtainButton").removeClass("loading").removeClass("disabled");
- console.log("Failed to update DNS configuration:", error);
- parent.msgbox("Failed to update DNS configuration");
- }
- });
- }
- // Obtain certificate from API
- function obtainCertificate() {
- var domains = $("#domainsInput").val();
- var filename = getFilename();
- if (filename == '') {
- return;
- }
- var email = $("#caRegisterEmail").val();
- if (email == ""){
- parent.msgbox("ACME renew email is not set", false)
- $("#obtainButton").removeClass("loading").removeClass("disabled");
- return;
- }
-
-
- var ca = $("#ca").dropdown("get value");
- var caURL = "";
- if (ca == "Custom ACME Server") {
- ca = "custom";
- caURL = $("#caURL").val();
- }
-
- var dns = $("#useDnsChallenge")[0].checked;
- var skipTLSValue = $("#skipTLSCheckbox")[0].checked;
- $.ajax({
- url: "/api/acme/obtainCert",
- method: "GET",
- data: {
- domains: domains,
- filename: filename,
- email: email,
- ca: ca,
- caURL: caURL,
- skipTLS: skipTLSValue,
- dns: dns,
- },
- success: function(response) {
- $("#obtainButton").removeClass("loading").removeClass("disabled");
- if (response.error) {
- console.log("Error:", response.error);
- // Show error message
- parent.msgbox(response.error, false, 12000);
- } else {
- console.log("Certificate renewed successfully");
- // Show success message
- parent.msgbox("Certificate renewed successfully");
-
- // Renew the parent certificate list
- parent.initManagedDomainCertificateList();
- }
- },
- error: function(error) {
- $("#obtainButton").removeClass("loading").removeClass("disabled");
- console.log("Failed to renewed certificate:", error);
- }
- });
- }
- function checkIfInputDomainIsMultiple(){
- var inputDomains = $("#domainsInput").val();
- if (inputDomains.includes(",")){
- $(".multiDomainOnly").show();
- }else{
- $(".multiDomainOnly").hide();
- }
- }
- function toggleDnsChallenge(){
- if ( $("#useDnsChallenge")[0].checked){
- $(".dnsChallengeOnly").show();
- }else{
- $(".dnsChallengeOnly").hide();
- }
- }
- //Grab the longest common suffix of all domains
- //not that smart technically
- function autoDetectMatchingRules(){
- var domainsString = $("#domainsInput").val();
- if (!domainsString.includes(",")){
- return domainsString;
- }
- let domains = domainsString.split(",");
- //Clean out any spacing between commas
- for (var i = 0; i < domains.length; i++){
- domains[i] = domains[i].trim();
- }
- function getLongestCommonSuffix(strings) {
- if (strings.length === 0) {
- return ''; // Return an empty string if the array is empty
- }
- var sortedStrings = strings.slice().sort(); // Create a sorted copy of the array
- var firstString = sortedStrings[0];
- var lastString = sortedStrings[sortedStrings.length - 1];
- var suffix = '';
- var minLength = Math.min(firstString.length, lastString.length);
- for (var i = 0; i < minLength; i++) {
- if (firstString[firstString.length - 1 - i] !== lastString[lastString.length - 1 - i]) {
- break; // Stop iterating if characters don't match
- }
- suffix = firstString[firstString.length - 1 - i] + suffix;
- }
- return suffix;
- }
- let longestSuffix = getLongestCommonSuffix(domains);
- //Check if the suffix is a valid domain
- if (longestSuffix.substr(0,1) == "."){
- //Trim off the first dot
- longestSuffix = longestSuffix.substr(1);
- }
- if (!longestSuffix.includes(".")){
- parent.msgbox("Auto Detect failed: Multiple Domains", false, 5000);
- return;
- }
- $("#filenameInput").val(longestSuffix);
- }
- //Handle the renew now btn click
- function renewNow(){
- $.get("/api/acme/autoRenew/renewNow", function(data){
- if (data.error != undefined){
- parent.msgbox(data.error, false, 6000);
- }else{
- parent.msgbox(data)
- }
- })
- }
- function initAutoRenewPolicy(){
- $.get("/api/acme/autoRenew/listDomains", function(data){
- if (data.error != undefined){
- parent.msgbox(data.error, false)
- }else{
- if (data[0] == "*"){
- //Auto select and renew is enabled
- $("#renewAllSupported").parent().checkbox("set checked");
- }else{
- //This is a list of domain files
- data.forEach(function(name) {
- $('#domainTableBody input[type="checkbox"][name="' + name + '"]').prop('checked', true);
- });
- $("#domainCertFileTable").removeClass("disabled");
- $("#renewNowBtn").addClass("disabled");
- $("#renewSelectedButton").removeClass("disabled");
- }
- }
- })
- }
- function saveAutoRenewPolicy(){
- let autoRenewAll = $("#renewAllSupported").parent().checkbox("is checked");
- if (autoRenewAll == true){
- $.ajax({
- url: "/api/acme/autoRenew/setDomains",
- data: {opr: "setAuto"},
- success: function(data){
- parent.msgbox("Renew policy rule updated")
- }
- });
- }else{
- let checkedNames = [];
- $('#domainTableBody input[type="checkbox"]:checked').each(function() {
- checkedNames.push($(this).attr('name'));
- });
- $.ajax({
- url: "/api/acme/autoRenew/setDomains",
- data: {opr: "setSelected", domains: JSON.stringify(checkedNames)},
- success: function(data){
- parent.msgbox("Renew policy rule updated")
- }
- });
- }
- }
- //Clear up the input field when page load
- $("#filenameInput").val("");
- </script>
- </body>
- </html>
|