diff --git a/core/lib/oauth/client.js b/core/lib/oauth/client.js index 52c51eb6ff422dc0899ccec31baf3fa39e42eeae..472772cfefc2c2947536d6a22b022c2f9c27c61f 100644 --- a/core/lib/oauth/client.js +++ b/core/lib/oauth/client.js @@ -5,9 +5,73 @@ Object.defineProperty(exports, "__esModule", { }); exports.openidClient = openidClient; var _openidClient = require("openid-client"); +var httpProxyAgent = require("https-proxy-agent"); + +function isGlobMatch(str, pattern) { + if (pattern === '*') return true; + if (pattern === str) return true; + if (pattern.startsWith('*')) { + var suffix = pattern.slice(1); + return str.endsWith(suffix) || str === suffix.replace(/^\./, ''); + } + if (pattern.endsWith('*')) { + var prefix = pattern.slice(0, -1); + return str.startsWith(prefix); + } + return false; +} + +function isUrlMatchingNoProxy(subjectUrl, noProxy) { + if (!noProxy) return false; + + var subjectUrlTokens; + try { + subjectUrlTokens = new URL(subjectUrl); + } catch (e) { + return false; + } + + var rules = noProxy.split(/[\s,]+/).filter(function(r) { return r.length > 0; }); + + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + var normalizedRule = rule.replace(/^\./, '*'); + var ruleMatch = normalizedRule.match(/^(.+?)(?::(\d+))?$/); + + if (!ruleMatch || !ruleMatch[1]) { + continue; + } + + var ruleHostname = ruleMatch[1].toLowerCase(); + var rulePort = ruleMatch[2]; + var subjectHostname = subjectUrlTokens.hostname.toLowerCase(); + var subjectPort = subjectUrlTokens.port; + + var hostnameIsMatch = isGlobMatch(subjectHostname, ruleHostname); + var portIsMatch = !rulePort || (subjectPort && subjectPort === rulePort); + + if (hostnameIsMatch && portIsMatch) { + return true; + } + } + + return false; +} + async function openidClient(options) { const provider = options.provider; - if (provider.httpOptions) _openidClient.custom.setHttpOptionsDefaults(provider.httpOptions); + let httpOptions = {}; + if (provider.httpOptions) httpOptions = { ...provider.httpOptions }; + + const proxyUrl = process.env.HTTPS_PROXY || process.env.HTTP_PROXY || process.env.https_proxy || process.env.http_proxy; + const noProxy = process.env.NO_PROXY || process.env.no_proxy || ''; + + if (proxyUrl && provider.wellKnown && !isUrlMatchingNoProxy(provider.wellKnown, noProxy)) { + const agent = new httpProxyAgent.HttpsProxyAgent(proxyUrl); + httpOptions.agent = agent; + } + + _openidClient.custom.setHttpOptionsDefaults(httpOptions); let issuer; if (provider.wellKnown) { issuer = await _openidClient.Issuer.discover(provider.wellKnown);