UNPKG

fca-nazrul-remastered

Version:

Facebook-chat-api protect and deploy by Kanzu and HZI Team

138 lines (127 loc) 4.36 kB
/** * Credit: @chronosis | Github: https://github.com/chronosis/uuid-apikey/ * Description: Update Package to resolve Deprecated from package "uuid" */ // index.js // Dependencies const base32 = require('encode32'); const uuidv4 = require('uuid').v4; // APIKeys are a Base32-Crockford encoded representation of UUIDs // Base32-Crockford encoding is used to maintain human readability of the values // and to eliminate confusing overlapping characters (0 -> O; l -> 1; etc.) class UUIDAPIKey { constructor() { this.defaultOptions = { noDashes: false }; } checkDashes(positions, str) { let test = true; for (const pos in positions) { if (positions.hasOwnProperty(pos)) { const chr = str.charAt(positions[pos]); test = test && chr === '-'; } } return test; } isUUID(uuid) { if (!uuid) { throw new ReferenceError('The required parameter \'uuid\' is undefined.'); } const uuidCheck = this.checkDashes([8, 13, 18], uuid); // Only check the first three dashes as ColdFusion implementations erroneously omit the last dash uuid = uuid.replace(/-/g, ''); const re = /[0-9A-Fa-f]*/g; return uuidCheck && uuid.length === 32 && re.test(uuid); } isAPIKey(apiKey) { if (!apiKey) { throw new ReferenceError('The required parameter \'apiKey\' is undefined.'); } apiKey = apiKey.toUpperCase().replace(/-/g, ''); const re = /[0-9A-Z]*/g; return apiKey.length === 28 && re.test(apiKey); } toAPIKey(uuid, options) { if (!uuid) { throw new ReferenceError('The required parameter \'uuid\' is undefined.'); } options = options || this.defaultOptions; if (this.isUUID(uuid)) { uuid = uuid.replace(/-/g, ''); const s1 = uuid.substr(0, 8); const s2 = uuid.substr(8, 8); const s3 = uuid.substr(16, 8); const s4 = uuid.substr(24, 8); const n1 = Number(`0x${s1}`); const n2 = Number(`0x${s2}`); const n3 = Number(`0x${s3}`); const n4 = Number(`0x${s4}`); const e1 = base32.encode32(n1); const e2 = base32.encode32(n2); const e3 = base32.encode32(n3); const e4 = base32.encode32(n4); if (options.noDashes) { return `${e1}${e2}${e3}${e4}`; } return `${e1}-${e2}-${e3}-${e4}`; } throw new TypeError(`The value provide '${uuid}' is not a valid uuid.`); } toUUID(apiKey) { if (!apiKey) { throw new ReferenceError('The required parameter \'apiKey\' is undefined.'); } if (this.isAPIKey(apiKey)) { apiKey = apiKey.replace(/-/g, ''); const e1 = apiKey.substr(0, 7); const e2 = apiKey.substr(7, 7); const e3 = apiKey.substr(14, 7); const e4 = apiKey.substr(21, 7); const n1 = base32.decode32(e1); const n2 = base32.decode32(e2); const n3 = base32.decode32(e3); const n4 = base32.decode32(e4); const s1 = n1.toString(16).padStart(8, '0'); const s2 = n2.toString(16).padStart(8, '0'); const s3 = n3.toString(16).padStart(8, '0'); const s4 = n4.toString(16).padStart(8, '0'); const s2a = s2.substr(0, 4); const s2b = s2.substr(4, 4); const s3a = s3.substr(0, 4); const s3b = s3.substr(4, 4); return `${s1}-${s2a}-${s2b}-${s3a}-${s3b}${s4}`; } throw new TypeError(`The value provide '${apiKey}' is not a valid apiKey.`); } check(apiKey, uuid) { if (!apiKey) { throw new ReferenceError('The required parameter \'apiKey\' is undefined.'); } if (!uuid) { throw new ReferenceError('The required parameter \'uuid\' is undefined.'); } const apiTest = this.isAPIKey(apiKey.toUpperCase()); const uuidTest = this.isUUID(uuid); let uuidCheck; if (apiTest && uuidTest) { uuidCheck = this.toUUID(apiKey); return uuid === uuidCheck; } let errMsg = ''; if (!apiTest) { errMsg += `The value provide '${apiKey}' is not a valid apiKey. `; } if (!uuidTest) { errMsg += `The value provide '${uuid}' is not a valid uuid. `; } throw new TypeError(errMsg); } create(options) { options = options || this.defaultOptions; const uid = uuidv4(); // Generate a new UUIDv4 const apiKey = this.toAPIKey(uid, options); return { apiKey: apiKey, uuid: uid }; } } module.exports = new UUIDAPIKey();