From 92ce86a6e0a1e5d967a4eb6b559d9f615aa29f6d Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sun, 12 Mar 2023 14:51:38 +0100 Subject: [PATCH] feat: Add support for Keybase claims --- src/claimDefinitions/index.js | 3 +- src/claimDefinitions/keybase.js | 74 +++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/claimDefinitions/keybase.js diff --git a/src/claimDefinitions/index.js b/src/claimDefinitions/index.js index 67268b6..479c7e6 100644 --- a/src/claimDefinitions/index.js +++ b/src/claimDefinitions/index.js @@ -34,7 +34,8 @@ const data = { activitypub: require('./activitypub'), discourse: require('./discourse'), owncast: require('./owncast'), - stackexchange: require('./stackexchange') + stackexchange: require('./stackexchange'), + keybase: require('./keybase') } exports.list = Object.keys(data) diff --git a/src/claimDefinitions/keybase.js b/src/claimDefinitions/keybase.js new file mode 100644 index 0000000..a313ffe --- /dev/null +++ b/src/claimDefinitions/keybase.js @@ -0,0 +1,74 @@ +/* +Copyright 2023 Yarmo Mackenbach + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const E = require('../enums') + +const reURI = /^https:\/\/keybase.io\/(.*)\/?/ + +const processURI = (uri) => { + const match = uri.match(reURI) + + return { + serviceprovider: { + type: 'web', + name: 'keybase' + }, + match: { + regularExpression: reURI, + isAmbiguous: false + }, + profile: { + display: match[1], + uri: uri, + qr: null + }, + proof: { + uri: `https://keybase.io/_/api/1.0/user/lookup.json?username=${match[1]}`, + request: { + fetcher: E.Fetcher.HTTP, + access: E.ProofAccess.NOCORS, + format: E.ProofFormat.JSON, + data: { + url: `https://keybase.io/_/api/1.0/user/lookup.json?username=${match[1]}`, + format: E.ProofFormat.JSON + } + } + }, + claim: [{ + format: E.ClaimFormat.FINGERPRINT, + relation: E.ClaimRelation.CONTAINS, + path: ['them', 'public_keys', 'primary', 'key_fingerprint'] + }] + } +} + +const tests = [ + { + uri: 'https://keybase.io/Alice', + shouldMatch: true + }, + { + uri: 'https://keybase.io/Alice/', + shouldMatch: true + }, + { + uri: 'https://domain.org/Alice', + shouldMatch: false + } +] + +exports.reURI = reURI +exports.processURI = processURI +exports.tests = tests