2020-10-24 17:22:54 -06:00
( function ( f ) { if ( typeof exports === "object" && typeof module !== "undefined" ) { module . exports = f ( ) } else if ( typeof define === "function" && define . amd ) { define ( [ ] , f ) } else { var g ; if ( typeof window !== "undefined" ) { g = window } else if ( typeof global !== "undefined" ) { g = global } else if ( typeof self !== "undefined" ) { g = self } else { g = this } g . doip = f ( ) } } ) ( function ( ) { var define , module , exports ; return ( function ( ) { function r ( e , n , t ) { function o ( i , f ) { if ( ! n [ i ] ) { if ( ! e [ i ] ) { var c = "function" == typeof require && require ; if ( ! f && c ) return c ( i , ! 0 ) ; if ( u ) return u ( i , ! 0 ) ; var a = new Error ( "Cannot find module '" + i + "'" ) ; throw a . code = "MODULE_NOT_FOUND" , a } var p = n [ i ] = { exports : { } } ; e [ i ] [ 0 ] . call ( p . exports , function ( r ) { var n = e [ i ] [ 1 ] [ r ] ; return o ( n || r ) } , p , p . exports , r , e , n , t ) } return n [ i ] . exports } for ( var u = "function" == typeof require && require , i = 0 ; i < t . length ; i ++ ) o ( t [ i ] ) ; return o } return r } ) ( ) ( { 1 : [ function ( require , module , exports ) {
2021-03-02 02:48:52 -07:00
'use strict'
/* global fetch, btoa, Headers */
const core = require ( './core' )
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
class StatusError extends Error {
constructor ( res , ... params ) {
super ( ... params )
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( Error . captureStackTrace ) {
Error . captureStackTrace ( this , StatusError )
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
this . name = 'StatusError'
this . message = res . statusMessage
this . statusCode = res . status
this . res = res
this . json = res . json . bind ( res )
this . text = res . text . bind ( res )
this . arrayBuffer = res . arrayBuffer . bind ( res )
let buffer
const get = ( ) => {
if ( ! buffer ) buffer = this . arrayBuffer ( )
return buffer
}
Object . defineProperty ( this , 'responseBody' , { get } )
// match Node.js headers object
this . headers = { }
for ( const [ key , value ] of res . headers . entries ( ) ) {
this . headers [ key . toLowerCase ( ) ] = value
}
2020-10-24 17:22:54 -06:00
}
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
const mkrequest = ( statusCodes , method , encoding , headers , baseurl ) => async ( _url , body , _headers = { } ) => {
_url = baseurl + ( _url || '' )
let parsed = new URL ( _url )
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( ! headers ) headers = { }
if ( parsed . username ) {
headers . Authorization = 'Basic ' + btoa ( parsed . username + ':' + parsed . password )
parsed = new URL ( parsed . protocol + '//' + parsed . host + parsed . pathname + parsed . search )
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
if ( parsed . protocol !== 'https:' && parsed . protocol !== 'http:' ) {
throw new Error ( ` Unknown protocol, ${ parsed . protocol } ` )
2020-10-24 17:22:54 -06:00
}
2021-03-02 02:48:52 -07:00
if ( body ) {
if ( body instanceof ArrayBuffer ||
ArrayBuffer . isView ( body ) ||
typeof body === 'string'
) {
// noop
} else if ( typeof body === 'object' ) {
body = JSON . stringify ( body )
headers [ 'Content-Type' ] = 'application/json'
} else {
throw new Error ( 'Unknown body type.' )
}
}
2020-10-24 17:22:54 -06:00
2021-03-02 02:48:52 -07:00
_headers = new Headers ( { ... ( headers || { } ) , ... _headers } )
2020-10-24 17:22:54 -06:00
2021-03-02 02:48:52 -07:00
const resp = await fetch ( parsed , { method , headers : _headers , body } )
resp . statusCode = resp . status
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( ! statusCodes . has ( resp . status ) ) {
throw new StatusError ( resp )
2020-10-24 17:22:54 -06:00
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( encoding === 'json' ) return resp . json ( )
else if ( encoding === 'buffer' ) return resp . arrayBuffer ( )
else if ( encoding === 'string' ) return resp . text ( )
else return resp
2020-10-24 17:22:54 -06:00
}
2021-03-02 02:48:52 -07:00
module . exports = core ( mkrequest )
2020-10-24 17:22:54 -06:00
2021-03-02 02:48:52 -07:00
} , { "./core" : 2 } ] , 2 : [ function ( require , module , exports ) {
'use strict'
const encodings = new Set ( [ 'json' , 'buffer' , 'string' ] )
2020-10-24 17:22:54 -06:00
2021-03-02 02:48:52 -07:00
module . exports = mkrequest => ( ... args ) => {
const statusCodes = new Set ( )
let method
let encoding
let headers
let baseurl = ''
2020-10-24 17:22:54 -06:00
2021-03-02 02:48:52 -07:00
args . forEach ( arg => {
if ( typeof arg === 'string' ) {
if ( arg . toUpperCase ( ) === arg ) {
if ( method ) {
const msg = ` Can't set method to ${ arg } , already set to ${ method } . `
throw new Error ( msg )
} else {
method = arg
}
} else if ( arg . startsWith ( 'http:' ) || arg . startsWith ( 'https:' ) ) {
baseurl = arg
} else {
if ( encodings . has ( arg ) ) {
encoding = arg
} else {
throw new Error ( ` Unknown encoding, ${ arg } ` )
}
2020-10-24 17:22:54 -06:00
}
2021-03-02 02:48:52 -07:00
} else if ( typeof arg === 'number' ) {
statusCodes . add ( arg )
} else if ( typeof arg === 'object' ) {
if ( Array . isArray ( arg ) || arg instanceof Set ) {
arg . forEach ( code => statusCodes . add ( code ) )
} else {
if ( headers ) {
throw new Error ( 'Cannot set headers twice.' )
}
headers = arg
}
} else {
throw new Error ( ` Unknown type: ${ typeof arg } ` )
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
} )
2020-10-24 17:22:54 -06:00
2021-03-02 02:48:52 -07:00
if ( ! method ) method = 'GET'
if ( statusCodes . size === 0 ) {
statusCodes . add ( 200 )
}
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
return mkrequest ( statusCodes , method , encoding , headers , baseurl )
}
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
} , { } ] , 3 : [ function ( require , module , exports ) {
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
} , { } ] , 4 : [ function ( require , module , exports ) {
'use strict' ;
2021-03-05 09:13:08 -07:00
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' ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
module . exports = value => {
if ( Object . prototype . toString . call ( value ) !== '[object Object]' ) {
return false ;
}
2020-11-06 10:39:06 -07:00
2021-03-02 02:48:52 -07:00
const prototype = Object . getPrototypeOf ( value ) ;
return prototype === null || prototype === Object . prototype ;
} ;
2020-11-05 04:14:26 -07:00
2021-03-05 09:13:08 -07:00
} , { } ] , 7 : [ function ( require , module , exports ) {
2021-03-02 02:48:52 -07:00
'use strict' ;
const isOptionObject = require ( 'is-plain-obj' ) ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
const { hasOwnProperty } = Object . prototype ;
const { propertyIsEnumerable } = Object ;
const defineProperty = ( object , name , value ) => Object . defineProperty ( object , name , {
value ,
writable : true ,
enumerable : true ,
configurable : true
} ) ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
const globalThis = this ;
const defaultMergeOptions = {
concatArrays : false ,
ignoreUndefined : false
} ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
const getEnumerableOwnPropertyKeys = value => {
const keys = [ ] ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
for ( const key in value ) {
if ( hasOwnProperty . call ( value , key ) ) {
keys . push ( key ) ;
}
}
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
/* istanbul ignore else */
if ( Object . getOwnPropertySymbols ) {
const symbols = Object . getOwnPropertySymbols ( value ) ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
for ( const symbol of symbols ) {
if ( propertyIsEnumerable . call ( value , symbol ) ) {
keys . push ( symbol ) ;
}
}
}
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
return keys ;
} ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
function clone ( value ) {
if ( Array . isArray ( value ) ) {
return cloneArray ( value ) ;
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( isOptionObject ( value ) ) {
return cloneOptionObject ( value ) ;
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
return value ;
2020-11-05 04:14:26 -07:00
}
2021-03-02 02:48:52 -07:00
function cloneArray ( array ) {
const result = array . slice ( 0 , 0 ) ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
getEnumerableOwnPropertyKeys ( array ) . forEach ( key => {
defineProperty ( result , key , clone ( array [ key ] ) ) ;
} ) ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
return result ;
2020-11-05 04:14:26 -07:00
}
2021-03-02 02:48:52 -07:00
function cloneOptionObject ( object ) {
const result = Object . getPrototypeOf ( object ) === null ? Object . create ( null ) : { } ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
getEnumerableOwnPropertyKeys ( object ) . forEach ( key => {
defineProperty ( result , key , clone ( object [ key ] ) ) ;
} ) ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
return result ;
2020-11-06 10:39:06 -07:00
}
2020-11-05 04:14:26 -07:00
2020-11-06 10:39:06 -07:00
/ * *
2021-03-02 02:48:52 -07:00
* @ param { * } merged already cloned
* @ param { * } source something to merge
* @ param { string [ ] } keys keys to merge
* @ param { Object } config Config Object
* @ returns { * } cloned Object
2020-11-06 10:39:06 -07:00
* /
2021-03-02 02:48:52 -07:00
const mergeKeys = ( merged , source , keys , config ) => {
keys . forEach ( key => {
if ( typeof source [ key ] === 'undefined' && config . ignoreUndefined ) {
return ;
}
2020-11-06 10:39:06 -07:00
2021-03-02 02:48:52 -07:00
// Do not recurse into prototype chain of merged
if ( key in merged && merged [ key ] !== Object . getPrototypeOf ( merged ) ) {
defineProperty ( merged , key , merge ( merged [ key ] , source [ key ] , config ) ) ;
} else {
defineProperty ( merged , key , clone ( source [ key ] ) ) ;
}
} ) ;
2020-11-06 10:39:06 -07:00
2021-03-02 02:48:52 -07:00
return merged ;
} ;
2020-11-05 04:14:26 -07:00
2020-11-06 10:39:06 -07:00
/ * *
2021-03-02 02:48:52 -07:00
* @ param { * } merged already cloned
* @ param { * } source something to merge
* @ param { Object } config Config Object
* @ returns { * } cloned Object
*
* see [ Array . prototype . concat ( ... arguments ) ] ( http : //www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.concat)
* /
const concatArrays = ( merged , source , config ) => {
let result = merged . slice ( 0 , 0 ) ;
let resultIndex = 0 ;
2020-11-06 10:39:06 -07:00
2021-03-02 02:48:52 -07:00
[ merged , source ] . forEach ( array => {
const indices = [ ] ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
// `result.concat(array)` with cloning
for ( let k = 0 ; k < array . length ; k ++ ) {
if ( ! hasOwnProperty . call ( array , k ) ) {
continue ;
}
2020-11-06 10:39:06 -07:00
2021-03-02 02:48:52 -07:00
indices . push ( String ( k ) ) ;
2020-11-06 10:39:06 -07:00
2021-03-02 02:48:52 -07:00
if ( array === merged ) {
// Already cloned
defineProperty ( result , resultIndex ++ , array [ k ] ) ;
} else {
defineProperty ( result , resultIndex ++ , clone ( array [ k ] ) ) ;
}
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
// Merge non-index keys
result = mergeKeys ( result , array , getEnumerableOwnPropertyKeys ( array ) . filter ( key => ! indices . includes ( key ) ) , config ) ;
} ) ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
return result ;
} ;
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
/ * *
* @ param { * } merged already cloned
* @ param { * } source something to merge
* @ param { Object } config Config Object
* @ returns { * } cloned Object
* /
function merge ( merged , source , config ) {
if ( config . concatArrays && Array . isArray ( merged ) && Array . isArray ( source ) ) {
return concatArrays ( merged , source , config ) ;
}
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
if ( ! isOptionObject ( source ) || ! isOptionObject ( merged ) ) {
return clone ( source ) ;
}
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
return mergeKeys ( merged , source , getEnumerableOwnPropertyKeys ( source ) , config ) ;
2021-03-01 10:35:59 -07:00
}
2020-11-05 04:14:26 -07:00
2021-03-02 02:48:52 -07:00
module . exports = function ( ... options ) {
const config = merge ( clone ( defaultMergeOptions ) , ( this !== globalThis && this ) || { } , defaultMergeOptions ) ;
let merged = { _ : { } } ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
for ( const option of options ) {
if ( option === undefined ) {
continue ;
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( ! isOptionObject ( option ) ) {
throw new TypeError ( '`' + option + '` is not an Option Object' ) ;
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
merged = merge ( merged , { _ : option } , config ) ;
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
return merged . _ ;
2021-03-01 10:35:59 -07:00
} ;
2021-03-05 09:13:08 -07:00
} , { "is-plain-obj" : 6 } ] , 8 : [ function ( require , module , exports ) {
2021-03-02 02:48:52 -07:00
( function ( process ) { ( function ( ) {
// 'path' module extracted from Node.js v8.11.1 (only the posix part)
// transplited with Babel
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
2021-03-01 10:35:59 -07:00
2020-11-20 01:15:39 -07:00
'use strict' ;
2021-03-02 02:48:52 -07:00
function assertPath ( path ) {
if ( typeof path !== 'string' ) {
throw new TypeError ( 'Path must be a string. Received ' + JSON . stringify ( path ) ) ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
// Resolves . and .. elements in a path with directory names
function normalizeStringPosix ( path , allowAboveRoot ) {
var res = '' ;
var lastSegmentLength = 0 ;
var lastSlash = - 1 ;
var dots = 0 ;
var code ;
for ( var i = 0 ; i <= path . length ; ++ i ) {
if ( i < path . length )
code = path . charCodeAt ( i ) ;
else if ( code === 47 /*/*/ )
break ;
else
code = 47 /*/*/ ;
if ( code === 47 /*/*/ ) {
if ( lastSlash === i - 1 || dots === 1 ) {
// NOOP
} else if ( lastSlash !== i - 1 && dots === 2 ) {
if ( res . length < 2 || lastSegmentLength !== 2 || res . charCodeAt ( res . length - 1 ) !== 46 /*.*/ || res . charCodeAt ( res . length - 2 ) !== 46 /*.*/ ) {
if ( res . length > 2 ) {
var lastSlashIndex = res . lastIndexOf ( '/' ) ;
if ( lastSlashIndex !== res . length - 1 ) {
if ( lastSlashIndex === - 1 ) {
res = '' ;
lastSegmentLength = 0 ;
} else {
res = res . slice ( 0 , lastSlashIndex ) ;
lastSegmentLength = res . length - 1 - res . lastIndexOf ( '/' ) ;
}
lastSlash = i ;
dots = 0 ;
continue ;
}
} else if ( res . length === 2 || res . length === 1 ) {
res = '' ;
lastSegmentLength = 0 ;
lastSlash = i ;
dots = 0 ;
continue ;
}
}
if ( allowAboveRoot ) {
if ( res . length > 0 )
res += '/..' ;
else
res = '..' ;
lastSegmentLength = 2 ;
}
} else {
if ( res . length > 0 )
res += '/' + path . slice ( lastSlash + 1 , i ) ;
else
res = path . slice ( lastSlash + 1 , i ) ;
lastSegmentLength = i - lastSlash - 1 ;
}
lastSlash = i ;
dots = 0 ;
} else if ( code === 46 /*.*/ && dots !== - 1 ) {
++ dots ;
} else {
dots = - 1 ;
}
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
return res ;
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
function _format ( sep , pathObject ) {
var dir = pathObject . dir || pathObject . root ;
var base = pathObject . base || ( pathObject . name || '' ) + ( pathObject . ext || '' ) ;
if ( ! dir ) {
return base ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
if ( dir === pathObject . root ) {
return dir + base ;
}
return dir + sep + base ;
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
var posix = {
// path.resolve([from ...], to)
resolve : function resolve ( ) {
var resolvedPath = '' ;
var resolvedAbsolute = false ;
var cwd ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
for ( var i = arguments . length - 1 ; i >= - 1 && ! resolvedAbsolute ; i -- ) {
var path ;
if ( i >= 0 )
path = arguments [ i ] ;
else {
if ( cwd === undefined )
cwd = process . cwd ( ) ;
path = cwd ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
assertPath ( path ) ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
// Skip empty entries
if ( path . length === 0 ) {
continue ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
resolvedPath = path + '/' + resolvedPath ;
resolvedAbsolute = path . charCodeAt ( 0 ) === 47 /*/*/ ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
// Normalize the path
resolvedPath = normalizeStringPosix ( resolvedPath , ! resolvedAbsolute ) ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( resolvedAbsolute ) {
if ( resolvedPath . length > 0 )
return '/' + resolvedPath ;
else
return '/' ;
} else if ( resolvedPath . length > 0 ) {
return resolvedPath ;
} else {
return '.' ;
}
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
normalize : function normalize ( path ) {
assertPath ( path ) ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( path . length === 0 ) return '.' ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
var isAbsolute = path . charCodeAt ( 0 ) === 47 /*/*/ ;
var trailingSeparator = path . charCodeAt ( path . length - 1 ) === 47 /*/*/ ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
// Normalize the path
path = normalizeStringPosix ( path , ! isAbsolute ) ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( path . length === 0 && ! isAbsolute ) path = '.' ;
if ( path . length > 0 && trailingSeparator ) path += '/' ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( isAbsolute ) return '/' + path ;
return path ;
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
isAbsolute : function isAbsolute ( path ) {
assertPath ( path ) ;
return path . length > 0 && path . charCodeAt ( 0 ) === 47 /*/*/ ;
} ,
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
join : function join ( ) {
if ( arguments . length === 0 )
return '.' ;
var joined ;
for ( var i = 0 ; i < arguments . length ; ++ i ) {
var arg = arguments [ i ] ;
assertPath ( arg ) ;
if ( arg . length > 0 ) {
if ( joined === undefined )
joined = arg ;
else
joined += '/' + arg ;
}
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
if ( joined === undefined )
return '.' ;
return posix . normalize ( joined ) ;
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
relative : function relative ( from , to ) {
assertPath ( from ) ;
assertPath ( to ) ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( from === to ) return '' ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
from = posix . resolve ( from ) ;
to = posix . resolve ( to ) ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( from === to ) return '' ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
// Trim any leading backslashes
var fromStart = 1 ;
for ( ; fromStart < from . length ; ++ fromStart ) {
if ( from . charCodeAt ( fromStart ) !== 47 /*/*/ )
break ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
var fromEnd = from . length ;
var fromLen = fromEnd - fromStart ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
// Trim any leading backslashes
var toStart = 1 ;
for ( ; toStart < to . length ; ++ toStart ) {
if ( to . charCodeAt ( toStart ) !== 47 /*/*/ )
break ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
var toEnd = to . length ;
var toLen = toEnd - toStart ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
// Compare paths to find the longest common path from root
var length = fromLen < toLen ? fromLen : toLen ;
var lastCommonSep = - 1 ;
var i = 0 ;
for ( ; i <= length ; ++ i ) {
if ( i === length ) {
if ( toLen > length ) {
if ( to . charCodeAt ( toStart + i ) === 47 /*/*/ ) {
// We get here if `from` is the exact base path for `to`.
// For example: from='/foo/bar'; to='/foo/bar/baz'
return to . slice ( toStart + i + 1 ) ;
} else if ( i === 0 ) {
// We get here if `from` is the root
// For example: from='/'; to='/foo'
return to . slice ( toStart + i ) ;
}
} else if ( fromLen > length ) {
if ( from . charCodeAt ( fromStart + i ) === 47 /*/*/ ) {
// We get here if `to` is the exact base path for `from`.
// For example: from='/foo/bar/baz'; to='/foo/bar'
lastCommonSep = i ;
} else if ( i === 0 ) {
// We get here if `to` is the root.
// For example: from='/foo'; to='/'
lastCommonSep = 0 ;
}
}
break ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
var fromCode = from . charCodeAt ( fromStart + i ) ;
var toCode = to . charCodeAt ( toStart + i ) ;
if ( fromCode !== toCode )
break ;
else if ( fromCode === 47 /*/*/ )
lastCommonSep = i ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
var out = '' ;
// Generate the relative path based on the path difference between `to`
// and `from`
for ( i = fromStart + lastCommonSep + 1 ; i <= fromEnd ; ++ i ) {
if ( i === fromEnd || from . charCodeAt ( i ) === 47 /*/*/ ) {
if ( out . length === 0 )
out += '..' ;
else
out += '/..' ;
2020-11-20 01:15:39 -07:00
}
}
2021-03-02 02:48:52 -07:00
// Lastly, append the rest of the destination (`to`) path that comes after
// the common path parts
if ( out . length > 0 )
return out + to . slice ( toStart + lastCommonSep ) ;
else {
toStart += lastCommonSep ;
if ( to . charCodeAt ( toStart ) === 47 /*/*/ )
++ toStart ;
return to . slice ( toStart ) ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
_makeLong : function _makeLong ( path ) {
return path ;
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
dirname : function dirname ( path ) {
assertPath ( path ) ;
if ( path . length === 0 ) return '.' ;
var code = path . charCodeAt ( 0 ) ;
var hasRoot = code === 47 /*/*/ ;
var end = - 1 ;
var matchedSlash = true ;
for ( var i = path . length - 1 ; i >= 1 ; -- i ) {
code = path . charCodeAt ( i ) ;
if ( code === 47 /*/*/ ) {
if ( ! matchedSlash ) {
end = i ;
break ;
}
} else {
// We saw the first non-path separator
matchedSlash = false ;
}
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( end === - 1 ) return hasRoot ? '/' : '.' ;
if ( hasRoot && end === 1 ) return '//' ;
return path . slice ( 0 , end ) ;
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
basename : function basename ( path , ext ) {
if ( ext !== undefined && typeof ext !== 'string' ) throw new TypeError ( '"ext" argument must be a string' ) ;
assertPath ( path ) ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
var start = 0 ;
var end = - 1 ;
var matchedSlash = true ;
var i ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( ext !== undefined && ext . length > 0 && ext . length <= path . length ) {
if ( ext . length === path . length && ext === path ) return '' ;
var extIdx = ext . length - 1 ;
var firstNonSlashEnd = - 1 ;
for ( i = path . length - 1 ; i >= 0 ; -- i ) {
var code = path . charCodeAt ( i ) ;
if ( code === 47 /*/*/ ) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if ( ! matchedSlash ) {
start = i + 1 ;
break ;
}
} else {
if ( firstNonSlashEnd === - 1 ) {
// We saw the first non-path separator, remember this index in case
// we need it if the extension ends up not matching
matchedSlash = false ;
firstNonSlashEnd = i + 1 ;
}
if ( extIdx >= 0 ) {
// Try to match the explicit extension
if ( code === ext . charCodeAt ( extIdx ) ) {
if ( -- extIdx === - 1 ) {
// We matched the extension, so mark this as the end of our path
// component
end = i ;
}
} else {
// Extension does not match, so our result is the entire path
// component
extIdx = - 1 ;
end = firstNonSlashEnd ;
}
}
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( start === end ) end = firstNonSlashEnd ; else if ( end === - 1 ) end = path . length ;
return path . slice ( start , end ) ;
} else {
for ( i = path . length - 1 ; i >= 0 ; -- i ) {
if ( path . charCodeAt ( i ) === 47 /*/*/ ) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if ( ! matchedSlash ) {
start = i + 1 ;
break ;
}
} else if ( end === - 1 ) {
// We saw the first non-path separator, mark this as the end of our
// path component
matchedSlash = false ;
end = i + 1 ;
2020-11-20 01:15:39 -07:00
}
}
2021-03-02 02:48:52 -07:00
if ( end === - 1 ) return '' ;
return path . slice ( start , end ) ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
extname : function extname ( path ) {
assertPath ( path ) ;
var startDot = - 1 ;
var startPart = 0 ;
var end = - 1 ;
var matchedSlash = true ;
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find
var preDotState = 0 ;
for ( var i = path . length - 1 ; i >= 0 ; -- i ) {
var code = path . charCodeAt ( i ) ;
if ( code === 47 /*/*/ ) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if ( ! matchedSlash ) {
startPart = i + 1 ;
break ;
}
continue ;
}
if ( end === - 1 ) {
// We saw the first non-path separator, mark this as the end of our
// extension
matchedSlash = false ;
end = i + 1 ;
}
if ( code === 46 /*.*/ ) {
// If this is our first dot, mark it as the start of our extension
if ( startDot === - 1 )
startDot = i ;
else if ( preDotState !== 1 )
preDotState = 1 ;
} else if ( startDot !== - 1 ) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension
preDotState = - 1 ;
}
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
if ( startDot === - 1 || end === - 1 ||
// We saw a non-dot character immediately before the dot
preDotState === 0 ||
// The (right-most) trimmed path component is exactly '..'
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1 ) {
return '' ;
}
return path . slice ( startDot , end ) ;
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
format : function format ( pathObject ) {
if ( pathObject === null || typeof pathObject !== 'object' ) {
throw new TypeError ( 'The "pathObject" argument must be of type Object. Received type ' + typeof pathObject ) ;
}
return _format ( '/' , pathObject ) ;
} ,
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
parse : function parse ( path ) {
assertPath ( path ) ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
var ret = { root : '' , dir : '' , base : '' , ext : '' , name : '' } ;
if ( path . length === 0 ) return ret ;
var code = path . charCodeAt ( 0 ) ;
var isAbsolute = code === 47 /*/*/ ;
var start ;
if ( isAbsolute ) {
ret . root = '/' ;
start = 1 ;
2021-03-01 10:35:59 -07:00
} else {
2021-03-02 02:48:52 -07:00
start = 0 ;
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
var startDot = - 1 ;
var startPart = 0 ;
var end = - 1 ;
var matchedSlash = true ;
var i = path . length - 1 ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find
var preDotState = 0 ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
// Get non-dir info
for ( ; i >= start ; -- i ) {
code = path . charCodeAt ( i ) ;
if ( code === 47 /*/*/ ) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if ( ! matchedSlash ) {
startPart = i + 1 ;
break ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
continue ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
if ( end === - 1 ) {
// We saw the first non-path separator, mark this as the end of our
// extension
matchedSlash = false ;
end = i + 1 ;
}
if ( code === 46 /*.*/ ) {
// If this is our first dot, mark it as the start of our extension
if ( startDot === - 1 ) startDot = i ; else if ( preDotState !== 1 ) preDotState = 1 ;
} else if ( startDot !== - 1 ) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension
preDotState = - 1 ;
2021-03-01 10:35:59 -07:00
}
2020-11-20 01:15:39 -07:00
}
2021-03-02 02:48:52 -07:00
if ( startDot === - 1 || end === - 1 ||
// We saw a non-dot character immediately before the dot
preDotState === 0 ||
// The (right-most) trimmed path component is exactly '..'
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1 ) {
if ( end !== - 1 ) {
if ( startPart === 0 && isAbsolute ) ret . base = ret . name = path . slice ( 1 , end ) ; else ret . base = ret . name = path . slice ( startPart , end ) ;
}
} else {
if ( startPart === 0 && isAbsolute ) {
ret . name = path . slice ( 1 , startDot ) ;
ret . base = path . slice ( 1 , end ) ;
2021-03-01 10:35:59 -07:00
} else {
2021-03-02 02:48:52 -07:00
ret . name = path . slice ( startPart , startDot ) ;
ret . base = path . slice ( startPart , end ) ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
ret . ext = path . slice ( startDot , end ) ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
if ( startPart > 0 ) ret . dir = path . slice ( 0 , startPart - 1 ) ; else if ( isAbsolute ) ret . dir = '/' ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
return ret ;
} ,
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
sep : '/' ,
delimiter : ':' ,
win32 : null ,
posix : null
} ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
posix . posix = posix ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
module . exports = posix ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
} ) . call ( this ) } ) . call ( this , require ( '_process' ) )
2021-03-05 09:13:08 -07:00
} , { "_process" : 9 } ] , 9 : [ function ( require , module , exports ) {
2021-03-02 02:48:52 -07:00
// shim for using process in browser
var process = module . exports = { } ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
var cachedSetTimeout ;
var cachedClearTimeout ;
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
function defaultSetTimout ( ) {
throw new Error ( 'setTimeout has not been defined' ) ;
}
function defaultClearTimeout ( ) {
throw new Error ( 'clearTimeout has not been defined' ) ;
}
( function ( ) {
try {
if ( typeof setTimeout === 'function' ) {
cachedSetTimeout = setTimeout ;
2021-03-01 10:35:59 -07:00
} else {
2021-03-02 02:48:52 -07:00
cachedSetTimeout = defaultSetTimout ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
} catch ( e ) {
cachedSetTimeout = defaultSetTimout ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
try {
if ( typeof clearTimeout === 'function' ) {
cachedClearTimeout = clearTimeout ;
2021-03-01 10:35:59 -07:00
} else {
2021-03-02 02:48:52 -07:00
cachedClearTimeout = defaultClearTimeout ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
} catch ( e ) {
cachedClearTimeout = defaultClearTimeout ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
} ( ) )
function runTimeout ( fun ) {
if ( cachedSetTimeout === setTimeout ) {
//normal enviroments in sane situations
return setTimeout ( fun , 0 ) ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
// if setTimeout wasn't available but was latter defined
if ( ( cachedSetTimeout === defaultSetTimout || ! cachedSetTimeout ) && setTimeout ) {
cachedSetTimeout = setTimeout ;
return setTimeout ( fun , 0 ) ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout ( fun , 0 ) ;
} catch ( e ) {
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout . call ( null , fun , 0 ) ;
} catch ( e ) {
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout . call ( this , fun , 0 ) ;
}
2021-03-01 10:35:59 -07:00
}
}
2021-03-02 02:48:52 -07:00
function runClearTimeout ( marker ) {
if ( cachedClearTimeout === clearTimeout ) {
//normal enviroments in sane situations
return clearTimeout ( marker ) ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
// if clearTimeout wasn't available but was latter defined
if ( ( cachedClearTimeout === defaultClearTimeout || ! cachedClearTimeout ) && clearTimeout ) {
cachedClearTimeout = clearTimeout ;
return clearTimeout ( marker ) ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout ( marker ) ;
} catch ( e ) {
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout . call ( null , marker ) ;
} catch ( e ) {
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout . call ( this , marker ) ;
}
2021-03-01 10:35:59 -07:00
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
}
var queue = [ ] ;
var draining = false ;
var currentQueue ;
var queueIndex = - 1 ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
function cleanUpNextTick ( ) {
if ( ! draining || ! currentQueue ) {
return ;
}
draining = false ;
if ( currentQueue . length ) {
queue = currentQueue . concat ( queue ) ;
} else {
queueIndex = - 1 ;
}
if ( queue . length ) {
drainQueue ( ) ;
}
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
function drainQueue ( ) {
if ( draining ) {
return ;
}
var timeout = runTimeout ( cleanUpNextTick ) ;
draining = true ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
var len = queue . length ;
while ( len ) {
currentQueue = queue ;
queue = [ ] ;
while ( ++ queueIndex < len ) {
if ( currentQueue ) {
currentQueue [ queueIndex ] . run ( ) ;
}
}
queueIndex = - 1 ;
len = queue . length ;
}
currentQueue = null ;
draining = false ;
runClearTimeout ( timeout ) ;
}
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
process . nextTick = function ( fun ) {
var args = new Array ( arguments . length - 1 ) ;
if ( arguments . length > 1 ) {
for ( var i = 1 ; i < arguments . length ; i ++ ) {
args [ i - 1 ] = arguments [ i ] ;
}
}
queue . push ( new Item ( fun , args ) ) ;
if ( queue . length === 1 && ! draining ) {
runTimeout ( drainQueue ) ;
}
} ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
// v8 likes predictible objects
function Item ( fun , array ) {
this . fun = fun ;
this . array = array ;
}
Item . prototype . run = function ( ) {
this . fun . apply ( null , this . array ) ;
} ;
process . title = 'browser' ;
process . browser = true ;
process . env = { } ;
process . argv = [ ] ;
process . version = '' ; // empty string to avoid regexp issues
process . versions = { } ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
function noop ( ) { }
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
process . on = noop ;
process . addListener = noop ;
process . once = noop ;
process . off = noop ;
process . removeListener = noop ;
process . removeAllListeners = noop ;
process . emit = noop ;
process . prependListener = noop ;
process . prependOnceListener = noop ;
2020-11-20 01:15:39 -07:00
2021-03-02 02:48:52 -07:00
process . listeners = function ( name ) { return [ ] }
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
process . binding = function ( name ) {
throw new Error ( 'process.binding is not supported' ) ;
} ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
process . cwd = function ( ) { return '/' } ;
process . chdir = function ( dir ) {
throw new Error ( 'process.chdir is not supported' ) ;
} ;
process . umask = function ( ) { return 0 ; } ;
2020-10-24 06:38:10 -06:00
2021-03-05 09:13:08 -07:00
} , { } ] , 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 ) {
2021-03-02 02:48:52 -07:00
( function ( module ) {
'use strict' ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
module . exports . is _uri = is _iri ;
module . exports . is _http _uri = is _http _iri ;
module . exports . is _https _uri = is _https _iri ;
module . exports . is _web _uri = is _web _iri ;
// Create aliases
module . exports . isUri = is _iri ;
module . exports . isHttpUri = is _http _iri ;
module . exports . isHttpsUri = is _https _iri ;
module . exports . isWebUri = is _web _iri ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// private function
// internal URI spitter method - direct from RFC 3986
var splitUri = function ( uri ) {
var splitted = uri . match ( /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?/ ) ;
return splitted ;
} ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
function is _iri ( value ) {
if ( ! value ) {
return ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// check for illegal characters
if ( /[^a-z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\.\-\_\~\%]/i . test ( value ) ) return ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// check for hex escapes that aren't complete
if ( /%[^0-9a-f]/i . test ( value ) ) return ;
if ( /%[0-9a-f](:?[^0-9a-f]|$)/i . test ( value ) ) return ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
var splitted = [ ] ;
var scheme = '' ;
var authority = '' ;
var path = '' ;
var query = '' ;
var fragment = '' ;
var out = '' ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// from RFC 3986
splitted = splitUri ( value ) ;
scheme = splitted [ 1 ] ;
authority = splitted [ 2 ] ;
path = splitted [ 3 ] ;
query = splitted [ 4 ] ;
fragment = splitted [ 5 ] ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// scheme and path are required, though the path can be empty
if ( ! ( scheme && scheme . length && path . length >= 0 ) ) return ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// if authority is present, the path must be empty or begin with a /
if ( authority && authority . length ) {
if ( ! ( path . length === 0 || /^\// . test ( path ) ) ) return ;
} else {
// if authority is not present, the path must not start with //
if ( /^\/\// . test ( path ) ) return ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// scheme must begin with a letter, then consist of letters, digits, +, ., or -
if ( ! /^[a-z][a-z0-9\+\-\.]*$/ . test ( scheme . toLowerCase ( ) ) ) return ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// re-assemble the URL per section 5.3 in RFC 3986
out += scheme + ':' ;
if ( authority && authority . length ) {
out += '//' + authority ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
out += path ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
if ( query && query . length ) {
out += '?' + query ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
if ( fragment && fragment . length ) {
out += '#' + fragment ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
return out ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
function is _http _iri ( value , allowHttps ) {
if ( ! is _iri ( value ) ) {
return ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
var splitted = [ ] ;
var scheme = '' ;
var authority = '' ;
var path = '' ;
var port = '' ;
var query = '' ;
var fragment = '' ;
var out = '' ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// from RFC 3986
splitted = splitUri ( value ) ;
scheme = splitted [ 1 ] ;
authority = splitted [ 2 ] ;
path = splitted [ 3 ] ;
query = splitted [ 4 ] ;
fragment = splitted [ 5 ] ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
if ( ! scheme ) return ;
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
if ( allowHttps ) {
if ( scheme . toLowerCase ( ) != 'https' ) return ;
} else {
if ( scheme . toLowerCase ( ) != 'http' ) return ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// fully-qualified URIs must have an authority section that is
// a valid host
if ( ! authority ) {
return ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
// enable port component
if ( /:(\d+)$/ . test ( authority ) ) {
port = authority . match ( /:(\d+)$/ ) [ 0 ] ;
authority = authority . replace ( /:\d+$/ , '' ) ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
out += scheme + ':' ;
out += '//' + authority ;
if ( port ) {
out += port ;
}
out += path ;
if ( query && query . length ) {
out += '?' + query ;
}
2021-03-01 10:35:59 -07:00
2021-03-02 02:48:52 -07:00
if ( fragment && fragment . length ) {
out += '#' + fragment ;
2021-03-01 10:35:59 -07:00
}
2021-03-02 02:48:52 -07:00
return out ;
2020-10-24 06:38:10 -06:00
}
2021-03-02 02:48:52 -07:00
function is _https _iri ( value ) {
return is _http _iri ( value , true ) ;
}
function is _web _iri ( value ) {
return ( is _http _iri ( value ) || is _https _iri ( value ) ) ;
}
2020-10-24 06:38:10 -06:00
2021-03-02 02:48:52 -07:00
} ) ( module ) ;
2021-03-05 09:13:08 -07:00
} , { } ] , 14 : [ function ( require , module , exports ) {
2020-11-18 13:51:53 -07:00
module . exports = {
"name" : "doipjs" ,
2021-03-06 15:34:20 -07:00
"version" : "0.11.2" ,
2020-11-18 13:51:53 -07:00
"description" : "Decentralized OpenPGP Identity Proofs library in Node.js" ,
"main" : "src/index.js" ,
"dependencies" : {
"bent" : "^7.3.12" ,
"browserify" : "^17.0.0" ,
"merge-options" : "^3.0.3" ,
2020-12-07 18:39:30 -07:00
"openpgp" : "^4.10.9" ,
2020-11-18 13:51:53 -07:00
"prettier" : "^2.1.2" ,
2021-03-05 09:13:08 -07:00
"query-string" : "^6.14.1" ,
2020-11-18 13:51:53 -07:00
"valid-url" : "^1.0.9"
} ,
"devDependencies" : {
2020-12-09 18:05:36 -07:00
"browserify-shim" : "^3.8.14" ,
2020-11-18 13:51:53 -07:00
"chai" : "^4.2.0" ,
"chai-as-promised" : "^7.1.1" ,
"chai-match-pattern" : "^1.2.0" ,
"license-check-and-add" : "^3.0.4" ,
"minify" : "^6.0.1" ,
"mocha" : "^8.2.0"
} ,
"scripts" : {
2020-12-09 18:05:36 -07:00
"release:bundle" : "./node_modules/browserify/bin/cmd.js ./src/index.js --standalone doip -x openpgp -o ./dist/doip.js" ,
2020-11-18 13:51:53 -07:00
"release:minify" : "./node_modules/minify/bin/minify.js ./dist/doip.js > ./dist/doip.min.js" ,
"prettier:check" : "./node_modules/prettier/bin-prettier.js --check ." ,
"prettier:write" : "./node_modules/prettier/bin-prettier.js --write ." ,
"license:check" : "./node_modules/license-check-and-add/dist/src/cli.js check" ,
"license:add" : "./node_modules/license-check-and-add/dist/src/cli.js add" ,
"license:remove" : "./node_modules/license-check-and-add/dist/src/cli.js remove" ,
"docs" : "docsify serve ./docs" ,
"test" : "./node_modules/mocha/bin/mocha"
} ,
"repository" : {
"type" : "git" ,
"url" : "https://codeberg.org/keyoxide/doipjs"
} ,
"homepage" : "https://js.doip.rocks" ,
"keywords" : [
"pgp" ,
"gpg" ,
"openpgp" ,
"encryption" ,
"decentralized" ,
"identity"
] ,
"author" : "Yarmo Mackenbach <yarmo@yarmo.eu> (https://yarmo.eu)" ,
2020-12-09 18:05:36 -07:00
"license" : "Apache-2.0" ,
"browserify" : {
2020-12-20 15:20:32 -07:00
"transform" : [
"browserify-shim"
]
2020-12-09 18:05:36 -07:00
} ,
"browserify-shim" : {
"openpgp" : "global:openpgp"
}
2020-11-18 13:51:53 -07:00
}
2021-03-05 09:13:08 -07:00
} , { } ] , 15 : [ function ( require , module , exports ) {
2020-12-09 18:05:36 -07:00
( function ( global ) { ( function ( ) {
2020-11-18 13:51:53 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-18 13:51:53 -07:00
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 .
* /
2020-11-20 01:15:39 -07:00
const path = require ( 'path' )
2020-11-18 13:51:53 -07:00
const mergeOptions = require ( 'merge-options' )
const validUrl = require ( 'valid-url' )
2020-12-09 18:05:36 -07:00
const openpgp = ( typeof window !== "undefined" ? window [ 'openpgp' ] : typeof global !== "undefined" ? global [ 'openpgp' ] : null )
2020-11-18 13:51:53 -07:00
const serviceproviders = require ( './serviceproviders' )
const keys = require ( './keys' )
2020-10-24 17:22:54 -06:00
const utils = require ( './utils' )
2020-10-24 06:38:10 -06:00
2021-01-26 13:53:21 -07:00
// Promise.allSettled polyfill
2021-03-01 10:35:59 -07:00
Promise . allSettled =
Promise . allSettled ||
( ( promises ) =>
Promise . all (
promises . map ( ( p ) =>
p
. then ( ( v ) => ( {
status : 'fulfilled' ,
value : v ,
} ) )
. catch ( ( e ) => ( {
status : 'rejected' ,
reason : e ,
} ) )
)
) )
2021-01-26 13:53:21 -07:00
2020-11-18 13:51:53 -07:00
const runVerificationJson = (
res ,
proofData ,
checkPath ,
checkClaim ,
checkRelation
) => {
2020-11-03 14:53:04 -07:00
let re
2020-10-24 06:38:10 -06:00
2020-11-03 14:53:04 -07:00
if ( res . isVerified || ! proofData ) {
return res
2020-10-24 17:22:54 -06:00
}
2020-10-24 06:38:10 -06:00
2020-11-05 04:14:26 -07:00
if ( Array . isArray ( proofData ) ) {
proofData . forEach ( ( item , i ) => {
2020-11-18 13:51:53 -07:00
res = runVerificationJson ( res , item , checkPath , checkClaim , checkRelation )
2020-11-05 04:14:26 -07:00
} )
return res
}
2020-10-24 17:22:54 -06:00
if ( checkPath . length == 0 ) {
switch ( checkRelation ) {
default :
case 'contains' :
2020-12-05 15:17:54 -07:00
re = new RegExp ( checkClaim , 'gi' )
res . isVerified = re . test ( proofData . replace ( /\r?\n|\r|\\/g , '' ) )
2020-10-24 17:22:54 -06:00
break
case 'equals' :
2020-11-18 13:51:53 -07:00
res . isVerified =
2020-12-05 15:17:54 -07:00
proofData . replace ( /\r?\n|\r|\\/g , '' ) . toLowerCase ( ) ==
2020-11-18 13:51:53 -07:00
checkClaim . toLowerCase ( )
2020-10-24 17:22:54 -06:00
break
case 'oneOf' :
2020-11-18 13:51:53 -07:00
re = new RegExp ( checkClaim , 'gi' )
res . isVerified = re . test ( proofData . join ( '|' ) )
2020-10-24 17:22:54 -06:00
break
}
2020-11-03 14:53:04 -07:00
return res
}
2020-11-06 10:39:06 -07:00
try {
checkPath [ 0 ] in proofData
2020-11-18 13:51:53 -07:00
} catch ( e ) {
2020-11-03 14:53:04 -07:00
res . errors . push ( 'err_data_structure_incorrect' )
return res
2020-10-24 17:22:54 -06:00
}
2020-10-24 06:38:10 -06:00
2020-11-18 13:51:53 -07:00
res = runVerificationJson (
res ,
proofData [ checkPath [ 0 ] ] ,
checkPath . slice ( 1 ) ,
checkClaim ,
checkRelation
)
2020-11-03 14:53:04 -07:00
return res
2020-10-24 17:22:54 -06:00
}
2020-10-24 06:38:10 -06:00
2020-11-18 13:51:53 -07:00
const runVerification = ( proofData , spData ) => {
2020-11-03 14:53:04 -07:00
let res = {
isVerified : false ,
2020-11-18 13:51:53 -07:00
errors : [ ] ,
2020-11-03 14:53:04 -07:00
}
2020-10-24 17:22:54 -06:00
switch ( spData . proof . format ) {
case 'json' :
2020-11-18 13:51:53 -07:00
res = runVerificationJson (
res ,
proofData ,
spData . claim . path ,
utils . generateClaim ( spData . claim . fingerprint , spData . claim . format ) ,
spData . claim . relation
)
2020-10-24 17:22:54 -06:00
break
case 'text' :
2020-11-18 13:51:53 -07:00
re = new RegExp (
utils . generateClaim ( spData . claim . fingerprint , spData . claim . format ) ,
'gi'
)
res . isVerified = re . test ( proofData . replace ( /\r?\n|\r/ , '' ) )
2020-10-24 17:22:54 -06:00
break
}
2020-11-03 14:53:04 -07:00
return res
2020-10-24 17:22:54 -06:00
}
2020-10-24 06:38:10 -06:00
2020-11-18 13:51:53 -07:00
const verify = async ( input , fingerprint , opts ) => {
if ( input instanceof openpgp . key . Key ) {
2020-12-05 15:17:54 -07:00
const fingerprintFromKey = await keys . getFingerprint ( input )
const userData = await keys . getUserData ( input )
const promises = userData . map ( async ( user , i ) => {
return new Promise ( async ( resolve , reject ) => {
try {
const res = await verify ( user . notations , fingerprintFromKey , opts )
resolve ( res )
} catch ( e ) {
reject ( e )
}
} )
} )
2020-12-11 03:07:13 -07:00
return Promise . allSettled ( promises ) . then ( ( values ) => {
return values . map ( ( obj , i ) => {
2020-12-20 15:20:32 -07:00
if ( obj . status == 'fulfilled' ) {
return obj . value
} else {
return obj . reason
}
2020-12-11 03:07:13 -07:00
} )
2020-12-05 15:17:54 -07:00
} )
2020-11-18 13:51:53 -07:00
}
if ( input instanceof Array ) {
const promises = input . map ( async ( uri , i ) => {
return new Promise ( async ( resolve , reject ) => {
try {
const res = await verify ( uri , fingerprint , opts )
resolve ( res )
} catch ( e ) {
reject ( e )
}
} )
} )
2020-10-24 17:22:54 -06:00
2020-12-11 03:07:13 -07:00
return Promise . allSettled ( promises ) . then ( ( values ) => {
return values . map ( ( obj , i ) => {
2020-12-20 15:20:32 -07:00
if ( obj . status == 'fulfilled' ) {
return obj . value
} else {
return obj . reason
}
2020-12-11 03:07:13 -07:00
} )
2020-11-18 13:51:53 -07:00
} )
}
2020-10-24 06:38:10 -06:00
2020-12-20 15:20:32 -07:00
const promiseClaim = new Promise ( async ( resolve , reject ) => {
let objResult = {
isVerified : false ,
errors : [ ] ,
serviceproviderData : undefined ,
}
2020-10-24 17:22:54 -06:00
2020-12-20 15:20:32 -07:00
const uri = input . replace ( /^\s+|\s+$/g , '' )
2020-10-24 06:38:10 -06:00
2020-12-20 15:20:32 -07:00
if ( ! fingerprint ) {
fingerprint = null
}
2020-11-06 10:39:06 -07:00
2020-12-20 15:20:32 -07:00
const defaultOpts = {
returnMatchesOnly : false ,
proxyPolicy : 'adaptive' ,
doipProxyHostname : 'proxy.keyoxide.org' ,
2021-03-01 10:35:59 -07:00
twitterBearerToken : null ,
nitterInstance : null ,
2020-12-20 15:20:32 -07:00
}
opts = mergeOptions ( defaultOpts , opts ? opts : { } )
2020-10-24 06:38:10 -06:00
2020-12-20 15:20:32 -07:00
if ( ! validUrl . isUri ( uri ) ) {
objResult . errors . push ( 'invalid_uri' )
reject ( objResult )
return
}
2020-10-24 06:38:10 -06:00
2020-12-20 15:20:32 -07:00
const spMatches = serviceproviders . match ( uri , opts )
2020-12-11 03:07:13 -07:00
2020-12-20 15:20:32 -07:00
if ( 'returnMatchesOnly' in opts && opts . returnMatchesOnly ) {
resolve ( spMatches )
return
}
2020-12-11 03:07:13 -07:00
2020-12-20 15:20:32 -07:00
let claimVerificationDone = false ,
claimVerificationResult ,
sp ,
iSp = 0 ,
res ,
proofData ,
spData
2020-10-24 17:22:54 -06:00
2020-12-20 15:20:32 -07:00
while ( ! claimVerificationDone && iSp < spMatches . length ) {
spData = spMatches [ iSp ]
spData . claim . fingerprint = fingerprint
2020-10-24 17:22:54 -06:00
2020-12-20 15:20:32 -07:00
res = null
if ( spData . customRequestHandler instanceof Function ) {
try {
proofData = await spData . customRequestHandler ( spData , opts )
} catch ( e ) {
objResult . errors . push ( 'custom_request_handler_failed' )
}
} else {
switch ( opts . proxyPolicy ) {
case 'adaptive' :
if ( spData . proof . useProxy ) {
try {
proofData = await serviceproviders . proxyRequestHandler (
spData ,
opts
)
} catch ( er ) { }
} else {
try {
proofData = await serviceproviders . directRequestHandler (
spData ,
opts
)
} catch ( er ) { }
if ( ! proofData ) {
try {
proofData = await serviceproviders . proxyRequestHandler (
spData ,
opts
)
} catch ( er ) { }
}
}
break
case 'fallback' :
2020-12-11 03:07:13 -07:00
try {
2020-12-20 15:20:32 -07:00
proofData = await serviceproviders . directRequestHandler (
spData ,
opts
)
} catch ( er ) { }
2020-12-11 03:07:13 -07:00
if ( ! proofData ) {
try {
2020-12-20 15:20:32 -07:00
proofData = await serviceproviders . proxyRequestHandler (
spData ,
opts
)
} catch ( er ) { }
2020-12-11 03:07:13 -07:00
}
2020-12-20 15:20:32 -07:00
break
case 'always' :
2020-12-11 03:07:13 -07:00
try {
2020-12-20 15:20:32 -07:00
proofData = await serviceproviders . proxyRequestHandler (
spData ,
opts
)
} catch ( er ) { }
break
case 'never' :
try {
proofData = await serviceproviders . directRequestHandler (
spData ,
opts
)
} catch ( er ) { }
break
default :
objResult . errors . push ( 'invalid_proxy_policy' )
}
2020-12-11 03:07:13 -07:00
}
2020-11-05 04:14:26 -07:00
2020-12-20 15:20:32 -07:00
if ( proofData ) {
claimVerificationResult = runVerification ( proofData , spData )
2020-10-24 06:38:10 -06:00
2020-12-20 15:20:32 -07:00
if ( claimVerificationResult . errors . length == 0 ) {
claimVerificationDone = true
}
} else {
objResult . errors . push ( 'unsuccessful_claim_verification' )
2020-11-03 14:53:04 -07:00
}
2020-12-20 15:20:32 -07:00
iSp ++
2020-11-03 14:53:04 -07:00
}
2020-10-24 06:38:10 -06:00
2020-12-20 15:20:32 -07:00
if ( ! claimVerificationResult ) {
claimVerificationResult = {
isVerified : false ,
}
}
2020-10-24 06:38:10 -06:00
2020-12-20 15:20:32 -07:00
objResult . isVerified = claimVerificationResult . isVerified
objResult . serviceproviderData = spData
resolve ( objResult )
return
} )
const promiseTimeout = new Promise ( ( resolve ) => {
const objResult = {
2020-11-18 13:51:53 -07:00
isVerified : false ,
2020-12-20 15:20:32 -07:00
errors : [ 'verification_timed_out' ] ,
serviceproviderData : undefined ,
2020-11-03 14:53:04 -07:00
}
2020-12-20 15:20:32 -07:00
setTimeout ( ( ) => {
resolve ( objResult )
return
2021-03-05 09:13:08 -07:00
} , 10000 )
2020-12-20 15:20:32 -07:00
} )
2020-11-03 14:53:04 -07:00
2020-12-20 15:20:32 -07:00
return await Promise . race ( [ promiseClaim , promiseTimeout ] )
2020-10-24 06:38:10 -06:00
}
2020-10-24 17:22:54 -06:00
exports . verify = verify
2020-11-18 13:51:53 -07:00
2020-12-09 18:05:36 -07:00
} ) . call ( this ) } ) . call ( this , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } )
2021-03-05 09:13:08 -07:00
} , { "./keys" : 17 , "./serviceproviders" : 18 , "./utils" : 37 , "merge-options" : 7 , "path" : 8 , "valid-url" : 13 } ] , 16 : [ function ( require , module , exports ) {
2020-11-18 13:51:53 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-18 13:51:53 -07:00
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 claims = require ( './claims' )
const keys = require ( './keys' )
2021-01-07 08:26:31 -07:00
const signatures = require ( './signatures' )
2020-11-18 13:51:53 -07:00
const serviceproviders = require ( './serviceproviders' )
const utils = require ( './utils' )
exports . claims = claims
exports . keys = keys
2021-01-07 08:26:31 -07:00
exports . signatures = signatures
2020-10-24 17:22:54 -06:00
exports . serviceproviders = serviceproviders
exports . utils = utils
2020-10-24 06:38:10 -06:00
2021-03-05 09:13:08 -07:00
} , { "./claims" : 15 , "./keys" : 17 , "./serviceproviders" : 18 , "./signatures" : 36 , "./utils" : 37 } ] , 17 : [ function ( require , module , exports ) {
2020-12-09 18:05:36 -07:00
( function ( global ) { ( function ( ) {
2020-11-18 13:51:53 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-18 13:51:53 -07:00
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 .
* /
2020-11-20 01:15:39 -07:00
const path = require ( 'path' )
2020-11-18 13:51:53 -07:00
const bent = require ( 'bent' )
const req = bent ( 'GET' )
const validUrl = require ( 'valid-url' )
2020-12-09 18:05:36 -07:00
const openpgp = ( typeof window !== "undefined" ? window [ 'openpgp' ] : typeof global !== "undefined" ? global [ 'openpgp' ] : null )
2020-11-18 13:51:53 -07:00
const mergeOptions = require ( 'merge-options' )
2020-12-05 15:17:54 -07:00
const fetchHKP = ( identifier , keyserverBaseUrl ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
keyserverBaseUrl = keyserverBaseUrl
2021-01-03 11:54:15 -07:00
? ` https:// ${ keyserverBaseUrl } `
: 'https://keys.openpgp.org'
2020-11-18 13:51:53 -07:00
const hkp = new openpgp . HKP ( keyserverBaseUrl )
const lookupOpts = {
query : identifier ,
}
2021-01-09 08:07:01 -07:00
2021-03-01 10:35:59 -07:00
let publicKey = await hkp . lookup ( lookupOpts ) . catch ( ( error ) => {
2021-01-09 08:07:01 -07:00
reject ( 'Key does not exist or could not be fetched' )
} )
2021-03-01 10:35:59 -07:00
publicKey = await openpgp . key
. readArmored ( publicKey )
. then ( ( result ) => {
return result . keys [ 0 ]
} )
. catch ( ( error ) => {
return null
} )
2020-11-18 13:51:53 -07:00
2021-01-09 08:07:01 -07:00
if ( publicKey ) {
resolve ( publicKey )
} else {
2020-12-05 15:17:54 -07:00
reject ( 'Key does not exist or could not be fetched' )
}
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const fetchWKD = ( identifier ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
const wkd = new openpgp . WKD ( )
const lookupOpts = {
email : identifier ,
}
2021-03-01 10:35:59 -07:00
const publicKey = await wkd
. lookup ( lookupOpts )
. then ( ( result ) => {
return result . keys [ 0 ]
} )
. catch ( ( error ) => {
return null
} )
2021-01-09 08:07:01 -07:00
if ( publicKey ) {
resolve ( publicKey )
} else {
2020-12-05 15:17:54 -07:00
reject ( 'Key does not exist or could not be fetched' )
}
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const fetchKeybase = ( username , fingerprint ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
const keyLink = ` https://keybase.io/ ${ username } /pgp_keys.asc?fingerprint= ${ fingerprint } `
try {
const rawKeyContent = await req ( opts . keyLink )
2020-12-05 15:17:54 -07:00
. then ( ( response ) => {
2020-11-18 13:51:53 -07:00
if ( response . status === 200 ) {
return response
}
} )
. then ( ( response ) => response . text ( ) )
} catch ( e ) {
2020-12-05 15:17:54 -07:00
reject ( ` Error fetching Keybase key: ${ e . message } ` )
2020-11-18 13:51:53 -07:00
}
2021-03-01 10:35:59 -07:00
const publicKey = await openpgp . key
. readArmored ( rawKeyContent )
. then ( ( result ) => {
return result . keys [ 0 ]
} )
. catch ( ( error ) => {
return null
} )
2020-11-18 13:51:53 -07:00
2021-01-09 08:07:01 -07:00
if ( publicKey ) {
resolve ( publicKey )
} else {
2020-12-05 15:17:54 -07:00
reject ( 'Key does not exist or could not be fetched' )
}
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const fetchPlaintext = ( rawKeyContent ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
const publicKey = ( await openpgp . key . readArmored ( rawKeyContent ) ) . keys [ 0 ]
2020-12-05 15:17:54 -07:00
resolve ( publicKey )
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const fetchSignature = ( rawSignatureContent , keyserverBaseUrl ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
let sig = await openpgp . signature . readArmored ( rawSignatureContent )
if ( 'compressed' in sig . packets [ 0 ] ) {
sig = sig . packets [ 0 ]
let sigContent = await openpgp . stream . readToEnd (
await sig . packets [ 1 ] . getText ( )
)
}
const sigUserId = sig . packets [ 0 ] . signersUserId
const sigKeyId = await sig . packets [ 0 ] . issuerKeyId . toHex ( )
2020-12-05 15:17:54 -07:00
resolve ( fetchHKP ( sigUserId ? sigUserId : sigKeyId , keyserverBaseUrl ) )
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const fetchURI = ( uri ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
if ( ! validUrl . isUri ( uri ) ) {
2020-12-05 15:17:54 -07:00
reject ( 'Invalid URI' )
2020-11-18 13:51:53 -07:00
}
2020-12-07 18:59:13 -07:00
const re = /([a-zA-Z0-9]*):([a-zA-Z0-9@._=+\-]*)(?:\:([a-zA-Z0-9@._=+\-]*))?/
2020-11-18 13:51:53 -07:00
const match = uri . match ( re )
if ( ! match [ 1 ] ) {
2020-12-05 15:17:54 -07:00
reject ( 'Invalid URI' )
2020-11-18 13:51:53 -07:00
}
switch ( match [ 1 ] ) {
case 'hkp' :
2020-12-20 15:20:32 -07:00
resolve (
fetchHKP ( match [ 3 ] ? match [ 3 ] : match [ 2 ] , match [ 3 ] ? match [ 2 ] : null )
)
2020-11-18 13:51:53 -07:00
break
case 'wkd' :
2020-12-05 15:17:54 -07:00
resolve ( fetchWKD ( match [ 2 ] ) )
2020-11-18 13:51:53 -07:00
break
case 'kb' :
2020-12-05 15:17:54 -07:00
resolve ( fetchKeybase ( match [ 2 ] , match . length >= 4 ? match [ 3 ] : null ) )
2020-11-18 13:51:53 -07:00
break
default :
2020-12-05 15:17:54 -07:00
reject ( 'Invalid URI protocol' )
2020-11-18 13:51:53 -07:00
break
}
2020-12-05 15:17:54 -07:00
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const process = ( publicKey ) => {
return new Promise ( async ( resolve , reject ) => {
if ( ! publicKey ) {
reject ( 'Invalid public key' )
}
2020-11-18 13:51:53 -07:00
const fingerprint = await publicKey . primaryKey . getFingerprint ( )
2020-12-05 15:17:54 -07:00
const primaryUser = await publicKey . getPrimaryUser ( )
const users = publicKey . users
let primaryUserIndex ,
usersOutput = [ ]
users . forEach ( ( user , i ) => {
usersOutput [ i ] = {
userData : {
2020-12-26 14:48:18 -07:00
id : user . userId ? user . userId . userid : null ,
name : user . userId ? user . userId . name : null ,
email : user . userId ? user . userId . email : null ,
comment : user . userId ? user . userId . comment : null ,
2020-12-05 15:17:54 -07:00
isPrimary : primaryUser . index === i ,
} ,
}
2020-11-18 13:51:53 -07:00
2020-12-26 14:48:18 -07:00
if ( 'selfCertifications' in user && user . selfCertifications . length > 0 ) {
2020-12-26 05:58:33 -07:00
const notations = user . selfCertifications [ 0 ] . rawNotations
usersOutput [ i ] . notations = notations . map (
( { name , value , humanReadable } ) => {
if ( humanReadable && name === 'proof@metacode.biz' ) {
return openpgp . util . decode _utf8 ( value )
}
2020-12-05 15:17:54 -07:00
}
2020-12-26 05:58:33 -07:00
)
} else {
usersOutput [ i ] . notations = [ ]
}
2020-12-05 15:17:54 -07:00
} )
resolve ( {
2020-11-18 13:51:53 -07:00
fingerprint : fingerprint ,
2020-12-05 15:17:54 -07:00
users : usersOutput ,
primaryUserIndex : primaryUser . index ,
} )
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const getUserData = ( publicKey ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
const keyData = await process ( publicKey )
2020-12-05 15:17:54 -07:00
resolve ( keyData . users )
} )
2020-11-18 13:51:53 -07:00
}
2020-12-05 15:17:54 -07:00
const getFingerprint = ( publicKey ) => {
return new Promise ( async ( resolve , reject ) => {
2020-11-18 13:51:53 -07:00
const keyData = await process ( publicKey )
2020-12-05 15:17:54 -07:00
resolve ( keyData . fingerprint )
} )
2020-11-18 13:51:53 -07:00
}
exports . fetch = {
uri : fetchURI ,
hkp : fetchHKP ,
wkd : fetchWKD ,
keybase : fetchKeybase ,
plaintext : fetchPlaintext ,
signature : fetchSignature ,
}
exports . process = process
2020-12-05 15:17:54 -07:00
exports . getUserData = getUserData
2020-11-18 13:51:53 -07:00
exports . getFingerprint = getFingerprint
2020-12-09 18:05:36 -07:00
} ) . call ( this ) } ) . call ( this , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } )
2021-03-05 09:13:08 -07:00
} , { "bent" : 1 , "merge-options" : 7 , "path" : 8 , "valid-url" : 13 } ] , 18 : [ function ( require , module , exports ) {
2020-10-24 06:38:10 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-24 06:38:10 -06:00
2020-10-24 17:22:54 -06:00
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
2020-10-24 06:38:10 -06:00
2020-10-24 17:22:54 -06:00
http : //www.apache.org/licenses/LICENSE-2.0
2020-10-24 06:38:10 -06:00
2020-10-24 17:22:54 -06:00
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 .
* /
2020-10-26 16:02:22 -06:00
const bent = require ( 'bent' )
const req = bent ( 'GET' )
2020-11-05 04:14:26 -07:00
const utils = require ( './utils' )
2020-10-26 16:02:22 -06:00
2020-10-24 17:22:54 -06:00
const list = [
'dns' ,
2021-03-05 09:13:08 -07:00
'irc' ,
2020-10-24 17:22:54 -06:00
'xmpp' ,
2021-03-05 09:13:08 -07:00
'matrix' ,
2020-10-24 17:22:54 -06:00
'twitter' ,
2020-10-26 05:24:30 -06:00
'reddit' ,
2020-11-05 04:14:26 -07:00
'liberapay' ,
2020-10-24 17:22:54 -06:00
'hackernews' ,
'lobsters' ,
2020-10-26 05:24:30 -06:00
'devto' ,
'gitea' ,
2020-10-26 16:02:22 -06:00
'gitlab' ,
2020-10-26 05:24:30 -06:00
'github' ,
2020-11-03 14:53:04 -07:00
'mastodon' ,
'fediverse' ,
'discourse' ,
2021-01-13 05:27:58 -07:00
'owncast' ,
2020-10-24 17:22:54 -06:00
]
2020-10-24 06:38:10 -06:00
2020-10-24 17:55:32 -06:00
const data = {
dns : require ( './serviceproviders/dns' ) ,
2021-03-05 09:13:08 -07:00
irc : require ( './serviceproviders/irc' ) ,
2020-10-24 17:55:32 -06:00
xmpp : require ( './serviceproviders/xmpp' ) ,
2021-03-05 09:13:08 -07:00
matrix : require ( './serviceproviders/matrix' ) ,
2020-10-24 17:55:32 -06:00
twitter : require ( './serviceproviders/twitter' ) ,
2020-10-26 05:24:30 -06:00
reddit : require ( './serviceproviders/reddit' ) ,
2020-11-05 04:14:26 -07:00
liberapay : require ( './serviceproviders/liberapay' ) ,
2020-10-24 17:55:32 -06:00
hackernews : require ( './serviceproviders/hackernews' ) ,
lobsters : require ( './serviceproviders/lobsters' ) ,
2020-10-26 05:24:30 -06:00
devto : require ( './serviceproviders/devto' ) ,
gitea : require ( './serviceproviders/gitea' ) ,
2020-10-26 16:02:22 -06:00
gitlab : require ( './serviceproviders/gitlab' ) ,
2020-10-26 05:24:30 -06:00
github : require ( './serviceproviders/github' ) ,
2020-11-03 14:53:04 -07:00
mastodon : require ( './serviceproviders/mastodon' ) ,
fediverse : require ( './serviceproviders/fediverse' ) ,
discourse : require ( './serviceproviders/discourse' ) ,
2021-01-13 05:27:58 -07:00
owncast : require ( './serviceproviders/owncast' ) ,
2020-10-24 17:55:32 -06:00
}
2020-10-24 06:38:10 -06:00
2020-10-24 17:22:54 -06:00
const match = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
let matches = [ ] ,
sp
2020-10-24 06:38:10 -06:00
2020-10-24 17:22:54 -06:00
list . forEach ( ( spName , i ) => {
sp = data [ spName ]
if ( sp . reURI . test ( uri ) ) {
matches . push ( sp . processURI ( uri , opts ) )
}
} )
2020-10-24 06:38:10 -06:00
2020-10-24 17:22:54 -06:00
return matches
2020-10-24 06:38:10 -06:00
}
2020-12-05 15:17:54 -07:00
const directRequestHandler = ( spData , opts ) => {
return new Promise ( async ( resolve , reject ) => {
const url = spData . proof . fetch ? spData . proof . fetch : spData . proof . uri
2021-03-05 09:13:08 -07:00
if ( ! url ) {
reject ( 'No valid URI provided' )
return
}
2020-12-05 15:17:54 -07:00
let res
2020-11-03 14:53:04 -07:00
2020-12-05 15:17:54 -07:00
switch ( spData . proof . format ) {
case 'json' :
2020-12-11 03:07:13 -07:00
req ( url , null , {
2020-12-05 15:17:54 -07:00
Accept : 'application/json' ,
'User-Agent' : ` doipjs/ ${ require ( '../package.json' ) . version } ` ,
} )
2020-12-20 15:20:32 -07:00
. then ( async ( res ) => {
return await res . json ( )
} )
. then ( ( res ) => {
resolve ( res )
} )
. catch ( ( e ) => {
reject ( e )
} )
2020-12-05 15:17:54 -07:00
break
case 'text' :
2020-12-11 03:07:13 -07:00
req ( url )
2020-12-20 15:20:32 -07:00
. then ( async ( res ) => {
return await res . text ( )
} )
. then ( ( res ) => {
resolve ( res )
} )
. catch ( ( e ) => {
reject ( e )
} )
2020-12-05 15:17:54 -07:00
break
default :
reject ( 'No specified proof data format' )
break
}
} )
2020-10-26 16:02:22 -06:00
}
2020-12-05 15:17:54 -07:00
const proxyRequestHandler = ( spData , opts ) => {
return new Promise ( async ( resolve , reject ) => {
const url = spData . proof . fetch ? spData . proof . fetch : spData . proof . uri
2020-12-20 15:20:32 -07:00
req ( utils . generateProxyURL ( spData . proof . format , url , opts ) , null , {
Accept : 'application/json' ,
2020-12-11 03:07:13 -07:00
} )
2020-12-20 15:20:32 -07:00
. then ( async ( res ) => {
return await res . json ( )
} )
. then ( ( res ) => {
resolve ( res . content )
} )
. catch ( ( e ) => {
reject ( e )
} )
2020-12-05 15:17:54 -07:00
} )
2020-10-26 16:02:22 -06:00
}
2020-10-24 17:22:54 -06:00
exports . list = list
exports . data = data
exports . match = match
2020-10-26 16:02:22 -06:00
exports . directRequestHandler = directRequestHandler
exports . proxyRequestHandler = proxyRequestHandler
2020-10-24 17:22:54 -06:00
2021-03-05 09:13:08 -07:00
} , { "../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 ) {
2020-10-26 05:24:30 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-26 05:24:30 -06:00
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 reURI = /^https:\/\/dev\.to\/(.*)\/(.*)\/?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-26 05:24:30 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'devto' ,
2020-10-26 05:24:30 -06:00
} ,
profile : {
display : match [ 1 ] ,
2020-11-06 10:39:06 -07:00
uri : ` https://dev.to/ ${ match [ 1 ] } ` ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-26 05:24:30 -06:00
} ,
proof : {
uri : uri ,
fetch : ` https://dev.to/api/articles/ ${ match [ 1 ] } / ${ match [ 2 ] } ` ,
2020-12-11 03:07:13 -07:00
useProxy : true ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-26 05:24:30 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'body_markdown' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-26 05:24:30 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-10-26 05:24:30 -06:00
}
}
const tests = [
{
uri : 'https://dev.to/alice/post' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://dev.to/alice/post/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://domain.org/alice/post' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-26 05:24:30 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 20 : [ function ( require , module , exports ) {
2020-10-24 17:55:32 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-24 17:55:32 -06:00
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
2020-11-03 14:53:04 -07:00
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 reURI = /^https:\/\/(.*)\/u\/(.*)\/?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-11-03 14:53:04 -07:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'discourse' ,
2020-11-03 14:53:04 -07:00
} ,
profile : {
display : ` ${ match [ 2 ] } @ ${ match [ 1 ] } ` ,
2020-11-06 10:39:06 -07:00
uri : uri ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-11-03 14:53:04 -07:00
} ,
proof : {
uri : uri ,
fetch : ` https:// ${ match [ 1 ] } /u/ ${ match [ 2 ] } .json ` ,
useProxy : true ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-11-03 14:53:04 -07:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'user' , 'bio_raw' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-11-03 14:53:04 -07:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-11-03 14:53:04 -07:00
}
}
const tests = [
{
uri : 'https://domain.org/u/alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-03 14:53:04 -07:00
} ,
{
uri : 'https://domain.org/u/alice/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-03 14:53:04 -07:00
} ,
{
uri : 'https://domain.org/alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-11-03 14:53:04 -07:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 21 : [ function ( require , module , exports ) {
2020-11-03 14:53:04 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-03 14:53:04 -07:00
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
2020-10-24 17:55:32 -06:00
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 .
* /
2020-11-06 10:39:06 -07:00
const dns = require ( 'dns' )
const bent = require ( 'bent' )
const req = bent ( 'GET' )
2020-11-05 04:14:26 -07:00
const utils = require ( '../utils' )
2020-10-24 17:55:32 -06:00
const reURI = /^dns:([a-zA-Z0-9\.\-\_]*)(?:\?(.*))?/
2020-11-06 10:39:06 -07:00
const customRequestHandler = async ( spData , opts ) => {
2020-11-18 13:51:53 -07:00
if ( 'resolveTxt' in dns ) {
2020-11-06 10:39:06 -07:00
const prom = async ( ) => {
return new Promise ( ( resolve , reject ) => {
dns . resolveTxt ( spData . profile . display , ( err , records ) => {
if ( err ) reject ( err )
resolve ( records )
} )
} )
}
return {
hostname : spData . profile . display ,
records : {
2020-11-18 13:51:53 -07:00
txt : await prom ( ) ,
} ,
2020-11-06 10:39:06 -07:00
}
} else {
2020-11-18 13:51:53 -07:00
const res = await req ( spData . proof . uri , null , {
Accept : 'application/json' ,
} )
2020-11-06 10:39:06 -07:00
const json = await res . json ( )
return json
}
}
2020-10-24 17:55:32 -06:00
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-24 17:55:32 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'dns' ,
2020-10-24 17:55:32 -06:00
} ,
profile : {
display : match [ 1 ] ,
2020-11-06 10:39:06 -07:00
uri : ` https:// ${ match [ 1 ] } ` ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-24 17:55:32 -06:00
} ,
proof : {
2020-12-11 03:07:13 -07:00
uri : utils . generateProxyURL ( 'dns' , match [ 1 ] , opts ) ,
2020-10-24 17:55:32 -06:00
fetch : null ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-24 17:55:32 -06:00
} ,
claim : {
fingerprint : null ,
format : 'uri' ,
2020-11-05 04:14:26 -07:00
path : [ 'records' , 'txt' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-24 17:55:32 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : customRequestHandler ,
2020-10-24 17:55:32 -06:00
}
}
const tests = [
{
uri : 'dns:domain.org' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'dns:domain.org?type=TXT' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://domain.org' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-24 17:55:32 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { "../utils" : 37 , "bent" : 1 , "dns" : 3 } ] , 22 : [ function ( require , module , exports ) {
2020-11-03 14:53:04 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-03 14:53:04 -07:00
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 reURI = /^https:\/\/(.*)\/users\/(.*)\/?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-11-03 14:53:04 -07:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'fediverse' ,
2020-11-03 14:53:04 -07:00
} ,
profile : {
display : ` @ ${ match [ 2 ] } @ ${ match [ 1 ] } ` ,
2020-11-06 10:39:06 -07:00
uri : uri ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-11-03 14:53:04 -07:00
} ,
proof : {
uri : uri ,
fetch : null ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-11-03 14:53:04 -07:00
} ,
claim : {
fingerprint : null ,
format : 'fingerprint' ,
path : [ 'summary' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-11-03 14:53:04 -07:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-11-03 14:53:04 -07:00
}
}
const tests = [
{
uri : 'https://domain.org/users/alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-03 14:53:04 -07:00
} ,
{
uri : 'https://domain.org/users/alice/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-03 14:53:04 -07:00
} ,
{
uri : 'https://domain.org/alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-11-03 14:53:04 -07:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 23 : [ function ( require , module , exports ) {
2020-10-26 05:24:30 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-26 05:24:30 -06:00
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 reURI = /^https:\/\/(.*)\/(.*)\/gitea_proof\/?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-26 05:24:30 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'gitea' ,
2020-10-26 05:24:30 -06:00
} ,
profile : {
display : ` ${ match [ 2 ] } @ ${ match [ 1 ] } ` ,
2020-11-06 10:39:06 -07:00
uri : ` https:// ${ match [ 1 ] } / ${ match [ 2 ] } ` ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-26 05:24:30 -06:00
} ,
proof : {
uri : uri ,
fetch : ` https:// ${ match [ 1 ] } /api/v1/repos/ ${ match [ 2 ] } /gitea_proof ` ,
useProxy : true ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-26 05:24:30 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'description' ] ,
2020-11-18 13:51:53 -07:00
relation : 'equals' ,
2020-10-26 05:24:30 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-10-26 05:24:30 -06:00
}
}
const tests = [
{
uri : 'https://domain.org/alice/gitea_proof' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://domain.org/alice/gitea_proof/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://domain.org/alice/other_proof' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-26 05:24:30 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 24 : [ function ( require , module , exports ) {
2020-10-26 05:24:30 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-26 05:24:30 -06:00
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 .
* /
2020-11-05 04:14:26 -07:00
const reURI = /^https:\/\/gist\.github\.com\/(.*)\/(.*)\/?/
2020-10-26 05:24:30 -06:00
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-26 05:24:30 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'github' ,
2020-10-26 05:24:30 -06:00
} ,
profile : {
display : match [ 1 ] ,
2020-11-06 10:39:06 -07:00
uri : ` https://github.com/ ${ match [ 1 ] } ` ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-26 05:24:30 -06:00
} ,
proof : {
uri : uri ,
fetch : ` https://api.github.com/gists/ ${ match [ 2 ] } ` ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-26 05:24:30 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'files' , 'openpgp.md' , 'content' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-26 05:24:30 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-10-26 05:24:30 -06:00
}
}
const tests = [
{
uri : 'https://gist.github.com/Alice/123456789' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://gist.github.com/Alice/123456789/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://domain.org/Alice/123456789' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-26 05:24:30 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 25 : [ function ( require , module , exports ) {
2020-10-24 17:55:32 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-24 17:55:32 -06:00
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
2020-10-26 16:02:22 -06:00
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 reURI = /^https:\/\/(.*)\/(.*)\/gitlab_proof\/?/
const customRequestHandler = async ( spData , opts ) => {
const match = spData . proof . uri . match ( reURI )
const urlUser = ` https:// ${ match [ 1 ] } /api/v4/users?username= ${ match [ 2 ] } `
2020-12-11 03:07:13 -07:00
let resUser
try {
resUser = await req ( urlUser , null , { Accept : 'application/json' } )
} catch ( e ) {
2020-12-20 15:20:32 -07:00
resUser = await req ( utils . generateProxyURL ( 'web' , urlUser , opts ) , null , {
Accept : 'application/json' ,
} )
2020-12-11 03:07:13 -07:00
}
2020-10-26 16:02:22 -06:00
const jsonUser = await resUser . json ( )
2020-11-18 13:51:53 -07:00
const user = jsonUser . find ( ( user ) => user . username === match [ 2 ] )
2020-10-26 16:02:22 -06:00
if ( ! user ) {
2020-11-18 13:51:53 -07:00
throw new Error ( ` No user with username ${ match [ 2 ] } ` )
2020-10-26 16:02:22 -06:00
}
const urlProject = ` https:// ${ match [ 1 ] } /api/v4/users/ ${ user . id } /projects `
2020-12-11 03:07:13 -07:00
let resProject
try {
resProject = await req ( urlProject , null , { Accept : 'application/json' } )
} catch ( e ) {
resProject = await req (
utils . generateProxyURL ( 'web' , urlProject , opts ) ,
null ,
{ Accept : 'application/json' }
)
}
2020-10-26 16:02:22 -06:00
const jsonProject = await resProject . json ( )
2020-11-18 13:51:53 -07:00
const project = jsonProject . find ( ( proj ) => proj . path === 'gitlab_proof' )
2020-10-26 16:02:22 -06:00
if ( ! project ) {
2020-11-18 13:51:53 -07:00
throw new Error ( ` No project at ${ spData . proof . uri } ` )
2020-10-26 16:02:22 -06:00
}
return project
}
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-26 16:02:22 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'gitlab' ,
2020-10-26 16:02:22 -06:00
} ,
profile : {
display : ` ${ match [ 2 ] } @ ${ match [ 1 ] } ` ,
2020-11-06 10:39:06 -07:00
uri : ` https:// ${ match [ 1 ] } / ${ match [ 2 ] } ` ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-26 16:02:22 -06:00
} ,
proof : {
uri : uri ,
fetch : null ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-26 16:02:22 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'description' ] ,
2020-11-18 13:51:53 -07:00
relation : 'equals' ,
2020-10-26 16:02:22 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : customRequestHandler ,
2020-10-26 16:02:22 -06:00
}
}
const tests = [
{
uri : 'https://gitlab.domain.org/alice/gitlab_proof' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 16:02:22 -06:00
} ,
{
uri : 'https://gitlab.domain.org/alice/gitlab_proof/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 16:02:22 -06:00
} ,
{
uri : 'https://domain.org/alice/other_proof' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-26 16:02:22 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { "bent" : 1 } ] , 26 : [ function ( require , module , exports ) {
2020-10-26 16:02:22 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-26 16:02:22 -06:00
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
2020-10-24 17:55:32 -06:00
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 .
* /
2020-11-05 04:14:26 -07:00
const reURI = /^https:\/\/news\.ycombinator\.com\/user\?id=(.*)\/?/
2020-10-24 17:55:32 -06:00
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-24 17:55:32 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'hackernews' ,
2020-10-24 17:55:32 -06:00
} ,
profile : {
display : match [ 1 ] ,
2020-11-06 10:39:06 -07:00
uri : uri ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-24 17:55:32 -06:00
} ,
proof : {
uri : ` https://hacker-news.firebaseio.com/v0/user/ ${ match [ 1 ] } .json ` ,
fetch : null ,
useProxy : true ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-24 17:55:32 -06:00
} ,
claim : {
fingerprint : null ,
format : 'uri' ,
path : [ 'about' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-24 17:55:32 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-10-24 17:55:32 -06:00
}
}
const tests = [
{
uri : 'https://news.ycombinator.com/user?id=Alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://news.ycombinator.com/user?id=Alice/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://domain.org/user?id=Alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-24 17:55:32 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 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 ) {
2020-11-05 04:14:26 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-05 04:14:26 -07:00
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 reURI = /^https:\/\/liberapay\.com\/(.*)\/?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-11-05 04:14:26 -07:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'liberapay' ,
2020-11-05 04:14:26 -07:00
} ,
profile : {
display : match [ 1 ] ,
2020-11-06 10:39:06 -07:00
uri : uri ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-11-05 04:14:26 -07:00
} ,
proof : {
uri : uri ,
fetch : ` https://liberapay.com/ ${ match [ 1 ] } /public.json ` ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-11-05 04:14:26 -07:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'statements' , 'content' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-11-05 04:14:26 -07:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-11-05 04:14:26 -07:00
}
}
const tests = [
{
uri : 'https://liberapay.com/alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-05 04:14:26 -07:00
} ,
{
uri : 'https://liberapay.com/alice/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-05 04:14:26 -07:00
} ,
{
uri : 'https://domain.org/alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-11-05 04:14:26 -07:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 29 : [ function ( require , module , exports ) {
2020-10-24 17:55:32 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-24 17:55:32 -06:00
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 .
* /
2020-11-05 04:14:26 -07:00
const reURI = /^https:\/\/lobste\.rs\/u\/(.*)\/?/
2020-10-24 17:55:32 -06:00
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-24 17:55:32 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'lobsters' ,
2020-10-24 17:55:32 -06:00
} ,
profile : {
display : match [ 1 ] ,
2020-11-06 10:39:06 -07:00
uri : uri ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-24 17:55:32 -06:00
} ,
proof : {
uri : ` https://lobste.rs/u/ ${ match [ 1 ] } .json ` ,
fetch : null ,
useProxy : true ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-24 17:55:32 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'about' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-24 17:55:32 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-10-24 17:55:32 -06:00
}
}
const tests = [
{
uri : 'https://lobste.rs/u/Alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://lobste.rs/u/Alice/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://domain.org/u/Alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-24 17:55:32 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 30 : [ function ( require , module , exports ) {
2020-11-03 14:53:04 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-03 14:53:04 -07:00
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 reURI = /^https:\/\/(.*)\/@(.*)\/?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-11-03 14:53:04 -07:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'mastodon' ,
2020-11-03 14:53:04 -07:00
} ,
profile : {
display : ` @ ${ match [ 2 ] } @ ${ match [ 1 ] } ` ,
2020-11-06 10:39:06 -07:00
uri : uri ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-11-03 14:53:04 -07:00
} ,
proof : {
uri : uri ,
fetch : null ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-11-03 14:53:04 -07:00
} ,
claim : {
fingerprint : null ,
format : 'fingerprint' ,
path : [ 'attachment' , 'value' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-11-03 14:53:04 -07:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-11-03 14:53:04 -07:00
}
}
const tests = [
{
uri : 'https://domain.org/@alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-03 14:53:04 -07:00
} ,
{
uri : 'https://domain.org/@alice/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-11-03 14:53:04 -07:00
} ,
{
uri : 'https://domain.org/alice' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-11-03 14:53:04 -07:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 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 )
2021-03-06 15:34:20 -07:00
let profileUrl = null ,
eventUrl = null ,
proofUrl = null
2021-03-05 09:13:08 -07:00
if ( match [ 2 ] ) {
const params = queryString . parse ( match [ 2 ] )
if ( 'org.keyoxide.e' in params && 'org.keyoxide.r' in params ) {
2021-03-06 15:34:20 -07:00
profileUrl = ` https://matrix.to/#/ ${ match [ 1 ] } `
eventUrl = ` https://matrix.to/#/ ${ params [ 'org.keyoxide.r' ] } / ${ params [ 'org.keyoxide.e' ] } `
2021-03-05 16:06:46 -07:00
proofUrl = utils . generateProxyURL (
'matrix' ,
[ params [ 'org.keyoxide.r' ] , params [ 'org.keyoxide.e' ] ] ,
opts
)
2021-03-05 09:13:08 -07:00
}
}
return {
serviceprovider : {
type : 'communication' ,
name : 'matrix' ,
} ,
profile : {
display : match [ 1 ] ,
2021-03-06 15:34:20 -07:00
uri : profileUrl ,
2021-03-05 09:13:08 -07:00
qr : null ,
} ,
proof : {
2021-03-06 15:34:20 -07:00
uri : eventUrl ,
fetch : proofUrl ,
2021-03-05 09:13:08 -07:00
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 ,
} ,
{
2021-03-05 16:06:46 -07:00
uri :
'matrix:u/@alice:matrix.domain.org?org.keyoxide.r=!123:domain.org&org.keyoxide.e=$123' ,
2021-03-05 09:13:08 -07:00
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 ) {
2020-10-26 05:24:30 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-26 05:24:30 -06:00
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
2021-01-13 05:27:58 -07:00
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 reURI = /^https:\/\/(.*)/
const processURI = ( uri , opts ) => {
if ( ! opts ) {
opts = { }
}
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
name : 'owncast' ,
} ,
profile : {
display : match [ 1 ] ,
uri : uri ,
qr : null ,
} ,
proof : {
uri : ` ${ uri } /api/config ` ,
fetch : null ,
useProxy : false ,
format : 'json' ,
} ,
claim : {
fingerprint : null ,
format : 'fingerprint' ,
path : [ 'socialHandles' , 'url' ] ,
relation : 'contains' ,
} ,
customRequestHandler : null ,
}
}
const tests = [
{
uri : 'https://live.domain.org' ,
shouldMatch : true ,
} ,
{
uri : 'https://live.domain.org/' ,
shouldMatch : true ,
} ,
{
uri : 'https://domain.org/live' ,
shouldMatch : true ,
} ,
{
uri : 'https://domain.org/live/' ,
shouldMatch : true ,
} ,
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { "bent" : 1 } ] , 33 : [ function ( require , module , exports ) {
2021-01-13 05:27:58 -07:00
/ *
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
2020-10-26 05:24:30 -06:00
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 reURI = /^https:\/\/(?:www\.)?reddit\.com\/user\/(.*)\/comments\/(.*)\/(.*)\/?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-26 05:24:30 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'reddit' ,
2020-10-26 05:24:30 -06:00
} ,
profile : {
display : match [ 1 ] ,
2020-11-06 10:39:06 -07:00
uri : ` https://www.reddit.com/user/ ${ match [ 1 ] } ` ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-26 05:24:30 -06:00
} ,
proof : {
uri : uri ,
fetch : ` https://www.reddit.com/user/ ${ match [ 1 ] } /comments/ ${ match [ 2 ] } .json ` ,
useProxy : true ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-26 05:24:30 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ 'data' , 'children' , 'data' , 'selftext' ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-26 05:24:30 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-10-26 05:24:30 -06:00
}
}
const tests = [
{
uri : 'https://www.reddit.com/user/Alice/comments/123456/post' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://www.reddit.com/user/Alice/comments/123456/post/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://reddit.com/user/Alice/comments/123456/post' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://reddit.com/user/Alice/comments/123456/post/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-26 05:24:30 -06:00
} ,
{
uri : 'https://domain.org/user/Alice/comments/123456/post' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-26 05:24:30 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { } ] , 34 : [ function ( require , module , exports ) {
2020-10-24 17:55:32 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-24 17:55:32 -06:00
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 .
* /
2021-03-02 02:48:52 -07:00
const bent = require ( 'bent' )
const req = bent ( 'GET' )
2021-03-01 10:35:59 -07:00
const serviceproviders = require ( '../serviceproviders' )
2021-03-02 07:13:44 -07:00
const utils = require ( '../utils' )
2020-10-24 17:55:32 -06:00
const reURI = /^https:\/\/twitter\.com\/(.*)\/status\/([0-9]*)(?:\?.*)?/
2021-03-01 10:35:59 -07:00
const customRequestHandler = async ( spData , opts ) => {
const match = spData . proof . uri . match ( reURI )
2021-03-02 07:13:44 -07:00
// Attempt direct verification if policy allows it
if ( opts . proxyPolicy !== 'always' ) {
if ( 'twitterBearerToken' in opts && opts . twitterBearerToken ) {
2021-03-05 16:06:46 -07:00
const res = await req (
` https://api.twitter.com/1.1/statuses/show.json?id= ${ match [ 2 ] } ` ,
null ,
{
Accept : 'application/json' ,
Authorization : ` Bearer ${ opts . twitterBearerToken } ` ,
}
)
2021-03-02 07:13:44 -07:00
const json = await res . json ( )
return json . text
} else if ( 'nitterInstance' in opts && opts . nitterInstance ) {
spData . proof . fetch = ` https:// ${ opts . nitterInstance } / ${ match [ 1 ] } /status/ ${ match [ 2 ] } `
const res = await serviceproviders . proxyRequestHandler ( spData , opts )
return res
}
}
// Attempt proxy verification if policy allows it
if ( opts . proxyPolicy !== 'never' && spData . proof . fetch ) {
return req ( utils . generateProxyURL ( 'twitter' , match [ 2 ] , opts ) , null , {
2021-03-02 02:48:52 -07:00
Accept : 'application/json' ,
2021-03-01 10:35:59 -07:00
} )
2021-03-05 16:06:46 -07:00
. then ( async ( res ) => {
return await res . json ( )
} )
. then ( ( res ) => {
return res . data . text
} )
. catch ( ( e ) => {
reject ( e )
} )
2021-03-01 10:35:59 -07:00
}
2021-03-02 07:13:44 -07:00
// No verification
return null
2021-03-01 10:35:59 -07:00
}
2020-10-24 17:55:32 -06:00
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-24 17:55:32 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'web' ,
2020-11-18 13:51:53 -07:00
name : 'twitter' ,
2020-10-24 17:55:32 -06:00
} ,
profile : {
display : ` @ ${ match [ 1 ] } ` ,
2020-11-06 10:39:06 -07:00
uri : ` https://twitter.com/ ${ match [ 1 ] } ` ,
2020-11-18 13:51:53 -07:00
qr : null ,
2020-10-24 17:55:32 -06:00
} ,
proof : {
uri : uri ,
2021-03-02 07:13:44 -07:00
fetch : utils . generateProxyURL ( 'twitter' , match [ 2 ] , opts ) ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'text' ,
2020-10-24 17:55:32 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-24 17:55:32 -06:00
} ,
2021-03-01 10:35:59 -07:00
customRequestHandler : customRequestHandler ,
2020-10-24 17:55:32 -06:00
}
}
const tests = [
{
uri : 'https://twitter.com/alice/status/1234567890123456789' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://twitter.com/alice/status/1234567890123456789/' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://domain.org/alice/status/1234567890123456789' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-24 17:55:32 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { "../serviceproviders" : 18 , "../utils" : 37 , "bent" : 1 } ] , 35 : [ function ( require , module , exports ) {
2020-10-24 17:55:32 -06:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-10-24 17:55:32 -06:00
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 .
* /
2020-11-18 13:51:53 -07:00
const utils = require ( '../utils' )
2020-10-24 17:55:32 -06:00
const reURI = /^xmpp:([a-zA-Z0-9\.\-\_]*)@([a-zA-Z0-9\.\-\_]*)(?:\?(.*))?/
const processURI = ( uri , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts ) {
opts = { }
}
2020-10-24 17:55:32 -06:00
const match = uri . match ( reURI )
return {
serviceprovider : {
type : 'communication' ,
2020-11-18 13:51:53 -07:00
name : 'xmpp' ,
2020-10-24 17:55:32 -06:00
} ,
profile : {
display : ` ${ match [ 1 ] } @ ${ match [ 2 ] } ` ,
2020-11-06 10:39:06 -07:00
uri : uri ,
2020-11-18 13:51:53 -07:00
qr : uri ,
2020-10-24 17:55:32 -06:00
} ,
proof : {
2020-11-18 13:51:53 -07:00
uri : utils . generateProxyURL ( 'xmpp' , ` ${ match [ 1 ] } @ ${ match [ 2 ] } ` , opts ) ,
2020-10-24 17:55:32 -06:00
fetch : null ,
useProxy : false ,
2020-11-18 13:51:53 -07:00
format : 'json' ,
2020-10-24 17:55:32 -06:00
} ,
claim : {
fingerprint : null ,
format : 'message' ,
path : [ ] ,
2020-11-18 13:51:53 -07:00
relation : 'contains' ,
2020-10-24 17:55:32 -06:00
} ,
2020-11-18 13:51:53 -07:00
customRequestHandler : null ,
2020-10-24 17:55:32 -06:00
}
}
const tests = [
{
uri : 'xmpp:alice@domain.org' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'xmpp:alice@domain.org?omemo-sid-123456789=A1B2C3D4E5F6G7H8I9' ,
2020-11-18 13:51:53 -07:00
shouldMatch : true ,
2020-10-24 17:55:32 -06:00
} ,
{
uri : 'https://domain.org' ,
2020-11-18 13:51:53 -07:00
shouldMatch : false ,
} ,
2020-10-24 17:55:32 -06:00
]
exports . reURI = reURI
exports . processURI = processURI
exports . tests = tests
2021-03-05 09:13:08 -07:00
} , { "../utils" : 37 } ] , 36 : [ function ( require , module , exports ) {
2021-01-07 08:26:31 -07:00
( function ( global ) { ( function ( ) {
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2021-01-07 08:26:31 -07:00
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 openpgp = ( typeof window !== "undefined" ? window [ 'openpgp' ] : typeof global !== "undefined" ? global [ 'openpgp' ] : null )
const mergeOptions = require ( 'merge-options' )
const claims = require ( './claims' )
const keys = require ( './keys' )
const verify = ( signature , opts ) => {
return new Promise ( async ( resolve , reject ) => {
let errors = [ ] ,
sigData
2021-01-09 07:22:59 -07:00
2021-01-07 08:26:31 -07:00
try {
sigData = await openpgp . cleartext . readArmored ( signature )
} catch ( error ) {
errors . push ( 'invalid_signature' )
reject ( { errors : errors } )
2021-01-09 07:22:59 -07:00
return
2021-01-07 08:26:31 -07:00
}
2021-01-09 07:22:59 -07:00
const issuerKeyId = sigData . signature . packets [ 0 ] . issuerKeyId . toHex ( )
const signersUserId = sigData . signature . packets [ 0 ] . signersUserId
const preferredKeyServer =
sigData . signature . packets [ 0 ] . preferredKeyServer ||
2021-01-10 09:59:24 -07:00
'https://keys.openpgp.org/'
2021-01-07 08:26:31 -07:00
const text = sigData . getText ( )
let sigKeys = [ ]
let sigClaims = [ ]
2021-01-09 07:22:59 -07:00
2021-01-07 08:26:31 -07:00
text . split ( '\n' ) . forEach ( ( line , i ) => {
2021-01-10 04:34:47 -07:00
const match = line . match ( /^([a-zA-Z0-9]*)\=(.*)$/i )
2021-01-07 08:26:31 -07:00
if ( ! match ) {
return
}
switch ( match [ 1 ] . toLowerCase ( ) ) {
case 'key' :
sigKeys . push ( match [ 2 ] )
break
case 'proof' :
sigClaims . push ( match [ 2 ] )
break
default :
break
}
} )
2021-01-09 07:22:59 -07:00
let keyData , keyUri
// Try overruling key
if ( sigKeys . length > 0 ) {
try {
keyUri = sigKeys [ 0 ]
keyData = await keys . fetch . uri ( keyUri )
2021-03-01 10:35:59 -07:00
} catch ( e ) { }
2021-01-09 07:22:59 -07:00
}
// Try WKD
if ( ! keyData && signersUserId ) {
try {
keyUri = ` wkd: ${ signersUserId } `
keyData = await keys . fetch . uri ( keyUri )
2021-03-01 10:35:59 -07:00
} catch ( e ) { }
2021-01-09 07:22:59 -07:00
}
// Try HKP
if ( ! keyData ) {
try {
const match = preferredKeyServer . match ( /^(.*\:\/\/)?([^/]*)(?:\/)?$/i )
keyUri = ` hkp: ${ match [ 2 ] } : ${ issuerKeyId ? issuerKeyId : signersUserId } `
keyData = await keys . fetch . uri ( keyUri )
2021-03-01 10:35:59 -07:00
} catch ( e ) {
2021-01-09 07:22:59 -07:00
errors . push ( 'key_not_found' )
reject ( { errors : errors } )
return
}
2021-01-07 08:26:31 -07:00
}
const fingerprint = keyData . keyPacket . getFingerprint ( )
try {
const sigVerification = await sigData . verify ( [ keyData ] )
await sigVerification [ 0 ] . verified
} catch ( e ) {
errors . push ( 'invalid_signature_verification' )
reject ( { errors : errors } )
2021-01-09 07:22:59 -07:00
return
2021-01-07 08:26:31 -07:00
}
const claimVerifications = await claims . verify ( sigClaims , fingerprint , opts )
resolve ( {
errors : errors ,
2021-01-09 07:22:59 -07:00
signature : {
data : sigData . signature ,
issuerKeyId : issuerKeyId ,
signersUserId : signersUserId ,
preferredKeyServer : preferredKeyServer ,
} ,
publicKey : {
data : keyData ,
uri : keyUri ,
fingerprint : fingerprint ,
} ,
text : text ,
2021-01-07 08:26:31 -07:00
claims : claimVerifications ,
} )
} )
}
exports . verify = verify
} ) . call ( this ) } ) . call ( this , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } )
2021-03-05 09:13:08 -07:00
} , { "./claims" : 15 , "./keys" : 17 , "merge-options" : 7 } ] , 37 : [ function ( require , module , exports ) {
2020-11-18 13:51:53 -07:00
/ *
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-18 13:51:53 -07:00
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 .
* /
2021-03-05 09:13:08 -07:00
const generateProxyURL = ( type , urlElements , opts ) => {
2020-11-18 13:51:53 -07:00
if ( ! opts || ! opts . doipProxyHostname ) {
return null
}
let addParam = ''
if ( type == 'xmpp' ) {
addParam += '/DESC'
}
2021-03-05 09:13:08 -07:00
if ( ! Array . isArray ( urlElements ) ) {
urlElements = [ urlElements ]
}
2021-03-05 16:06:46 -07:00
urlElements = urlElements . map ( ( x ) => {
return encodeURIComponent ( x )
} )
2021-03-05 09:13:08 -07:00
2020-11-18 13:51:53 -07:00
return ` https:// ${
opts . doipProxyHostname
2021-03-05 09:13:08 -07:00
} / api / 1 / get / $ { type } / $ { urlElements . join ( '/' ) } $ { addParam } `
2020-11-05 04:14:26 -07:00
}
2020-10-24 17:22:54 -06:00
const generateClaim = ( fingerprint , format ) => {
switch ( format ) {
case 'uri' :
return ` openpgp4fpr: ${ fingerprint } `
2020-11-18 13:51:53 -07:00
break
2020-10-24 17:22:54 -06:00
case 'message' :
return ` [Verifying my OpenPGP key: openpgp4fpr: ${ fingerprint } ] `
2020-11-18 13:51:53 -07:00
break
2020-10-24 17:22:54 -06:00
case 'fingerprint' :
return fingerprint
2020-11-18 13:51:53 -07:00
break
2020-10-24 17:22:54 -06:00
default :
throw new Error ( 'No valid claim format' )
2020-10-24 06:38:10 -06:00
}
2020-10-24 17:22:54 -06:00
}
2020-10-24 06:38:10 -06:00
2020-11-05 04:14:26 -07:00
exports . generateProxyURL = generateProxyURL
2020-10-24 17:22:54 -06:00
exports . generateClaim = generateClaim
2020-10-24 06:38:10 -06:00
2021-03-05 09:13:08 -07:00
} , { } ] } , { } , [ 16 ] ) ( 16 )
2020-10-24 06:38:10 -06:00
} ) ;