From 6f7ce392ff47468f6ac364ad7ec7759bbe42b63e Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Fri, 6 Oct 2023 21:30:17 +0200 Subject: [PATCH] feat: support HTML alias --- package.json | 1 + src/index.js | 1 + src/profile.js | 50 +++++++++++++++++++++++++++++++++++ yarn.lock | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) diff --git a/package.json b/package.json index 2827d46..81f622b 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "irc-upd": "^0.11.0", "jose": "^4.14.4", "merge-options": "^3.0.3", + "node-html-parser": "^6.1.10", "openpgp": "^5.5.0", "rfc4648": "^1.5.2", "valid-url": "^1.0.9", diff --git a/src/index.js b/src/index.js index ec2d94f..fbe6b66 100644 --- a/src/index.js +++ b/src/index.js @@ -17,6 +17,7 @@ export { Profile } from './profile.js' export { Persona } from './persona.js' export { Claim } from './claim.js' export { ServiceProvider } from './serviceProvider.js' +export * as profile from './profile.js' export * as ServiceProviderDefinitions from './serviceProviders/index.js' export * as proofs from './proofs.js' export * as openpgp from './openpgp.js' diff --git a/src/profile.js b/src/profile.js index 698d09c..0eb7676 100644 --- a/src/profile.js +++ b/src/profile.js @@ -13,8 +13,11 @@ 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. */ +import isFQDN from 'validator/lib/isFQDN.js' +import { parse } from 'node-html-parser' import { PublicKeyFetchMethod, PublicKeyEncoding, PublicKeyType } from './enums.js' import { Persona } from './persona.js' +import { fetchASPE } from './asp.js' /** * A profile of personas with identity claims @@ -222,3 +225,50 @@ function importJsonProfileVersion2 (profileObject) { return profile } + +/** + * Resolve a profile identifier and return a [Profile] + * @param {string} id + * @returns {Promise} + */ +export async function resolve (id) { + /** @type {string | null} */ + let aliasedId = null + + // Attempt resolving as alias + if (isFQDN(id)) { + aliasedId = await resolveToAlias(id) + } + + const finalId = aliasedId ?? id + + // Attempting resolving as ASPE + if (/^aspe:(:?.*)/.test(finalId)) { + return await fetchASPE(finalId) + } + + return null +} + +/** + * @param {string} id + * @returns {Promise} + */ +async function resolveToAlias (id) { + const url = new URL(`https://${id}`) + const res = await fetch(url) + .then(async res => { + if (res.status >= 400) return null + return await res.text() + }) + .catch(_ => null) + + if (!res) return null + + const dom = parse(res) + const meta = dom.querySelector('meta[name="ariadne-profile-id"]') + + if (!meta) return null + + return meta.attributes.content +} diff --git a/yarn.lock b/yarn.lock index b34c554..f0befb4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1020,6 +1020,11 @@ body-parser@1.20.1: type-is "~1.6.18" unpipe "1.0.0" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1426,6 +1431,22 @@ css-b64-images@~0.2.5: resolved "https://registry.yarnpkg.com/css-b64-images/-/css-b64-images-0.2.5.tgz#42005d83204b2b4a5d93b6b1a5644133b5927a02" integrity sha512-TgQBEdP07adhrDfXvI5o6bHGukKBNMzp2Ngckc/6d09zpjD2gc1Hl3Ca1CKgb8FXjHi88+Phv2Uegs2kTL4zjg== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1530,6 +1551,36 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -1570,6 +1621,11 @@ enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + entities@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" @@ -3202,6 +3258,14 @@ node-fetch@^2.6.1, node-fetch@^2.6.6: dependencies: whatwg-url "^5.0.0" +node-html-parser@^6.1.10: + version "6.1.10" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.10.tgz#5db11eac3ccbea6fc1b04a22c8a0e3a0774cfae6" + integrity sha512-6/uWdWxjQWQ7tMcFK2wWlrflsQUzh1HsEzlIf2j5+TtzfhT2yUvg3DwZYAmjEHeR3uX74ko7exjHW69J0tOzIg== + dependencies: + css-select "^5.1.0" + he "1.2.0" + node-releases@^2.0.8: version "2.0.10" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" @@ -3242,6 +3306,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + object-assign@^4: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"