UNPKG

@sap/cli-core

Version:

Command-Line Interface (CLI) Core Module

117 lines (116 loc) 5.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCode = exports.retrieveCode = exports.refreshToken = void 0; const http_1 = require("http"); const fs_extra_1 = require("fs-extra"); const logger_1 = require("../../../../../logger"); const utils_1 = require("../utils"); const setAuthorization_1 = require("./setAuthorization"); const constants_1 = require("../../../../../constants"); const options_1 = require("../../../../../utils/options"); const SecretsStorageSingleton_1 = require("../../../../../cache/secrets/SecretsStorageSingleton"); const openUtils_1 = require("../../../../../utils/openUtils"); const utils_2 = require("../../../../../logger/utils"); const types_1 = require("../../../../../types"); const getLogger = () => (0, logger_1.get)("commands.handler.authentication.oauth.tokenProvider.utils.refreshToken"); const refreshToken = async (forceRefresh = false) => { const logger = getLogger(); const secrets = await SecretsStorageSingleton_1.SecretsStorageSingleton.SINGLETON.getDefaultSecret(); if ((!forceRefresh && !secrets.expires_after) || (secrets.authorization_flow === types_1.GrantType.authorization_code && !secrets.refresh_token)) { (0, utils_2.logVerbose)(logger, "Access token cannot be refreshed. Is the refresh token available?"); throw new Error("invalid secrets information"); } logger.info("checking token expiry date"); if (forceRefresh || (0, utils_1.isExpired)(secrets.expires_after)) { logger.debug("access token is expired, refreshing token"); if (secrets.authorization_flow === types_1.GrantType.client_credentials) { await (0, utils_1.readToken)({ grant_type: secrets.authorization_flow }); } else { await (0, utils_1.readToken)({ refresh_token: secrets.refresh_token, grant_type: types_1.GrantType.refresh_token, }); } await (0, setAuthorization_1.updateAuthorization)(); } else { logger.debug("access token is not expired"); } }; exports.refreshToken = refreshToken; const retrieveCode = async () => new Promise((resolve, reject) => { void (async () => { const { debug, error, output } = getLogger(); try { const secrets = await SecretsStorageSingleton_1.SecretsStorageSingleton.SINGLETON.getDefaultSecret(); const defaultPort = secrets.customClient ? "8080" : "65000"; const PORT = parseInt(process.env.CLI_HTTP_PORT ?? defaultPort, 10); let timeout; const server = (0, http_1.createServer)((req, res) => { void (async () => { clearTimeout(timeout); const code = new URL(req.url ? `http://localhost:${PORT}${req.url}` : "http://no-code.damn").searchParams.get("code"); let file; try { file = await (0, fs_extra_1.readFile)(code ? constants_1.PATH_TO_SUCCESS_HTML : constants_1.PATH_TO_ERROR_HTML, "utf8"); } catch (err) { debug("failed to read file for code", code, err); file = "<html><body>Ops, something went wrong! Please try again.</body></html>"; } res.writeHead(200, { "Content-Type": "text/html", "Content-Security-Policy": "frame-ancestors 'none'", "X-Frame-Options": "DENY", }); res.end(file, "utf8"); server.close(); if (code) { debug(`code received: ${code}`); resolve(code); } else { const message = "no code found in callback URI"; error(message); reject(new Error(message)); } })(); }); timeout = setTimeout(() => { server.close(); const message = `Did not receive a code within 30 seconds. Did you maintain the redirect URI for the OAuth client as http://localhost:${PORT} in SAP Datasphere?`; output(message); reject(new Error(message)); }, 30 * 1000); server.listen(PORT); debug(`started http server at localhost:${PORT}`); } catch (err) { error("failed to instantiate server", err); reject(new Error("failed to instantiate server", { cause: err })); } })(); }); exports.retrieveCode = retrieveCode; const getCode = async (authorizeUrl, clientId) => { const { debug } = getLogger(); try { return (0, options_1.getOptionValueFromConfig)(constants_1.OPTION_CODE); } catch (err) { debug("failed to retrieve code from options", err); const code = (0, exports.retrieveCode)(); void (0, openUtils_1.openUrlInBrowser)(authorizeUrl, { response_type: "code", client_id: clientId, }); return code; } }; exports.getCode = getCode;