Przeglądaj źródła

auto update script executed

Toby Chui 1 rok temu
rodzic
commit
9854fffd55

+ 24 - 0
mod/acme/acme_test.go

@@ -0,0 +1,24 @@
+package acme_test
+
+import (
+	"fmt"
+	"testing"
+
+	"imuslab.com/zoraxy/mod/acme"
+)
+
+// Test if the issuer extraction is working
+func TestExtractIssuerNameFromPEM(t *testing.T) {
+	pemFilePath := "test/stackoverflow.pem"
+	expectedIssuer := "Let's Encrypt"
+
+	issuerName, err := acme.ExtractIssuerNameFromPEM(pemFilePath)
+	fmt.Println(issuerName)
+	if err != nil {
+		t.Errorf("Error extracting issuer name: %v", err)
+	}
+
+	if issuerName != expectedIssuer {
+		t.Errorf("Unexpected issuer name. Expected: %s, Got: %s", expectedIssuer, issuerName)
+	}
+}

+ 40 - 0
mod/acme/test/stackoverflow.pem

@@ -0,0 +1,40 @@
+-----BEGIN CERTIFICATE-----
+MIIG9DCCBdygAwIBAgISBLVVNLaqjcNTwd1Kp3sl4qQxMA0GCSqGSIb3DQEBCwUA
+MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
+EwJSMzAeFw0yMzA2MTAwMjM2MTdaFw0yMzA5MDgwMjM2MTZaMB4xHDAaBgNVBAMM
+Eyouc3RhY2tleGNoYW5nZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC+Kxksqbf0RG+LgisUQxw8NbTxAKmCWnU/PjzHTrV77zZ8AQMKLS1cIyCi
+hlM493MOSSqAsM7Nsa0bPomlVFtx1MDFbzP34kCfQpj5DscaGcKFwljWPSVRO8+J
+Aj/id5ySd2zqCJz6cyeoHNPa8kFLnMYWv/cixWQslecmohfs1Wd+cqxYFAAm68Jj
+FAQjBvb49UAx+g0t9Y84+LGsb+dxC4/LDi0f4mVERg3zBuxu+5rKvv+BAORMhKYc
+rXMqoqaRLdO0KUR6gmYJ2z7et5wz1vdqOFYUcUIayzDKxww7mhsupUdHhEsH5woI
+7IrhCmuERq6bOjtw3N1+IYONvZXfAgMBAAGjggQWMIIEEjAOBgNVHQ8BAf8EBAMC
+BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFD/xbdI1IAdRCcnMRaMEjaYA1onaMB8GA1UdIwQYMBaAFBQusxe3
+WFbLrlAJQOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0
+cDovL3IzLm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5j
+ci5vcmcvMIIB5AYDVR0RBIIB2zCCAdeCDyouYXNrdWJ1bnR1LmNvbYISKi5ibG9n
+b3ZlcmZsb3cuY29tghIqLm1hdGhvdmVyZmxvdy5uZXSCGCoubWV0YS5zdGFja2V4
+Y2hhbmdlLmNvbYIYKi5tZXRhLnN0YWNrb3ZlcmZsb3cuY29tghEqLnNlcnZlcmZh
+dWx0LmNvbYINKi5zc3RhdGljLm5ldIITKi5zdGFja2V4Y2hhbmdlLmNvbYITKi5z
+dGFja292ZXJmbG93LmNvbYIVKi5zdGFja292ZXJmbG93LmVtYWlsgg8qLnN1cGVy
+dXNlci5jb22CDWFza3VidW50dS5jb22CEGJsb2dvdmVyZmxvdy5jb22CEG1hdGhv
+dmVyZmxvdy5uZXSCFG9wZW5pZC5zdGFja2F1dGguY29tgg9zZXJ2ZXJmYXVsdC5j
+b22CC3NzdGF0aWMubmV0gg1zdGFja2FwcHMuY29tgg1zdGFja2F1dGguY29tghFz
+dGFja2V4Y2hhbmdlLmNvbYISc3RhY2tvdmVyZmxvdy5ibG9nghFzdGFja292ZXJm
+bG93LmNvbYITc3RhY2tvdmVyZmxvdy5lbWFpbIIRc3RhY2tzbmlwcGV0cy5uZXSC
+DXN1cGVydXNlci5jb20wTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMB
+AQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEE
+BgorBgEEAdZ5AgQCBIH1BIHyAPAAdgB6MoxU2LcttiDqOOBSHumEFnAyE4VNO9Ir
+wTpXo1LrUgAAAYijYEziAAAEAwBHMEUCIElLE1vDR1Vx3bTaw7ohgHBHOQT4ZYHy
+x0xOa4UfwZY7AiEAp7C5Woa8p1BWcWZ3Sxccn3gN26pZfW0ojfT3HoYL9tYAdgC3
+Pvsk35xNunXyOcW6WPRsXfxCz3qfNcSeHQmBJe20mQAAAYijYEzSAAAEAwBHMEUC
+IQDxUchWwJESu6QOVYBpV+cgVuOn75HmvC4VBEsxvOTTtQIgAaeN65TPtFvrqIF4
+kTnl2qvm/Sf4C+dFD95pLBzr8sUwDQYJKoZIhvcNAQELBQADggEBAJxBWEjpkWX7
+wMBay+Vn7f22fNeronFEi5ypb0KybDS24u7HPdsOfJoyIbeo4WL5yCkwKosEoXae
+H6OrJMKtUum9/xghprsYtL6VdpjBmYxnMQya9gAtgDfDKL9PkpKTLUNjm/sGbM3d
+gC8pZGD8jXToAZ27m6JdLygf/fAbVUbx1zMOhQUxl90dr7bDsOCue1YktFAafqD9
+C4ReuyMpVaR/Qdr1EgkSC+r8Jb5hT9p7Y8DFDVpD2CkgZ6UK1lJGHaeFp3NM3oTW
+cxhXjjf4D18gtmQ6IxhKfnKvWSWKeaPI7fbOADbnTnfDl8kJpGv9fw/ab5HCBD9s
+0OiskieWysI=
+-----END CERTIFICATE-----

+ 34 - 0
mod/acme/utils.go

@@ -0,0 +1,34 @@
+package acme
+
+import (
+	"crypto/x509"
+	"encoding/pem"
+	"fmt"
+	"io/ioutil"
+)
+
+// Get the issuer name from pem file
+func ExtractIssuerNameFromPEM(pemFilePath string) (string, error) {
+	// Read the PEM file
+	pemData, err := ioutil.ReadFile(pemFilePath)
+	if err != nil {
+		return "", err
+	}
+
+	// Parse the PEM block
+	block, _ := pem.Decode(pemData)
+	if block == nil || block.Type != "CERTIFICATE" {
+		return "", fmt.Errorf("failed to decode PEM block containing certificate")
+	}
+
+	// Parse the certificate
+	cert, err := x509.ParseCertificate(block.Bytes)
+	if err != nil {
+		return "", fmt.Errorf("failed to parse certificate: %v", err)
+	}
+
+	// Extract the issuer name
+	issuer := cert.Issuer.Organization[0]
+
+	return issuer, nil
+}

+ 8 - 0
web/components/cert.html

@@ -67,6 +67,7 @@
         </tbody>
         </table>
         <button class="ui basic button" onclick="initManagedDomainCertificateList();"><i class="green refresh icon"></i> Refresh List</button>
+        <button class="ui basic button" onclick="openACMEManager();"><i class="yellow refresh icon"></i> Auto Renew (ACME) Settings</button>
     </div>
     <div class="ui message">
         <h4><i class="info circle icon"></i> Sub-domain Certificates</h4>
@@ -106,6 +107,9 @@
                 msgbox(data.error, false, 5000);
             }else{
                 $("#certifiedDomainList").html("");
+                data.sort((a,b) => {
+                    return a.Domain > b.Domain
+                });
                 data.forEach(entry => {
                     $("#certifiedDomainList").append(`<tr>
                         <td>${entry.Domain}</td>
@@ -125,6 +129,10 @@
     }
     initManagedDomainCertificateList();
 
+    function openACMEManager(){
+        showSideWrapper('snippet/acme.html');
+    }
+
     function handleDomainUploadByKeypress(){
         handleDomainKeysUpload(function(){
             $("#certUploadingDomain").text($("#certdomain").val().trim());

+ 2 - 0
web/index.html

@@ -364,6 +364,7 @@
                 $(".sideWrapper").show();
                 $(".sideWrapper .fadingBackground").fadeIn("fast");
                 $(".sideWrapper .content").transition('slide left in', 300);
+                $("body").css("overflow", "hidden");
             }
 
             function hideSideWrapper(discardFrameContent = false){
@@ -378,6 +379,7 @@
                         $(".sideWrapper").hide(); 
                     });
                 });
+                $("body").css("overflow", "auto");
             }
         </script>
     </body>

+ 1 - 1
web/main.css

@@ -179,7 +179,7 @@ body{
 }
 
 .sideWrapper iframe{
-    height: 100%;
+    height: calc(100% - 55px);
     width: 100%;
     border: 0px solid transparent;
 }

+ 24 - 11
web/acme.html → web/snippet/acme.html

@@ -1,16 +1,29 @@
 <!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css">
-  <title>ACME</title>
-</head>
-<body>
-
+<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>
+  </head>
+  <body>
+  <br>
   <div class="ui container">
-    <h1 class="ui header">Welcome to ACME</h1>
-
+    <div class="ui header">
+        <div class="content">
+            Certificates Auto Renew Settings
+            <div class="sub header">Fetch and renew your certificates with ACME</div>
+        </div>
+    </div>
+    <div class="ui message">
+      
+    </div>
+    <div class="ui basic segment">
+      <div class="ui toggle checkbox">
+        <input type="checkbox" name="public">
+        <label>Enable Domain Auto Renew</label>
+      </div>
+    </div>
     <div class="ui segment">
       <p>This is an example of using ACME.</p>
       <button id="fetchButton" class="ui primary button">Fetch Expired Domains</button>