UNPKG

daikin-controller-cloud

Version:

Interact with Daikin Cloud devices and retrieve Tokens

107 lines 4.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OnectaOIDCCallbackServer = void 0; const node_path_1 = require("node:path"); const node_https_1 = require("node:https"); const promises_1 = require("node:fs/promises"); const ip_1 = require("ip"); const oidc_utils_js_1 = require("./oidc-utils.js"); class OnectaOIDCCallbackServer { #config; #server; #redirectUri; constructor(config) { this.#config = config; this.#server = null; this.#redirectUri = null; } async listen() { const config = this.#config; const server = (0, node_https_1.createServer)({ key: await (0, promises_1.readFile)(config.certificatePathKey ?? (0, node_path_1.resolve)(__dirname, '..', '..', 'cert', 'cert.key')), cert: await (0, promises_1.readFile)(config.certificatePathCert ?? (0, node_path_1.resolve)(__dirname, '..', '..', 'cert', 'cert.pem')), }); await new Promise((resolve, reject) => { const cleanup = () => { server.removeListener('listening', onListening); server.removeListener('error', onError); }; const onListening = () => { cleanup(); resolve(); }; const onError = (err) => { cleanup(); reject(err); }; server.on('listening', onListening); server.on('error', onError); server.listen(config.oidcCallbackServerPort ?? 0, config.oidcCallbackServerBindAddr ?? '0.0.0.0'); }); let callbackUrl = config.oidcCallbackServerBaseUrl; if (!callbackUrl) { const oidcHostname = config.oidcCallbackServerExternalAddress ?? (0, ip_1.address)('public'); const oidcPort = config.oidcCallbackServerPort ?? server.address().port; callbackUrl = `https://${oidcHostname}:${oidcPort}`; } this.#server = server; this.#redirectUri = callbackUrl; return callbackUrl; } async waitForAuthCodeAndClose(oidc_state, auth_url) { const config = this.#config; const server = this.#server; if (!server?.listening) { throw new Error('server is not listening'); } return await new Promise((resolve, reject) => { let timeout; const cleanup = () => { clearTimeout(timeout); server.removeListener('request', onRequest); server.removeListener('error', onError); server.closeAllConnections(); server.close(); }; const onError = (err) => { cleanup(); reject(err); }; const onTimeout = () => { cleanup(); reject(new Error('Authorization time out')); }; const onAuthCode = (code) => { cleanup(); resolve(code); }; const onRequest = (req, res) => { const url = new URL(req.url ?? '/', this.#redirectUri); const resState = url.searchParams.get('state'); const authCode = url.searchParams.get('code'); if (resState === oidc_state && authCode) { res.statusCode = 200; res.write(config.onectaOidcAuthThankYouHtml ?? oidc_utils_js_1.onecta_oidc_auth_thank_you_html); res.once('finish', () => onAuthCode(authCode)); } else if (!resState && !authCode && (req.url ?? '/') === '/') { // Redirect to auth_url res.writeHead(302, { 'Location': auth_url, }); } else { res.statusCode = 400; } res.end(); }; timeout = setTimeout(onTimeout, (config.oidcAuthorizationTimeoutS || 300) * 1000); server.on('request', onRequest); server.on('error', onError); }); } } exports.OnectaOIDCCallbackServer = OnectaOIDCCallbackServer; //# sourceMappingURL=oidc-callback-server.js.map