Release 0.11.0

This commit is contained in:
Yarmo Mackenbach 2021-03-05 17:13:08 +01:00
parent ef48a9535c
commit 75c8ce3626
No known key found for this signature in database
GPG key ID: 37367F4AF4087AD1
7 changed files with 766 additions and 35 deletions

View file

@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
## [0.11.0] - 2021-03-05
## Added ## Added
- IRC service provider - IRC service provider
- Matrix service provider - Matrix service provider

781
dist/doip.js vendored
View file

@ -133,6 +133,121 @@ module.exports = mkrequest => (...args) => {
},{}],4:[function(require,module,exports){ },{}],4:[function(require,module,exports){
'use strict'; 'use strict';
var token = '%[a-f0-9]{2}';
var singleMatcher = new RegExp(token, 'gi');
var multiMatcher = new RegExp('(' + token + ')+', 'gi');
function decodeComponents(components, split) {
try {
// Try to decode the entire string first
return decodeURIComponent(components.join(''));
} catch (err) {
// Do nothing
}
if (components.length === 1) {
return components;
}
split = split || 1;
// Split the array in 2 parts
var left = components.slice(0, split);
var right = components.slice(split);
return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));
}
function decode(input) {
try {
return decodeURIComponent(input);
} catch (err) {
var tokens = input.match(singleMatcher);
for (var i = 1; i < tokens.length; i++) {
input = decodeComponents(tokens, i).join('');
tokens = input.match(singleMatcher);
}
return input;
}
}
function customDecodeURIComponent(input) {
// Keep track of all the replacements and prefill the map with the `BOM`
var replaceMap = {
'%FE%FF': '\uFFFD\uFFFD',
'%FF%FE': '\uFFFD\uFFFD'
};
var match = multiMatcher.exec(input);
while (match) {
try {
// Decode as big chunks as possible
replaceMap[match[0]] = decodeURIComponent(match[0]);
} catch (err) {
var result = decode(match[0]);
if (result !== match[0]) {
replaceMap[match[0]] = result;
}
}
match = multiMatcher.exec(input);
}
// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else
replaceMap['%C2'] = '\uFFFD';
var entries = Object.keys(replaceMap);
for (var i = 0; i < entries.length; i++) {
// Replace all decoded components
var key = entries[i];
input = input.replace(new RegExp(key, 'g'), replaceMap[key]);
}
return input;
}
module.exports = function (encodedURI) {
if (typeof encodedURI !== 'string') {
throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');
}
try {
encodedURI = encodedURI.replace(/\+/g, ' ');
// Try the built in decoder first
return decodeURIComponent(encodedURI);
} catch (err) {
// Fallback to a more advanced decoder
return customDecodeURIComponent(encodedURI);
}
};
},{}],5:[function(require,module,exports){
'use strict';
module.exports = function (obj, predicate) {
var ret = {};
var keys = Object.keys(obj);
var isArr = Array.isArray(predicate);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var val = obj[key];
if (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {
ret[key] = val;
}
}
return ret;
};
},{}],6:[function(require,module,exports){
'use strict';
module.exports = value => { module.exports = value => {
if (Object.prototype.toString.call(value) !== '[object Object]') { if (Object.prototype.toString.call(value) !== '[object Object]') {
@ -143,7 +258,7 @@ module.exports = value => {
return prototype === null || prototype === Object.prototype; return prototype === null || prototype === Object.prototype;
}; };
},{}],5:[function(require,module,exports){ },{}],7:[function(require,module,exports){
'use strict'; 'use strict';
const isOptionObject = require('is-plain-obj'); const isOptionObject = require('is-plain-obj');
@ -316,7 +431,7 @@ module.exports = function (...options) {
return merged._; return merged._;
}; };
},{"is-plain-obj":4}],6:[function(require,module,exports){ },{"is-plain-obj":6}],8:[function(require,module,exports){
(function (process){(function (){ (function (process){(function (){
// 'path' module extracted from Node.js v8.11.1 (only the posix part) // 'path' module extracted from Node.js v8.11.1 (only the posix part)
// transplited with Babel // transplited with Babel
@ -849,7 +964,7 @@ posix.posix = posix;
module.exports = posix; module.exports = posix;
}).call(this)}).call(this,require('_process')) }).call(this)}).call(this,require('_process'))
},{"_process":7}],7:[function(require,module,exports){ },{"_process":9}],9:[function(require,module,exports){
// shim for using process in browser // shim for using process in browser
var process = module.exports = {}; var process = module.exports = {};
@ -1035,7 +1150,441 @@ process.chdir = function (dir) {
}; };
process.umask = function() { return 0; }; process.umask = function() { return 0; };
},{}],8:[function(require,module,exports){ },{}],10:[function(require,module,exports){
'use strict';
const strictUriEncode = require('strict-uri-encode');
const decodeComponent = require('decode-uri-component');
const splitOnFirst = require('split-on-first');
const filterObject = require('filter-obj');
const isNullOrUndefined = value => value === null || value === undefined;
function encoderForArrayFormat(options) {
switch (options.arrayFormat) {
case 'index':
return key => (result, value) => {
const index = result.length;
if (
value === undefined ||
(options.skipNull && value === null) ||
(options.skipEmptyString && value === '')
) {
return result;
}
if (value === null) {
return [...result, [encode(key, options), '[', index, ']'].join('')];
}
return [
...result,
[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')
];
};
case 'bracket':
return key => (result, value) => {
if (
value === undefined ||
(options.skipNull && value === null) ||
(options.skipEmptyString && value === '')
) {
return result;
}
if (value === null) {
return [...result, [encode(key, options), '[]'].join('')];
}
return [...result, [encode(key, options), '[]=', encode(value, options)].join('')];
};
case 'comma':
case 'separator':
return key => (result, value) => {
if (value === null || value === undefined || value.length === 0) {
return result;
}
if (result.length === 0) {
return [[encode(key, options), '=', encode(value, options)].join('')];
}
return [[result, encode(value, options)].join(options.arrayFormatSeparator)];
};
default:
return key => (result, value) => {
if (
value === undefined ||
(options.skipNull && value === null) ||
(options.skipEmptyString && value === '')
) {
return result;
}
if (value === null) {
return [...result, encode(key, options)];
}
return [...result, [encode(key, options), '=', encode(value, options)].join('')];
};
}
}
function parserForArrayFormat(options) {
let result;
switch (options.arrayFormat) {
case 'index':
return (key, value, accumulator) => {
result = /\[(\d*)\]$/.exec(key);
key = key.replace(/\[\d*\]$/, '');
if (!result) {
accumulator[key] = value;
return;
}
if (accumulator[key] === undefined) {
accumulator[key] = {};
}
accumulator[key][result[1]] = value;
};
case 'bracket':
return (key, value, accumulator) => {
result = /(\[\])$/.exec(key);
key = key.replace(/\[\]$/, '');
if (!result) {
accumulator[key] = value;
return;
}
if (accumulator[key] === undefined) {
accumulator[key] = [value];
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
case 'comma':
case 'separator':
return (key, value, accumulator) => {
const isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);
const isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));
value = isEncodedArray ? decode(value, options) : value;
const newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);
accumulator[key] = newValue;
};
default:
return (key, value, accumulator) => {
if (accumulator[key] === undefined) {
accumulator[key] = value;
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
}
}
function validateArrayFormatSeparator(value) {
if (typeof value !== 'string' || value.length !== 1) {
throw new TypeError('arrayFormatSeparator must be single character string');
}
}
function encode(value, options) {
if (options.encode) {
return options.strict ? strictUriEncode(value) : encodeURIComponent(value);
}
return value;
}
function decode(value, options) {
if (options.decode) {
return decodeComponent(value);
}
return value;
}
function keysSorter(input) {
if (Array.isArray(input)) {
return input.sort();
}
if (typeof input === 'object') {
return keysSorter(Object.keys(input))
.sort((a, b) => Number(a) - Number(b))
.map(key => input[key]);
}
return input;
}
function removeHash(input) {
const hashStart = input.indexOf('#');
if (hashStart !== -1) {
input = input.slice(0, hashStart);
}
return input;
}
function getHash(url) {
let hash = '';
const hashStart = url.indexOf('#');
if (hashStart !== -1) {
hash = url.slice(hashStart);
}
return hash;
}
function extract(input) {
input = removeHash(input);
const queryStart = input.indexOf('?');
if (queryStart === -1) {
return '';
}
return input.slice(queryStart + 1);
}
function parseValue(value, options) {
if (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {
value = Number(value);
} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {
value = value.toLowerCase() === 'true';
}
return value;
}
function parse(query, options) {
options = Object.assign({
decode: true,
sort: true,
arrayFormat: 'none',
arrayFormatSeparator: ',',
parseNumbers: false,
parseBooleans: false
}, options);
validateArrayFormatSeparator(options.arrayFormatSeparator);
const formatter = parserForArrayFormat(options);
// Create an object with no prototype
const ret = Object.create(null);
if (typeof query !== 'string') {
return ret;
}
query = query.trim().replace(/^[?#&]/, '');
if (!query) {
return ret;
}
for (const param of query.split('&')) {
if (param === '') {
continue;
}
let [key, value] = splitOnFirst(options.decode ? param.replace(/\+/g, ' ') : param, '=');
// Missing `=` should be `null`:
// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
value = value === undefined ? null : ['comma', 'separator'].includes(options.arrayFormat) ? value : decode(value, options);
formatter(decode(key, options), value, ret);
}
for (const key of Object.keys(ret)) {
const value = ret[key];
if (typeof value === 'object' && value !== null) {
for (const k of Object.keys(value)) {
value[k] = parseValue(value[k], options);
}
} else {
ret[key] = parseValue(value, options);
}
}
if (options.sort === false) {
return ret;
}
return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {
const value = ret[key];
if (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {
// Sort object keys, not values
result[key] = keysSorter(value);
} else {
result[key] = value;
}
return result;
}, Object.create(null));
}
exports.extract = extract;
exports.parse = parse;
exports.stringify = (object, options) => {
if (!object) {
return '';
}
options = Object.assign({
encode: true,
strict: true,
arrayFormat: 'none',
arrayFormatSeparator: ','
}, options);
validateArrayFormatSeparator(options.arrayFormatSeparator);
const shouldFilter = key => (
(options.skipNull && isNullOrUndefined(object[key])) ||
(options.skipEmptyString && object[key] === '')
);
const formatter = encoderForArrayFormat(options);
const objectCopy = {};
for (const key of Object.keys(object)) {
if (!shouldFilter(key)) {
objectCopy[key] = object[key];
}
}
const keys = Object.keys(objectCopy);
if (options.sort !== false) {
keys.sort(options.sort);
}
return keys.map(key => {
const value = object[key];
if (value === undefined) {
return '';
}
if (value === null) {
return encode(key, options);
}
if (Array.isArray(value)) {
return value
.reduce(formatter(key), [])
.join('&');
}
return encode(key, options) + '=' + encode(value, options);
}).filter(x => x.length > 0).join('&');
};
exports.parseUrl = (url, options) => {
options = Object.assign({
decode: true
}, options);
const [url_, hash] = splitOnFirst(url, '#');
return Object.assign(
{
url: url_.split('?')[0] || '',
query: parse(extract(url), options)
},
options && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}
);
};
exports.stringifyUrl = (object, options) => {
options = Object.assign({
encode: true,
strict: true
}, options);
const url = removeHash(object.url).split('?')[0] || '';
const queryFromUrl = exports.extract(object.url);
const parsedQueryFromUrl = exports.parse(queryFromUrl, {sort: false});
const query = Object.assign(parsedQueryFromUrl, object.query);
let queryString = exports.stringify(query, options);
if (queryString) {
queryString = `?${queryString}`;
}
let hash = getHash(object.url);
if (object.fragmentIdentifier) {
hash = `#${encode(object.fragmentIdentifier, options)}`;
}
return `${url}${queryString}${hash}`;
};
exports.pick = (input, filter, options) => {
options = Object.assign({
parseFragmentIdentifier: true
}, options);
const {url, query, fragmentIdentifier} = exports.parseUrl(input, options);
return exports.stringifyUrl({
url,
query: filterObject(query, filter),
fragmentIdentifier
}, options);
};
exports.exclude = (input, filter, options) => {
const exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);
return exports.pick(input, exclusionFilter, options);
};
},{"decode-uri-component":4,"filter-obj":5,"split-on-first":11,"strict-uri-encode":12}],11:[function(require,module,exports){
'use strict';
module.exports = (string, separator) => {
if (!(typeof string === 'string' && typeof separator === 'string')) {
throw new TypeError('Expected the arguments to be of type `string`');
}
if (separator === '') {
return [string];
}
const separatorIndex = string.indexOf(separator);
if (separatorIndex === -1) {
return [string];
}
return [
string.slice(0, separatorIndex),
string.slice(separatorIndex + separator.length)
];
};
},{}],12:[function(require,module,exports){
'use strict';
module.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);
},{}],13:[function(require,module,exports){
(function(module) { (function(module) {
'use strict'; 'use strict';
@ -1190,10 +1739,10 @@ process.umask = function() { return 0; };
})(module); })(module);
},{}],9:[function(require,module,exports){ },{}],14:[function(require,module,exports){
module.exports={ module.exports={
"name": "doipjs", "name": "doipjs",
"version": "0.10.5", "version": "0.11.0",
"description": "Decentralized OpenPGP Identity Proofs library in Node.js", "description": "Decentralized OpenPGP Identity Proofs library in Node.js",
"main": "src/index.js", "main": "src/index.js",
"dependencies": { "dependencies": {
@ -1202,6 +1751,7 @@ module.exports={
"merge-options": "^3.0.3", "merge-options": "^3.0.3",
"openpgp": "^4.10.9", "openpgp": "^4.10.9",
"prettier": "^2.1.2", "prettier": "^2.1.2",
"query-string": "^6.14.1",
"valid-url": "^1.0.9" "valid-url": "^1.0.9"
}, },
"devDependencies": { "devDependencies": {
@ -1249,7 +1799,7 @@ module.exports={
} }
} }
},{}],10:[function(require,module,exports){ },{}],15:[function(require,module,exports){
(function (global){(function (){ (function (global){(function (){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -1579,7 +2129,7 @@ const verify = async (input, fingerprint, opts) => {
setTimeout(() => { setTimeout(() => {
resolve(objResult) resolve(objResult)
return return
}, 3000) }, 10000)
}) })
return await Promise.race([promiseClaim, promiseTimeout]) return await Promise.race([promiseClaim, promiseTimeout])
@ -1588,7 +2138,7 @@ const verify = async (input, fingerprint, opts) => {
exports.verify = verify exports.verify = verify
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./keys":12,"./serviceproviders":13,"./utils":30,"merge-options":5,"path":6,"valid-url":8}],11:[function(require,module,exports){ },{"./keys":17,"./serviceproviders":18,"./utils":37,"merge-options":7,"path":8,"valid-url":13}],16:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -1616,7 +2166,7 @@ exports.signatures = signatures
exports.serviceproviders = serviceproviders exports.serviceproviders = serviceproviders
exports.utils = utils exports.utils = utils
},{"./claims":10,"./keys":12,"./serviceproviders":13,"./signatures":29,"./utils":30}],12:[function(require,module,exports){ },{"./claims":15,"./keys":17,"./serviceproviders":18,"./signatures":36,"./utils":37}],17:[function(require,module,exports){
(function (global){(function (){ (function (global){(function (){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -1857,7 +2407,7 @@ exports.getUserData = getUserData
exports.getFingerprint = getFingerprint exports.getFingerprint = getFingerprint
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"bent":1,"merge-options":5,"path":6,"valid-url":8}],13:[function(require,module,exports){ },{"bent":1,"merge-options":7,"path":8,"valid-url":13}],18:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -1879,7 +2429,9 @@ const utils = require('./utils')
const list = [ const list = [
'dns', 'dns',
'irc',
'xmpp', 'xmpp',
'matrix',
'twitter', 'twitter',
'reddit', 'reddit',
'liberapay', 'liberapay',
@ -1897,7 +2449,9 @@ const list = [
const data = { const data = {
dns: require('./serviceproviders/dns'), dns: require('./serviceproviders/dns'),
irc: require('./serviceproviders/irc'),
xmpp: require('./serviceproviders/xmpp'), xmpp: require('./serviceproviders/xmpp'),
matrix: require('./serviceproviders/matrix'),
twitter: require('./serviceproviders/twitter'), twitter: require('./serviceproviders/twitter'),
reddit: require('./serviceproviders/reddit'), reddit: require('./serviceproviders/reddit'),
liberapay: require('./serviceproviders/liberapay'), liberapay: require('./serviceproviders/liberapay'),
@ -1930,6 +2484,10 @@ const match = (uri, opts) => {
const directRequestHandler = (spData, opts) => { const directRequestHandler = (spData, opts) => {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const url = spData.proof.fetch ? spData.proof.fetch : spData.proof.uri const url = spData.proof.fetch ? spData.proof.fetch : spData.proof.uri
if (!url) {
reject('No valid URI provided')
return
}
let res let res
switch (spData.proof.format) { switch (spData.proof.format) {
@ -1991,7 +2549,7 @@ exports.match = match
exports.directRequestHandler = directRequestHandler exports.directRequestHandler = directRequestHandler
exports.proxyRequestHandler = proxyRequestHandler exports.proxyRequestHandler = proxyRequestHandler
},{"../package.json":9,"./serviceproviders/devto":14,"./serviceproviders/discourse":15,"./serviceproviders/dns":16,"./serviceproviders/fediverse":17,"./serviceproviders/gitea":18,"./serviceproviders/github":19,"./serviceproviders/gitlab":20,"./serviceproviders/hackernews":21,"./serviceproviders/liberapay":22,"./serviceproviders/lobsters":23,"./serviceproviders/mastodon":24,"./serviceproviders/owncast":25,"./serviceproviders/reddit":26,"./serviceproviders/twitter":27,"./serviceproviders/xmpp":28,"./utils":30,"bent":1}],14:[function(require,module,exports){ },{"../package.json":14,"./serviceproviders/devto":19,"./serviceproviders/discourse":20,"./serviceproviders/dns":21,"./serviceproviders/fediverse":22,"./serviceproviders/gitea":23,"./serviceproviders/github":24,"./serviceproviders/gitlab":25,"./serviceproviders/hackernews":26,"./serviceproviders/irc":27,"./serviceproviders/liberapay":28,"./serviceproviders/lobsters":29,"./serviceproviders/mastodon":30,"./serviceproviders/matrix":31,"./serviceproviders/owncast":32,"./serviceproviders/reddit":33,"./serviceproviders/twitter":34,"./serviceproviders/xmpp":35,"./utils":37,"bent":1}],19:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2060,7 +2618,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],15:[function(require,module,exports){ },{}],20:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2129,7 +2687,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],16:[function(require,module,exports){ },{}],21:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2227,7 +2785,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{"../utils":30,"bent":1,"dns":3}],17:[function(require,module,exports){ },{"../utils":37,"bent":1,"dns":3}],22:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2296,7 +2854,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],18:[function(require,module,exports){ },{}],23:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2365,7 +2923,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],19:[function(require,module,exports){ },{}],24:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2434,7 +2992,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],20:[function(require,module,exports){ },{}],25:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2546,7 +3104,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{"bent":1}],21:[function(require,module,exports){ },{"bent":1}],26:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2615,7 +3173,77 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],22:[function(require,module,exports){ },{}],27:[function(require,module,exports){
/*
Copyright 2021 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 utils = require('../utils')
const reURI = /^irc\:\/\/(.*)\/([a-zA-Z0-9]*)/
const processURI = (uri, opts) => {
if (!opts) {
opts = {}
}
const match = uri.match(reURI)
return {
serviceprovider: {
type: 'communication',
name: 'irc',
},
profile: {
display: `irc://${match[1]}/${match[2]}`,
uri: uri,
qr: null,
},
proof: {
uri: utils.generateProxyURL('irc', [match[1], match[2]], opts),
fetch: null,
useProxy: false,
format: 'json',
},
claim: {
fingerprint: null,
format: 'uri',
path: ['data'],
relation: 'contains',
},
customRequestHandler: null,
}
}
const tests = [
{
uri: 'irc://chat.ircserver.org/Alice1',
shouldMatch: true,
},
{
uri: 'irc://chat.ircserver.org/alice?param=123',
shouldMatch: true,
},
{
uri: 'https://chat.ircserver.org/alice',
shouldMatch: false,
},
]
exports.reURI = reURI
exports.processURI = processURI
exports.tests = tests
},{"../utils":37}],28:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2684,7 +3312,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],23:[function(require,module,exports){ },{}],29:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2753,7 +3381,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],24:[function(require,module,exports){ },{}],30:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2822,7 +3450,91 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],25:[function(require,module,exports){ },{}],31:[function(require,module,exports){
/*
Copyright 2021 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 bent = require('bent')
const req = bent('GET')
const queryString = require('query-string')
const utils = require('../utils')
const reURI = /^matrix\:u\/(\@[^:]*\:[^?]*)(\?.*)?/
const processURI = (uri, opts) => {
if (!opts) {
opts = {}
}
const match = uri.match(reURI)
let proofUrl = null
if (match[2]) {
const params = queryString.parse(match[2])
if ('org.keyoxide.e' in params && 'org.keyoxide.r' in params) {
proofUrl = utils.generateProxyURL('matrix', [params['org.keyoxide.r'], params['org.keyoxide.e']], opts)
}
}
return {
serviceprovider: {
type: 'communication',
name: 'matrix',
},
profile: {
display: match[1],
uri: uri,
qr: null,
},
proof: {
uri: proofUrl,
fetch: null,
useProxy: false,
format: 'json',
},
claim: {
fingerprint: null,
format: 'message',
path: ['data', 'content', 'body'],
relation: 'contains',
},
customRequestHandler: null,
}
}
const tests = [
{
uri: 'matrix:u/@alice:matrix.domain.org',
shouldMatch: true,
},
{
uri: 'matrix:u/@alice:matrix.domain.org?org.keyoxide.r=!123:domain.org&org.keyoxide.e=$123',
shouldMatch: true,
},
{
uri: 'xmpp:alice@domain.org',
shouldMatch: false,
},
{
uri: 'https://domain.org/@alice',
shouldMatch: false,
},
]
exports.reURI = reURI
exports.processURI = processURI
exports.tests = tests
},{"../utils":37,"bent":1,"query-string":10}],32:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2898,7 +3610,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{"bent":1}],26:[function(require,module,exports){ },{"bent":1}],33:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -2975,7 +3687,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{}],27:[function(require,module,exports){ },{}],34:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -3087,7 +3799,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{"../serviceproviders":13,"../utils":30,"bent":1}],28:[function(require,module,exports){ },{"../serviceproviders":18,"../utils":37,"bent":1}],35:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -3157,7 +3869,7 @@ exports.reURI = reURI
exports.processURI = processURI exports.processURI = processURI
exports.tests = tests exports.tests = tests
},{"../utils":30}],29:[function(require,module,exports){ },{"../utils":37}],36:[function(require,module,exports){
(function (global){(function (){ (function (global){(function (){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -3284,7 +3996,7 @@ const verify = (signature, opts) => {
exports.verify = verify exports.verify = verify
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./claims":10,"./keys":12,"merge-options":5}],30:[function(require,module,exports){ },{"./claims":15,"./keys":17,"merge-options":7}],37:[function(require,module,exports){
/* /*
Copyright 2021 Yarmo Mackenbach Copyright 2021 Yarmo Mackenbach
@ -3300,7 +4012,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
const generateProxyURL = (type, url, opts) => { const generateProxyURL = (type, urlElements, opts) => {
if (!opts || !opts.doipProxyHostname) { if (!opts || !opts.doipProxyHostname) {
return null return null
} }
@ -3308,9 +4020,16 @@ const generateProxyURL = (type, url, opts) => {
if (type == 'xmpp') { if (type == 'xmpp') {
addParam += '/DESC' addParam += '/DESC'
} }
if (!Array.isArray(urlElements)) {
urlElements = [urlElements]
}
urlElements.map((x) => { encodeURIComponent(x) })
return `https://${ return `https://${
opts.doipProxyHostname opts.doipProxyHostname
}/api/1/get/${type}/${encodeURIComponent(url)}${addParam}` }/api/1/get/${type}/${urlElements.join('/')}${addParam}`
} }
const generateClaim = (fingerprint, format) => { const generateClaim = (fingerprint, format) => {
@ -3332,5 +4051,5 @@ const generateClaim = (fingerprint, format) => {
exports.generateProxyURL = generateProxyURL exports.generateProxyURL = generateProxyURL
exports.generateClaim = generateClaim exports.generateClaim = generateClaim
},{}]},{},[11])(11) },{}]},{},[16])(16)
}); });

2
dist/doip.min.js vendored

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
# doip.js <small>0.10.5</small> # doip.js <small>0.11.0</small>
<img src="doip.png" width="120"> <img src="doip.png" width="120">

View file

@ -1,5 +1,15 @@
# Changelog # Changelog
## [0.11.0]
[2021-03-05](https://codeberg.org/keyoxide/doipjs/releases/tag/0.11.0)
## Added
- IRC service provider
- Matrix service provider
## Fixed
- Handling of requests without URI
## [0.10.5] ## [0.10.5]
[2021-03-02](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.5) [2021-03-02](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.5)

View file

@ -15,7 +15,7 @@ npm install --save doipjs
Install on website by including the following HTML snippet: Install on website by including the following HTML snippet:
```html ```html
<script src="https://cdn.jsdelivr.net/npm/doipjs@0.10.5/dist/doip.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/doipjs@0.11.0/dist/doip.min.js"></script>
``` ```
Next step: [quick start (Node.js)](quickstart-nodejs.md) and [quick start (browser)](quickstart-browser.md) Next step: [quick start (Node.js)](quickstart-nodejs.md) and [quick start (browser)](quickstart-browser.md)

View file

@ -1,6 +1,6 @@
{ {
"name": "doipjs", "name": "doipjs",
"version": "0.10.5", "version": "0.11.0",
"description": "Decentralized OpenPGP Identity Proofs library in Node.js", "description": "Decentralized OpenPGP Identity Proofs library in Node.js",
"main": "src/index.js", "main": "src/index.js",
"dependencies": { "dependencies": {