forked from Mirrors/keyoxide-web
wrapping verifyProof in try
This will prevent other proofs from failing if there is an error in one of them See #44
This commit is contained in:
parent
0491c3db38
commit
e07cfd7f7b
1 changed files with 302 additions and 298 deletions
|
@ -435,107 +435,276 @@ async function verifyProof(url, fingerprint) {
|
||||||
// Init
|
// Init
|
||||||
let reVerify, match, output = {url: url, type: null, proofUrl: url, proofUrlFetch: null, isVerified: false, display: null, qr: null};
|
let reVerify, match, output = {url: url, type: null, proofUrl: url, proofUrlFetch: null, isVerified: false, display: null, qr: null};
|
||||||
|
|
||||||
// DNS
|
try {
|
||||||
if (/^dns:/.test(url)) {
|
// DNS
|
||||||
output.type = "domain";
|
if (/^dns:/.test(url)) {
|
||||||
output.display = url.replace(/dns:/, '').replace(/\?type=TXT/, '');
|
output.type = "domain";
|
||||||
output.proofUrl = `https://dns.shivering-isles.com/dns-query?name=${output.display}&type=TXT`;
|
output.display = url.replace(/dns:/, '').replace(/\?type=TXT/, '');
|
||||||
output.proofUrlFetch = output.proofUrl;
|
output.proofUrl = `https://dns.shivering-isles.com/dns-query?name=${output.display}&type=TXT`;
|
||||||
output.url = `https://${output.display}`;
|
output.proofUrlFetch = output.proofUrl;
|
||||||
|
output.url = `https://${output.display}`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
response = await fetch(output.proofUrlFetch, {
|
response = await fetch(output.proofUrlFetch, {
|
||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/json'
|
Accept: 'application/json'
|
||||||
},
|
},
|
||||||
credentials: 'omit'
|
credentials: 'omit'
|
||||||
});
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Response failed: ' + response.status);
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
reVerify = new RegExp(`openpgp4fpr:${fingerprint}`, 'i');
|
||||||
|
json.Answer.forEach((item, i) => {
|
||||||
|
if (reVerify.test(item.data)) {
|
||||||
|
output.isVerified = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
json = await response.json();
|
}
|
||||||
reVerify = new RegExp(`openpgp4fpr:${fingerprint}`, 'i');
|
// XMPP
|
||||||
json.Answer.forEach((item, i) => {
|
if (/^xmpp:/.test(url)) {
|
||||||
if (reVerify.test(item.data)) {
|
output.type = "xmpp";
|
||||||
|
match = url.match(/xmpp:([a-zA-Z0-9\.\-\_]*)@([a-zA-Z0-9\.\-\_]*)(?:\?(.*))?/);
|
||||||
|
output.display = `${match[1]}@${match[2]}`;
|
||||||
|
output.proofUrl = `https://PLACEHOLDER__XMPP_VCARD_SERVER_DOMAIN/api/vcard/${output.display}/DESC`;
|
||||||
|
output.qr = url;
|
||||||
|
|
||||||
|
try {
|
||||||
|
response = await fetchWithTimeout(output.proofUrl);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
||||||
|
if (reVerify.test(json)) {
|
||||||
output.isVerified = true;
|
output.isVerified = true;
|
||||||
}
|
}
|
||||||
});
|
} catch (e) {
|
||||||
} catch (e) {
|
} finally {
|
||||||
} finally {
|
return output;
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// XMPP
|
|
||||||
if (/^xmpp:/.test(url)) {
|
|
||||||
output.type = "xmpp";
|
|
||||||
match = url.match(/xmpp:([a-zA-Z0-9\.\-\_]*)@([a-zA-Z0-9\.\-\_]*)(?:\?(.*))?/);
|
|
||||||
output.display = `${match[1]}@${match[2]}`;
|
|
||||||
output.proofUrl = `https://PLACEHOLDER__XMPP_VCARD_SERVER_DOMAIN/api/vcard/${output.display}/DESC`;
|
|
||||||
output.qr = url;
|
|
||||||
|
|
||||||
try {
|
|
||||||
response = await fetchWithTimeout(output.proofUrl);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
}
|
||||||
json = await response.json();
|
|
||||||
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
|
||||||
if (reVerify.test(json)) {
|
|
||||||
output.isVerified = true;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
return output;
|
|
||||||
}
|
}
|
||||||
}
|
// Twitter
|
||||||
// Twitter
|
if (/^https:\/\/twitter.com/.test(url)) {
|
||||||
if (/^https:\/\/twitter.com/.test(url)) {
|
output.type = "twitter";
|
||||||
output.type = "twitter";
|
match = url.match(/https:\/\/twitter\.com\/(.*)\/status\/([0-9]*)(?:\?.*)?/);
|
||||||
match = url.match(/https:\/\/twitter\.com\/(.*)\/status\/([0-9]*)(?:\?.*)?/);
|
output.display = `@${match[1]}`;
|
||||||
output.display = `@${match[1]}`;
|
output.url = `https://twitter.com/${match[1]}`;
|
||||||
output.url = `https://twitter.com/${match[1]}`;
|
output.proofUrlFetch = `/server/verify/twitter
|
||||||
output.proofUrlFetch = `/server/verify/twitter
|
|
||||||
?tweetId=${encodeURIComponent(match[2])}
|
?tweetId=${encodeURIComponent(match[2])}
|
||||||
&account=${encodeURIComponent(match[1])}
|
&account=${encodeURIComponent(match[1])}
|
||||||
&fingerprint=${fingerprint}`;
|
&fingerprint=${fingerprint}`;
|
||||||
try {
|
try {
|
||||||
response = await fetch(output.proofUrlFetch);
|
response = await fetch(output.proofUrlFetch);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Response failed: ' + response.status);
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
output.isVerified = json.isVerified;
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// HN
|
||||||
|
if (/^https:\/\/news.ycombinator.com/.test(url)) {
|
||||||
|
output.type = "hackernews";
|
||||||
|
match = url.match(/https:\/\/news.ycombinator.com\/user\?id=(.*)/);
|
||||||
|
output.display = match[1];
|
||||||
|
output.proofUrl = `https://hacker-news.firebaseio.com/v0/user/${match[1]}.json`;
|
||||||
|
output.proofUrlFetch = output.proofUrl;
|
||||||
|
try {
|
||||||
|
response = await fetch(output.proofUrlFetch, {
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/json'
|
||||||
|
},
|
||||||
|
credentials: 'omit'
|
||||||
|
});
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
reVerify = new RegExp(`openpgp4fpr:${fingerprint}`, 'i');
|
||||||
|
if (reVerify.test(json.about)) {
|
||||||
|
output.isVerified = true;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!output.isVerified) {
|
||||||
|
output.proofUrlFetch = `/server/verify/proxy
|
||||||
|
?url=${encodeURIComponent(output.proofUrl)}
|
||||||
|
&fingerprint=${fingerprint}
|
||||||
|
&checkRelation=contains
|
||||||
|
&checkPath=about
|
||||||
|
&checkClaimFormat=message`;
|
||||||
|
try {
|
||||||
|
response = await fetch(output.proofUrlFetch);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
output.isVerified = json.verified;
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
json = await response.json();
|
|
||||||
output.isVerified = json.isVerified;
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
}
|
// dev.to
|
||||||
// HN
|
if (/^https:\/\/dev\.to\//.test(url)) {
|
||||||
if (/^https:\/\/news.ycombinator.com/.test(url)) {
|
output.type = "dev.to";
|
||||||
output.type = "hackernews";
|
match = url.match(/https:\/\/dev\.to\/(.*)\/(.*)/);
|
||||||
match = url.match(/https:\/\/news.ycombinator.com\/user\?id=(.*)/);
|
output.display = match[1];
|
||||||
output.display = match[1];
|
output.url = `https://dev.to/${match[1]}`;
|
||||||
output.proofUrl = `https://hacker-news.firebaseio.com/v0/user/${match[1]}.json`;
|
output.proofUrlFetch = `https://dev.to/api/articles/${match[1]}/${match[2]}`;
|
||||||
output.proofUrlFetch = output.proofUrl;
|
try {
|
||||||
try {
|
response = await fetch(output.proofUrlFetch);
|
||||||
response = await fetch(output.proofUrlFetch, {
|
if (!response.ok) {
|
||||||
headers: {
|
throw new Error('Response failed: ' + response.status);
|
||||||
Accept: 'application/json'
|
}
|
||||||
},
|
json = await response.json();
|
||||||
credentials: 'omit'
|
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
||||||
});
|
if (reVerify.test(json.body_markdown)) {
|
||||||
if (!response.ok) {
|
output.isVerified = true;
|
||||||
throw new Error('Response failed: ' + response.status);
|
}
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
json = await response.json();
|
|
||||||
reVerify = new RegExp(`openpgp4fpr:${fingerprint}`, 'i');
|
|
||||||
if (reVerify.test(json.about)) {
|
|
||||||
output.isVerified = true;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
}
|
}
|
||||||
|
// Reddit
|
||||||
if (!output.isVerified) {
|
if (/^https:\/\/(?:www\.)?reddit\.com\/user/.test(url)) {
|
||||||
|
output.type = "reddit";
|
||||||
|
match = url.match(/https:\/\/(?:www\.)?reddit\.com\/user\/(.*)\/comments\/(.*)\/([^/]*)/);
|
||||||
|
output.display = match[1];
|
||||||
|
output.url = `https://www.reddit.com/user/${match[1]}`;
|
||||||
|
output.proofUrl = `https://www.reddit.com/user/${match[1]}/comments/${match[2]}.json`;
|
||||||
|
output.proofUrlFetch = `/server/verify/proxy
|
||||||
|
?url=${encodeURIComponent(output.proofUrl)}
|
||||||
|
&fingerprint=${fingerprint}
|
||||||
|
&checkRelation=contains
|
||||||
|
&checkPath=data,children,data,selftext
|
||||||
|
&checkClaimFormat=message`;
|
||||||
|
try {
|
||||||
|
response = await fetch(output.proofUrlFetch);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
output.isVerified = json.isVerified;
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Gitea
|
||||||
|
if (/\/gitea_proof$/.test(url)) {
|
||||||
|
output.type = "gitea";
|
||||||
|
match = url.match(/https:\/\/(.*)\/(.*)\/gitea_proof/);
|
||||||
|
output.display = `${match[2]}@${match[1]}`;
|
||||||
|
output.url = `https://${match[1]}/${match[2]}`;
|
||||||
|
output.proofUrl = `https://${match[1]}/api/v1/repos/${match[2]}/gitea_proof`;
|
||||||
|
output.proofUrlFetch = `/server/verify/proxy
|
||||||
|
?url=${encodeURIComponent(output.proofUrl)}
|
||||||
|
&fingerprint=${fingerprint}
|
||||||
|
&checkRelation=eq
|
||||||
|
&checkPath=description
|
||||||
|
&checkClaimFormat=message`;
|
||||||
|
output.proofUrl = url; // Actually set the proof URL to something user-friendly
|
||||||
|
try {
|
||||||
|
response = await fetch(output.proofUrlFetch);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
output.isVerified = json.isVerified;
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Github
|
||||||
|
if (/^https:\/\/gist.github.com/.test(url)) {
|
||||||
|
output.type = "github";
|
||||||
|
match = url.match(/https:\/\/gist.github.com\/(.*)\/(.*)/);
|
||||||
|
output.display = match[1];
|
||||||
|
output.url = `https://github.com/${match[1]}`;
|
||||||
|
output.proofUrlFetch = `https://api.github.com/gists/${match[2]}`;
|
||||||
|
try {
|
||||||
|
response = await fetch(output.proofUrlFetch, {
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/json'
|
||||||
|
},
|
||||||
|
credentials: 'omit'
|
||||||
|
});
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
||||||
|
if (reVerify.test(json.files["openpgp.md"].content)) {
|
||||||
|
output.isVerified = true;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// GitLab
|
||||||
|
if (/\/gitlab_proof$/.test(url)) {
|
||||||
|
output.type = "gitlab";
|
||||||
|
match = url.match(/https:\/\/(.*)\/(.*)\/gitlab_proof/);
|
||||||
|
output.display = `${match[2]}@${match[1]}`;
|
||||||
|
output.url = `https://${match[1]}/${match[2]}`;
|
||||||
|
output.proofUrlFetch = `https://${match[1]}/api/v4/users?username=${match[2]}`;
|
||||||
|
try {
|
||||||
|
const opts = {
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/json'
|
||||||
|
},
|
||||||
|
credentials: 'omit'
|
||||||
|
};
|
||||||
|
// Get user
|
||||||
|
response = await fetch(output.proofUrlFetch, opts);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
const user = json.find(user => user.username === match[2]);
|
||||||
|
if (!user) {
|
||||||
|
throw new Error('No user with username ' + match[2]);
|
||||||
|
}
|
||||||
|
// Get project
|
||||||
|
output.proofUrlFetch = `https://${match[1]}/api/v4/users/${user.id}/projects`;
|
||||||
|
response = await fetch(output.proofUrlFetch, opts);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Response failed: ' + response.status);
|
||||||
|
}
|
||||||
|
json = await response.json();
|
||||||
|
const project = json.find(proj => proj.path === 'gitlab_proof');
|
||||||
|
if (!project) {
|
||||||
|
throw new Error('No project at ' + url);
|
||||||
|
}
|
||||||
|
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
||||||
|
if (reVerify.test(project.description)) {
|
||||||
|
output.isVerified = true;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Lobsters
|
||||||
|
if (/^https:\/\/lobste.rs/.test(url)) {
|
||||||
|
output.type = "lobsters";
|
||||||
|
match = url.match(/https:\/\/lobste.rs\/u\/(.*)/);
|
||||||
|
output.display = match[1];
|
||||||
|
output.proofUrl = `https://lobste.rs/u/${match[1]}.json`;
|
||||||
output.proofUrlFetch = `/server/verify/proxy
|
output.proofUrlFetch = `/server/verify/proxy
|
||||||
?url=${encodeURIComponent(output.proofUrl)}
|
?url=${encodeURIComponent(output.proofUrl)}
|
||||||
&fingerprint=${fingerprint}
|
&fingerprint=${fingerprint}
|
||||||
|
@ -548,94 +717,16 @@ async function verifyProof(url, fingerprint) {
|
||||||
throw new Error('Response failed: ' + response.status);
|
throw new Error('Response failed: ' + response.status);
|
||||||
}
|
}
|
||||||
json = await response.json();
|
json = await response.json();
|
||||||
output.isVerified = json.verified;
|
output.isVerified = json.isVerified;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return output;
|
// Catchall
|
||||||
}
|
// Fediverse
|
||||||
// dev.to
|
|
||||||
if (/^https:\/\/dev\.to\//.test(url)) {
|
|
||||||
output.type = "dev.to";
|
|
||||||
match = url.match(/https:\/\/dev\.to\/(.*)\/(.*)/);
|
|
||||||
output.display = match[1];
|
|
||||||
output.url = `https://dev.to/${match[1]}`;
|
|
||||||
output.proofUrlFetch = `https://dev.to/api/articles/${match[1]}/${match[2]}`;
|
|
||||||
try {
|
try {
|
||||||
response = await fetch(output.proofUrlFetch);
|
response = await fetch(url, {
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
|
||||||
json = await response.json();
|
|
||||||
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
|
||||||
if (reVerify.test(json.body_markdown)) {
|
|
||||||
output.isVerified = true;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Reddit
|
|
||||||
if (/^https:\/\/(?:www\.)?reddit\.com\/user/.test(url)) {
|
|
||||||
output.type = "reddit";
|
|
||||||
match = url.match(/https:\/\/(?:www\.)?reddit\.com\/user\/(.*)\/comments\/(.*)\/([^/]*)/);
|
|
||||||
output.display = match[1];
|
|
||||||
output.url = `https://www.reddit.com/user/${match[1]}`;
|
|
||||||
output.proofUrl = `https://www.reddit.com/user/${match[1]}/comments/${match[2]}.json`;
|
|
||||||
output.proofUrlFetch = `/server/verify/proxy
|
|
||||||
?url=${encodeURIComponent(output.proofUrl)}
|
|
||||||
&fingerprint=${fingerprint}
|
|
||||||
&checkRelation=contains
|
|
||||||
&checkPath=data,children,data,selftext
|
|
||||||
&checkClaimFormat=message`;
|
|
||||||
try {
|
|
||||||
response = await fetch(output.proofUrlFetch);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
|
||||||
json = await response.json();
|
|
||||||
output.isVerified = json.isVerified;
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Gitea
|
|
||||||
if (/\/gitea_proof$/.test(url)) {
|
|
||||||
output.type = "gitea";
|
|
||||||
match = url.match(/https:\/\/(.*)\/(.*)\/gitea_proof/);
|
|
||||||
output.display = `${match[2]}@${match[1]}`;
|
|
||||||
output.url = `https://${match[1]}/${match[2]}`;
|
|
||||||
output.proofUrl = `https://${match[1]}/api/v1/repos/${match[2]}/gitea_proof`;
|
|
||||||
output.proofUrlFetch = `/server/verify/proxy
|
|
||||||
?url=${encodeURIComponent(output.proofUrl)}
|
|
||||||
&fingerprint=${fingerprint}
|
|
||||||
&checkRelation=eq
|
|
||||||
&checkPath=description
|
|
||||||
&checkClaimFormat=message`;
|
|
||||||
output.proofUrl = url; // Actually set the proof URL to something user-friendly
|
|
||||||
try {
|
|
||||||
response = await fetch(output.proofUrlFetch);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
|
||||||
json = await response.json();
|
|
||||||
output.isVerified = json.isVerified;
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Github
|
|
||||||
if (/^https:\/\/gist.github.com/.test(url)) {
|
|
||||||
output.type = "github";
|
|
||||||
match = url.match(/https:\/\/gist.github.com\/(.*)\/(.*)/);
|
|
||||||
output.display = match[1];
|
|
||||||
output.url = `https://github.com/${match[1]}`;
|
|
||||||
output.proofUrlFetch = `https://api.github.com/gists/${match[2]}`;
|
|
||||||
try {
|
|
||||||
response = await fetch(output.proofUrlFetch, {
|
|
||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/json'
|
Accept: 'application/json'
|
||||||
},
|
},
|
||||||
|
@ -645,145 +736,58 @@ async function verifyProof(url, fingerprint) {
|
||||||
throw new Error('Response failed: ' + response.status);
|
throw new Error('Response failed: ' + response.status);
|
||||||
}
|
}
|
||||||
json = await response.json();
|
json = await response.json();
|
||||||
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
if ('attachment' in json) {
|
||||||
if (reVerify.test(json.files["openpgp.md"].content)) {
|
match = url.match(/https:\/\/(.*)\/@(.*)/);
|
||||||
output.isVerified = true;
|
json.attachment.forEach((item, i) => {
|
||||||
|
reVerify = new RegExp(fingerprint, 'i');
|
||||||
|
if (reVerify.test(item.value)) {
|
||||||
|
output.type = "fediverse";
|
||||||
|
output.display = `@${json.preferredUsername}@${[match[1]]}`;
|
||||||
|
output.proofUrlFetch = json.url;
|
||||||
|
output.isVerified = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} catch (e) {
|
if (!output.type && 'summary' in json) {
|
||||||
} finally {
|
match = url.match(/https:\/\/(.*)\/users\/(.*)/);
|
||||||
return output;
|
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
||||||
}
|
if (reVerify.test(json.summary)) {
|
||||||
}
|
|
||||||
// GitLab
|
|
||||||
if (/\/gitlab_proof$/.test(url)) {
|
|
||||||
output.type = "gitlab";
|
|
||||||
match = url.match(/https:\/\/(.*)\/(.*)\/gitlab_proof/);
|
|
||||||
output.display = `${match[2]}@${match[1]}`;
|
|
||||||
output.url = `https://${match[1]}/${match[2]}`;
|
|
||||||
output.proofUrlFetch = `https://${match[1]}/api/v4/users?username=${match[2]}`;
|
|
||||||
try {
|
|
||||||
const opts = {
|
|
||||||
headers: {
|
|
||||||
Accept: 'application/json'
|
|
||||||
},
|
|
||||||
credentials: 'omit'
|
|
||||||
};
|
|
||||||
// Get user
|
|
||||||
response = await fetch(output.proofUrlFetch, opts);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
|
||||||
json = await response.json();
|
|
||||||
const user = json.find(user => user.username === match[2]);
|
|
||||||
if (!user) {
|
|
||||||
throw new Error('No user with username ' + match[2]);
|
|
||||||
}
|
|
||||||
// Get project
|
|
||||||
output.proofUrlFetch = `https://${match[1]}/api/v4/users/${user.id}/projects`;
|
|
||||||
response = await fetch(output.proofUrlFetch, opts);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
|
||||||
json = await response.json();
|
|
||||||
const project = json.find(proj => proj.path === 'gitlab_proof');
|
|
||||||
if (!project) {
|
|
||||||
throw new Error('No project at ' + url);
|
|
||||||
}
|
|
||||||
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
|
||||||
if (reVerify.test(project.description)) {
|
|
||||||
output.isVerified = true;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Lobsters
|
|
||||||
if (/^https:\/\/lobste.rs/.test(url)) {
|
|
||||||
output.type = "lobsters";
|
|
||||||
match = url.match(/https:\/\/lobste.rs\/u\/(.*)/);
|
|
||||||
output.display = match[1];
|
|
||||||
output.proofUrl = `https://lobste.rs/u/${match[1]}.json`;
|
|
||||||
output.proofUrlFetch = `/server/verify/proxy
|
|
||||||
?url=${encodeURIComponent(output.proofUrl)}
|
|
||||||
&fingerprint=${fingerprint}
|
|
||||||
&checkRelation=contains
|
|
||||||
&checkPath=about
|
|
||||||
&checkClaimFormat=message`;
|
|
||||||
try {
|
|
||||||
response = await fetch(output.proofUrlFetch);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
|
||||||
json = await response.json();
|
|
||||||
output.isVerified = json.isVerified;
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Catchall
|
|
||||||
// Fediverse
|
|
||||||
try {
|
|
||||||
response = await fetch(url, {
|
|
||||||
headers: {
|
|
||||||
Accept: 'application/json'
|
|
||||||
},
|
|
||||||
credentials: 'omit'
|
|
||||||
});
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Response failed: ' + response.status);
|
|
||||||
}
|
|
||||||
json = await response.json();
|
|
||||||
if ('attachment' in json) {
|
|
||||||
match = url.match(/https:\/\/(.*)\/@(.*)/);
|
|
||||||
json.attachment.forEach((item, i) => {
|
|
||||||
reVerify = new RegExp(fingerprint, 'i');
|
|
||||||
if (reVerify.test(item.value)) {
|
|
||||||
output.type = "fediverse";
|
output.type = "fediverse";
|
||||||
output.display = `@${json.preferredUsername}@${[match[1]]}`;
|
output.display = `@${json.preferredUsername}@${[match[1]]}`;
|
||||||
output.proofUrlFetch = json.url;
|
output.proofUrlFetch = json.url;
|
||||||
output.isVerified = true;
|
output.isVerified = true;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
if (!output.type && 'summary' in json) {
|
|
||||||
match = url.match(/https:\/\/(.*)\/users\/(.*)/);
|
|
||||||
reVerify = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${fingerprint}]`, 'i');
|
|
||||||
if (reVerify.test(json.summary)) {
|
|
||||||
output.type = "fediverse";
|
|
||||||
output.display = `@${json.preferredUsername}@${[match[1]]}`;
|
|
||||||
output.proofUrlFetch = json.url;
|
|
||||||
output.isVerified = true;
|
|
||||||
}
|
}
|
||||||
|
if (output.type) {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn(e);
|
||||||
}
|
}
|
||||||
if (output.type) {
|
// Discourse
|
||||||
return output;
|
try {
|
||||||
}
|
match = url.match(/https:\/\/(.*)\/u\/(.*)/);
|
||||||
} catch (e) {
|
output.proofUrl = `${url}.json`;
|
||||||
console.warn(e);
|
output.proofUrlFetch = `/server/verify/proxy
|
||||||
}
|
|
||||||
// Discourse
|
|
||||||
try {
|
|
||||||
match = url.match(/https:\/\/(.*)\/u\/(.*)/);
|
|
||||||
output.proofUrl = `${url}.json`;
|
|
||||||
output.proofUrlFetch = `/server/verify/proxy
|
|
||||||
?url=${encodeURIComponent(output.proofUrl)}
|
?url=${encodeURIComponent(output.proofUrl)}
|
||||||
&fingerprint=${fingerprint}
|
&fingerprint=${fingerprint}
|
||||||
&checkRelation=contains
|
&checkRelation=contains
|
||||||
&checkPath=user,bio_raw
|
&checkPath=user,bio_raw
|
||||||
&checkClaimFormat=message`;
|
&checkClaimFormat=message`;
|
||||||
try {
|
try {
|
||||||
response = await fetch(output.proofUrlFetch);
|
response = await fetch(output.proofUrlFetch);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Response failed: ' + response.status);
|
throw new Error('Response failed: ' + response.status);
|
||||||
}
|
}
|
||||||
json = await response.json();
|
json = await response.json();
|
||||||
if (json.isVerified) {
|
if (json.isVerified) {
|
||||||
output.type = "discourse";
|
output.type = "discourse";
|
||||||
output.display = `${match[2]}@${match[1]}`;
|
output.display = `${match[2]}@${match[1]}`;
|
||||||
output.isVerified = json.isVerified;
|
output.isVerified = json.isVerified;
|
||||||
return output;
|
return output;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn(e);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn(e);
|
console.warn(e);
|
||||||
|
@ -791,7 +795,7 @@ async function verifyProof(url, fingerprint) {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn(e);
|
console.warn(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return output without confirmed proof
|
// Return output without confirmed proof
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue