@verdaccio/auth 8.0.0-next-8.3 → 8.0.0-next-8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/build/auth.d.ts +3 -2
- package/build/auth.js +7 -7
- package/build/auth.js.map +1 -1
- package/package.json +8 -8
- package/src/auth.ts +9 -7
- package/test/auth-utils-middleware.spec.ts +3 -3
- package/test/auth-utils.spec.ts +2 -2
- package/test/auth.spec.ts +31 -31
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @verdaccio/auth
|
|
2
2
|
|
|
3
|
+
## 8.0.0-next-8.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e93d6a3: chore: auth package requires logger as parameter
|
|
8
|
+
- Updated dependencies [48aa89f]
|
|
9
|
+
- Updated dependencies [58e0d95]
|
|
10
|
+
- @verdaccio/core@8.0.0-next-8.4
|
|
11
|
+
- @verdaccio/config@8.0.0-next-8.4
|
|
12
|
+
- @verdaccio/loaders@8.0.0-next-8.3
|
|
13
|
+
- verdaccio-htpasswd@13.0.0-next-8.4
|
|
14
|
+
- @verdaccio/utils@8.1.0-next-8.4
|
|
15
|
+
- @verdaccio/signature@8.0.0-next-8.1
|
|
16
|
+
|
|
3
17
|
## 8.0.0-next-8.3
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/build/auth.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { VerdaccioError, pluginUtils } from '@verdaccio/core';
|
|
2
|
-
import { Callback, Config, JWTSignOptions, RemoteUser } from '@verdaccio/types';
|
|
2
|
+
import { Callback, Config, JWTSignOptions, Logger, RemoteUser } from '@verdaccio/types';
|
|
3
3
|
import { $RequestExtend, $ResponseExtend, IAuthMiddleware, NextFunction, TokenEncryption } from './types';
|
|
4
4
|
declare class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
|
5
5
|
config: Config;
|
|
6
6
|
secret: string;
|
|
7
|
+
logger: Logger;
|
|
7
8
|
plugins: pluginUtils.Auth<Config>[];
|
|
8
|
-
constructor(config: Config);
|
|
9
|
+
constructor(config: Config, logger: Logger);
|
|
9
10
|
init(): Promise<void>;
|
|
10
11
|
private loadDefaultPlugin;
|
|
11
12
|
private loadPlugin;
|
package/build/auth.js
CHANGED
|
@@ -10,16 +10,16 @@ var _verdaccioHtpasswd = require("verdaccio-htpasswd");
|
|
|
10
10
|
var _config = require("@verdaccio/config");
|
|
11
11
|
var _core = require("@verdaccio/core");
|
|
12
12
|
var _loaders = require("@verdaccio/loaders");
|
|
13
|
-
var _logger = require("@verdaccio/logger");
|
|
14
13
|
var _signature = require("@verdaccio/signature");
|
|
15
14
|
var _utils = require("@verdaccio/utils");
|
|
16
15
|
var _utils2 = require("./utils");
|
|
17
16
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
17
|
const debug = (0, _debug.default)('verdaccio:auth');
|
|
19
18
|
class Auth {
|
|
20
|
-
constructor(config) {
|
|
19
|
+
constructor(config, logger) {
|
|
21
20
|
this.config = config;
|
|
22
21
|
this.secret = config.secret;
|
|
22
|
+
this.logger = logger;
|
|
23
23
|
this.plugins = [];
|
|
24
24
|
if (!this.secret) {
|
|
25
25
|
throw new TypeError('secret it is required value on initialize the auth class');
|
|
@@ -38,7 +38,7 @@ class Auth {
|
|
|
38
38
|
debug('load default auth plugin');
|
|
39
39
|
const pluginOptions = {
|
|
40
40
|
config: this.config,
|
|
41
|
-
logger:
|
|
41
|
+
logger: this.logger
|
|
42
42
|
};
|
|
43
43
|
let authPlugin;
|
|
44
44
|
try {
|
|
@@ -47,7 +47,7 @@ class Auth {
|
|
|
47
47
|
}, pluginOptions);
|
|
48
48
|
} catch (error) {
|
|
49
49
|
debug('error on loading auth htpasswd plugin stack: %o', error);
|
|
50
|
-
|
|
50
|
+
this.logger.info({}, 'no auth plugin has been found');
|
|
51
51
|
return [];
|
|
52
52
|
}
|
|
53
53
|
return [authPlugin];
|
|
@@ -55,7 +55,7 @@ class Auth {
|
|
|
55
55
|
async loadPlugin() {
|
|
56
56
|
return (0, _loaders.asyncLoadPlugin)(this.config.auth, {
|
|
57
57
|
config: this.config,
|
|
58
|
-
logger:
|
|
58
|
+
logger: this.logger
|
|
59
59
|
}, plugin => {
|
|
60
60
|
const {
|
|
61
61
|
authenticate,
|
|
@@ -67,7 +67,7 @@ class Auth {
|
|
|
67
67
|
}
|
|
68
68
|
_applyDefaultPlugins() {
|
|
69
69
|
// TODO: rename to applyFallbackPluginMethods
|
|
70
|
-
this.plugins.push((0, _utils2.getDefaultPlugins)(
|
|
70
|
+
this.plugins.push((0, _utils2.getDefaultPlugins)(this.logger));
|
|
71
71
|
}
|
|
72
72
|
changePassword(username, password, newPassword, cb) {
|
|
73
73
|
const validPlugins = _lodash.default.filter(this.plugins, plugin => (0, _utils.isFunction)(plugin.changePassword));
|
|
@@ -82,7 +82,7 @@ class Auth {
|
|
|
82
82
|
debug('updating password for %o', username);
|
|
83
83
|
plugin.changePassword(username, password, newPassword, (err, profile) => {
|
|
84
84
|
if (err) {
|
|
85
|
-
|
|
85
|
+
this.logger.error({
|
|
86
86
|
username,
|
|
87
87
|
err
|
|
88
88
|
}, `An error has been produced
|
package/build/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","names":["_debug","_interopRequireDefault","require","_lodash","_verdaccioHtpasswd","_config","_core","_loaders","_logger","_signature","_utils","_utils2","e","__esModule","default","debug","buildDebug","Auth","constructor","config","secret","plugins","TypeError","init","loadPlugin","length","loadDefaultPlugin","_applyDefaultPlugins","pluginOptions","logger","authPlugin","HTPasswd","file","error","info","asyncLoadPlugin","auth","plugin","authenticate","allow_access","allow_publish","serverSettings","pluginPrefix","PLUGIN_CATEGORY","AUTHENTICATION","push","getDefaultPlugins","changePassword","username","password","newPassword","cb","validPlugins","_","filter","isFunction","isEmpty","errorUtils","getInternalError","SUPPORT_ERRORS","PLUGIN_MISSING_INTERFACE","isNil","err","profile","invalidateToken","token","console","log","Promise","resolve","slice","next","shift","groups","message","isString","isGroupValid","isArray","API_ERROR","BAD_FORMAT_USER_GROUP","createRemoteUser","add_user","user","self","method","adduser","warningUtils","emit","Codes","VERWAR006","ok","packageName","packageVersion","callback","pkgAllowAccess","name","version","pkg","Object","assign","getMatchedPackagesSpec","packages","allow_unpublish","isError","apiJWTmiddleware","helpers","createAnonymousRemoteUser","req","res","_next","pause","resume","remote_user","remoteUser","locals","authorization","headers","isAuthHeaderValid","getBadRequest","BAD_AUTH_HEADER","security","isAESLegacy","handleAESMiddleware","handleJWTAPIMiddleware","scheme","parseAuthTokenHeader","toUpperCase","TOKEN_BASIC","credentials","convertPayloadToBase64","toString","parseBasicPayload","getMiddlewareCredentials","getForbidden","BAD_USERNAME_PASSWORD","_isRemoteUserValid","isUndefined","webUIJWTmiddleware","status","statusCode","send","replace","TOKEN_BEARER","verifyJWTPayload","jwtEncrypt","signOptions","real_groups","realGroupsValidated","groupedGroups","Array","from","Set","concat","payload","signPayload","aesEncrypt","value","signatureUtils","TOKEN_VALID_LENGTH","aesEncryptDeprecated","Buffer","exports"],"sources":["../src/auth.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport { HTPasswd } from 'verdaccio-htpasswd';\n\nimport { createAnonymousRemoteUser, createRemoteUser } from '@verdaccio/config';\nimport {\n API_ERROR,\n PLUGIN_CATEGORY,\n SUPPORT_ERRORS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n VerdaccioError,\n errorUtils,\n pluginUtils,\n warningUtils,\n} from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport {\n aesEncrypt,\n aesEncryptDeprecated,\n parseBasicPayload,\n signPayload,\n utils as signatureUtils,\n} from '@verdaccio/signature';\nimport {\n AllowAccess,\n Callback,\n Config,\n JWTSignOptions,\n PackageAccess,\n RemoteUser,\n Security,\n} from '@verdaccio/types';\nimport { getMatchedPackagesSpec, isFunction, isNil } from '@verdaccio/utils';\n\nimport {\n $RequestExtend,\n $ResponseExtend,\n AESPayload,\n IAuthMiddleware,\n NextFunction,\n TokenEncryption,\n} from './types';\nimport {\n convertPayloadToBase64,\n getDefaultPlugins,\n getMiddlewareCredentials,\n isAESLegacy,\n isAuthHeaderValid,\n parseAuthTokenHeader,\n verifyJWTPayload,\n} from './utils';\n\nconst debug = buildDebug('verdaccio:auth');\n\nclass Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {\n public config: Config;\n public secret: string;\n public plugins: pluginUtils.Auth<Config>[];\n\n public constructor(config: Config) {\n this.config = config;\n this.secret = config.secret;\n this.plugins = [];\n if (!this.secret) {\n throw new TypeError('secret it is required value on initialize the auth class');\n }\n }\n\n public async init() {\n let plugins = (await this.loadPlugin()) as pluginUtils.Auth<unknown>[];\n\n debug('auth plugins found %s', plugins.length);\n if (!plugins || plugins.length === 0) {\n plugins = this.loadDefaultPlugin();\n }\n this.plugins = plugins;\n\n this._applyDefaultPlugins();\n }\n\n private loadDefaultPlugin() {\n debug('load default auth plugin');\n const pluginOptions: pluginUtils.PluginOptions = {\n config: this.config,\n logger,\n };\n let authPlugin;\n try {\n authPlugin = new HTPasswd(\n { file: './htpasswd' },\n pluginOptions as any as pluginUtils.PluginOptions\n );\n } catch (error: any) {\n debug('error on loading auth htpasswd plugin stack: %o', error);\n logger.info({}, 'no auth plugin has been found');\n return [];\n }\n\n return [authPlugin];\n }\n\n private async loadPlugin() {\n return asyncLoadPlugin<pluginUtils.Auth<unknown>>(\n this.config.auth,\n {\n config: this.config,\n logger,\n },\n (plugin): boolean => {\n const { authenticate, allow_access, allow_publish } = plugin;\n\n return (\n typeof authenticate !== 'undefined' ||\n typeof allow_access !== 'undefined' ||\n typeof allow_publish !== 'undefined'\n );\n },\n this.config?.serverSettings?.pluginPrefix,\n PLUGIN_CATEGORY.AUTHENTICATION\n );\n }\n\n private _applyDefaultPlugins(): void {\n // TODO: rename to applyFallbackPluginMethods\n this.plugins.push(getDefaultPlugins(logger));\n }\n\n public changePassword(\n username: string,\n password: string,\n newPassword: string,\n cb: Callback\n ): void {\n const validPlugins = _.filter(this.plugins, (plugin) => isFunction(plugin.changePassword));\n\n if (_.isEmpty(validPlugins)) {\n return cb(errorUtils.getInternalError(SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE));\n }\n\n for (const plugin of validPlugins) {\n if (isNil(plugin) || isFunction(plugin.changePassword) === false) {\n debug('auth plugin does not implement changePassword, trying next one');\n continue;\n } else {\n debug('updating password for %o', username);\n plugin.changePassword!(username, password, newPassword, (err, profile): void => {\n if (err) {\n logger.error(\n { username, err },\n `An error has been produced\n updating the password for @{username}. Error: @{err.message}`\n );\n return cb(err);\n }\n\n debug('updated password for %o was successful', username);\n return cb(null, profile);\n });\n }\n }\n }\n\n public async invalidateToken(token: string) {\n // eslint-disable-next-line no-console\n console.log('invalidate token pending to implement', token);\n return Promise.resolve();\n }\n\n public authenticate(\n username: string,\n password: string,\n cb: (error: VerdaccioError | null, user?: RemoteUser) => void\n ): void {\n const plugins = this.plugins.slice(0);\n (function next(): void {\n const plugin = plugins.shift() as pluginUtils.Auth<Config>;\n\n if (isFunction(plugin.authenticate) === false) {\n return next();\n }\n\n debug('authenticating %o', username);\n plugin.authenticate(username, password, function (err: VerdaccioError | null, groups): void {\n if (err) {\n debug('authenticating for user %o failed. Error: %o', username, err?.message);\n return cb(err);\n }\n\n // Expect: SKIP if groups is falsey and not an array\n // with at least one item (truthy length)\n // Expect: CONTINUE otherwise (will error if groups is not\n // an array, but this is current behavior)\n // Caveat: STRING (if valid) will pass successfully\n // bug give unexpected results\n // Info: Cannot use `== false to check falsey values`\n if (!!groups && groups.length !== 0) {\n // TODO: create a better understanding of expectations\n if (_.isString(groups)) {\n throw new TypeError('plugin group error: invalid type for function');\n }\n const isGroupValid: boolean = _.isArray(groups);\n if (!isGroupValid) {\n throw new TypeError(API_ERROR.BAD_FORMAT_USER_GROUP);\n }\n\n debug('authentication for user %o was successfully. Groups: %o', username, groups);\n return cb(err, createRemoteUser(username, groups));\n }\n next();\n });\n })();\n }\n\n public add_user(\n user: string,\n password: string,\n cb: (error: VerdaccioError | null, user?: RemoteUser) => void\n ): void {\n const self = this;\n const plugins = this.plugins.slice(0);\n debug('add user %o', user);\n\n (function next(): void {\n let method = 'adduser';\n const plugin = plugins.shift() as pluginUtils.Auth<Config>;\n // @ts-expect-error future major (7.x) should remove this section\n if (typeof plugin.adduser === 'undefined' && typeof plugin.add_user === 'function') {\n method = 'add_user';\n warningUtils.emit(warningUtils.Codes.VERWAR006);\n }\n // @ts-ignore\n if (typeof plugin[method] !== 'function') {\n next();\n } else {\n // TODO: replace by adduser whenever add_user deprecation method has been removed\n // @ts-ignore\n plugin[method](\n user,\n password,\n function (err: VerdaccioError | null, ok?: boolean | string): void {\n if (err) {\n debug('the user %o could not be added. Error: %o', user, err?.message);\n return cb(err);\n }\n if (ok) {\n debug('the user %o has been added', user);\n return self.authenticate(user, password, cb);\n }\n debug('user could not be added, skip to next auth plugin');\n next();\n }\n );\n }\n })();\n }\n\n /**\n * Allow user to access a package.\n */\n public allow_access(\n { packageName, packageVersion }: pluginUtils.AuthPluginPackage,\n user: RemoteUser,\n callback: pluginUtils.AccessCallback\n ): void {\n const plugins = this.plugins.slice(0);\n const pkgAllowAccess: AllowAccess = { name: packageName, version: packageVersion };\n const pkg = Object.assign(\n {},\n pkgAllowAccess,\n getMatchedPackagesSpec(packageName, this.config.packages)\n ) as AllowAccess & PackageAccess;\n debug('allow access for %o', packageName);\n\n (function next(): void {\n const plugin: pluginUtils.Auth<unknown> = plugins.shift() as pluginUtils.Auth<unknown>;\n\n if (_.isNil(plugin) || isFunction(plugin.allow_access) === false) {\n return next();\n }\n\n plugin.allow_access!(user, pkg, function (err: VerdaccioError | null, ok?: boolean): void {\n if (err) {\n debug('forbidden access for %o. Error: %o', packageName, err?.message);\n return callback(err);\n }\n\n if (ok) {\n debug('allowed access for %o', packageName);\n return callback(null, ok);\n }\n\n next(); // cb(null, false) causes next plugin to roll\n });\n })();\n }\n\n public allow_unpublish(\n { packageName, packageVersion }: pluginUtils.AuthPluginPackage,\n user: RemoteUser,\n callback: Callback\n ): void {\n const pkg = Object.assign(\n { name: packageName, version: packageVersion },\n getMatchedPackagesSpec(packageName, this.config.packages)\n );\n debug('allow unpublish for %o', packageName);\n\n for (const plugin of this.plugins) {\n if (typeof plugin?.allow_unpublish !== 'function') {\n debug('allow unpublish for %o plugin does not implement allow_unpublish', packageName);\n continue;\n } else {\n plugin.allow_unpublish(user, pkg, (err, ok): void => {\n if (err) {\n debug(\n 'forbidden publish for %o, it will fallback on unpublish permissions',\n packageName\n );\n return callback(err);\n }\n\n if (_.isNil(ok) === true) {\n debug('bypass unpublish for %o, publish will handle the access', packageName);\n return this.allow_publish({ packageName, packageVersion }, user, callback);\n }\n\n if (ok) {\n debug('allowed unpublish for %o', packageName);\n return callback(null, ok);\n }\n });\n }\n }\n }\n\n /**\n * Allow user to publish a package.\n */\n public allow_publish(\n { packageName, packageVersion }: pluginUtils.AuthPluginPackage,\n user: RemoteUser,\n callback: Callback\n ): void {\n const plugins = this.plugins.slice(0);\n const pkg = Object.assign(\n { name: packageName, version: packageVersion },\n getMatchedPackagesSpec(packageName, this.config.packages)\n );\n debug('allow publish for %o init | plugins: %o', packageName, plugins.length);\n\n (function next(): void {\n const plugin = plugins.shift();\n\n if (typeof plugin?.allow_publish !== 'function') {\n debug('allow publish for %o plugin does not implement allow_publish', packageName);\n return next();\n }\n\n plugin.allow_publish(user, pkg, (err: VerdaccioError | null, ok?: boolean): void => {\n if (_.isNil(err) === false && _.isError(err)) {\n debug('forbidden publish for %o', packageName);\n return callback(err);\n }\n\n if (ok) {\n debug('allowed publish for %o', packageName);\n return callback(null, ok);\n }\n\n debug('allow publish skip validation for %o', packageName);\n next(); // cb(null, false) causes next plugin to roll\n });\n })();\n }\n\n public apiJWTmiddleware(): any {\n debug('jwt middleware');\n const plugins = this.plugins.slice(0);\n const helpers = { createAnonymousRemoteUser, createRemoteUser };\n for (const plugin of plugins) {\n if (plugin.apiJWTmiddleware) {\n return plugin.apiJWTmiddleware(helpers);\n }\n }\n\n return (req: $RequestExtend, res: $ResponseExtend, _next: NextFunction) => {\n req.pause();\n const next = function (err?: VerdaccioError): NextFunction {\n req.resume();\n // uncomment this to reject users with bad auth headers\n // return _next.apply(null, arguments)\n // swallow error, user remains unauthorized\n // set remoteUserError to indicate that user was attempting authentication\n if (err) {\n req.remote_user.error = err.message;\n }\n\n return _next() as unknown as NextFunction;\n };\n\n // FUTURE: disabled, not removed yet but seems unreacable code\n // if (this._isRemoteUserValid(req.remote_user)) {\n // debug('jwt has a valid authentication header');\n // return next();\n // }\n\n // in case auth header does not exist we return anonymous function\n const remoteUser = createAnonymousRemoteUser();\n req.remote_user = remoteUser;\n res.locals.remote_user = remoteUser;\n\n const { authorization } = req.headers;\n if (_.isNil(authorization)) {\n debug('jwt, authentication header is missing');\n return next();\n }\n\n if (!isAuthHeaderValid(authorization)) {\n debug('api middleware authentication heather is invalid');\n return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));\n }\n const { secret, security } = this.config;\n\n if (isAESLegacy(security)) {\n debug('api middleware using legacy auth token');\n this.handleAESMiddleware(req, security, secret, authorization, next);\n } else {\n debug('api middleware using JWT auth token');\n this.handleJWTAPIMiddleware(req, security, secret, authorization, next);\n }\n };\n }\n\n private handleJWTAPIMiddleware(\n req: $RequestExtend,\n security: Security,\n secret: string,\n authorization: string,\n next: any\n ): void {\n debug('handle JWT api middleware');\n const { scheme, token } = parseAuthTokenHeader(authorization);\n if (scheme.toUpperCase() === TOKEN_BASIC.toUpperCase()) {\n debug('handle basic token');\n // this should happen when client tries to login with an existing user\n const credentials = convertPayloadToBase64(token).toString();\n const { user, password } = parseBasicPayload(credentials) as AESPayload;\n debug('authenticating %o', user);\n this.authenticate(user, password, (err: VerdaccioError | null, user): void => {\n if (!err) {\n debug('generating a remote user');\n req.remote_user = user;\n next();\n } else {\n debug('generating anonymous user');\n req.remote_user = createAnonymousRemoteUser();\n next(err);\n }\n });\n } else {\n debug('handle jwt token');\n const credentials: any = getMiddlewareCredentials(security, secret, authorization);\n if (credentials) {\n // if the signature is valid we rely on it\n req.remote_user = credentials;\n debug('generating a remote user');\n next();\n } else {\n // with JWT throw 401\n debug('jwt invalid token');\n next(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));\n }\n }\n }\n\n private handleAESMiddleware(\n req: $RequestExtend,\n security: Security,\n secret: string,\n authorization: string,\n next: Function\n ): void {\n debug('handle legacy api middleware');\n debug('api middleware has a secret? %o', typeof secret === 'string');\n debug('api middleware authorization %o', typeof authorization === 'string');\n const credentials: any = getMiddlewareCredentials(security, secret, authorization);\n debug('api middleware credentials %o', credentials?.name);\n if (credentials) {\n const { user, password } = credentials;\n debug('authenticating %o', user);\n this.authenticate(user, password, (err, user): void => {\n if (!err) {\n req.remote_user = user;\n debug('generating a remote user');\n next();\n } else {\n req.remote_user = createAnonymousRemoteUser();\n debug('generating anonymous user');\n next(err);\n }\n });\n } else {\n // we force npm client to ask again with basic authentication\n debug('legacy invalid header');\n return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));\n }\n }\n\n private _isRemoteUserValid(remote_user?: RemoteUser): boolean {\n return _.isUndefined(remote_user) === false && _.isUndefined(remote_user?.name) === false;\n }\n\n /**\n * JWT middleware for WebUI\n */\n public webUIJWTmiddleware() {\n return (req: $RequestExtend, res: $ResponseExtend, _next: NextFunction): void => {\n if (this._isRemoteUserValid(req.remote_user)) {\n return _next();\n }\n\n req.pause();\n const next = (err: VerdaccioError | void): void => {\n req.resume();\n if (err) {\n req.remote_user.error = err.message;\n res.status(err.statusCode).send(err.message);\n }\n\n return _next();\n };\n\n const { authorization } = req.headers;\n if (_.isNil(authorization)) {\n return next();\n }\n\n if (!isAuthHeaderValid(authorization)) {\n return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));\n }\n\n const token = (authorization || '').replace(`${TOKEN_BEARER} `, '');\n if (!token) {\n return next();\n }\n\n let credentials: RemoteUser | undefined;\n try {\n credentials = verifyJWTPayload(token, this.config.secret);\n } catch (err: any) {\n // FIXME: intended behaviour, do we want it?\n }\n\n if (this._isRemoteUserValid(credentials)) {\n const { name, groups } = credentials as RemoteUser;\n req.remote_user = createRemoteUser(name as string, groups);\n } else {\n req.remote_user = createAnonymousRemoteUser();\n }\n\n next();\n };\n }\n\n public async jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string> {\n const { real_groups, name, groups } = user;\n debug('jwt encrypt %o', name);\n const realGroupsValidated = _.isNil(real_groups) ? [] : real_groups;\n const groupedGroups = _.isNil(groups)\n ? real_groups\n : Array.from(new Set([...groups.concat(realGroupsValidated)]));\n const payload: RemoteUser = {\n real_groups: realGroupsValidated,\n name,\n groups: groupedGroups,\n };\n const token: string = await signPayload(payload, this.secret, signOptions);\n\n return token;\n }\n\n /**\n * Encrypt a string.\n */\n public aesEncrypt(value: string): string | void {\n if (this.secret.length === signatureUtils.TOKEN_VALID_LENGTH) {\n debug('signing with enhanced aes legacy');\n const token = aesEncrypt(value, this.secret);\n return token;\n } else {\n debug('signing with enhanced aes deprecated legacy');\n // deprecated aes (legacy) signature, only must be used for legacy version\n const token = aesEncryptDeprecated(Buffer.from(value), this.secret).toString('base64');\n return token;\n }\n }\n}\n\nexport { Auth };\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"auth.js","names":["_debug","_interopRequireDefault","require","_lodash","_verdaccioHtpasswd","_config","_core","_loaders","_signature","_utils","_utils2","e","__esModule","default","debug","buildDebug","Auth","constructor","config","logger","secret","plugins","TypeError","init","loadPlugin","length","loadDefaultPlugin","_applyDefaultPlugins","pluginOptions","authPlugin","HTPasswd","file","error","info","asyncLoadPlugin","auth","plugin","authenticate","allow_access","allow_publish","serverSettings","pluginPrefix","PLUGIN_CATEGORY","AUTHENTICATION","push","getDefaultPlugins","changePassword","username","password","newPassword","cb","validPlugins","_","filter","isFunction","isEmpty","errorUtils","getInternalError","SUPPORT_ERRORS","PLUGIN_MISSING_INTERFACE","isNil","err","profile","invalidateToken","token","console","log","Promise","resolve","slice","next","shift","groups","message","isString","isGroupValid","isArray","API_ERROR","BAD_FORMAT_USER_GROUP","createRemoteUser","add_user","user","self","method","adduser","warningUtils","emit","Codes","VERWAR006","ok","packageName","packageVersion","callback","pkgAllowAccess","name","version","pkg","Object","assign","getMatchedPackagesSpec","packages","allow_unpublish","isError","apiJWTmiddleware","helpers","createAnonymousRemoteUser","req","res","_next","pause","resume","remote_user","remoteUser","locals","authorization","headers","isAuthHeaderValid","getBadRequest","BAD_AUTH_HEADER","security","isAESLegacy","handleAESMiddleware","handleJWTAPIMiddleware","scheme","parseAuthTokenHeader","toUpperCase","TOKEN_BASIC","credentials","convertPayloadToBase64","toString","parseBasicPayload","getMiddlewareCredentials","getForbidden","BAD_USERNAME_PASSWORD","_isRemoteUserValid","isUndefined","webUIJWTmiddleware","status","statusCode","send","replace","TOKEN_BEARER","verifyJWTPayload","jwtEncrypt","signOptions","real_groups","realGroupsValidated","groupedGroups","Array","from","Set","concat","payload","signPayload","aesEncrypt","value","signatureUtils","TOKEN_VALID_LENGTH","aesEncryptDeprecated","Buffer","exports"],"sources":["../src/auth.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport { HTPasswd } from 'verdaccio-htpasswd';\n\nimport { createAnonymousRemoteUser, createRemoteUser } from '@verdaccio/config';\nimport {\n API_ERROR,\n PLUGIN_CATEGORY,\n SUPPORT_ERRORS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n VerdaccioError,\n errorUtils,\n pluginUtils,\n warningUtils,\n} from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport {\n aesEncrypt,\n aesEncryptDeprecated,\n parseBasicPayload,\n signPayload,\n utils as signatureUtils,\n} from '@verdaccio/signature';\nimport {\n AllowAccess,\n Callback,\n Config,\n JWTSignOptions,\n Logger,\n PackageAccess,\n RemoteUser,\n Security,\n} from '@verdaccio/types';\nimport { getMatchedPackagesSpec, isFunction, isNil } from '@verdaccio/utils';\n\nimport {\n $RequestExtend,\n $ResponseExtend,\n AESPayload,\n IAuthMiddleware,\n NextFunction,\n TokenEncryption,\n} from './types';\nimport {\n convertPayloadToBase64,\n getDefaultPlugins,\n getMiddlewareCredentials,\n isAESLegacy,\n isAuthHeaderValid,\n parseAuthTokenHeader,\n verifyJWTPayload,\n} from './utils';\n\nconst debug = buildDebug('verdaccio:auth');\n\nclass Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {\n public config: Config;\n public secret: string;\n public logger: Logger;\n public plugins: pluginUtils.Auth<Config>[];\n\n public constructor(config: Config, logger: Logger) {\n this.config = config;\n this.secret = config.secret;\n this.logger = logger;\n this.plugins = [];\n if (!this.secret) {\n throw new TypeError('secret it is required value on initialize the auth class');\n }\n }\n\n public async init() {\n let plugins = (await this.loadPlugin()) as pluginUtils.Auth<unknown>[];\n\n debug('auth plugins found %s', plugins.length);\n if (!plugins || plugins.length === 0) {\n plugins = this.loadDefaultPlugin();\n }\n this.plugins = plugins;\n\n this._applyDefaultPlugins();\n }\n\n private loadDefaultPlugin() {\n debug('load default auth plugin');\n const pluginOptions: pluginUtils.PluginOptions = {\n config: this.config,\n logger: this.logger,\n };\n let authPlugin;\n try {\n authPlugin = new HTPasswd(\n { file: './htpasswd' },\n pluginOptions as any as pluginUtils.PluginOptions\n );\n } catch (error: any) {\n debug('error on loading auth htpasswd plugin stack: %o', error);\n this.logger.info({}, 'no auth plugin has been found');\n return [];\n }\n\n return [authPlugin];\n }\n\n private async loadPlugin() {\n return asyncLoadPlugin<pluginUtils.Auth<unknown>>(\n this.config.auth,\n {\n config: this.config,\n logger: this.logger,\n },\n (plugin): boolean => {\n const { authenticate, allow_access, allow_publish } = plugin;\n\n return (\n typeof authenticate !== 'undefined' ||\n typeof allow_access !== 'undefined' ||\n typeof allow_publish !== 'undefined'\n );\n },\n this.config?.serverSettings?.pluginPrefix,\n PLUGIN_CATEGORY.AUTHENTICATION\n );\n }\n\n private _applyDefaultPlugins(): void {\n // TODO: rename to applyFallbackPluginMethods\n this.plugins.push(getDefaultPlugins(this.logger));\n }\n\n public changePassword(\n username: string,\n password: string,\n newPassword: string,\n cb: Callback\n ): void {\n const validPlugins = _.filter(this.plugins, (plugin) => isFunction(plugin.changePassword));\n\n if (_.isEmpty(validPlugins)) {\n return cb(errorUtils.getInternalError(SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE));\n }\n\n for (const plugin of validPlugins) {\n if (isNil(plugin) || isFunction(plugin.changePassword) === false) {\n debug('auth plugin does not implement changePassword, trying next one');\n continue;\n } else {\n debug('updating password for %o', username);\n plugin.changePassword!(username, password, newPassword, (err, profile): void => {\n if (err) {\n this.logger.error(\n { username, err },\n `An error has been produced\n updating the password for @{username}. Error: @{err.message}`\n );\n return cb(err);\n }\n\n debug('updated password for %o was successful', username);\n return cb(null, profile);\n });\n }\n }\n }\n\n public async invalidateToken(token: string) {\n // eslint-disable-next-line no-console\n console.log('invalidate token pending to implement', token);\n return Promise.resolve();\n }\n\n public authenticate(\n username: string,\n password: string,\n cb: (error: VerdaccioError | null, user?: RemoteUser) => void\n ): void {\n const plugins = this.plugins.slice(0);\n (function next(): void {\n const plugin = plugins.shift() as pluginUtils.Auth<Config>;\n\n if (isFunction(plugin.authenticate) === false) {\n return next();\n }\n\n debug('authenticating %o', username);\n plugin.authenticate(username, password, function (err: VerdaccioError | null, groups): void {\n if (err) {\n debug('authenticating for user %o failed. Error: %o', username, err?.message);\n return cb(err);\n }\n\n // Expect: SKIP if groups is falsey and not an array\n // with at least one item (truthy length)\n // Expect: CONTINUE otherwise (will error if groups is not\n // an array, but this is current behavior)\n // Caveat: STRING (if valid) will pass successfully\n // bug give unexpected results\n // Info: Cannot use `== false to check falsey values`\n if (!!groups && groups.length !== 0) {\n // TODO: create a better understanding of expectations\n if (_.isString(groups)) {\n throw new TypeError('plugin group error: invalid type for function');\n }\n const isGroupValid: boolean = _.isArray(groups);\n if (!isGroupValid) {\n throw new TypeError(API_ERROR.BAD_FORMAT_USER_GROUP);\n }\n\n debug('authentication for user %o was successfully. Groups: %o', username, groups);\n return cb(err, createRemoteUser(username, groups));\n }\n next();\n });\n })();\n }\n\n public add_user(\n user: string,\n password: string,\n cb: (error: VerdaccioError | null, user?: RemoteUser) => void\n ): void {\n const self = this;\n const plugins = this.plugins.slice(0);\n debug('add user %o', user);\n\n (function next(): void {\n let method = 'adduser';\n const plugin = plugins.shift() as pluginUtils.Auth<Config>;\n // @ts-expect-error future major (7.x) should remove this section\n if (typeof plugin.adduser === 'undefined' && typeof plugin.add_user === 'function') {\n method = 'add_user';\n warningUtils.emit(warningUtils.Codes.VERWAR006);\n }\n // @ts-ignore\n if (typeof plugin[method] !== 'function') {\n next();\n } else {\n // TODO: replace by adduser whenever add_user deprecation method has been removed\n // @ts-ignore\n plugin[method](\n user,\n password,\n function (err: VerdaccioError | null, ok?: boolean | string): void {\n if (err) {\n debug('the user %o could not be added. Error: %o', user, err?.message);\n return cb(err);\n }\n if (ok) {\n debug('the user %o has been added', user);\n return self.authenticate(user, password, cb);\n }\n debug('user could not be added, skip to next auth plugin');\n next();\n }\n );\n }\n })();\n }\n\n /**\n * Allow user to access a package.\n */\n public allow_access(\n { packageName, packageVersion }: pluginUtils.AuthPluginPackage,\n user: RemoteUser,\n callback: pluginUtils.AccessCallback\n ): void {\n const plugins = this.plugins.slice(0);\n const pkgAllowAccess: AllowAccess = { name: packageName, version: packageVersion };\n const pkg = Object.assign(\n {},\n pkgAllowAccess,\n getMatchedPackagesSpec(packageName, this.config.packages)\n ) as AllowAccess & PackageAccess;\n debug('allow access for %o', packageName);\n\n (function next(): void {\n const plugin: pluginUtils.Auth<unknown> = plugins.shift() as pluginUtils.Auth<unknown>;\n\n if (_.isNil(plugin) || isFunction(plugin.allow_access) === false) {\n return next();\n }\n\n plugin.allow_access!(user, pkg, function (err: VerdaccioError | null, ok?: boolean): void {\n if (err) {\n debug('forbidden access for %o. Error: %o', packageName, err?.message);\n return callback(err);\n }\n\n if (ok) {\n debug('allowed access for %o', packageName);\n return callback(null, ok);\n }\n\n next(); // cb(null, false) causes next plugin to roll\n });\n })();\n }\n\n public allow_unpublish(\n { packageName, packageVersion }: pluginUtils.AuthPluginPackage,\n user: RemoteUser,\n callback: Callback\n ): void {\n const pkg = Object.assign(\n { name: packageName, version: packageVersion },\n getMatchedPackagesSpec(packageName, this.config.packages)\n );\n debug('allow unpublish for %o', packageName);\n\n for (const plugin of this.plugins) {\n if (typeof plugin?.allow_unpublish !== 'function') {\n debug('allow unpublish for %o plugin does not implement allow_unpublish', packageName);\n continue;\n } else {\n plugin.allow_unpublish(user, pkg, (err, ok): void => {\n if (err) {\n debug(\n 'forbidden publish for %o, it will fallback on unpublish permissions',\n packageName\n );\n return callback(err);\n }\n\n if (_.isNil(ok) === true) {\n debug('bypass unpublish for %o, publish will handle the access', packageName);\n return this.allow_publish({ packageName, packageVersion }, user, callback);\n }\n\n if (ok) {\n debug('allowed unpublish for %o', packageName);\n return callback(null, ok);\n }\n });\n }\n }\n }\n\n /**\n * Allow user to publish a package.\n */\n public allow_publish(\n { packageName, packageVersion }: pluginUtils.AuthPluginPackage,\n user: RemoteUser,\n callback: Callback\n ): void {\n const plugins = this.plugins.slice(0);\n const pkg = Object.assign(\n { name: packageName, version: packageVersion },\n getMatchedPackagesSpec(packageName, this.config.packages)\n );\n debug('allow publish for %o init | plugins: %o', packageName, plugins.length);\n\n (function next(): void {\n const plugin = plugins.shift();\n\n if (typeof plugin?.allow_publish !== 'function') {\n debug('allow publish for %o plugin does not implement allow_publish', packageName);\n return next();\n }\n\n plugin.allow_publish(user, pkg, (err: VerdaccioError | null, ok?: boolean): void => {\n if (_.isNil(err) === false && _.isError(err)) {\n debug('forbidden publish for %o', packageName);\n return callback(err);\n }\n\n if (ok) {\n debug('allowed publish for %o', packageName);\n return callback(null, ok);\n }\n\n debug('allow publish skip validation for %o', packageName);\n next(); // cb(null, false) causes next plugin to roll\n });\n })();\n }\n\n public apiJWTmiddleware(): any {\n debug('jwt middleware');\n const plugins = this.plugins.slice(0);\n const helpers = { createAnonymousRemoteUser, createRemoteUser };\n for (const plugin of plugins) {\n if (plugin.apiJWTmiddleware) {\n return plugin.apiJWTmiddleware(helpers);\n }\n }\n\n return (req: $RequestExtend, res: $ResponseExtend, _next: NextFunction) => {\n req.pause();\n const next = function (err?: VerdaccioError): NextFunction {\n req.resume();\n // uncomment this to reject users with bad auth headers\n // return _next.apply(null, arguments)\n // swallow error, user remains unauthorized\n // set remoteUserError to indicate that user was attempting authentication\n if (err) {\n req.remote_user.error = err.message;\n }\n\n return _next() as unknown as NextFunction;\n };\n\n // FUTURE: disabled, not removed yet but seems unreacable code\n // if (this._isRemoteUserValid(req.remote_user)) {\n // debug('jwt has a valid authentication header');\n // return next();\n // }\n\n // in case auth header does not exist we return anonymous function\n const remoteUser = createAnonymousRemoteUser();\n req.remote_user = remoteUser;\n res.locals.remote_user = remoteUser;\n\n const { authorization } = req.headers;\n if (_.isNil(authorization)) {\n debug('jwt, authentication header is missing');\n return next();\n }\n\n if (!isAuthHeaderValid(authorization)) {\n debug('api middleware authentication heather is invalid');\n return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));\n }\n const { secret, security } = this.config;\n\n if (isAESLegacy(security)) {\n debug('api middleware using legacy auth token');\n this.handleAESMiddleware(req, security, secret, authorization, next);\n } else {\n debug('api middleware using JWT auth token');\n this.handleJWTAPIMiddleware(req, security, secret, authorization, next);\n }\n };\n }\n\n private handleJWTAPIMiddleware(\n req: $RequestExtend,\n security: Security,\n secret: string,\n authorization: string,\n next: any\n ): void {\n debug('handle JWT api middleware');\n const { scheme, token } = parseAuthTokenHeader(authorization);\n if (scheme.toUpperCase() === TOKEN_BASIC.toUpperCase()) {\n debug('handle basic token');\n // this should happen when client tries to login with an existing user\n const credentials = convertPayloadToBase64(token).toString();\n const { user, password } = parseBasicPayload(credentials) as AESPayload;\n debug('authenticating %o', user);\n this.authenticate(user, password, (err: VerdaccioError | null, user): void => {\n if (!err) {\n debug('generating a remote user');\n req.remote_user = user;\n next();\n } else {\n debug('generating anonymous user');\n req.remote_user = createAnonymousRemoteUser();\n next(err);\n }\n });\n } else {\n debug('handle jwt token');\n const credentials: any = getMiddlewareCredentials(security, secret, authorization);\n if (credentials) {\n // if the signature is valid we rely on it\n req.remote_user = credentials;\n debug('generating a remote user');\n next();\n } else {\n // with JWT throw 401\n debug('jwt invalid token');\n next(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));\n }\n }\n }\n\n private handleAESMiddleware(\n req: $RequestExtend,\n security: Security,\n secret: string,\n authorization: string,\n next: Function\n ): void {\n debug('handle legacy api middleware');\n debug('api middleware has a secret? %o', typeof secret === 'string');\n debug('api middleware authorization %o', typeof authorization === 'string');\n const credentials: any = getMiddlewareCredentials(security, secret, authorization);\n debug('api middleware credentials %o', credentials?.name);\n if (credentials) {\n const { user, password } = credentials;\n debug('authenticating %o', user);\n this.authenticate(user, password, (err, user): void => {\n if (!err) {\n req.remote_user = user;\n debug('generating a remote user');\n next();\n } else {\n req.remote_user = createAnonymousRemoteUser();\n debug('generating anonymous user');\n next(err);\n }\n });\n } else {\n // we force npm client to ask again with basic authentication\n debug('legacy invalid header');\n return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));\n }\n }\n\n private _isRemoteUserValid(remote_user?: RemoteUser): boolean {\n return _.isUndefined(remote_user) === false && _.isUndefined(remote_user?.name) === false;\n }\n\n /**\n * JWT middleware for WebUI\n */\n public webUIJWTmiddleware() {\n return (req: $RequestExtend, res: $ResponseExtend, _next: NextFunction): void => {\n if (this._isRemoteUserValid(req.remote_user)) {\n return _next();\n }\n\n req.pause();\n const next = (err: VerdaccioError | void): void => {\n req.resume();\n if (err) {\n req.remote_user.error = err.message;\n res.status(err.statusCode).send(err.message);\n }\n\n return _next();\n };\n\n const { authorization } = req.headers;\n if (_.isNil(authorization)) {\n return next();\n }\n\n if (!isAuthHeaderValid(authorization)) {\n return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));\n }\n\n const token = (authorization || '').replace(`${TOKEN_BEARER} `, '');\n if (!token) {\n return next();\n }\n\n let credentials: RemoteUser | undefined;\n try {\n credentials = verifyJWTPayload(token, this.config.secret);\n } catch (err: any) {\n // FIXME: intended behaviour, do we want it?\n }\n\n if (this._isRemoteUserValid(credentials)) {\n const { name, groups } = credentials as RemoteUser;\n req.remote_user = createRemoteUser(name as string, groups);\n } else {\n req.remote_user = createAnonymousRemoteUser();\n }\n\n next();\n };\n }\n\n public async jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string> {\n const { real_groups, name, groups } = user;\n debug('jwt encrypt %o', name);\n const realGroupsValidated = _.isNil(real_groups) ? [] : real_groups;\n const groupedGroups = _.isNil(groups)\n ? real_groups\n : Array.from(new Set([...groups.concat(realGroupsValidated)]));\n const payload: RemoteUser = {\n real_groups: realGroupsValidated,\n name,\n groups: groupedGroups,\n };\n const token: string = await signPayload(payload, this.secret, signOptions);\n\n return token;\n }\n\n /**\n * Encrypt a string.\n */\n public aesEncrypt(value: string): string | void {\n if (this.secret.length === signatureUtils.TOKEN_VALID_LENGTH) {\n debug('signing with enhanced aes legacy');\n const token = aesEncrypt(value, this.secret);\n return token;\n } else {\n debug('signing with enhanced aes deprecated legacy');\n // deprecated aes (legacy) signature, only must be used for legacy version\n const token = aesEncryptDeprecated(Buffer.from(value), this.secret).toString('base64');\n return token;\n }\n }\n}\n\nexport { Auth };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,kBAAA,GAAAF,OAAA;AAEA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAJ,OAAA;AAWA,IAAAK,QAAA,GAAAL,OAAA;AACA,IAAAM,UAAA,GAAAN,OAAA;AAiBA,IAAAO,MAAA,GAAAP,OAAA;AAUA,IAAAQ,OAAA,GAAAR,OAAA;AAQiB,SAAAD,uBAAAU,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjB,MAAMG,KAAK,GAAG,IAAAC,cAAU,EAAC,gBAAgB,CAAC;AAE1C,MAAMC,IAAI,CAAqE;EAMtEC,WAAWA,CAACC,MAAc,EAAEC,MAAc,EAAE;IACjD,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,MAAM,GAAGF,MAAM,CAACE,MAAM;IAC3B,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,OAAO,GAAG,EAAE;IACjB,IAAI,CAAC,IAAI,CAACD,MAAM,EAAE;MAChB,MAAM,IAAIE,SAAS,CAAC,0DAA0D,CAAC;IACjF;EACF;EAEA,MAAaC,IAAIA,CAAA,EAAG;IAClB,IAAIF,OAAO,GAAI,MAAM,IAAI,CAACG,UAAU,CAAC,CAAiC;IAEtEV,KAAK,CAAC,uBAAuB,EAAEO,OAAO,CAACI,MAAM,CAAC;IAC9C,IAAI,CAACJ,OAAO,IAAIA,OAAO,CAACI,MAAM,KAAK,CAAC,EAAE;MACpCJ,OAAO,GAAG,IAAI,CAACK,iBAAiB,CAAC,CAAC;IACpC;IACA,IAAI,CAACL,OAAO,GAAGA,OAAO;IAEtB,IAAI,CAACM,oBAAoB,CAAC,CAAC;EAC7B;EAEQD,iBAAiBA,CAAA,EAAG;IAC1BZ,KAAK,CAAC,0BAA0B,CAAC;IACjC,MAAMc,aAAwC,GAAG;MAC/CV,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,MAAM,EAAE,IAAI,CAACA;IACf,CAAC;IACD,IAAIU,UAAU;IACd,IAAI;MACFA,UAAU,GAAG,IAAIC,2BAAQ,CACvB;QAAEC,IAAI,EAAE;MAAa,CAAC,EACtBH,aACF,CAAC;IACH,CAAC,CAAC,OAAOI,KAAU,EAAE;MACnBlB,KAAK,CAAC,iDAAiD,EAAEkB,KAAK,CAAC;MAC/D,IAAI,CAACb,MAAM,CAACc,IAAI,CAAC,CAAC,CAAC,EAAE,+BAA+B,CAAC;MACrD,OAAO,EAAE;IACX;IAEA,OAAO,CAACJ,UAAU,CAAC;EACrB;EAEA,MAAcL,UAAUA,CAAA,EAAG;IACzB,OAAO,IAAAU,wBAAe,EACpB,IAAI,CAAChB,MAAM,CAACiB,IAAI,EAChB;MACEjB,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,MAAM,EAAE,IAAI,CAACA;IACf,CAAC,EACAiB,MAAM,IAAc;MACnB,MAAM;QAAEC,YAAY;QAAEC,YAAY;QAAEC;MAAc,CAAC,GAAGH,MAAM;MAE5D,OACE,OAAOC,YAAY,KAAK,WAAW,IACnC,OAAOC,YAAY,KAAK,WAAW,IACnC,OAAOC,aAAa,KAAK,WAAW;IAExC,CAAC,EACD,IAAI,CAACrB,MAAM,EAAEsB,cAAc,EAAEC,YAAY,EACzCC,qBAAe,CAACC,cAClB,CAAC;EACH;EAEQhB,oBAAoBA,CAAA,EAAS;IACnC;IACA,IAAI,CAACN,OAAO,CAACuB,IAAI,CAAC,IAAAC,yBAAiB,EAAC,IAAI,CAAC1B,MAAM,CAAC,CAAC;EACnD;EAEO2B,cAAcA,CACnBC,QAAgB,EAChBC,QAAgB,EAChBC,WAAmB,EACnBC,EAAY,EACN;IACN,MAAMC,YAAY,GAAGC,eAAC,CAACC,MAAM,CAAC,IAAI,CAAChC,OAAO,EAAGe,MAAM,IAAK,IAAAkB,iBAAU,EAAClB,MAAM,CAACU,cAAc,CAAC,CAAC;IAE1F,IAAIM,eAAC,CAACG,OAAO,CAACJ,YAAY,CAAC,EAAE;MAC3B,OAAOD,EAAE,CAACM,gBAAU,CAACC,gBAAgB,CAACC,oBAAc,CAACC,wBAAwB,CAAC,CAAC;IACjF;IAEA,KAAK,MAAMvB,MAAM,IAAIe,YAAY,EAAE;MACjC,IAAI,IAAAS,YAAK,EAACxB,MAAM,CAAC,IAAI,IAAAkB,iBAAU,EAAClB,MAAM,CAACU,cAAc,CAAC,KAAK,KAAK,EAAE;QAChEhC,KAAK,CAAC,gEAAgE,CAAC;QACvE;MACF,CAAC,MAAM;QACLA,KAAK,CAAC,0BAA0B,EAAEiC,QAAQ,CAAC;QAC3CX,MAAM,CAACU,cAAc,CAAEC,QAAQ,EAAEC,QAAQ,EAAEC,WAAW,EAAE,CAACY,GAAG,EAAEC,OAAO,KAAW;UAC9E,IAAID,GAAG,EAAE;YACP,IAAI,CAAC1C,MAAM,CAACa,KAAK,CACf;cAAEe,QAAQ;cAAEc;YAAI,CAAC,EACjB;AACd,yEACY,CAAC;YACD,OAAOX,EAAE,CAACW,GAAG,CAAC;UAChB;UAEA/C,KAAK,CAAC,wCAAwC,EAAEiC,QAAQ,CAAC;UACzD,OAAOG,EAAE,CAAC,IAAI,EAAEY,OAAO,CAAC;QAC1B,CAAC,CAAC;MACJ;IACF;EACF;EAEA,MAAaC,eAAeA,CAACC,KAAa,EAAE;IAC1C;IACAC,OAAO,CAACC,GAAG,CAAC,uCAAuC,EAAEF,KAAK,CAAC;IAC3D,OAAOG,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;EAEO/B,YAAYA,CACjBU,QAAgB,EAChBC,QAAgB,EAChBE,EAA6D,EACvD;IACN,MAAM7B,OAAO,GAAG,IAAI,CAACA,OAAO,CAACgD,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC,SAASC,IAAIA,CAAA,EAAS;MACrB,MAAMlC,MAAM,GAAGf,OAAO,CAACkD,KAAK,CAAC,CAA6B;MAE1D,IAAI,IAAAjB,iBAAU,EAAClB,MAAM,CAACC,YAAY,CAAC,KAAK,KAAK,EAAE;QAC7C,OAAOiC,IAAI,CAAC,CAAC;MACf;MAEAxD,KAAK,CAAC,mBAAmB,EAAEiC,QAAQ,CAAC;MACpCX,MAAM,CAACC,YAAY,CAACU,QAAQ,EAAEC,QAAQ,EAAE,UAAUa,GAA0B,EAAEW,MAAM,EAAQ;QAC1F,IAAIX,GAAG,EAAE;UACP/C,KAAK,CAAC,8CAA8C,EAAEiC,QAAQ,EAAEc,GAAG,EAAEY,OAAO,CAAC;UAC7E,OAAOvB,EAAE,CAACW,GAAG,CAAC;QAChB;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,IAAI,CAAC,CAACW,MAAM,IAAIA,MAAM,CAAC/C,MAAM,KAAK,CAAC,EAAE;UACnC;UACA,IAAI2B,eAAC,CAACsB,QAAQ,CAACF,MAAM,CAAC,EAAE;YACtB,MAAM,IAAIlD,SAAS,CAAC,+CAA+C,CAAC;UACtE;UACA,MAAMqD,YAAqB,GAAGvB,eAAC,CAACwB,OAAO,CAACJ,MAAM,CAAC;UAC/C,IAAI,CAACG,YAAY,EAAE;YACjB,MAAM,IAAIrD,SAAS,CAACuD,eAAS,CAACC,qBAAqB,CAAC;UACtD;UAEAhE,KAAK,CAAC,yDAAyD,EAAEiC,QAAQ,EAAEyB,MAAM,CAAC;UAClF,OAAOtB,EAAE,CAACW,GAAG,EAAE,IAAAkB,wBAAgB,EAAChC,QAAQ,EAAEyB,MAAM,CAAC,CAAC;QACpD;QACAF,IAAI,CAAC,CAAC;MACR,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC;EACN;EAEOU,QAAQA,CACbC,IAAY,EACZjC,QAAgB,EAChBE,EAA6D,EACvD;IACN,MAAMgC,IAAI,GAAG,IAAI;IACjB,MAAM7D,OAAO,GAAG,IAAI,CAACA,OAAO,CAACgD,KAAK,CAAC,CAAC,CAAC;IACrCvD,KAAK,CAAC,aAAa,EAAEmE,IAAI,CAAC;IAE1B,CAAC,SAASX,IAAIA,CAAA,EAAS;MACrB,IAAIa,MAAM,GAAG,SAAS;MACtB,MAAM/C,MAAM,GAAGf,OAAO,CAACkD,KAAK,CAAC,CAA6B;MAC1D;MACA,IAAI,OAAOnC,MAAM,CAACgD,OAAO,KAAK,WAAW,IAAI,OAAOhD,MAAM,CAAC4C,QAAQ,KAAK,UAAU,EAAE;QAClFG,MAAM,GAAG,UAAU;QACnBE,kBAAY,CAACC,IAAI,CAACD,kBAAY,CAACE,KAAK,CAACC,SAAS,CAAC;MACjD;MACA;MACA,IAAI,OAAOpD,MAAM,CAAC+C,MAAM,CAAC,KAAK,UAAU,EAAE;QACxCb,IAAI,CAAC,CAAC;MACR,CAAC,MAAM;QACL;QACA;QACAlC,MAAM,CAAC+C,MAAM,CAAC,CACZF,IAAI,EACJjC,QAAQ,EACR,UAAUa,GAA0B,EAAE4B,EAAqB,EAAQ;UACjE,IAAI5B,GAAG,EAAE;YACP/C,KAAK,CAAC,2CAA2C,EAAEmE,IAAI,EAAEpB,GAAG,EAAEY,OAAO,CAAC;YACtE,OAAOvB,EAAE,CAACW,GAAG,CAAC;UAChB;UACA,IAAI4B,EAAE,EAAE;YACN3E,KAAK,CAAC,4BAA4B,EAAEmE,IAAI,CAAC;YACzC,OAAOC,IAAI,CAAC7C,YAAY,CAAC4C,IAAI,EAAEjC,QAAQ,EAAEE,EAAE,CAAC;UAC9C;UACApC,KAAK,CAAC,mDAAmD,CAAC;UAC1DwD,IAAI,CAAC,CAAC;QACR,CACF,CAAC;MACH;IACF,CAAC,EAAE,CAAC;EACN;;EAEA;AACF;AACA;EACShC,YAAYA,CACjB;IAAEoD,WAAW;IAAEC;EAA8C,CAAC,EAC9DV,IAAgB,EAChBW,QAAoC,EAC9B;IACN,MAAMvE,OAAO,GAAG,IAAI,CAACA,OAAO,CAACgD,KAAK,CAAC,CAAC,CAAC;IACrC,MAAMwB,cAA2B,GAAG;MAAEC,IAAI,EAAEJ,WAAW;MAAEK,OAAO,EAAEJ;IAAe,CAAC;IAClF,MAAMK,GAAG,GAAGC,MAAM,CAACC,MAAM,CACvB,CAAC,CAAC,EACFL,cAAc,EACd,IAAAM,6BAAsB,EAACT,WAAW,EAAE,IAAI,CAACxE,MAAM,CAACkF,QAAQ,CAC1D,CAAgC;IAChCtF,KAAK,CAAC,qBAAqB,EAAE4E,WAAW,CAAC;IAEzC,CAAC,SAASpB,IAAIA,CAAA,EAAS;MACrB,MAAMlC,MAAiC,GAAGf,OAAO,CAACkD,KAAK,CAAC,CAA8B;MAEtF,IAAInB,eAAC,CAACQ,KAAK,CAACxB,MAAM,CAAC,IAAI,IAAAkB,iBAAU,EAAClB,MAAM,CAACE,YAAY,CAAC,KAAK,KAAK,EAAE;QAChE,OAAOgC,IAAI,CAAC,CAAC;MACf;MAEAlC,MAAM,CAACE,YAAY,CAAE2C,IAAI,EAAEe,GAAG,EAAE,UAAUnC,GAA0B,EAAE4B,EAAY,EAAQ;QACxF,IAAI5B,GAAG,EAAE;UACP/C,KAAK,CAAC,oCAAoC,EAAE4E,WAAW,EAAE7B,GAAG,EAAEY,OAAO,CAAC;UACtE,OAAOmB,QAAQ,CAAC/B,GAAG,CAAC;QACtB;QAEA,IAAI4B,EAAE,EAAE;UACN3E,KAAK,CAAC,uBAAuB,EAAE4E,WAAW,CAAC;UAC3C,OAAOE,QAAQ,CAAC,IAAI,EAAEH,EAAE,CAAC;QAC3B;QAEAnB,IAAI,CAAC,CAAC,CAAC,CAAC;MACV,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC;EACN;EAEO+B,eAAeA,CACpB;IAAEX,WAAW;IAAEC;EAA8C,CAAC,EAC9DV,IAAgB,EAChBW,QAAkB,EACZ;IACN,MAAMI,GAAG,GAAGC,MAAM,CAACC,MAAM,CACvB;MAAEJ,IAAI,EAAEJ,WAAW;MAAEK,OAAO,EAAEJ;IAAe,CAAC,EAC9C,IAAAQ,6BAAsB,EAACT,WAAW,EAAE,IAAI,CAACxE,MAAM,CAACkF,QAAQ,CAC1D,CAAC;IACDtF,KAAK,CAAC,wBAAwB,EAAE4E,WAAW,CAAC;IAE5C,KAAK,MAAMtD,MAAM,IAAI,IAAI,CAACf,OAAO,EAAE;MACjC,IAAI,OAAOe,MAAM,EAAEiE,eAAe,KAAK,UAAU,EAAE;QACjDvF,KAAK,CAAC,kEAAkE,EAAE4E,WAAW,CAAC;QACtF;MACF,CAAC,MAAM;QACLtD,MAAM,CAACiE,eAAe,CAACpB,IAAI,EAAEe,GAAG,EAAE,CAACnC,GAAG,EAAE4B,EAAE,KAAW;UACnD,IAAI5B,GAAG,EAAE;YACP/C,KAAK,CACH,qEAAqE,EACrE4E,WACF,CAAC;YACD,OAAOE,QAAQ,CAAC/B,GAAG,CAAC;UACtB;UAEA,IAAIT,eAAC,CAACQ,KAAK,CAAC6B,EAAE,CAAC,KAAK,IAAI,EAAE;YACxB3E,KAAK,CAAC,yDAAyD,EAAE4E,WAAW,CAAC;YAC7E,OAAO,IAAI,CAACnD,aAAa,CAAC;cAAEmD,WAAW;cAAEC;YAAe,CAAC,EAAEV,IAAI,EAAEW,QAAQ,CAAC;UAC5E;UAEA,IAAIH,EAAE,EAAE;YACN3E,KAAK,CAAC,0BAA0B,EAAE4E,WAAW,CAAC;YAC9C,OAAOE,QAAQ,CAAC,IAAI,EAAEH,EAAE,CAAC;UAC3B;QACF,CAAC,CAAC;MACJ;IACF;EACF;;EAEA;AACF;AACA;EACSlD,aAAaA,CAClB;IAAEmD,WAAW;IAAEC;EAA8C,CAAC,EAC9DV,IAAgB,EAChBW,QAAkB,EACZ;IACN,MAAMvE,OAAO,GAAG,IAAI,CAACA,OAAO,CAACgD,KAAK,CAAC,CAAC,CAAC;IACrC,MAAM2B,GAAG,GAAGC,MAAM,CAACC,MAAM,CACvB;MAAEJ,IAAI,EAAEJ,WAAW;MAAEK,OAAO,EAAEJ;IAAe,CAAC,EAC9C,IAAAQ,6BAAsB,EAACT,WAAW,EAAE,IAAI,CAACxE,MAAM,CAACkF,QAAQ,CAC1D,CAAC;IACDtF,KAAK,CAAC,yCAAyC,EAAE4E,WAAW,EAAErE,OAAO,CAACI,MAAM,CAAC;IAE7E,CAAC,SAAS6C,IAAIA,CAAA,EAAS;MACrB,MAAMlC,MAAM,GAAGf,OAAO,CAACkD,KAAK,CAAC,CAAC;MAE9B,IAAI,OAAOnC,MAAM,EAAEG,aAAa,KAAK,UAAU,EAAE;QAC/CzB,KAAK,CAAC,8DAA8D,EAAE4E,WAAW,CAAC;QAClF,OAAOpB,IAAI,CAAC,CAAC;MACf;MAEAlC,MAAM,CAACG,aAAa,CAAC0C,IAAI,EAAEe,GAAG,EAAE,CAACnC,GAA0B,EAAE4B,EAAY,KAAW;QAClF,IAAIrC,eAAC,CAACQ,KAAK,CAACC,GAAG,CAAC,KAAK,KAAK,IAAIT,eAAC,CAACkD,OAAO,CAACzC,GAAG,CAAC,EAAE;UAC5C/C,KAAK,CAAC,0BAA0B,EAAE4E,WAAW,CAAC;UAC9C,OAAOE,QAAQ,CAAC/B,GAAG,CAAC;QACtB;QAEA,IAAI4B,EAAE,EAAE;UACN3E,KAAK,CAAC,wBAAwB,EAAE4E,WAAW,CAAC;UAC5C,OAAOE,QAAQ,CAAC,IAAI,EAAEH,EAAE,CAAC;QAC3B;QAEA3E,KAAK,CAAC,sCAAsC,EAAE4E,WAAW,CAAC;QAC1DpB,IAAI,CAAC,CAAC,CAAC,CAAC;MACV,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC;EACN;EAEOiC,gBAAgBA,CAAA,EAAQ;IAC7BzF,KAAK,CAAC,gBAAgB,CAAC;IACvB,MAAMO,OAAO,GAAG,IAAI,CAACA,OAAO,CAACgD,KAAK,CAAC,CAAC,CAAC;IACrC,MAAMmC,OAAO,GAAG;MAAEC,yBAAyB,EAAzBA,iCAAyB;MAAE1B,gBAAgB,EAAhBA;IAAiB,CAAC;IAC/D,KAAK,MAAM3C,MAAM,IAAIf,OAAO,EAAE;MAC5B,IAAIe,MAAM,CAACmE,gBAAgB,EAAE;QAC3B,OAAOnE,MAAM,CAACmE,gBAAgB,CAACC,OAAO,CAAC;MACzC;IACF;IAEA,OAAO,CAACE,GAAmB,EAAEC,GAAoB,EAAEC,KAAmB,KAAK;MACzEF,GAAG,CAACG,KAAK,CAAC,CAAC;MACX,MAAMvC,IAAI,GAAG,SAAAA,CAAUT,GAAoB,EAAgB;QACzD6C,GAAG,CAACI,MAAM,CAAC,CAAC;QACZ;QACA;QACA;QACA;QACA,IAAIjD,GAAG,EAAE;UACP6C,GAAG,CAACK,WAAW,CAAC/E,KAAK,GAAG6B,GAAG,CAACY,OAAO;QACrC;QAEA,OAAOmC,KAAK,CAAC,CAAC;MAChB,CAAC;;MAED;MACA;MACA;MACA;MACA;;MAEA;MACA,MAAMI,UAAU,GAAG,IAAAP,iCAAyB,EAAC,CAAC;MAC9CC,GAAG,CAACK,WAAW,GAAGC,UAAU;MAC5BL,GAAG,CAACM,MAAM,CAACF,WAAW,GAAGC,UAAU;MAEnC,MAAM;QAAEE;MAAc,CAAC,GAAGR,GAAG,CAACS,OAAO;MACrC,IAAI/D,eAAC,CAACQ,KAAK,CAACsD,aAAa,CAAC,EAAE;QAC1BpG,KAAK,CAAC,uCAAuC,CAAC;QAC9C,OAAOwD,IAAI,CAAC,CAAC;MACf;MAEA,IAAI,CAAC,IAAA8C,yBAAiB,EAACF,aAAa,CAAC,EAAE;QACrCpG,KAAK,CAAC,kDAAkD,CAAC;QACzD,OAAOwD,IAAI,CAACd,gBAAU,CAAC6D,aAAa,CAACxC,eAAS,CAACyC,eAAe,CAAC,CAAC;MAClE;MACA,MAAM;QAAElG,MAAM;QAAEmG;MAAS,CAAC,GAAG,IAAI,CAACrG,MAAM;MAExC,IAAI,IAAAsG,mBAAW,EAACD,QAAQ,CAAC,EAAE;QACzBzG,KAAK,CAAC,wCAAwC,CAAC;QAC/C,IAAI,CAAC2G,mBAAmB,CAACf,GAAG,EAAEa,QAAQ,EAAEnG,MAAM,EAAE8F,aAAa,EAAE5C,IAAI,CAAC;MACtE,CAAC,MAAM;QACLxD,KAAK,CAAC,qCAAqC,CAAC;QAC5C,IAAI,CAAC4G,sBAAsB,CAAChB,GAAG,EAAEa,QAAQ,EAAEnG,MAAM,EAAE8F,aAAa,EAAE5C,IAAI,CAAC;MACzE;IACF,CAAC;EACH;EAEQoD,sBAAsBA,CAC5BhB,GAAmB,EACnBa,QAAkB,EAClBnG,MAAc,EACd8F,aAAqB,EACrB5C,IAAS,EACH;IACNxD,KAAK,CAAC,2BAA2B,CAAC;IAClC,MAAM;MAAE6G,MAAM;MAAE3D;IAAM,CAAC,GAAG,IAAA4D,4BAAoB,EAACV,aAAa,CAAC;IAC7D,IAAIS,MAAM,CAACE,WAAW,CAAC,CAAC,KAAKC,iBAAW,CAACD,WAAW,CAAC,CAAC,EAAE;MACtD/G,KAAK,CAAC,oBAAoB,CAAC;MAC3B;MACA,MAAMiH,WAAW,GAAG,IAAAC,8BAAsB,EAAChE,KAAK,CAAC,CAACiE,QAAQ,CAAC,CAAC;MAC5D,MAAM;QAAEhD,IAAI;QAAEjC;MAAS,CAAC,GAAG,IAAAkF,4BAAiB,EAACH,WAAW,CAAe;MACvEjH,KAAK,CAAC,mBAAmB,EAAEmE,IAAI,CAAC;MAChC,IAAI,CAAC5C,YAAY,CAAC4C,IAAI,EAAEjC,QAAQ,EAAE,CAACa,GAA0B,EAAEoB,IAAI,KAAW;QAC5E,IAAI,CAACpB,GAAG,EAAE;UACR/C,KAAK,CAAC,0BAA0B,CAAC;UACjC4F,GAAG,CAACK,WAAW,GAAG9B,IAAI;UACtBX,IAAI,CAAC,CAAC;QACR,CAAC,MAAM;UACLxD,KAAK,CAAC,2BAA2B,CAAC;UAClC4F,GAAG,CAACK,WAAW,GAAG,IAAAN,iCAAyB,EAAC,CAAC;UAC7CnC,IAAI,CAACT,GAAG,CAAC;QACX;MACF,CAAC,CAAC;IACJ,CAAC,MAAM;MACL/C,KAAK,CAAC,kBAAkB,CAAC;MACzB,MAAMiH,WAAgB,GAAG,IAAAI,gCAAwB,EAACZ,QAAQ,EAAEnG,MAAM,EAAE8F,aAAa,CAAC;MAClF,IAAIa,WAAW,EAAE;QACf;QACArB,GAAG,CAACK,WAAW,GAAGgB,WAAW;QAC7BjH,KAAK,CAAC,0BAA0B,CAAC;QACjCwD,IAAI,CAAC,CAAC;MACR,CAAC,MAAM;QACL;QACAxD,KAAK,CAAC,mBAAmB,CAAC;QAC1BwD,IAAI,CAACd,gBAAU,CAAC4E,YAAY,CAACvD,eAAS,CAACwD,qBAAqB,CAAC,CAAC;MAChE;IACF;EACF;EAEQZ,mBAAmBA,CACzBf,GAAmB,EACnBa,QAAkB,EAClBnG,MAAc,EACd8F,aAAqB,EACrB5C,IAAc,EACR;IACNxD,KAAK,CAAC,8BAA8B,CAAC;IACrCA,KAAK,CAAC,iCAAiC,EAAE,OAAOM,MAAM,KAAK,QAAQ,CAAC;IACpEN,KAAK,CAAC,iCAAiC,EAAE,OAAOoG,aAAa,KAAK,QAAQ,CAAC;IAC3E,MAAMa,WAAgB,GAAG,IAAAI,gCAAwB,EAACZ,QAAQ,EAAEnG,MAAM,EAAE8F,aAAa,CAAC;IAClFpG,KAAK,CAAC,+BAA+B,EAAEiH,WAAW,EAAEjC,IAAI,CAAC;IACzD,IAAIiC,WAAW,EAAE;MACf,MAAM;QAAE9C,IAAI;QAAEjC;MAAS,CAAC,GAAG+E,WAAW;MACtCjH,KAAK,CAAC,mBAAmB,EAAEmE,IAAI,CAAC;MAChC,IAAI,CAAC5C,YAAY,CAAC4C,IAAI,EAAEjC,QAAQ,EAAE,CAACa,GAAG,EAAEoB,IAAI,KAAW;QACrD,IAAI,CAACpB,GAAG,EAAE;UACR6C,GAAG,CAACK,WAAW,GAAG9B,IAAI;UACtBnE,KAAK,CAAC,0BAA0B,CAAC;UACjCwD,IAAI,CAAC,CAAC;QACR,CAAC,MAAM;UACLoC,GAAG,CAACK,WAAW,GAAG,IAAAN,iCAAyB,EAAC,CAAC;UAC7C3F,KAAK,CAAC,2BAA2B,CAAC;UAClCwD,IAAI,CAACT,GAAG,CAAC;QACX;MACF,CAAC,CAAC;IACJ,CAAC,MAAM;MACL;MACA/C,KAAK,CAAC,uBAAuB,CAAC;MAC9B,OAAOwD,IAAI,CAACd,gBAAU,CAAC6D,aAAa,CAACxC,eAAS,CAACyC,eAAe,CAAC,CAAC;IAClE;EACF;EAEQgB,kBAAkBA,CAACvB,WAAwB,EAAW;IAC5D,OAAO3D,eAAC,CAACmF,WAAW,CAACxB,WAAW,CAAC,KAAK,KAAK,IAAI3D,eAAC,CAACmF,WAAW,CAACxB,WAAW,EAAEjB,IAAI,CAAC,KAAK,KAAK;EAC3F;;EAEA;AACF;AACA;EACS0C,kBAAkBA,CAAA,EAAG;IAC1B,OAAO,CAAC9B,GAAmB,EAAEC,GAAoB,EAAEC,KAAmB,KAAW;MAC/E,IAAI,IAAI,CAAC0B,kBAAkB,CAAC5B,GAAG,CAACK,WAAW,CAAC,EAAE;QAC5C,OAAOH,KAAK,CAAC,CAAC;MAChB;MAEAF,GAAG,CAACG,KAAK,CAAC,CAAC;MACX,MAAMvC,IAAI,GAAIT,GAA0B,IAAW;QACjD6C,GAAG,CAACI,MAAM,CAAC,CAAC;QACZ,IAAIjD,GAAG,EAAE;UACP6C,GAAG,CAACK,WAAW,CAAC/E,KAAK,GAAG6B,GAAG,CAACY,OAAO;UACnCkC,GAAG,CAAC8B,MAAM,CAAC5E,GAAG,CAAC6E,UAAU,CAAC,CAACC,IAAI,CAAC9E,GAAG,CAACY,OAAO,CAAC;QAC9C;QAEA,OAAOmC,KAAK,CAAC,CAAC;MAChB,CAAC;MAED,MAAM;QAAEM;MAAc,CAAC,GAAGR,GAAG,CAACS,OAAO;MACrC,IAAI/D,eAAC,CAACQ,KAAK,CAACsD,aAAa,CAAC,EAAE;QAC1B,OAAO5C,IAAI,CAAC,CAAC;MACf;MAEA,IAAI,CAAC,IAAA8C,yBAAiB,EAACF,aAAa,CAAC,EAAE;QACrC,OAAO5C,IAAI,CAACd,gBAAU,CAAC6D,aAAa,CAACxC,eAAS,CAACyC,eAAe,CAAC,CAAC;MAClE;MAEA,MAAMtD,KAAK,GAAG,CAACkD,aAAa,IAAI,EAAE,EAAE0B,OAAO,CAAC,GAAGC,kBAAY,GAAG,EAAE,EAAE,CAAC;MACnE,IAAI,CAAC7E,KAAK,EAAE;QACV,OAAOM,IAAI,CAAC,CAAC;MACf;MAEA,IAAIyD,WAAmC;MACvC,IAAI;QACFA,WAAW,GAAG,IAAAe,wBAAgB,EAAC9E,KAAK,EAAE,IAAI,CAAC9C,MAAM,CAACE,MAAM,CAAC;MAC3D,CAAC,CAAC,OAAOyC,GAAQ,EAAE;QACjB;MAAA;MAGF,IAAI,IAAI,CAACyE,kBAAkB,CAACP,WAAW,CAAC,EAAE;QACxC,MAAM;UAAEjC,IAAI;UAAEtB;QAAO,CAAC,GAAGuD,WAAyB;QAClDrB,GAAG,CAACK,WAAW,GAAG,IAAAhC,wBAAgB,EAACe,IAAI,EAAYtB,MAAM,CAAC;MAC5D,CAAC,MAAM;QACLkC,GAAG,CAACK,WAAW,GAAG,IAAAN,iCAAyB,EAAC,CAAC;MAC/C;MAEAnC,IAAI,CAAC,CAAC;IACR,CAAC;EACH;EAEA,MAAayE,UAAUA,CAAC9D,IAAgB,EAAE+D,WAA2B,EAAmB;IACtF,MAAM;MAAEC,WAAW;MAAEnD,IAAI;MAAEtB;IAAO,CAAC,GAAGS,IAAI;IAC1CnE,KAAK,CAAC,gBAAgB,EAAEgF,IAAI,CAAC;IAC7B,MAAMoD,mBAAmB,GAAG9F,eAAC,CAACQ,KAAK,CAACqF,WAAW,CAAC,GAAG,EAAE,GAAGA,WAAW;IACnE,MAAME,aAAa,GAAG/F,eAAC,CAACQ,KAAK,CAACY,MAAM,CAAC,GACjCyE,WAAW,GACXG,KAAK,CAACC,IAAI,CAAC,IAAIC,GAAG,CAAC,CAAC,GAAG9E,MAAM,CAAC+E,MAAM,CAACL,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAChE,MAAMM,OAAmB,GAAG;MAC1BP,WAAW,EAAEC,mBAAmB;MAChCpD,IAAI;MACJtB,MAAM,EAAE2E;IACV,CAAC;IACD,MAAMnF,KAAa,GAAG,MAAM,IAAAyF,sBAAW,EAACD,OAAO,EAAE,IAAI,CAACpI,MAAM,EAAE4H,WAAW,CAAC;IAE1E,OAAOhF,KAAK;EACd;;EAEA;AACF;AACA;EACS0F,UAAUA,CAACC,KAAa,EAAiB;IAC9C,IAAI,IAAI,CAACvI,MAAM,CAACK,MAAM,KAAKmI,gBAAc,CAACC,kBAAkB,EAAE;MAC5D/I,KAAK,CAAC,kCAAkC,CAAC;MACzC,MAAMkD,KAAK,GAAG,IAAA0F,qBAAU,EAACC,KAAK,EAAE,IAAI,CAACvI,MAAM,CAAC;MAC5C,OAAO4C,KAAK;IACd,CAAC,MAAM;MACLlD,KAAK,CAAC,6CAA6C,CAAC;MACpD;MACA,MAAMkD,KAAK,GAAG,IAAA8F,+BAAoB,EAACC,MAAM,CAACV,IAAI,CAACM,KAAK,CAAC,EAAE,IAAI,CAACvI,MAAM,CAAC,CAAC6G,QAAQ,CAAC,QAAQ,CAAC;MACtF,OAAOjE,KAAK;IACd;EACF;AACF;AAACgG,OAAA,CAAAhJ,IAAA,GAAAA,IAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdaccio/auth",
|
|
3
|
-
"version": "8.0.0-next-8.
|
|
3
|
+
"version": "8.0.0-next-8.4",
|
|
4
4
|
"description": "logger",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"types": "./build/index.d.ts",
|
|
@@ -29,20 +29,20 @@
|
|
|
29
29
|
},
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@verdaccio/config": "8.0.0-next-8.
|
|
33
|
-
"@verdaccio/core": "8.0.0-next-8.
|
|
32
|
+
"@verdaccio/config": "8.0.0-next-8.4",
|
|
33
|
+
"@verdaccio/core": "8.0.0-next-8.4",
|
|
34
34
|
"@verdaccio/loaders": "8.0.0-next-8.3",
|
|
35
|
-
"@verdaccio/logger": "8.0.0-next-8.3",
|
|
36
35
|
"@verdaccio/signature": "8.0.0-next-8.1",
|
|
37
|
-
"@verdaccio/utils": "8.1.0-next-8.
|
|
36
|
+
"@verdaccio/utils": "8.1.0-next-8.4",
|
|
38
37
|
"debug": "4.3.7",
|
|
39
38
|
"lodash": "4.17.21",
|
|
40
|
-
"verdaccio-htpasswd": "13.0.0-next-8.
|
|
39
|
+
"verdaccio-htpasswd": "13.0.0-next-8.4"
|
|
41
40
|
},
|
|
42
41
|
"devDependencies": {
|
|
43
|
-
"@verdaccio/middleware": "8.0.0-next-8.
|
|
42
|
+
"@verdaccio/middleware": "8.0.0-next-8.4",
|
|
44
43
|
"@verdaccio/types": "13.0.0-next-8.1",
|
|
45
|
-
"
|
|
44
|
+
"@verdaccio/logger": "8.0.0-next-8.4",
|
|
45
|
+
"express": "4.21.1",
|
|
46
46
|
"supertest": "7.0.0"
|
|
47
47
|
},
|
|
48
48
|
"funding": {
|
package/src/auth.ts
CHANGED
|
@@ -15,7 +15,6 @@ import {
|
|
|
15
15
|
warningUtils,
|
|
16
16
|
} from '@verdaccio/core';
|
|
17
17
|
import { asyncLoadPlugin } from '@verdaccio/loaders';
|
|
18
|
-
import { logger } from '@verdaccio/logger';
|
|
19
18
|
import {
|
|
20
19
|
aesEncrypt,
|
|
21
20
|
aesEncryptDeprecated,
|
|
@@ -28,6 +27,7 @@ import {
|
|
|
28
27
|
Callback,
|
|
29
28
|
Config,
|
|
30
29
|
JWTSignOptions,
|
|
30
|
+
Logger,
|
|
31
31
|
PackageAccess,
|
|
32
32
|
RemoteUser,
|
|
33
33
|
Security,
|
|
@@ -57,11 +57,13 @@ const debug = buildDebug('verdaccio:auth');
|
|
|
57
57
|
class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
|
58
58
|
public config: Config;
|
|
59
59
|
public secret: string;
|
|
60
|
+
public logger: Logger;
|
|
60
61
|
public plugins: pluginUtils.Auth<Config>[];
|
|
61
62
|
|
|
62
|
-
public constructor(config: Config) {
|
|
63
|
+
public constructor(config: Config, logger: Logger) {
|
|
63
64
|
this.config = config;
|
|
64
65
|
this.secret = config.secret;
|
|
66
|
+
this.logger = logger;
|
|
65
67
|
this.plugins = [];
|
|
66
68
|
if (!this.secret) {
|
|
67
69
|
throw new TypeError('secret it is required value on initialize the auth class');
|
|
@@ -84,7 +86,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
|
|
84
86
|
debug('load default auth plugin');
|
|
85
87
|
const pluginOptions: pluginUtils.PluginOptions = {
|
|
86
88
|
config: this.config,
|
|
87
|
-
logger,
|
|
89
|
+
logger: this.logger,
|
|
88
90
|
};
|
|
89
91
|
let authPlugin;
|
|
90
92
|
try {
|
|
@@ -94,7 +96,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
|
|
94
96
|
);
|
|
95
97
|
} catch (error: any) {
|
|
96
98
|
debug('error on loading auth htpasswd plugin stack: %o', error);
|
|
97
|
-
logger.info({}, 'no auth plugin has been found');
|
|
99
|
+
this.logger.info({}, 'no auth plugin has been found');
|
|
98
100
|
return [];
|
|
99
101
|
}
|
|
100
102
|
|
|
@@ -106,7 +108,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
|
|
106
108
|
this.config.auth,
|
|
107
109
|
{
|
|
108
110
|
config: this.config,
|
|
109
|
-
logger,
|
|
111
|
+
logger: this.logger,
|
|
110
112
|
},
|
|
111
113
|
(plugin): boolean => {
|
|
112
114
|
const { authenticate, allow_access, allow_publish } = plugin;
|
|
@@ -124,7 +126,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
|
|
124
126
|
|
|
125
127
|
private _applyDefaultPlugins(): void {
|
|
126
128
|
// TODO: rename to applyFallbackPluginMethods
|
|
127
|
-
this.plugins.push(getDefaultPlugins(logger));
|
|
129
|
+
this.plugins.push(getDefaultPlugins(this.logger));
|
|
128
130
|
}
|
|
129
131
|
|
|
130
132
|
public changePassword(
|
|
@@ -147,7 +149,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
|
|
147
149
|
debug('updating password for %o', username);
|
|
148
150
|
plugin.changePassword!(username, password, newPassword, (err, profile): void => {
|
|
149
151
|
if (err) {
|
|
150
|
-
logger.error(
|
|
152
|
+
this.logger.error(
|
|
151
153
|
{ username, err },
|
|
152
154
|
`An error has been produced
|
|
153
155
|
updating the password for @{username}. Error: @{err.message}`
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from '@verdaccio/config';
|
|
11
11
|
import { getDefaultConfig } from '@verdaccio/config';
|
|
12
12
|
import { TOKEN_BEARER } from '@verdaccio/core';
|
|
13
|
-
import { setup } from '@verdaccio/logger';
|
|
13
|
+
import { logger, setup } from '@verdaccio/logger';
|
|
14
14
|
import { signPayload } from '@verdaccio/signature';
|
|
15
15
|
import { Config, RemoteUser, Security } from '@verdaccio/types';
|
|
16
16
|
import { buildToken, buildUserBuffer } from '@verdaccio/utils';
|
|
@@ -52,7 +52,7 @@ describe('Auth utilities', () => {
|
|
|
52
52
|
methodNotBeenCalled: string
|
|
53
53
|
): Promise<string> {
|
|
54
54
|
const config: Config = getConfig(configFileName, secret);
|
|
55
|
-
const auth: Auth = new Auth(config);
|
|
55
|
+
const auth: Auth = new Auth(config, logger);
|
|
56
56
|
await auth.init();
|
|
57
57
|
// @ts-ignore
|
|
58
58
|
const spy = vi.spyOn(auth, methodToSpy);
|
|
@@ -155,7 +155,7 @@ describe('Auth utilities', () => {
|
|
|
155
155
|
test.concurrent('should return empty credential corrupted payload', async () => {
|
|
156
156
|
const secret = 'b2df428b9929d3ace7c598bbf4e496b2';
|
|
157
157
|
const config: Config = getConfig('security-legacy', secret);
|
|
158
|
-
const auth: Auth = new Auth(config);
|
|
158
|
+
const auth: Auth = new Auth(config, logger);
|
|
159
159
|
await auth.init();
|
|
160
160
|
// @ts-expect-error
|
|
161
161
|
const token = auth.aesEncrypt(null);
|
package/test/auth-utils.spec.ts
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from '@verdaccio/config';
|
|
12
12
|
import { getDefaultConfig } from '@verdaccio/config';
|
|
13
13
|
import { API_ERROR, CHARACTER_ENCODING, VerdaccioError, errorUtils } from '@verdaccio/core';
|
|
14
|
-
import { setup } from '@verdaccio/logger';
|
|
14
|
+
import { logger, setup } from '@verdaccio/logger';
|
|
15
15
|
import { aesDecrypt, verifyPayload } from '@verdaccio/signature';
|
|
16
16
|
import { Config, RemoteUser } from '@verdaccio/types';
|
|
17
17
|
import { getAuthenticatedMessage } from '@verdaccio/utils';
|
|
@@ -61,7 +61,7 @@ describe('Auth utilities', () => {
|
|
|
61
61
|
methodNotBeenCalled: string
|
|
62
62
|
): Promise<string> {
|
|
63
63
|
const config: Config = getConfig(configFileName, secret);
|
|
64
|
-
const auth: Auth = new Auth(config);
|
|
64
|
+
const auth: Auth = new Auth(config, logger);
|
|
65
65
|
await auth.init();
|
|
66
66
|
// @ts-ignore
|
|
67
67
|
const spy = vi.spyOn(auth, methodToSpy);
|
package/test/auth.spec.ts
CHANGED
|
@@ -45,7 +45,7 @@ describe('AuthTest', () => {
|
|
|
45
45
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
46
46
|
config.checkSecretKey('12345');
|
|
47
47
|
|
|
48
|
-
const auth: Auth = new Auth(config);
|
|
48
|
+
const auth: Auth = new Auth(config, logger);
|
|
49
49
|
await auth.init();
|
|
50
50
|
expect(auth).toBeDefined();
|
|
51
51
|
});
|
|
@@ -54,7 +54,7 @@ describe('AuthTest', () => {
|
|
|
54
54
|
const config: Config = new AppConfig({ ...authProfileConf, auth: undefined });
|
|
55
55
|
config.checkSecretKey('12345');
|
|
56
56
|
|
|
57
|
-
const auth: Auth = new Auth(config);
|
|
57
|
+
const auth: Auth = new Auth(config, logger);
|
|
58
58
|
await auth.init();
|
|
59
59
|
expect(auth).toBeDefined();
|
|
60
60
|
});
|
|
@@ -68,7 +68,7 @@ describe('AuthTest', () => {
|
|
|
68
68
|
});
|
|
69
69
|
config.checkSecretKey('12345');
|
|
70
70
|
|
|
71
|
-
const auth: Auth = new Auth(config);
|
|
71
|
+
const auth: Auth = new Auth(config, logger);
|
|
72
72
|
await auth.init();
|
|
73
73
|
expect(auth).toBeDefined();
|
|
74
74
|
});
|
|
@@ -79,7 +79,7 @@ describe('AuthTest', () => {
|
|
|
79
79
|
test('should be a success login', async () => {
|
|
80
80
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
81
81
|
config.checkSecretKey('12345');
|
|
82
|
-
const auth: Auth = new Auth(config);
|
|
82
|
+
const auth: Auth = new Auth(config, logger);
|
|
83
83
|
await auth.init();
|
|
84
84
|
expect(auth).toBeDefined();
|
|
85
85
|
|
|
@@ -106,7 +106,7 @@ describe('AuthTest', () => {
|
|
|
106
106
|
test('should be a fail on login', async () => {
|
|
107
107
|
const config: Config = new AppConfig(authPluginFailureConf);
|
|
108
108
|
config.checkSecretKey('12345');
|
|
109
|
-
const auth: Auth = new Auth(config);
|
|
109
|
+
const auth: Auth = new Auth(config, logger);
|
|
110
110
|
await auth.init();
|
|
111
111
|
expect(auth).toBeDefined();
|
|
112
112
|
|
|
@@ -125,7 +125,7 @@ describe('AuthTest', () => {
|
|
|
125
125
|
test('should skip falsy values', async () => {
|
|
126
126
|
const config: Config = new AppConfig({ ...authPluginPassThrougConf });
|
|
127
127
|
config.checkSecretKey('12345');
|
|
128
|
-
const auth: Auth = new Auth(config);
|
|
128
|
+
const auth: Auth = new Auth(config, logger);
|
|
129
129
|
await auth.init();
|
|
130
130
|
expect(auth).toBeDefined();
|
|
131
131
|
|
|
@@ -145,7 +145,7 @@ describe('AuthTest', () => {
|
|
|
145
145
|
test('should error truthy non-array', async () => {
|
|
146
146
|
const config: Config = new AppConfig({ ...authPluginPassThrougConf });
|
|
147
147
|
config.checkSecretKey('12345');
|
|
148
|
-
const auth: Auth = new Auth(config);
|
|
148
|
+
const auth: Auth = new Auth(config, logger);
|
|
149
149
|
await auth.init();
|
|
150
150
|
expect(auth).toBeDefined();
|
|
151
151
|
|
|
@@ -163,7 +163,7 @@ describe('AuthTest', () => {
|
|
|
163
163
|
test('should skip empty array', async () => {
|
|
164
164
|
const config: Config = new AppConfig({ ...authPluginPassThrougConf });
|
|
165
165
|
config.checkSecretKey('12345');
|
|
166
|
-
const auth: Auth = new Auth(config);
|
|
166
|
+
const auth: Auth = new Auth(config, logger);
|
|
167
167
|
await auth.init();
|
|
168
168
|
expect(auth).toBeDefined();
|
|
169
169
|
|
|
@@ -180,7 +180,7 @@ describe('AuthTest', () => {
|
|
|
180
180
|
test('should accept valid array', async () => {
|
|
181
181
|
const config: Config = new AppConfig({ ...authPluginPassThrougConf });
|
|
182
182
|
config.checkSecretKey('12345');
|
|
183
|
-
const auth: Auth = new Auth(config);
|
|
183
|
+
const auth: Auth = new Auth(config, logger);
|
|
184
184
|
await auth.init();
|
|
185
185
|
expect(auth).toBeDefined();
|
|
186
186
|
|
|
@@ -208,7 +208,7 @@ describe('AuthTest', () => {
|
|
|
208
208
|
},
|
|
209
209
|
});
|
|
210
210
|
config.checkSecretKey('12345');
|
|
211
|
-
const auth: Auth = new Auth(config);
|
|
211
|
+
const auth: Auth = new Auth(config, logger);
|
|
212
212
|
await auth.init();
|
|
213
213
|
|
|
214
214
|
return new Promise((resolve) => {
|
|
@@ -229,7 +229,7 @@ describe('AuthTest', () => {
|
|
|
229
229
|
test('should fail if the plugin does not provide implementation', async () => {
|
|
230
230
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
231
231
|
config.checkSecretKey('12345');
|
|
232
|
-
const auth: Auth = new Auth(config);
|
|
232
|
+
const auth: Auth = new Auth(config, logger);
|
|
233
233
|
await auth.init();
|
|
234
234
|
expect(auth).toBeDefined();
|
|
235
235
|
const callback = vi.fn();
|
|
@@ -244,7 +244,7 @@ describe('AuthTest', () => {
|
|
|
244
244
|
test('should handle plugin does provide implementation', async () => {
|
|
245
245
|
const config: Config = new AppConfig({ ...authChangePasswordConf });
|
|
246
246
|
config.checkSecretKey('12345');
|
|
247
|
-
const auth: Auth = new Auth(config);
|
|
247
|
+
const auth: Auth = new Auth(config, logger);
|
|
248
248
|
await auth.init();
|
|
249
249
|
expect(auth).toBeDefined();
|
|
250
250
|
const callback = vi.fn();
|
|
@@ -262,7 +262,7 @@ describe('AuthTest', () => {
|
|
|
262
262
|
test('should fails if groups do not match exactly', async () => {
|
|
263
263
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
264
264
|
config.checkSecretKey('12345');
|
|
265
|
-
const auth: Auth = new Auth(config);
|
|
265
|
+
const auth: Auth = new Auth(config, logger);
|
|
266
266
|
await auth.init();
|
|
267
267
|
expect(auth).toBeDefined();
|
|
268
268
|
|
|
@@ -284,7 +284,7 @@ describe('AuthTest', () => {
|
|
|
284
284
|
test('should success if groups do not match exactly', async () => {
|
|
285
285
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
286
286
|
config.checkSecretKey('12345');
|
|
287
|
-
const auth: Auth = new Auth(config);
|
|
287
|
+
const auth: Auth = new Auth(config, logger);
|
|
288
288
|
await auth.init();
|
|
289
289
|
expect(auth).toBeDefined();
|
|
290
290
|
|
|
@@ -311,7 +311,7 @@ describe('AuthTest', () => {
|
|
|
311
311
|
test('should fails if groups do not match exactly', async () => {
|
|
312
312
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
313
313
|
config.checkSecretKey('12345');
|
|
314
|
-
const auth: Auth = new Auth(config);
|
|
314
|
+
const auth: Auth = new Auth(config, logger);
|
|
315
315
|
await auth.init();
|
|
316
316
|
expect(auth).toBeDefined();
|
|
317
317
|
|
|
@@ -333,7 +333,7 @@ describe('AuthTest', () => {
|
|
|
333
333
|
test('should success if groups do match exactly', async () => {
|
|
334
334
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
335
335
|
config.checkSecretKey('12345');
|
|
336
|
-
const auth: Auth = new Auth(config);
|
|
336
|
+
const auth: Auth = new Auth(config, logger);
|
|
337
337
|
await auth.init();
|
|
338
338
|
expect(auth).toBeDefined();
|
|
339
339
|
|
|
@@ -358,7 +358,7 @@ describe('AuthTest', () => {
|
|
|
358
358
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
359
359
|
config.checkSecretKey('12345');
|
|
360
360
|
|
|
361
|
-
const auth: Auth = new Auth(config);
|
|
361
|
+
const auth: Auth = new Auth(config, logger);
|
|
362
362
|
await auth.init();
|
|
363
363
|
expect(auth).toBeDefined();
|
|
364
364
|
|
|
@@ -392,7 +392,7 @@ describe('AuthTest', () => {
|
|
|
392
392
|
},
|
|
393
393
|
});
|
|
394
394
|
config.checkSecretKey('12345');
|
|
395
|
-
const auth: Auth = new Auth(config);
|
|
395
|
+
const auth: Auth = new Auth(config, logger);
|
|
396
396
|
await auth.init();
|
|
397
397
|
expect(auth).toBeDefined();
|
|
398
398
|
|
|
@@ -415,7 +415,7 @@ describe('AuthTest', () => {
|
|
|
415
415
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
416
416
|
|
|
417
417
|
config.checkSecretKey('12345');
|
|
418
|
-
const auth: Auth = new Auth(config);
|
|
418
|
+
const auth: Auth = new Auth(config, logger);
|
|
419
419
|
await auth.init();
|
|
420
420
|
expect(auth).toBeDefined();
|
|
421
421
|
|
|
@@ -442,7 +442,7 @@ describe('AuthTest', () => {
|
|
|
442
442
|
test('should fails with bad password if adduser is not implemented', async () => {
|
|
443
443
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
444
444
|
config.checkSecretKey('12345');
|
|
445
|
-
const auth: Auth = new Auth(config);
|
|
445
|
+
const auth: Auth = new Auth(config, logger);
|
|
446
446
|
await auth.init();
|
|
447
447
|
expect(auth).toBeDefined();
|
|
448
448
|
|
|
@@ -465,7 +465,7 @@ describe('AuthTest', () => {
|
|
|
465
465
|
},
|
|
466
466
|
});
|
|
467
467
|
config.checkSecretKey('12345');
|
|
468
|
-
const auth: Auth = new Auth(config);
|
|
468
|
+
const auth: Auth = new Auth(config, logger);
|
|
469
469
|
await auth.init();
|
|
470
470
|
expect(auth).toBeDefined();
|
|
471
471
|
|
|
@@ -489,7 +489,7 @@ describe('AuthTest', () => {
|
|
|
489
489
|
},
|
|
490
490
|
});
|
|
491
491
|
config.checkSecretKey('12345');
|
|
492
|
-
const auth: Auth = new Auth(config);
|
|
492
|
+
const auth: Auth = new Auth(config, logger);
|
|
493
493
|
await auth.init();
|
|
494
494
|
expect(auth).toBeDefined();
|
|
495
495
|
|
|
@@ -513,7 +513,7 @@ describe('AuthTest', () => {
|
|
|
513
513
|
},
|
|
514
514
|
});
|
|
515
515
|
config.checkSecretKey('12345');
|
|
516
|
-
const auth: Auth = new Auth(config);
|
|
516
|
+
const auth: Auth = new Auth(config, logger);
|
|
517
517
|
await auth.init();
|
|
518
518
|
expect(auth).toBeDefined();
|
|
519
519
|
|
|
@@ -537,7 +537,7 @@ describe('AuthTest', () => {
|
|
|
537
537
|
},
|
|
538
538
|
});
|
|
539
539
|
config.checkSecretKey('12345');
|
|
540
|
-
const auth: Auth = new Auth(config);
|
|
540
|
+
const auth: Auth = new Auth(config, logger);
|
|
541
541
|
await auth.init();
|
|
542
542
|
expect(auth).toBeDefined();
|
|
543
543
|
|
|
@@ -583,7 +583,7 @@ describe('AuthTest', () => {
|
|
|
583
583
|
test('should handle invalid auth token', async () => {
|
|
584
584
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
585
585
|
config.checkSecretKey(secret);
|
|
586
|
-
const auth = new Auth(config);
|
|
586
|
+
const auth = new Auth(config, logger);
|
|
587
587
|
await auth.init();
|
|
588
588
|
const app = await getServer(auth);
|
|
589
589
|
return supertest(app)
|
|
@@ -595,7 +595,7 @@ describe('AuthTest', () => {
|
|
|
595
595
|
test('should handle missing auth header', async () => {
|
|
596
596
|
const config: Config = new AppConfig({ ...authProfileConf });
|
|
597
597
|
config.checkSecretKey(secret);
|
|
598
|
-
const auth = new Auth(config);
|
|
598
|
+
const auth = new Auth(config, logger);
|
|
599
599
|
await auth.init();
|
|
600
600
|
const app = await getServer(auth);
|
|
601
601
|
return supertest(app).get(`/`).expect(HTTP_STATUS.OK);
|
|
@@ -610,7 +610,7 @@ describe('AuthTest', () => {
|
|
|
610
610
|
// intended to force key generator (associated with mocks above)
|
|
611
611
|
// 64 characters secret long
|
|
612
612
|
config.checkSecretKey('35fabdd29b820d39125e76e6d85cc294');
|
|
613
|
-
const auth = new Auth(config);
|
|
613
|
+
const auth = new Auth(config, logger);
|
|
614
614
|
await auth.init();
|
|
615
615
|
const token = auth.aesEncrypt(payload) as string;
|
|
616
616
|
const app = await getServer(auth);
|
|
@@ -626,7 +626,7 @@ describe('AuthTest', () => {
|
|
|
626
626
|
const config: Config = new AppConfig({ ...authPluginFailureConf });
|
|
627
627
|
// intended to force key generator (associated with mocks above)
|
|
628
628
|
config.checkSecretKey(undefined);
|
|
629
|
-
const auth = new Auth(config);
|
|
629
|
+
const auth = new Auth(config, logger);
|
|
630
630
|
await auth.init();
|
|
631
631
|
const token = auth.aesEncrypt(payload) as string;
|
|
632
632
|
const app = await getServer(auth);
|
|
@@ -646,7 +646,7 @@ describe('AuthTest', () => {
|
|
|
646
646
|
...{ security: { api: { jwt: { sign: { expiresIn: '29d' } } } } },
|
|
647
647
|
});
|
|
648
648
|
config.checkSecretKey(secret);
|
|
649
|
-
const auth = new Auth(config);
|
|
649
|
+
const auth = new Auth(config, logger);
|
|
650
650
|
await auth.init();
|
|
651
651
|
const app = await getServer(auth);
|
|
652
652
|
const res = await supertest(app)
|
|
@@ -668,7 +668,7 @@ describe('AuthTest', () => {
|
|
|
668
668
|
...{ security: { api: { jwt: { sign: { expiresIn: '29d' } } } } },
|
|
669
669
|
});
|
|
670
670
|
config.checkSecretKey(secret);
|
|
671
|
-
const auth = new Auth(config);
|
|
671
|
+
const auth = new Auth(config, logger);
|
|
672
672
|
await auth.init();
|
|
673
673
|
const app = await getServer(auth);
|
|
674
674
|
const res = await supertest(app).get(`/`).expect(HTTP_STATUS.OK);
|
|
@@ -691,7 +691,7 @@ describe('AuthTest', () => {
|
|
|
691
691
|
);
|
|
692
692
|
// intended to force key generator (associated with mocks above)
|
|
693
693
|
config.checkSecretKey(undefined);
|
|
694
|
-
const auth = new Auth(config);
|
|
694
|
+
const auth = new Auth(config, logger);
|
|
695
695
|
await auth.init();
|
|
696
696
|
const token = (await auth.jwtEncrypt(
|
|
697
697
|
createRemoteUser('jwt_user', [ROLES.ALL]),
|