UNPKG

aladinnetwork-blockstack

Version:

The Aladin Javascript library for authentication, identity, and storage.

201 lines 7.61 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const bitcoinjs_lib_1 = require("bitcoinjs-lib"); const crypto_1 = __importDefault(require("crypto")); // @ts-ignore: Could not find a declaration file for module const jsontokens_1 = require("jsontokens"); const utils_1 = require("../utils"); const fetchUtil_1 = require("../fetchUtil"); const keys_1 = require("../keys"); const logger_1 = require("../logger"); const errors_1 = require("../errors"); /** * @ignore */ exports.ALADIN_GAIA_HUB_LABEL = 'aladin-gaia-hub-config'; /** * * @param filename * @param contents * @param hubConfig * @param contentType * * @ignore */ function uploadToGaiaHub(filename, contents, hubConfig, contentType = 'application/octet-stream') { return __awaiter(this, void 0, void 0, function* () { logger_1.Logger.debug(`uploadToGaiaHub: uploading ${filename} to ${hubConfig.server}`); const response = yield fetchUtil_1.fetchPrivate(`${hubConfig.server}/store/${hubConfig.address}/${filename}`, { method: 'POST', headers: { 'Content-Type': contentType, Authorization: `bearer ${hubConfig.token}` }, body: contents }); if (!response.ok) { throw new Error('Error when uploading to Gaia hub'); } const responseText = yield response.text(); const responseJSON = JSON.parse(responseText); return responseJSON.publicURL; }); } exports.uploadToGaiaHub = uploadToGaiaHub; function deleteFromGaiaHub(filename, hubConfig) { return __awaiter(this, void 0, void 0, function* () { logger_1.Logger.debug(`deleteFromGaiaHub: deleting ${filename} from ${hubConfig.server}`); const response = yield fetch(`${hubConfig.server}/delete/${hubConfig.address}/${filename}`, { method: 'DELETE', headers: { Authorization: `bearer ${hubConfig.token}` } }); if (!response.ok) { let responseMsg = ''; try { responseMsg = yield response.text(); } catch (error) { logger_1.Logger.debug(`Error getting bad http response text: ${error}`); } const errorMsg = 'Error deleting file from Gaia hub: ' + `${response.status} ${response.statusText}: ${responseMsg}`; logger_1.Logger.error(errorMsg); if (response.status === 404) { throw new errors_1.FileNotFound(errorMsg); } else { throw new Error(errorMsg); } } }); } exports.deleteFromGaiaHub = deleteFromGaiaHub; /** * * @param filename * @param hubConfig * * @ignore */ function getFullReadUrl(filename, hubConfig) { return Promise.resolve(`${hubConfig.url_prefix}${hubConfig.address}/${filename}`); } exports.getFullReadUrl = getFullReadUrl; /** * * @param challengeText * @param signerKeyHex * * @ignore */ function makeLegacyAuthToken(challengeText, signerKeyHex) { // only sign specific legacy auth challenges. let parsedChallenge; try { parsedChallenge = JSON.parse(challengeText); } catch (err) { throw new Error('Failed in parsing legacy challenge text from the gaia hub.'); } if (parsedChallenge[0] === 'gaiahub' && parsedChallenge[3] === 'aladin_storage_please_sign') { const signer = utils_1.hexStringToECPair(signerKeyHex + (signerKeyHex.length === 64 ? '01' : '')); const digest = bitcoinjs_lib_1.crypto.sha256(Buffer.from(challengeText)); const signatureBuffer = signer.sign(digest); const signatureWithHash = bitcoinjs_lib_1.script.signature.encode(signatureBuffer, bitcoinjs_lib_1.Transaction.SIGHASH_NONE); // We only want the DER encoding so remove the sighash version byte at the end. // See: https://github.com/bitcoinjs/bitcoinjs-lib/issues/1241#issuecomment-428062912 const signature = signatureWithHash.toString('hex').slice(0, -2); const publickey = keys_1.getPublicKeyFromPrivate(signerKeyHex); const token = Buffer.from(JSON.stringify({ publickey, signature })).toString('base64'); return token; } else { throw new Error('Failed to connect to legacy gaia hub. If you operate this hub, please update.'); } } /** * * @param hubInfo * @param signerKeyHex * @param hubUrl * @param associationToken * * @ignore */ function makeV1GaiaAuthToken(hubInfo, signerKeyHex, hubUrl, associationToken) { const challengeText = hubInfo.challenge_text; const handlesV1Auth = (hubInfo.latest_auth_version && parseInt(hubInfo.latest_auth_version.slice(1), 10) >= 1); const iss = keys_1.getPublicKeyFromPrivate(signerKeyHex); if (!handlesV1Auth) { return makeLegacyAuthToken(challengeText, signerKeyHex); } const salt = crypto_1.default.randomBytes(16).toString('hex'); const payload = { gaiaChallenge: challengeText, hubUrl, iss, salt, associationToken }; const token = new jsontokens_1.TokenSigner('ES256K', signerKeyHex).sign(payload); return `v1:${token}`; } /** * * @ignore */ function connectToGaiaHub(gaiaHubUrl, challengeSignerHex, associationToken) { return __awaiter(this, void 0, void 0, function* () { logger_1.Logger.debug(`connectToGaiaHub: ${gaiaHubUrl}/hub_info`); const response = yield fetchUtil_1.fetchPrivate(`${gaiaHubUrl}/hub_info`); const hubInfo = yield response.json(); const readURL = hubInfo.read_url_prefix; const token = makeV1GaiaAuthToken(hubInfo, challengeSignerHex, gaiaHubUrl, associationToken); const address = utils_1.ecPairToAddress(utils_1.hexStringToECPair(challengeSignerHex + (challengeSignerHex.length === 64 ? '01' : ''))); return { url_prefix: readURL, address, token, server: gaiaHubUrl }; }); } exports.connectToGaiaHub = connectToGaiaHub; /** * * @param gaiaHubUrl * @param appPrivateKey * * @ignore */ function getBucketUrl(gaiaHubUrl, appPrivateKey) { return __awaiter(this, void 0, void 0, function* () { const challengeSigner = bitcoinjs_lib_1.ECPair.fromPrivateKey(Buffer.from(appPrivateKey, 'hex')); const response = yield fetchUtil_1.fetchPrivate(`${gaiaHubUrl}/hub_info`); const responseText = yield response.text(); const responseJSON = JSON.parse(responseText); const readURL = responseJSON.read_url_prefix; const address = utils_1.ecPairToAddress(challengeSigner); const bucketUrl = `${readURL}${address}/`; return bucketUrl; }); } exports.getBucketUrl = getBucketUrl; //# sourceMappingURL=hub.js.map