import * as webauthn from "./webauthn.js" // const host = document.location.protocol + "//" + document.location.host const host = "http://localhost:8081" class UserInfoPanel extends HTMLElement { constructor(user) { super() let template = document.getElementById("user-info-panel") const shadowRoot = this.attachShadow({ mode: "open" }) const panel = template.content.cloneNode(true) let handle = user.handle panel.querySelector('h3').innerHTML = user.name panel.querySelector('input[name=name]').value = user.name panel.querySelector('form').action = panel.querySelector('form').action.replace(":id", handle) panel.querySelector('pre').textContent = handle panel.querySelector('input[name=greeting]').value = user.greeting panel.querySelector('input[name=schedule]').value = user.schedule panel.querySelector('input[name=expires]').value = user.expires panel.querySelector('input[name=max_ttl]').value = user.max_ttl panel.querySelector('input[name=is_admin]').checked = user.is_admin panel.querySelector('input[name=second_factor]').checked = user.second_factor shadowRoot.appendChild(panel) } } customElements.define("user-info-panel", UserInfoPanel) class REXRow extends HTMLElement { constructor(rex) { super() let template = document.getElementById("rex-record") const shadowRoot = this.attachShadow({ mode: "open" }) const row = template.content.cloneNode(true) row.querySelector('.log-record-timestamp').innerText = (new Date(rex.timestamp)).toISOString() row.querySelector('.log-record-user').innerText = rex.user row.querySelector('.log-record-status').innerHTML = !rex.error ? "ok" : `${rex.error} ${rex.failure}` row.querySelector('.log-record-second_factor').innerText = rex.second_factor ? "✓" : "" row.querySelector('.log-record-ip_address').innerText = rex.ip_address row.querySelector('.log-record-user_agent').innerText = rex.user_agent shadowRoot.appendChild(row) } } customElements.define("rex-record", REXRow) async function fetchUsers() { console.debug("fetching users") let response = await window.fetch(`${host}/api/user`, {credentials: "include"}) if (!response.ok) { alert("Could not load users") return } let json = {} try { json = await response.json() } catch (err) { alert(err) return } document.querySelector("#user-list").replaceChildren(...json.map(u => new UserInfoPanel(u))) } async function fetchLog() { console.debug("fetching log") let response = await window.fetch(`${host}/api/log?last=20`, {credentials: "include"}) if (!response.ok) { alert("Could not load log") return } let json = {} try { json = await response.json() } catch (err) { alert(err) return } document.querySelector("#rex-records").replaceChildren(...json.map(rex => { const tr = document.createElement("tr") tr.classList.add("rex-staus-" + (!rex.error ? "ok" : "failure")) const status = !rex.error ? "ok" : `${rex.error} ${rex.failure}` tr.innerHTML = `