// Add event listener to button document.getElementById("ssl").addEventListener("click", function () { getSSL(); }); // Add enter key listener to input document.getElementById("domain").addEventListener("keyup", function (event) { if (event.key === "Enter") { getSSL(); } }); function getSSL() { // Get the input value const domain = document.getElementById("domain").value.trim().toLowerCase(); // Set the domain parameter var params; if (window.location.search){ params = new URLSearchParams(window.location.search); params.set("domain", domain); } else { params = new URLSearchParams(); params.append("domain", domain); } // Add the parameters to the URL const url = `/?${params.toString()}`; // Push the URL to the history history.pushState(null, null, url); // Add a loading spinner document.getElementById("ssl-results").innerHTML = `<div style="text-align: center; margin-bottom: 3rem;"> <div class="spinner-border text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div></div>`; // Send a GET request to the API fetch(`/api/v1/ssl/${domain}`) .then(response => response.json()) .then(data => { // Check if the request was successful if (data.success) { // Display the results document.getElementById("ssl-results").innerHTML = ` <div class="card shadow-sm p-4" style="max-width: 950px;margin: auto; margin-bottom: 3rem;"> <h2 class="mb-3">SSL Certificate Details</h2> <ul class="list-group"> <li class="list-group-item"><strong>IP Address:</strong> ${data.ip}</li> <li class="list-group-item"> <div class="d-flex justify-content-between align-items-center"> <div> <strong>TLSA Records:</strong> ${data.tlsa.match ? '<span class="badge bg-success">Match</span>' : '<span class="badge bg-danger">No Match</span>'} </div> <button class="btn btn-sm btn-outline-secondary tlsa-toggle" type="button"> Show Details </button> </div> <div class="tlsa-details mt-2" style="display:none;"> <div class="card card-body bg-light"> <div><strong>Webserver TLSA:</strong><br><code>${data.tlsa.server}</code></div> <div class="mt-2"><strong>Nameserver TLSA:</strong><br><code>${data.tlsa.nameserver}</code></div> </div> </div> </li> <li class="list-group-item"> <div class="d-flex justify-content-between align-items-center"> <div> <strong>Certificate:</strong> ${!data.cert.expired && data.cert.domain ? '<span class="badge bg-success">Valid</span>' : '<span class="badge bg-danger">Invalid</span>'} </div> <button class="btn btn-sm btn-outline-secondary cert-toggle" type="button"> Show Details </button> </div> <div class="cert-details mt-2" style="display:none;"> <div class="card card-body bg-light"> <div><strong>Subject Names:</strong> ${data.cert.domains.join(", ")} ${data.cert.domain ? '<span class="badge bg-success">Match</span>' : '<span class="badge bg-danger">No Match</span>'} </div> <div class="mt-2"><strong>Expiry Date:</strong> ${data.cert.expiry_date} UTC ${data.cert.expired ? '<span class="badge bg-danger">Expired</span>' : '<span class="badge bg-success">Valid</span>'} </div> <div class="mt-2"><strong>Certificate Content:</strong></div> <pre class="mt-1 mb-0" style="white-space: pre-wrap; font-size: 0.8rem; max-height: 300px; overflow-y: auto;">${data.cert.cert}</pre> </div> </div> </li> <li class="list-group-item"> <div class="d-flex justify-content-between align-items-center"> <div> <strong>DNSSEC Chain:</strong> ${data.dnssec.valid ? '<span class="badge bg-success">Valid</span>' : '<span class="badge bg-danger">Invalid</span>'} </div> <button class="btn btn-sm btn-outline-secondary dnssec-toggle" type="button"> Show Details </button> </div> <div class="dnssec-details mt-2" style="display:none;"> <div class="card card-body bg-light"><pre class="mb-0" style="white-space: pre-wrap; text-align: left;">${data.dnssec.output}</pre> </div> </div> </li> <li class="list-group-item"><strong>Overall Status:</strong> ${data.valid ? '<span class="badge bg-success">Valid</span>' : '<span class="badge bg-danger">Invalid</span>'} </li> </ul> </div>`; // Add event listeners for all toggle buttons document.querySelector('.tlsa-toggle').addEventListener('click', function() { const detailsDiv = document.querySelector('.tlsa-details'); if (detailsDiv.style.display === 'none') { detailsDiv.style.display = 'block'; this.textContent = 'Hide Details'; } else { detailsDiv.style.display = 'none'; this.textContent = 'Show Details'; } }); document.querySelector('.cert-toggle').addEventListener('click', function() { const certDiv = document.querySelector('.cert-details'); if (certDiv.style.display === 'none') { certDiv.style.display = 'block'; this.textContent = 'Hide Details'; } else { certDiv.style.display = 'none'; this.textContent = 'Show Details'; } }); document.querySelector('.dnssec-toggle').addEventListener('click', function() { const dnssecDiv = document.querySelector('.dnssec-details'); if (dnssecDiv.style.display === 'none') { dnssecDiv.style.display = 'block'; this.textContent = 'Hide Details'; } else { dnssecDiv.style.display = 'none'; this.textContent = 'Show Details'; } }); } else { // Display an error message document.getElementById("ssl-results").innerHTML = `<h2>Error</h2> <p style="margin-bottom: 3rem;">${data.message}</p>`; } }) .catch(error => { // Display an error message document.getElementById("ssl-results").innerHTML = `<h2>Error</h2> <p>${error.message}</p>`; }); } // On load check if params are present if (window.location.search) { const params = new URLSearchParams(window.location.search); const domain = params.get('domain'); if (domain) { // Add domain to input document.getElementById("domain").value = domain; getSSL(domain); } }