doipjs/src/utils.js

103 lines
2.9 KiB
JavaScript
Raw Normal View History

2020-11-12 10:54:40 -07:00
/*
2021-01-13 05:20:33 -07:00
Copyright 2021 Yarmo Mackenbach
2020-11-12 10:54:40 -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-04-16 03:36:59 -06:00
const validator = require('validator')
2021-04-15 02:21:18 -06:00
const E = require('./enums')
2021-04-22 07:14:21 -06:00
/**
2021-04-22 08:00:37 -06:00
* @module utils
2021-04-22 07:14:21 -06:00
*/
/**
* Generate an URL to request data from a proxy server
* @param {string} type - The name of the fetcher the proxy must use
* @param {object} data - The data the proxy must provide to the fetcher
* @param {object} opts - Options to enable the request
* @param {object} opts.proxy.hostname - The hostname of the proxy server
* @returns {string}
*/
2021-04-16 03:36:59 -06:00
const generateProxyURL = (type, data, opts) => {
try {
validator.isFQDN(opts.proxy.hostname)
} catch (err) {
2021-07-09 15:44:52 -06:00
throw new Error('Invalid proxy hostname')
2020-11-08 04:22:36 -07:00
}
2021-03-05 07:11:13 -07:00
2021-07-09 15:44:52 -06:00
const queryStrings = []
2021-03-05 07:11:13 -07:00
2021-04-19 03:44:30 -06:00
Object.keys(data).forEach((key) => {
2021-04-16 03:36:59 -06:00
queryStrings.push(`${key}=${encodeURIComponent(data[key])}`)
2021-03-05 16:04:56 -07:00
})
2021-03-05 07:11:13 -07:00
2021-04-26 04:11:45 -06:00
return `https://${opts.proxy.hostname}/api/2/get/${type}?${queryStrings.join(
2021-04-19 03:44:30 -06:00
'&'
)}`
2020-11-03 19:01:02 -07:00
}
2021-04-22 07:14:21 -06:00
/**
* Generate the string that must be found in the proof to verify a claim
* @param {string} fingerprint - The fingerprint of the claim
* @param {number} format - The claim's format (see {@link module:enums~ClaimFormat|enums.ClaimFormat})
* @returns {string}
*/
2020-10-24 16:39:43 -06:00
const generateClaim = (fingerprint, format) => {
switch (format) {
2021-04-15 02:21:18 -06:00
case E.ClaimFormat.URI:
2020-10-24 16:39:43 -06:00
return `openpgp4fpr:${fingerprint}`
2021-04-15 02:21:18 -06:00
case E.ClaimFormat.FINGERPRINT:
2020-10-24 16:39:43 -06:00
return fingerprint
2020-10-24 16:31:14 -06:00
default:
throw new Error('No valid claim format')
}
}
2022-09-10 04:14:05 -06:00
/**
* Get the URIs from a string and return them as an array
* @param {string} text - The text that may contain URIs
* @returns {Array.string}
*/
const getUriFromString = (text) => {
const re = /((([A-Za-z0-9]+:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www\.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w\-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[.!/\\\w]*))?)/gi
const res = text.match(re)
const urls = []
if (!res) {
return []
}
res.forEach(url => {
// Remove bad trailing characters
let hasBadTrailingChars = true
while (hasBadTrailingChars) {
const lastChar = url.charAt(url.length - 1)
if ('?!.'.indexOf(lastChar) === -1) {
hasBadTrailingChars = false
continue
}
url = url.substring(0, url.length - 1)
}
urls.push(url)
})
return urls
}
2020-11-03 19:01:02 -07:00
exports.generateProxyURL = generateProxyURL
2020-10-24 16:31:14 -06:00
exports.generateClaim = generateClaim
2022-09-10 04:14:05 -06:00
exports.getUriFromString = getUriFromString