From e344960c55646d7a9c7177bb7ac6d5b5e991d7ff Mon Sep 17 00:00:00 2001 From: Sergey Ponomarev Date: Wed, 7 Jun 2023 11:29:32 +0300 Subject: [PATCH] luci-app-acme: List of certificates Add Certificates section to help users to see issued certificates and path to them. Signed-off-by: Sergey Ponomarev --- .../htdocs/luci-static/resources/view/acme.js | 48 ++++++++++++++++++- .../usr/share/rpcd/acl.d/luci-app-acme.json | 3 +- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/applications/luci-app-acme/htdocs/luci-static/resources/view/acme.js b/applications/luci-app-acme/htdocs/luci-static/resources/view/acme.js index a7553df9a7..2ddc1a6450 100644 --- a/applications/luci-app-acme/htdocs/luci-static/resources/view/acme.js +++ b/applications/luci-app-acme/htdocs/luci-static/resources/view/acme.js @@ -5,7 +5,19 @@ 'require view'; return view.extend({ - render: function (stats) { + load: function() { + return L.resolveDefault(fs.list('/etc/ssl/acme/'), []).then(function(entries) { + var certs = []; + for (var i = 0; i < entries.length; i++) { + if (entries[i].type == 'file' && entries[i].name.match(/\.key$/)) { + certs.push(entries[i]); + } + } + return certs; + }); + }, + + render: function (certs) { let wikiUrl = 'https://github.com/acmesh-official/acme.sh/wiki/'; var wikiInstructionUrl = wikiUrl + 'dnsapi'; var m, s, o; @@ -512,7 +524,12 @@ return view.extend({ o.datatype = 'uinteger'; o.modalonly = true; - return m.render() + + s = m.section(form.GridSection, '_certificates'); + + s.render = L.bind(_renderCerts, this, certs); + + return m.render(); } }) @@ -560,3 +577,30 @@ function _extractParamValue(paramsKeyVals, paramName) { function _handleCheckService(c, event, curVal, newVal) { document.getElementById('wikiInstructionUrl').href = 'https://github.com/acmesh-official/acme.sh/wiki/dnsapi#' + newVal; } + +function _renderCerts(certs) { + var table = E('table', {'class': 'table cbi-section-table', 'id': 'certificates_table'}, [ + E('tr', {'class': 'tr table-titles'}, [ + E('th', {'class': 'th'}, _('Main Domain')), + E('th', {'class': 'th'}, _('Private Key')), + E('th', {'class': 'th'}, _('Public Certificate')), + E('th', {'class': 'th'}, _('Issued on')), + ]) + ]); + + var rows = certs.map(function (cert) { + let domain = cert.name.substring(0, cert.name.length - 4); + let issueDate = new Date(cert.mtime * 1000).toLocaleDateString(); + return [ + domain, + '/etc/ssl/acme/' + domain + '.key', + '/etc/ssl/acme/' + domain + '.fullchain.crt', + issueDate, + ]; + }); + + cbi_update_table(table, rows); + + return E('div', {'class': 'cbi-section cbi-tblsection'}, [ + E('h3', _('Certificates')), table]); +} diff --git a/applications/luci-app-acme/root/usr/share/rpcd/acl.d/luci-app-acme.json b/applications/luci-app-acme/root/usr/share/rpcd/acl.d/luci-app-acme.json index 110f9c5451..bf99dd5745 100644 --- a/applications/luci-app-acme/root/usr/share/rpcd/acl.d/luci-app-acme.json +++ b/applications/luci-app-acme/root/usr/share/rpcd/acl.d/luci-app-acme.json @@ -3,8 +3,7 @@ "description": "Grant UCI access for luci-app-acme", "read": { "file": { - "/usr/sbin/nginx": [ "read" ], - "/usr/sbin/uhttpd": [ "read" ] + "/etc/ssl/acme": [ "list" ] }, "uci": [ "acme" ] }, -- 2.30.2