keyoxide-web/static/kx-claim.js

192 lines
9.5 KiB
JavaScript
Raw Normal View History

class Claim extends HTMLElement {
// Specify the attributes to observe
static get observedAttributes() {
return ['data-claim'];
}
constructor() {
// Call super
super();
}
attributeChangedCallback(name, oldValue, newValue) {
this.updateContent(newValue);
}
async verify() {
const claim = new doip.Claim(JSON.parse(this.getAttribute('data-claim')));
await claim.verify({
proxy: {
policy: 'adaptive',
hostname: 'PLACEHOLDER__PROXY_HOSTNAME'
}
});
this.setAttribute('data-claim', JSON.stringify(claim));
}
updateContent(value) {
2021-05-04 05:57:33 -06:00
const root = this;
const claim = new doip.Claim(JSON.parse(value));
switch (claim.matches[0].serviceprovider.name) {
case 'dns':
case 'xmpp':
case 'irc':
2021-05-04 05:57:33 -06:00
root.querySelector('.info .subtitle').innerText = claim.matches[0].serviceprovider.name.toUpperCase();
break;
default:
2021-05-04 05:57:33 -06:00
root.querySelector('.info .subtitle').innerText = claim.matches[0].serviceprovider.name;
break;
}
2021-05-04 05:57:33 -06:00
root.querySelector('.info .title').innerText = claim.matches[0].profile.display;
try {
if (claim.status === 'verified') {
2021-05-04 05:57:33 -06:00
root.querySelector('.icons .verificationStatus').setAttribute('data-value', claim.verification.result ? 'success' : 'failed');
} else {
2021-05-04 05:57:33 -06:00
root.querySelector('.icons .verificationStatus').setAttribute('data-value', 'running');
}
} catch (error) {
2021-05-04 05:57:33 -06:00
root.querySelector('.icons .verificationStatus').setAttribute('data-value', 'failed');
}
2021-05-04 05:57:33 -06:00
const elContent = root.querySelector('.content');
elContent.innerHTML = ``;
// Handle failed ambiguous claim
if (claim.status === 'verified' && !claim.verification.result && claim.isAmbiguous()) {
2021-05-04 05:57:33 -06:00
root.querySelector('.info .subtitle').innerText = '---';
2021-05-03 03:48:48 -06:00
const subsection_alert = elContent.appendChild(document.createElement('div'));
subsection_alert.setAttribute('class', 'subsection');
const subsection_alert_icon = subsection_alert.appendChild(document.createElement('img'));
subsection_alert_icon.setAttribute('src', '/static/img/alert-decagram.png');
2021-06-07 03:47:09 -06:00
subsection_alert_icon.setAttribute('alt', '');
2021-06-07 03:56:29 -06:00
subsection_alert_icon.setAttribute('aria-hidden', 'true');
2021-05-03 03:48:48 -06:00
const subsection_alert_text = subsection_alert.appendChild(document.createElement('div'));
2021-05-03 03:48:48 -06:00
const message = subsection_alert_text.appendChild(document.createElement('p'));
2021-05-02 05:06:18 -06:00
message.innerHTML = `None of the matched service providers could be verified. Keyoxide was not able to determine which was the correct service provider or why the verification process failed.`;
return;
}
// Links to profile and proof
2021-05-03 03:48:48 -06:00
const subsection_links = elContent.appendChild(document.createElement('div'));
subsection_links.setAttribute('class', 'subsection');
const subsection_links_icon = subsection_links.appendChild(document.createElement('img'));
subsection_links_icon.setAttribute('src', '/static/img/link.png');
2021-06-07 03:47:09 -06:00
subsection_links_icon.setAttribute('alt', '');
2021-06-07 03:56:29 -06:00
subsection_links_icon.setAttribute('aria-hidden', 'true');
2021-05-03 03:48:48 -06:00
const subsection_links_text = subsection_links.appendChild(document.createElement('div'));
2021-05-03 03:48:48 -06:00
const profile_link = subsection_links_text.appendChild(document.createElement('p'));
if (claim.matches[0].profile.uri) {
2021-06-09 05:58:36 -06:00
profile_link.innerHTML = `Profile link: <a rel="me" href="${claim.matches[0].profile.uri}" aria-label="link to profile">${claim.matches[0].profile.uri}</a>`;
} else {
profile_link.innerHTML = `Profile link: not accessible from browser`;
}
2021-05-03 03:48:48 -06:00
const proof_link = subsection_links_text.appendChild(document.createElement('p'));
if (claim.matches[0].proof.uri) {
2021-06-09 05:58:36 -06:00
proof_link.innerHTML = `Proof link: <a href="${claim.matches[0].proof.uri}" aria-label="link to profile">${claim.matches[0].proof.uri}</a>`;
} else {
proof_link.innerHTML = `Proof link: not accessible from browser`;
}
2021-05-03 03:48:48 -06:00
// QR Code
if (claim.matches[0].profile.qr) {
elContent.appendChild(document.createElement('hr'));
const subsection_qr = elContent.appendChild(document.createElement('div'));
subsection_qr.setAttribute('class', 'subsection');
const subsection_qr_icon = subsection_qr.appendChild(document.createElement('img'));
subsection_qr_icon.setAttribute('src', '/static/img/qrcode.png');
2021-06-07 03:47:09 -06:00
subsection_qr_icon.setAttribute('alt', '');
2021-06-07 03:56:29 -06:00
subsection_qr_icon.setAttribute('aria-hidden', 'true');
2021-05-03 03:48:48 -06:00
const subsection_qr_text = subsection_qr.appendChild(document.createElement('div'));
const button_profileQR = subsection_qr_text.appendChild(document.createElement('button'));
button_profileQR.innerText = `Show profile QR`;
2021-05-03 04:06:37 -06:00
button_profileQR.setAttribute('onClick', `showQR('${claim.matches[0].profile.qr}', 'url')`);
2021-06-09 05:58:36 -06:00
button_profileQR.setAttribute('aria-label', `Show QR code linking to profile`);
2021-05-03 03:48:48 -06:00
}
elContent.appendChild(document.createElement('hr'));
// Claim verification status
2021-05-03 03:48:48 -06:00
const subsection_status = elContent.appendChild(document.createElement('div'));
subsection_status.setAttribute('class', 'subsection');
const subsection_status_icon = subsection_status.appendChild(document.createElement('img'));
subsection_status_icon.setAttribute('src', '/static/img/decagram.png');
2021-06-07 03:47:09 -06:00
subsection_status_icon.setAttribute('alt', '');
2021-06-07 03:56:29 -06:00
subsection_status_icon.setAttribute('aria-hidden', 'true');
2021-05-03 03:48:48 -06:00
const subsection_status_text = subsection_status.appendChild(document.createElement('div'));
2021-05-03 03:48:48 -06:00
const verification = subsection_status_text.appendChild(document.createElement('p'));
if (claim.status === 'verified') {
verification.innerHTML = `Claim verification has completed.`;
2021-05-03 03:48:48 -06:00
subsection_status_icon.setAttribute('src', '/static/img/check-decagram.png');
2021-06-07 03:47:09 -06:00
subsection_status_icon.setAttribute('alt', '');
2021-06-07 03:56:29 -06:00
subsection_status_icon.setAttribute('aria-hidden', 'true');
} else {
verification.innerHTML = `Claim verification is in progress&hellip;`;
return;
}
elContent.appendChild(document.createElement('hr'));
// Result of claim verification
2021-05-03 03:48:48 -06:00
const subsection_result = elContent.appendChild(document.createElement('div'));
subsection_result.setAttribute('class', 'subsection');
const subsection_result_icon = subsection_result.appendChild(document.createElement('img'));
subsection_result_icon.setAttribute('src', '/static/img/shield-search.png');
2021-06-07 03:47:09 -06:00
subsection_result_icon.setAttribute('alt', '');
2021-06-07 03:56:29 -06:00
subsection_result_icon.setAttribute('aria-hidden', 'true');
2021-05-03 03:48:48 -06:00
const subsection_result_text = subsection_result.appendChild(document.createElement('div'));
2021-05-03 03:48:48 -06:00
const result = subsection_result_text.appendChild(document.createElement('p'));
result.innerHTML = `The claim <strong>${claim.verification.result ? 'HAS BEEN' : 'COULD NOT BE'}</strong> verified by the proof.`;
// Additional info
if (claim.verification.proof.viaProxy) {
elContent.appendChild(document.createElement('hr'));
2021-05-03 03:48:48 -06:00
const subsection_info = elContent.appendChild(document.createElement('div'));
subsection_info.setAttribute('class', 'subsection');
const subsection_info_icon = subsection_info.appendChild(document.createElement('img'));
subsection_info_icon.setAttribute('src', '/static/img/information.png');
2021-06-07 03:47:09 -06:00
subsection_info_icon.setAttribute('alt', '');
2021-06-07 03:56:29 -06:00
subsection_info_icon.setAttribute('aria-hidden', 'true');
2021-05-03 03:48:48 -06:00
const subsection_info_text = subsection_info.appendChild(document.createElement('div'));
2021-05-03 03:48:48 -06:00
const result_proxyUsed = subsection_info_text.appendChild(document.createElement('p'));
2021-06-09 05:58:36 -06:00
result_proxyUsed.innerHTML = `A proxy was used to fetch the proof: <a href="https://PLACEHOLDER__PROXY_HOSTNAME" aria-label="Link to proxy server">PLACEHOLDER__PROXY_HOSTNAME</a>`;
}
// TODO Display errors
// if (claim.verification.errors.length > 0) {
// console.log(claim.verification);
// elContent.appendChild(document.createElement('hr'));
2021-05-03 03:48:48 -06:00
// const subsection_errors = elContent.appendChild(document.createElement('div'));
// subsection_errors.setAttribute('class', 'subsection');
// const subsection_errors_icon = subsection_errors.appendChild(document.createElement('img'));
// subsection_errors_icon.setAttribute('src', '/static/img/alert-circle.png');
// const subsection_errors_text = subsection_errors.appendChild(document.createElement('div'));
// claim.verification.errors.forEach(message => {
2021-05-03 03:48:48 -06:00
// const error = subsection_errors_text.appendChild(document.createElement('p'));
// if (message instanceof Error) {
// error.innerText = message.message;
// } else {
// error.innerText = message;
// }
// });
// }
}
}
customElements.define('kx-claim', Claim);