diff options
author | Niall Sheridan <nsheridan@gmail.com> | 2016-09-10 20:16:28 +0100 |
---|---|---|
committer | Niall Sheridan <nsheridan@gmail.com> | 2016-09-11 20:41:32 +0100 |
commit | 65151dd29dc01c6d1f6ff79ab6f8e049e925ce25 (patch) | |
tree | 2db5267b573f2a58ffff94de7f9b9af5f9767d82 /server | |
parent | 2e7c8c2f521c9e50bb3aea4df16771c22fe70e58 (diff) |
Add a toggle for unexpired certs
Diffstat (limited to 'server')
-rw-r--r-- | server/static/js/table.js | 49 | ||||
-rw-r--r-- | server/static/static.go | 22 | ||||
-rw-r--r-- | server/store/mem.go | 6 | ||||
-rw-r--r-- | server/store/store_test.go | 2 | ||||
-rw-r--r-- | server/templates/certs.go | 24 |
5 files changed, 87 insertions, 16 deletions
diff --git a/server/static/js/table.js b/server/static/js/table.js new file mode 100644 index 0000000..da0da39 --- /dev/null +++ b/server/static/js/table.js @@ -0,0 +1,49 @@ +function reqListener() { + var recs = JSON.parse(this.responseText); + var table = document.querySelector('#cert-table'); + var tbody = table.querySelector("#list"); + while (tbody.rows.length > 0) { + tbody.deleteRow(0); + } + issuedList.clear(); + recs.forEach(function makeTable(el, i, arr) { + var row = tbody.insertRow(-1); + row.insertCell(0).innerHTML = el.key_id; + row.insertCell(1).innerHTML = el.created_at; + row.insertCell(2).innerHTML = el.expires; + row.insertCell(3).innerHTML = el.principals; + row.insertCell(4).innerHTML = el.revoked; + // Index keyid and principals. + row.cells[0].classList = ["keyid"]; + row.cells[3].classList = ["principals"]; + if (el.revoked) { + row.insertCell(5).innerHTML = '<input style="margin:0;" type="checkbox" value="'+ el.key_id + '" name="cert_id" id="cert_id" />'; + } + tbody.appendChild(row); + }); + issuedList.reIndex(); +} + +function loadCerts(all) { + var r = new XMLHttpRequest(); + var endpoint = '/admin/certs.json'; + if (all) { + endpoint += '?all=true'; + } + r.open('GET', endpoint); + r.addEventListener('load', reqListener); + r.send() +} + +var SHOW_ALL = false; + +function toggleExpired() { + var button = document.querySelector("#toggle-certs"); + SHOW_ALL = !SHOW_ALL; + loadCerts(SHOW_ALL); + if (SHOW_ALL == false) { + button.innerHTML = "Show Expired"; + } else { + button.innerHTML = "Hide Expired"; + } +} diff --git a/server/static/static.go b/server/static/static.go index 16f1c72..28719ca 100644 --- a/server/static/static.go +++ b/server/static/static.go @@ -296,7 +296,7 @@ AAD//7viGWrCLAAA "/static/js/list.min.js": { local: "server/static/js/list.min.js", size: 15785, - modtime: 1472412760, + modtime: 1472414777, compressed: ` H4sIAAAJbogA/6x7bZPbNpLwX5H4uLRABHGkxMnuksaovI5TT65i++rsvS8UvQUCIMUxRcokNGOfxP3t V3gjQYrjnezlywzx1mh0N/oNrXl6KqnIq3JGQIIoYvDc9XCQoT085ymY0yiL9Veivu5JPcuxZ6d6GIuv @@ -389,6 +389,26 @@ FG1iGP5vAAAA//84G4UUqT0AAA== `, }, + "/static/js/table.js": { + local: "server/static/js/table.js", + size: 1414, + modtime: 1473620952, + compressed: ` +H4sIAAAJbogA/3xU3W4aPRC95ynm21ysUYghX9qb0k1VRai0Io0UkFopipBZD+Bi7I3t5UcV717Zy/4k +0N4g1j5n5szxzMxzlTqhFRh8GQnrUKEhbfjdAtgwAwZTCwl8Gz98pxkzFolbCksN2kwrixPcuXb/iHVs +JhES4DrN16gcfcnR7McoMXXakPgiReOuAiquSTPN95AU5DeM6EIK66KA3S6FRCABTo3eWipRLdwSbqFX +yIUiFuUo0eGj3pJeYB5aAMLaHLmvj6YSmSHhxhdH59oMWLoklRFrtsKJV0NQdkB0gBlTZgiW6K3XG3IJ +ZdE4n+vqOoQEf308vkMpSa9NhVJohpP7ESSAkq5wPxX8LPj6BJwaZA75lLmzhP9PCLjLhEF7Fn1zgs6M +UKnImDxPeHdCMLjRKzyq73bhq+K4gxXuBQemONQBaRUwRSntU++ZppJZ6x8BEniKAil67r/B3bzF1SFL +sJgDqbWUb3Oi/v1r9fFHobLcgXV7iUm0ZmYh1IdePwK3zzCJ0iWmq5neRbBhMsckii/r54JLiCNQbO2B +aNxU8AgEb3x0b+NC3aHRiyzLUPG7pZCcGL0t+jH8NjrSYHDR9+Sh1ar6UGrG79A4S5iUjYmEBBRu4ef9 +aOhc9ogvOVpHqoFCxTMtlPcu7jK+FqrrNVr6y2oVJHr7qpBQEy4TiD8xKRNncozL0TFUZ6hI/GUwiTsV +uJgfyjgfbFC5anPEXnXcaW6TI9Si4qTtK/Qqx8OHH9PPI/8ucyYt9huFO71YSByERuaNXTTLndPq7wsm +uiiYV6HeYm008vxX/vfntbnlabu0pqYctZVGFflf9VQ0XuotHKVGwTJAafEfjKHg+JrROrT+BAAA//+v +G1KqhgUAAA== +`, + }, + "/": { isDir: true, local: "server", diff --git a/server/store/mem.go b/server/store/mem.go index e63d00a..54aa965 100644 --- a/server/store/mem.go +++ b/server/store/mem.go @@ -40,7 +40,7 @@ func (ms *memoryStore) List(includeExpired bool) ([]*CertRecord, error) { defer ms.Unlock() for _, value := range ms.certs { - if !includeExpired && value.Expires.After(time.Now().UTC()) { + if !includeExpired && value.Expires.Before(time.Now().UTC()) { continue } records = append(records, value) @@ -62,7 +62,9 @@ func (ms *memoryStore) GetRevoked() ([]*CertRecord, error) { var revoked []*CertRecord all, _ := ms.List(false) for _, r := range all { - revoked = append(revoked, r) + if r.Revoked { + revoked = append(revoked, r) + } } return revoked, nil } diff --git a/server/store/store_test.go b/server/store/store_test.go index 3552d1c..594da37 100644 --- a/server/store/store_test.go +++ b/server/store/store_test.go @@ -49,7 +49,7 @@ func testStore(t *testing.T, db CertStorer) { if err := db.SetRecord(r); err != nil { t.Error(err) } - if _, err := db.List(); err != nil { + if _, err := db.List(true); err != nil { t.Error(err) } diff --git a/server/templates/certs.go b/server/templates/certs.go index 89ec5a1..0aa2b7c 100644 --- a/server/templates/certs.go +++ b/server/templates/certs.go @@ -13,7 +13,7 @@ const Certs = ` <link rel="stylesheet" href="/static/css/skeleton.css"> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet"> </head> -<body> +<body onload="loadCerts()"> <div class="container"> <div class="page-header"> <h2>Issued SSH Certificates</h2> @@ -21,8 +21,9 @@ const Certs = ` <div id="issued"> <input class="u-full-width search" type="text" placeholder="Search" id="q" /> + <button class="button-primary" id="toggle-certs" onclick="toggleExpired()">Show Expired</button> <form action="/admin/revoke" method="post" id="form_revoke"> - {{ .CSRF }} + {{ .csrfField }} <table id="cert-table"> <thead> <tr> @@ -34,17 +35,15 @@ const Certs = ` <th>Revoke</th> </tr> </thead> - <tbody class="list"> - {{range .Certs}} - <tr> - <td class="keyid">{{.KeyID}}</td> - <td>{{.CreatedAt}}</td> - <td>{{.Expires}}</td> - <td class="principals">{{.Principals}}</td> - <td>{{.Revoked}}</td> - <td>{{if not .Revoked}}<input style="margin:0;" type="checkbox" value="{{.KeyID}}" name="cert_id" id="cert_id" />{{end}}</td> + <tbody id="list" class="list"> + <tr> + <td class="keyid"></td> + <td></td> + <td></td> + <td class="principals"></td> + <td></td> + <td></td> </tr> - {{ end }} </tbody> </table> </form> @@ -59,5 +58,6 @@ var options = { } var issuedList = new List('issued', options); </script> +<script src="/static/js/table.js"></script> </html> ` |