@verdaccio/auth 6.0.0-6-next.20 → 6.0.0-6-next.23
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 +63 -0
- package/build/auth.js +3 -3
- package/build/auth.js.map +1 -1
- package/build/index.js.map +1 -1
- package/build/jwt-token.js.map +1 -1
- package/build/legacy-token.js.map +1 -1
- package/build/token.js.map +1 -1
- package/build/utils.js +3 -3
- package/build/utils.js.map +1 -1
- package/jest.config.js +8 -1
- package/package.json +60 -60
- package/src/auth.ts +3 -3
- package/src/utils.ts +3 -3
- package/test/auth-utils.spec.ts +4 -8
- package/test/auth.spec.ts +1 -1
- package/test/helper/plugin.ts +11 -8
- package/test/partials/plugin/authenticate.fail.js +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
# @verdaccio/auth
|
|
2
2
|
|
|
3
|
+
## 6.0.0-6-next.23
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 292c0a37: feat!: replace deprecated request dependency by got
|
|
8
|
+
|
|
9
|
+
This is a big refactoring of the core, fetching dependencies, improve code, more tests and better stability. This is essential for the next release, will take some time but would allow modularize more the core.
|
|
10
|
+
|
|
11
|
+
## Notes
|
|
12
|
+
|
|
13
|
+
- Remove deprecated `request` by other `got`, retry improved, custom Agent ( got does not include it built-in)
|
|
14
|
+
- Remove `async` dependency from storage (used by core) it was linked with proxy somehow safe to remove now
|
|
15
|
+
- Refactor with promises instead callback wherever is possible
|
|
16
|
+
- ~Document the API~
|
|
17
|
+
- Improve testing, integration tests
|
|
18
|
+
- Bugfix
|
|
19
|
+
- Clean up old validations
|
|
20
|
+
- Improve performance
|
|
21
|
+
|
|
22
|
+
## 💥 Breaking changes
|
|
23
|
+
|
|
24
|
+
- Plugin API methods were callbacks based are returning promises, this will break current storage plugins, check documentation for upgrade.
|
|
25
|
+
- Write Tarball, Read Tarball methods parameters change, a new set of options like `AbortController` signals are being provided to the `addAbortSignal` can be internally used with Streams when a request is aborted. eg: `addAbortSignal(signal, fs.createReadStream(pathName));`
|
|
26
|
+
- `@verdaccio/streams` stream abort support is legacy is being deprecated removed
|
|
27
|
+
- Remove AWS and Google Cloud packages for future refactoring [#2574](https://github.com/verdaccio/verdaccio/pull/2574).
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [292c0a37]
|
|
32
|
+
- Updated dependencies [a3a209b5]
|
|
33
|
+
- Updated dependencies [00d1d2a1]
|
|
34
|
+
- @verdaccio/config@6.0.0-6-next.15
|
|
35
|
+
- @verdaccio/core@6.0.0-6-next.6
|
|
36
|
+
- @verdaccio/loaders@6.0.0-6-next.13
|
|
37
|
+
- @verdaccio/logger@6.0.0-6-next.12
|
|
38
|
+
- verdaccio-htpasswd@11.0.0-6-next.14
|
|
39
|
+
- @verdaccio/utils@6.0.0-6-next.12
|
|
40
|
+
|
|
41
|
+
## 6.0.0-6-next.22
|
|
42
|
+
|
|
43
|
+
### Patch Changes
|
|
44
|
+
|
|
45
|
+
- Updated dependencies [d43894e8]
|
|
46
|
+
- Updated dependencies [d08fe29d]
|
|
47
|
+
- @verdaccio/config@6.0.0-6-next.14
|
|
48
|
+
- @verdaccio/loaders@6.0.0-6-next.12
|
|
49
|
+
- @verdaccio/core@6.0.0-6-next.5
|
|
50
|
+
- @verdaccio/logger@6.0.0-6-next.11
|
|
51
|
+
- verdaccio-htpasswd@11.0.0-6-next.13
|
|
52
|
+
|
|
53
|
+
## 6.0.0-6-next.21
|
|
54
|
+
|
|
55
|
+
### Patch Changes
|
|
56
|
+
|
|
57
|
+
- Updated dependencies [82cb0f2b]
|
|
58
|
+
- Updated dependencies [5167bb52]
|
|
59
|
+
- @verdaccio/config@6.0.0-6-next.13
|
|
60
|
+
- @verdaccio/core@6.0.0-6-next.5
|
|
61
|
+
- @verdaccio/logger@6.0.0-6-next.11
|
|
62
|
+
- verdaccio-htpasswd@11.0.0-6-next.13
|
|
63
|
+
- @verdaccio/loaders@6.0.0-6-next.12
|
|
64
|
+
- @verdaccio/utils@6.0.0-6-next.11
|
|
65
|
+
|
|
3
66
|
## 6.0.0-6-next.20
|
|
4
67
|
|
|
5
68
|
### Patch Changes
|
package/build/auth.js
CHANGED
|
@@ -444,10 +444,10 @@ class Auth {
|
|
|
444
444
|
|
|
445
445
|
_handleAESMiddleware(req, security, secret, authorization, next) {
|
|
446
446
|
debug('handle legacy api middleware');
|
|
447
|
-
debug('api middleware secret %o', secret);
|
|
448
|
-
debug('api middleware authorization %o', authorization);
|
|
447
|
+
debug('api middleware secret %o', typeof secret === 'string');
|
|
448
|
+
debug('api middleware authorization %o', typeof authorization === 'string');
|
|
449
449
|
const credentials = (0, _utils2.getMiddlewareCredentials)(security, secret, authorization);
|
|
450
|
-
debug('api middleware credentials %o', credentials);
|
|
450
|
+
debug('api middleware credentials %o', credentials === null || credentials === void 0 ? void 0 : credentials.name);
|
|
451
451
|
|
|
452
452
|
if (credentials) {
|
|
453
453
|
const {
|
package/build/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts"],"names":["LoggerApi","require","debug","Auth","constructor","config","logger","child","sub","secret","TypeError","plugins","_","isNil","auth","_loadPlugin","loadDefaultPlugin","_applyDefaultPlugins","plugingConf","file","pluginOptions","authPlugin","HTPasswd","error","plugin","authenticate","allow_access","allow_publish","push","changePassword","username","password","newPassword","cb","validPlugins","filter","isEmpty","errorUtils","getInternalError","SUPPORT_ERRORS","PLUGIN_MISSING_INTERFACE","err","profile","invalidateToken","token","console","log","Promise","resolve","slice","next","shift","groups","message","length","isString","isGroupValid","isArray","API_ERROR","BAD_FORMAT_USER_GROUP","add_user","user","self","method","warn","ok","packageName","packageVersion","callback","pkgAllowAcces","name","version","pkg","Object","assign","packages","allow_unpublish","arguments","isError","apiJWTmiddleware","helpers","createAnonymousRemoteUser","createRemoteUser","req","res","_next","pause","resume","remote_user","_isRemoteUserValid","remoteUser","locals","authorization","headers","getBadRequest","BAD_AUTH_HEADER","security","_handleAESMiddleware","_handleJWTAPIMiddleware","scheme","toUpperCase","TOKEN_BASIC","credentials","toString","getForbidden","BAD_USERNAME_PASSWORD","isUndefined","webUIJWTmiddleware","status","statusCode","send","replace","TOKEN_BEARER","jwtEncrypt","signOptions","real_groups","realGroupsValidated","groupedGroups","concat","payload","aesEncrypt","value"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { NextFunction, Request, Response } from 'express';\nimport _ from 'lodash';\nimport { HTPasswd, HTPasswdConfig } from 'verdaccio-htpasswd';\n\nimport { createAnonymousRemoteUser, createRemoteUser } from '@verdaccio/config';\nimport {\n API_ERROR,\n SUPPORT_ERRORS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n VerdaccioError,\n errorUtils,\n} from '@verdaccio/core';\nimport { loadPlugin } from '@verdaccio/loaders';\nimport {\n AllowAccess,\n AuthPluginPackage,\n Callback,\n Config,\n IPluginAuth,\n JWTSignOptions,\n Logger,\n PackageAccess,\n PluginOptions,\n RemoteUser,\n Security,\n} from '@verdaccio/types';\nimport { getMatchedPackagesSpec, isFunction, isNil } from '@verdaccio/utils';\n\nimport { signPayload } from './jwt-token';\nimport { aesEncrypt } from './legacy-token';\nimport { parseBasicPayload } from './token';\nimport {\n convertPayloadToBase64,\n getDefaultPlugins,\n getMiddlewareCredentials,\n isAESLegacy,\n isAuthHeaderValid,\n parseAuthTokenHeader,\n verifyJWTPayload,\n} from './utils';\n\n/* eslint-disable @typescript-eslint/no-var-requires */\nconst LoggerApi = require('@verdaccio/logger');\n\nconst debug = buildDebug('verdaccio:auth');\n\nexport interface IBasicAuth<T> {\n config: T & Config;\n authenticate(user: string, password: string, cb: Callback): void;\n invalidateToken?(token: string): Promise<void>;\n changePassword(user: string, password: string, newPassword: string, cb: Callback): void;\n allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;\n add_user(user: string, password: string, cb: Callback): any;\n}\n\nexport interface TokenEncryption {\n jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string>;\n aesEncrypt(buf: string): string | void;\n}\n\nexport interface AESPayload {\n user: string;\n password: string;\n}\n\nexport type $RequestExtend = Request & { remote_user?: any; log: Logger };\nexport type $ResponseExtend = Response & { cookies?: any };\nexport type $NextFunctionVer = NextFunction & any;\n\nexport interface IAuthMiddleware {\n apiJWTmiddleware(): $NextFunctionVer;\n webUIJWTmiddleware(): $NextFunctionVer;\n}\n\nexport interface IAuth extends IBasicAuth<Config>, IAuthMiddleware, TokenEncryption {\n config: Config;\n logger: Logger;\n secret: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plugins: any[];\n allow_unpublish(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;\n invalidateToken(token: string): Promise<void>;\n}\n\nclass Auth implements IAuth {\n public config: Config;\n public logger: Logger;\n public secret: string;\n public plugins: IPluginAuth<Config>[];\n\n public constructor(config: Config) {\n this.config = config;\n this.logger = LoggerApi.logger.child({ sub: 'auth' });\n this.secret = config.secret;\n if (!this.secret) {\n throw new TypeError('secret it is required value on initialize the auth class');\n }\n\n this.plugins =\n _.isNil(config?.auth) === false ? this._loadPlugin(config) : this.loadDefaultPlugin(config);\n this._applyDefaultPlugins();\n }\n\n private loadDefaultPlugin(config: Config) {\n const plugingConf: HTPasswdConfig = { ...config, file: './htpasswd' };\n const pluginOptions: PluginOptions<{}> = {\n config,\n logger: this.logger,\n };\n let authPlugin;\n try {\n authPlugin = new HTPasswd(plugingConf, pluginOptions as any as PluginOptions<HTPasswdConfig>);\n } catch (error: any) {\n debug('error on loading auth htpasswd plugin stack: %o', error);\n return [];\n }\n\n return [authPlugin];\n }\n\n private _loadPlugin(config: Config): IPluginAuth<Config>[] {\n const pluginOptions = {\n config,\n logger: this.logger,\n };\n\n return loadPlugin<IPluginAuth<Config>>(\n config,\n config.auth,\n pluginOptions,\n (plugin: IPluginAuth<Config>): boolean => {\n const { authenticate, allow_access, allow_publish } = plugin;\n\n // @ts-ignore\n return authenticate || allow_access || allow_publish;\n }\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(username: string, password: string, cb: Callback): void {\n const plugins = this.plugins.slice(0);\n (function next(): void {\n const plugin = plugins.shift() as IPluginAuth<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, 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(user: string, password: string, cb: Callback): void {\n const self = this;\n const plugins = this.plugins.slice(0);\n debug('add user %o', user);\n\n (function next(): void {\n const plugin = plugins.shift() as IPluginAuth<Config>;\n let method = 'adduser';\n if (isFunction(plugin[method]) === false) {\n method = 'add_user';\n self.logger.warn(\n 'the plugin method add_user in the auth plugin is deprecated and will' +\n ' be removed in next major release, notify to the plugin author'\n );\n }\n\n if (isFunction(plugin[method]) === false) {\n next();\n } else {\n // p.add_user() execution\n plugin[method](user, password, function (err, ok): void {\n if (err) {\n debug('the user %o could not being 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 next();\n });\n }\n })();\n }\n\n /**\n * Allow user to access a package.\n */\n public allow_access(\n { packageName, packageVersion }: AuthPluginPackage,\n user: RemoteUser,\n callback: Callback\n ): void {\n const plugins = this.plugins.slice(0);\n const pkgAllowAcces: AllowAccess = { name: packageName, version: packageVersion };\n const pkg = Object.assign(\n {},\n pkgAllowAcces,\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: IPluginAuth<Config> = plugins.shift() as IPluginAuth<Config>;\n\n if (_.isNil(plugin) || isFunction(plugin.allow_access) === false) {\n return next();\n }\n\n plugin.allow_access!(user, pkg, function (err, 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 }: 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 (_.isNil(plugin) || isFunction(plugin.allow_unpublish) === false) {\n debug('allow unpublish for %o plugin does not implement allow_unpublish', packageName);\n continue;\n } else {\n // @ts-ignore\n plugin.allow_unpublish!(user, pkg, (err, ok: boolean): 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 // @ts-ignore\n // eslint-disable-next-line\n return this.allow_publish(...arguments);\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 }: 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 (isFunction(plugin?.allow_publish) === false) {\n debug('allow publish for %o plugin does not implement allow_publish', packageName);\n return next();\n }\n\n // @ts-ignore\n plugin.allow_publish(\n user,\n // @ts-ignore\n pkg,\n // @ts-ignore\n (err: VerdaccioError, 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\n public apiJWTmiddleware(): Function {\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): void => {\n req.pause();\n\n const next = function (err: VerdaccioError | void): void {\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 return _next();\n };\n\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: Function\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, 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 secret %o', secret);\n debug('api middleware authorization %o', authorization);\n const credentials: any = getMiddlewareCredentials(security, secret, authorization);\n debug('api middleware credentials %o', credentials);\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(): Function {\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;\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;\n // $FlowFixMe\n req.remote_user = createRemoteUser(name, 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) ? real_groups : groups.concat(realGroupsValidated);\n const payload: RemoteUser = {\n real_groups: realGroupsValidated,\n name,\n groups: groupedGroups,\n };\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 return aesEncrypt(value, this.secret);\n }\n}\n\nexport { Auth };\n"],"file":"auth.js"}
|
|
1
|
+
{"version":3,"file":"auth.js","names":["LoggerApi","require","debug","buildDebug","Auth","constructor","config","logger","child","sub","secret","TypeError","plugins","_","isNil","auth","_loadPlugin","loadDefaultPlugin","_applyDefaultPlugins","plugingConf","file","pluginOptions","authPlugin","HTPasswd","error","loadPlugin","plugin","authenticate","allow_access","allow_publish","push","getDefaultPlugins","changePassword","username","password","newPassword","cb","validPlugins","filter","isFunction","isEmpty","errorUtils","getInternalError","SUPPORT_ERRORS","PLUGIN_MISSING_INTERFACE","err","profile","invalidateToken","token","console","log","Promise","resolve","slice","next","shift","groups","message","length","isString","isGroupValid","isArray","API_ERROR","BAD_FORMAT_USER_GROUP","createRemoteUser","add_user","user","self","method","warn","ok","packageName","packageVersion","callback","pkgAllowAcces","name","version","pkg","Object","assign","getMatchedPackagesSpec","packages","allow_unpublish","arguments","isError","apiJWTmiddleware","helpers","createAnonymousRemoteUser","req","res","_next","pause","resume","remote_user","_isRemoteUserValid","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","isUndefined","webUIJWTmiddleware","status","statusCode","send","replace","TOKEN_BEARER","verifyJWTPayload","jwtEncrypt","signOptions","real_groups","realGroupsValidated","groupedGroups","concat","payload","signPayload","aesEncrypt","value"],"sources":["../src/auth.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { NextFunction, Request, Response } from 'express';\nimport _ from 'lodash';\nimport { HTPasswd, HTPasswdConfig } from 'verdaccio-htpasswd';\n\nimport { createAnonymousRemoteUser, createRemoteUser } from '@verdaccio/config';\nimport {\n API_ERROR,\n SUPPORT_ERRORS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n VerdaccioError,\n errorUtils,\n} from '@verdaccio/core';\nimport { loadPlugin } from '@verdaccio/loaders';\nimport {\n AllowAccess,\n AuthPluginPackage,\n Callback,\n Config,\n IPluginAuth,\n JWTSignOptions,\n Logger,\n PackageAccess,\n PluginOptions,\n RemoteUser,\n Security,\n} from '@verdaccio/types';\nimport { getMatchedPackagesSpec, isFunction, isNil } from '@verdaccio/utils';\n\nimport { signPayload } from './jwt-token';\nimport { aesEncrypt } from './legacy-token';\nimport { parseBasicPayload } from './token';\nimport {\n convertPayloadToBase64,\n getDefaultPlugins,\n getMiddlewareCredentials,\n isAESLegacy,\n isAuthHeaderValid,\n parseAuthTokenHeader,\n verifyJWTPayload,\n} from './utils';\n\n/* eslint-disable @typescript-eslint/no-var-requires */\nconst LoggerApi = require('@verdaccio/logger');\n\nconst debug = buildDebug('verdaccio:auth');\n\nexport interface IBasicAuth<T> {\n config: T & Config;\n authenticate(user: string, password: string, cb: Callback): void;\n invalidateToken?(token: string): Promise<void>;\n changePassword(user: string, password: string, newPassword: string, cb: Callback): void;\n allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;\n add_user(user: string, password: string, cb: Callback): any;\n}\n\nexport interface TokenEncryption {\n jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string>;\n aesEncrypt(buf: string): string | void;\n}\n\nexport interface AESPayload {\n user: string;\n password: string;\n}\n\nexport type $RequestExtend = Request & { remote_user?: any; log: Logger };\nexport type $ResponseExtend = Response & { cookies?: any };\nexport type $NextFunctionVer = NextFunction & any;\n\nexport interface IAuthMiddleware {\n apiJWTmiddleware(): $NextFunctionVer;\n webUIJWTmiddleware(): $NextFunctionVer;\n}\n\nexport interface IAuth extends IBasicAuth<Config>, IAuthMiddleware, TokenEncryption {\n config: Config;\n logger: Logger;\n secret: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plugins: any[];\n allow_unpublish(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;\n invalidateToken(token: string): Promise<void>;\n}\n\nclass Auth implements IAuth {\n public config: Config;\n public logger: Logger;\n public secret: string;\n public plugins: IPluginAuth<Config>[];\n\n public constructor(config: Config) {\n this.config = config;\n this.logger = LoggerApi.logger.child({ sub: 'auth' });\n this.secret = config.secret;\n if (!this.secret) {\n throw new TypeError('secret it is required value on initialize the auth class');\n }\n\n this.plugins =\n _.isNil(config?.auth) === false ? this._loadPlugin(config) : this.loadDefaultPlugin(config);\n this._applyDefaultPlugins();\n }\n\n private loadDefaultPlugin(config: Config) {\n const plugingConf: HTPasswdConfig = { ...config, file: './htpasswd' };\n const pluginOptions: PluginOptions<{}> = {\n config,\n logger: this.logger,\n };\n let authPlugin;\n try {\n authPlugin = new HTPasswd(plugingConf, pluginOptions as any as PluginOptions<HTPasswdConfig>);\n } catch (error: any) {\n debug('error on loading auth htpasswd plugin stack: %o', error);\n return [];\n }\n\n return [authPlugin];\n }\n\n private _loadPlugin(config: Config): IPluginAuth<Config>[] {\n const pluginOptions = {\n config,\n logger: this.logger,\n };\n\n return loadPlugin<IPluginAuth<Config>>(\n config,\n config.auth,\n pluginOptions,\n (plugin: IPluginAuth<Config>): boolean => {\n const { authenticate, allow_access, allow_publish } = plugin;\n\n // @ts-ignore\n return authenticate || allow_access || allow_publish;\n }\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(username: string, password: string, cb: Callback): void {\n const plugins = this.plugins.slice(0);\n (function next(): void {\n const plugin = plugins.shift() as IPluginAuth<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, 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(user: string, password: string, cb: Callback): void {\n const self = this;\n const plugins = this.plugins.slice(0);\n debug('add user %o', user);\n\n (function next(): void {\n const plugin = plugins.shift() as IPluginAuth<Config>;\n let method = 'adduser';\n if (isFunction(plugin[method]) === false) {\n method = 'add_user';\n self.logger.warn(\n 'the plugin method add_user in the auth plugin is deprecated and will' +\n ' be removed in next major release, notify to the plugin author'\n );\n }\n\n if (isFunction(plugin[method]) === false) {\n next();\n } else {\n // p.add_user() execution\n plugin[method](user, password, function (err, ok): void {\n if (err) {\n debug('the user %o could not being 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 next();\n });\n }\n })();\n }\n\n /**\n * Allow user to access a package.\n */\n public allow_access(\n { packageName, packageVersion }: AuthPluginPackage,\n user: RemoteUser,\n callback: Callback\n ): void {\n const plugins = this.plugins.slice(0);\n const pkgAllowAcces: AllowAccess = { name: packageName, version: packageVersion };\n const pkg = Object.assign(\n {},\n pkgAllowAcces,\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: IPluginAuth<Config> = plugins.shift() as IPluginAuth<Config>;\n\n if (_.isNil(plugin) || isFunction(plugin.allow_access) === false) {\n return next();\n }\n\n plugin.allow_access!(user, pkg, function (err, 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 }: 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 (_.isNil(plugin) || isFunction(plugin.allow_unpublish) === false) {\n debug('allow unpublish for %o plugin does not implement allow_unpublish', packageName);\n continue;\n } else {\n // @ts-ignore\n plugin.allow_unpublish!(user, pkg, (err, ok: boolean): 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 // @ts-ignore\n // eslint-disable-next-line\n return this.allow_publish(...arguments);\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 }: 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 (isFunction(plugin?.allow_publish) === false) {\n debug('allow publish for %o plugin does not implement allow_publish', packageName);\n return next();\n }\n\n // @ts-ignore\n plugin.allow_publish(\n user,\n // @ts-ignore\n pkg,\n // @ts-ignore\n (err: VerdaccioError, 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\n public apiJWTmiddleware(): Function {\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): void => {\n req.pause();\n\n const next = function (err: VerdaccioError | void): void {\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 return _next();\n };\n\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: Function\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, 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 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(): Function {\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;\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;\n // $FlowFixMe\n req.remote_user = createRemoteUser(name, 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) ? real_groups : groups.concat(realGroupsValidated);\n const payload: RemoteUser = {\n real_groups: realGroupsValidated,\n name,\n groups: groupedGroups,\n };\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 return aesEncrypt(value, this.secret);\n }\n}\n\nexport { Auth };\n"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AAEA;;AACA;;AAQA;;AAcA;;AAEA;;AACA;;AACA;;AACA;;;;AAUA;AACA,MAAMA,SAAS,GAAGC,OAAO,CAAC,mBAAD,CAAzB;;AAEA,MAAMC,KAAK,GAAG,IAAAC,cAAA,EAAW,gBAAX,CAAd;;AAwCA,MAAMC,IAAN,CAA4B;EAMnBC,WAAW,CAACC,MAAD,EAAiB;IACjC,KAAKA,MAAL,GAAcA,MAAd;IACA,KAAKC,MAAL,GAAcP,SAAS,CAACO,MAAV,CAAiBC,KAAjB,CAAuB;MAAEC,GAAG,EAAE;IAAP,CAAvB,CAAd;IACA,KAAKC,MAAL,GAAcJ,MAAM,CAACI,MAArB;;IACA,IAAI,CAAC,KAAKA,MAAV,EAAkB;MAChB,MAAM,IAAIC,SAAJ,CAAc,0DAAd,CAAN;IACD;;IAED,KAAKC,OAAL,GACEC,eAAA,CAAEC,KAAF,CAAQR,MAAR,aAAQA,MAAR,uBAAQA,MAAM,CAAES,IAAhB,MAA0B,KAA1B,GAAkC,KAAKC,WAAL,CAAiBV,MAAjB,CAAlC,GAA6D,KAAKW,iBAAL,CAAuBX,MAAvB,CAD/D;;IAEA,KAAKY,oBAAL;EACD;;EAEOD,iBAAiB,CAACX,MAAD,EAAiB;IACxC,MAAMa,WAA2B,GAAG,EAAE,GAAGb,MAAL;MAAac,IAAI,EAAE;IAAnB,CAApC;IACA,MAAMC,aAAgC,GAAG;MACvCf,MADuC;MAEvCC,MAAM,EAAE,KAAKA;IAF0B,CAAzC;IAIA,IAAIe,UAAJ;;IACA,IAAI;MACFA,UAAU,GAAG,IAAIC,2BAAJ,CAAaJ,WAAb,EAA0BE,aAA1B,CAAb;IACD,CAFD,CAEE,OAAOG,KAAP,EAAmB;MACnBtB,KAAK,CAAC,iDAAD,EAAoDsB,KAApD,CAAL;MACA,OAAO,EAAP;IACD;;IAED,OAAO,CAACF,UAAD,CAAP;EACD;;EAEON,WAAW,CAACV,MAAD,EAAwC;IACzD,MAAMe,aAAa,GAAG;MACpBf,MADoB;MAEpBC,MAAM,EAAE,KAAKA;IAFO,CAAtB;IAKA,OAAO,IAAAkB,mBAAA,EACLnB,MADK,EAELA,MAAM,CAACS,IAFF,EAGLM,aAHK,EAIJK,MAAD,IAA0C;MACxC,MAAM;QAAEC,YAAF;QAAgBC,YAAhB;QAA8BC;MAA9B,IAAgDH,MAAtD,CADwC,CAGxC;;MACA,OAAOC,YAAY,IAAIC,YAAhB,IAAgCC,aAAvC;IACD,CATI,CAAP;EAWD;;EAEOX,oBAAoB,GAAS;IACnC;IACA,KAAKN,OAAL,CAAakB,IAAb,CAAkB,IAAAC,yBAAA,EAAkB,KAAKxB,MAAvB,CAAlB;EACD;;EAEMyB,cAAc,CACnBC,QADmB,EAEnBC,QAFmB,EAGnBC,WAHmB,EAInBC,EAJmB,EAKb;IACN,MAAMC,YAAY,GAAGxB,eAAA,CAAEyB,MAAF,CAAS,KAAK1B,OAAd,EAAwBc,MAAD,IAAY,IAAAa,iBAAA,EAAWb,MAAM,CAACM,cAAlB,CAAnC,CAArB;;IAEA,IAAInB,eAAA,CAAE2B,OAAF,CAAUH,YAAV,CAAJ,EAA6B;MAC3B,OAAOD,EAAE,CAACK,gBAAA,CAAWC,gBAAX,CAA4BC,oBAAA,CAAeC,wBAA3C,CAAD,CAAT;IACD;;IAED,KAAK,MAAMlB,MAAX,IAAqBW,YAArB,EAAmC;MACjC,IAAI,IAAAvB,YAAA,EAAMY,MAAN,KAAiB,IAAAa,iBAAA,EAAWb,MAAM,CAACM,cAAlB,MAAsC,KAA3D,EAAkE;QAChE9B,KAAK,CAAC,gEAAD,CAAL;QACA;MACD,CAHD,MAGO;QACLA,KAAK,CAAC,0BAAD,EAA6B+B,QAA7B,CAAL;QACAP,MAAM,CAACM,cAAP,CAAuBC,QAAvB,EAAiCC,QAAjC,EAA2CC,WAA3C,EAAwD,CAACU,GAAD,EAAMC,OAAN,KAAwB;UAC9E,IAAID,GAAJ,EAAS;YACP,KAAKtC,MAAL,CAAYiB,KAAZ,CACE;cAAES,QAAF;cAAYY;YAAZ,CADF,EAEG;AACf,yEAHY;YAKA,OAAOT,EAAE,CAACS,GAAD,CAAT;UACD;;UAED3C,KAAK,CAAC,wCAAD,EAA2C+B,QAA3C,CAAL;UACA,OAAOG,EAAE,CAAC,IAAD,EAAOU,OAAP,CAAT;QACD,CAZD;MAaD;IACF;EACF;;EAE2B,MAAfC,eAAe,CAACC,KAAD,EAAgB;IAC1C;IACAC,OAAO,CAACC,GAAR,CAAY,uCAAZ,EAAqDF,KAArD;IACA,OAAOG,OAAO,CAACC,OAAR,EAAP;EACD;;EAEMzB,YAAY,CAACM,QAAD,EAAmBC,QAAnB,EAAqCE,EAArC,EAAyD;IAC1E,MAAMxB,OAAO,GAAG,KAAKA,OAAL,CAAayC,KAAb,CAAmB,CAAnB,CAAhB;;IACA,CAAC,SAASC,IAAT,GAAsB;MACrB,MAAM5B,MAAM,GAAGd,OAAO,CAAC2C,KAAR,EAAf;;MAEA,IAAI,IAAAhB,iBAAA,EAAWb,MAAM,CAACC,YAAlB,MAAoC,KAAxC,EAA+C;QAC7C,OAAO2B,IAAI,EAAX;MACD;;MAEDpD,KAAK,CAAC,mBAAD,EAAsB+B,QAAtB,CAAL;MACAP,MAAM,CAACC,YAAP,CAAoBM,QAApB,EAA8BC,QAA9B,EAAwC,UAAUW,GAAV,EAAeW,MAAf,EAA6B;QACnE,IAAIX,GAAJ,EAAS;UACP3C,KAAK,CAAC,8CAAD,EAAiD+B,QAAjD,EAA2DY,GAA3D,aAA2DA,GAA3D,uBAA2DA,GAAG,CAAEY,OAAhE,CAAL;UACA,OAAOrB,EAAE,CAACS,GAAD,CAAT;QACD,CAJkE,CAMnE;QACA;QACA;QACA;QACA;QACA;QACA;;;QACA,IAAI,CAAC,CAACW,MAAF,IAAYA,MAAM,CAACE,MAAP,KAAkB,CAAlC,EAAqC;UACnC;UACA,IAAI7C,eAAA,CAAE8C,QAAF,CAAWH,MAAX,CAAJ,EAAwB;YACtB,MAAM,IAAI7C,SAAJ,CAAc,+CAAd,CAAN;UACD;;UACD,MAAMiD,YAAqB,GAAG/C,eAAA,CAAEgD,OAAF,CAAUL,MAAV,CAA9B;;UACA,IAAI,CAACI,YAAL,EAAmB;YACjB,MAAM,IAAIjD,SAAJ,CAAcmD,eAAA,CAAUC,qBAAxB,CAAN;UACD;;UAED7D,KAAK,CAAC,yDAAD,EAA4D+B,QAA5D,EAAsEuB,MAAtE,CAAL;UACA,OAAOpB,EAAE,CAACS,GAAD,EAAM,IAAAmB,wBAAA,EAAiB/B,QAAjB,EAA2BuB,MAA3B,CAAN,CAAT;QACD;;QACDF,IAAI;MACL,CA3BD;IA4BD,CApCD;EAqCD;;EAEMW,QAAQ,CAACC,IAAD,EAAehC,QAAf,EAAiCE,EAAjC,EAAqD;IAClE,MAAM+B,IAAI,GAAG,IAAb;IACA,MAAMvD,OAAO,GAAG,KAAKA,OAAL,CAAayC,KAAb,CAAmB,CAAnB,CAAhB;IACAnD,KAAK,CAAC,aAAD,EAAgBgE,IAAhB,CAAL;;IAEA,CAAC,SAASZ,IAAT,GAAsB;MACrB,MAAM5B,MAAM,GAAGd,OAAO,CAAC2C,KAAR,EAAf;MACA,IAAIa,MAAM,GAAG,SAAb;;MACA,IAAI,IAAA7B,iBAAA,EAAWb,MAAM,CAAC0C,MAAD,CAAjB,MAA+B,KAAnC,EAA0C;QACxCA,MAAM,GAAG,UAAT;QACAD,IAAI,CAAC5D,MAAL,CAAY8D,IAAZ,CACE,yEACE,gEAFJ;MAID;;MAED,IAAI,IAAA9B,iBAAA,EAAWb,MAAM,CAAC0C,MAAD,CAAjB,MAA+B,KAAnC,EAA0C;QACxCd,IAAI;MACL,CAFD,MAEO;QACL;QACA5B,MAAM,CAAC0C,MAAD,CAAN,CAAeF,IAAf,EAAqBhC,QAArB,EAA+B,UAAUW,GAAV,EAAeyB,EAAf,EAAyB;UACtD,IAAIzB,GAAJ,EAAS;YACP3C,KAAK,CAAC,+CAAD,EAAkDgE,IAAlD,EAAwDrB,GAAxD,aAAwDA,GAAxD,uBAAwDA,GAAG,CAAEY,OAA7D,CAAL;YACA,OAAOrB,EAAE,CAACS,GAAD,CAAT;UACD;;UACD,IAAIyB,EAAJ,EAAQ;YACNpE,KAAK,CAAC,4BAAD,EAA+BgE,IAA/B,CAAL;YACA,OAAOC,IAAI,CAACxC,YAAL,CAAkBuC,IAAlB,EAAwBhC,QAAxB,EAAkCE,EAAlC,CAAP;UACD;;UACDkB,IAAI;QACL,CAVD;MAWD;IACF,CA3BD;EA4BD;EAED;AACF;AACA;;;EACS1B,YAAY,CACjB;IAAE2C,WAAF;IAAeC;EAAf,CADiB,EAEjBN,IAFiB,EAGjBO,QAHiB,EAIX;IACN,MAAM7D,OAAO,GAAG,KAAKA,OAAL,CAAayC,KAAb,CAAmB,CAAnB,CAAhB;IACA,MAAMqB,aAA0B,GAAG;MAAEC,IAAI,EAAEJ,WAAR;MAAqBK,OAAO,EAAEJ;IAA9B,CAAnC;IACA,MAAMK,GAAG,GAAGC,MAAM,CAACC,MAAP,CACV,EADU,EAEVL,aAFU,EAGV,IAAAM,6BAAA,EAAuBT,WAAvB,EAAoC,KAAKjE,MAAL,CAAY2E,QAAhD,CAHU,CAAZ;IAKA/E,KAAK,CAAC,qBAAD,EAAwBqE,WAAxB,CAAL;;IAEA,CAAC,SAASjB,IAAT,GAAsB;MACrB,MAAM5B,MAA2B,GAAGd,OAAO,CAAC2C,KAAR,EAApC;;MAEA,IAAI1C,eAAA,CAAEC,KAAF,CAAQY,MAAR,KAAmB,IAAAa,iBAAA,EAAWb,MAAM,CAACE,YAAlB,MAAoC,KAA3D,EAAkE;QAChE,OAAO0B,IAAI,EAAX;MACD;;MAED5B,MAAM,CAACE,YAAP,CAAqBsC,IAArB,EAA2BW,GAA3B,EAAgC,UAAUhC,GAAV,EAAeyB,EAAf,EAAkC;QAChE,IAAIzB,GAAJ,EAAS;UACP3C,KAAK,CAAC,oCAAD,EAAuCqE,WAAvC,EAAoD1B,GAApD,aAAoDA,GAApD,uBAAoDA,GAAG,CAAEY,OAAzD,CAAL;UACA,OAAOgB,QAAQ,CAAC5B,GAAD,CAAf;QACD;;QAED,IAAIyB,EAAJ,EAAQ;UACNpE,KAAK,CAAC,uBAAD,EAA0BqE,WAA1B,CAAL;UACA,OAAOE,QAAQ,CAAC,IAAD,EAAOH,EAAP,CAAf;QACD;;QAEDhB,IAAI,GAX4D,CAWxD;MACT,CAZD;IAaD,CApBD;EAqBD;;EAEM4B,eAAe,CACpB;IAAEX,WAAF;IAAeC;EAAf,CADoB,EAEpBN,IAFoB,EAGpBO,QAHoB,EAId;IACN,MAAMI,GAAG,GAAGC,MAAM,CAACC,MAAP,CACV;MAAEJ,IAAI,EAAEJ,WAAR;MAAqBK,OAAO,EAAEJ;IAA9B,CADU,EAEV,IAAAQ,6BAAA,EAAuBT,WAAvB,EAAoC,KAAKjE,MAAL,CAAY2E,QAAhD,CAFU,CAAZ;IAIA/E,KAAK,CAAC,wBAAD,EAA2BqE,WAA3B,CAAL;;IAEA,KAAK,MAAM7C,MAAX,IAAqB,KAAKd,OAA1B,EAAmC;MACjC,IAAIC,eAAA,CAAEC,KAAF,CAAQY,MAAR,KAAmB,IAAAa,iBAAA,EAAWb,MAAM,CAACwD,eAAlB,MAAuC,KAA9D,EAAqE;QACnEhF,KAAK,CAAC,kEAAD,EAAqEqE,WAArE,CAAL;QACA;MACD,CAHD,MAGO;QACL;QACA7C,MAAM,CAACwD,eAAP,CAAwBhB,IAAxB,EAA8BW,GAA9B,EAAmC,CAAChC,GAAD,EAAMyB,EAAN,KAA4B;UAC7D,IAAIzB,GAAJ,EAAS;YACP3C,KAAK,CACH,qEADG,EAEHqE,WAFG,CAAL;YAIA,OAAOE,QAAQ,CAAC5B,GAAD,CAAf;UACD;;UAED,IAAIhC,eAAA,CAAEC,KAAF,CAAQwD,EAAR,MAAgB,IAApB,EAA0B;YACxBpE,KAAK,CAAC,yDAAD,EAA4DqE,WAA5D,CAAL,CADwB,CAExB;YACA;;YACA,OAAO,KAAK1C,aAAL,CAAmB,GAAGsD,SAAtB,CAAP;UACD;;UAED,IAAIb,EAAJ,EAAQ;YACNpE,KAAK,CAAC,0BAAD,EAA6BqE,WAA7B,CAAL;YACA,OAAOE,QAAQ,CAAC,IAAD,EAAOH,EAAP,CAAf;UACD;QACF,CApBD;MAqBD;IACF;EACF;EAED;AACF;AACA;;;EACSzC,aAAa,CAClB;IAAE0C,WAAF;IAAeC;EAAf,CADkB,EAElBN,IAFkB,EAGlBO,QAHkB,EAIZ;IACN,MAAM7D,OAAO,GAAG,KAAKA,OAAL,CAAayC,KAAb,CAAmB,CAAnB,CAAhB;IACA,MAAMwB,GAAG,GAAGC,MAAM,CAACC,MAAP,CACV;MAAEJ,IAAI,EAAEJ,WAAR;MAAqBK,OAAO,EAAEJ;IAA9B,CADU,EAEV,IAAAQ,6BAAA,EAAuBT,WAAvB,EAAoC,KAAKjE,MAAL,CAAY2E,QAAhD,CAFU,CAAZ;IAIA/E,KAAK,CAAC,yCAAD,EAA4CqE,WAA5C,EAAyD3D,OAAO,CAAC8C,MAAjE,CAAL;;IAEA,CAAC,SAASJ,IAAT,GAAsB;MACrB,MAAM5B,MAAM,GAAGd,OAAO,CAAC2C,KAAR,EAAf;;MAEA,IAAI,IAAAhB,iBAAA,EAAWb,MAAX,aAAWA,MAAX,uBAAWA,MAAM,CAAEG,aAAnB,MAAsC,KAA1C,EAAiD;QAC/C3B,KAAK,CAAC,8DAAD,EAAiEqE,WAAjE,CAAL;QACA,OAAOjB,IAAI,EAAX;MACD,CANoB,CAQrB;;;MACA5B,MAAM,CAACG,aAAP,CACEqC,IADF,EAEE;MACAW,GAHF,EAIE;MACA,CAAChC,GAAD,EAAsByB,EAAtB,KAA4C;QAC1C,IAAIzD,eAAA,CAAEC,KAAF,CAAQ+B,GAAR,MAAiB,KAAjB,IAA0BhC,eAAA,CAAEuE,OAAF,CAAUvC,GAAV,CAA9B,EAA8C;UAC5C3C,KAAK,CAAC,0BAAD,EAA6BqE,WAA7B,CAAL;UACA,OAAOE,QAAQ,CAAC5B,GAAD,CAAf;QACD;;QAED,IAAIyB,EAAJ,EAAQ;UACNpE,KAAK,CAAC,wBAAD,EAA2BqE,WAA3B,CAAL;UACA,OAAOE,QAAQ,CAAC,IAAD,EAAOH,EAAP,CAAf;QACD;;QAEDpE,KAAK,CAAC,sCAAD,EAAyCqE,WAAzC,CAAL;QACAjB,IAAI,GAZsC,CAYlC;MACT,CAlBH;IAoBD,CA7BD;EA8BD;;EAEM+B,gBAAgB,GAAa;IAClCnF,KAAK,CAAC,gBAAD,CAAL;IACA,MAAMU,OAAO,GAAG,KAAKA,OAAL,CAAayC,KAAb,CAAmB,CAAnB,CAAhB;IACA,MAAMiC,OAAO,GAAG;MAAEC,yBAAyB,EAAzBA,iCAAF;MAA6BvB,gBAAgB,EAAhBA;IAA7B,CAAhB;;IACA,KAAK,MAAMtC,MAAX,IAAqBd,OAArB,EAA8B;MAC5B,IAAIc,MAAM,CAAC2D,gBAAX,EAA6B;QAC3B,OAAO3D,MAAM,CAAC2D,gBAAP,CAAwBC,OAAxB,CAAP;MACD;IACF;;IAED,OAAO,CAACE,GAAD,EAAsBC,GAAtB,EAA4CC,KAA5C,KAA0E;MAC/EF,GAAG,CAACG,KAAJ;;MAEA,MAAMrC,IAAI,GAAG,UAAUT,GAAV,EAA4C;QACvD2C,GAAG,CAACI,MAAJ,GADuD,CAEvD;QACA;QACA;QACA;;QACA,IAAI/C,GAAJ,EAAS;UACP2C,GAAG,CAACK,WAAJ,CAAgBrE,KAAhB,GAAwBqB,GAAG,CAACY,OAA5B;QACD;;QACD,OAAOiC,KAAK,EAAZ;MACD,CAVD;;MAYA,IAAI,KAAKI,kBAAL,CAAwBN,GAAG,CAACK,WAA5B,CAAJ,EAA8C;QAC5C3F,KAAK,CAAC,uCAAD,CAAL;QACA,OAAOoD,IAAI,EAAX;MACD,CAlB8E,CAoB/E;;;MACA,MAAMyC,UAAU,GAAG,IAAAR,iCAAA,GAAnB;MACAC,GAAG,CAACK,WAAJ,GAAkBE,UAAlB;MACAN,GAAG,CAACO,MAAJ,CAAWH,WAAX,GAAyBE,UAAzB;MAEA,MAAM;QAAEE;MAAF,IAAoBT,GAAG,CAACU,OAA9B;;MACA,IAAIrF,eAAA,CAAEC,KAAF,CAAQmF,aAAR,CAAJ,EAA4B;QAC1B/F,KAAK,CAAC,uCAAD,CAAL;QACA,OAAOoD,IAAI,EAAX;MACD;;MAED,IAAI,CAAC,IAAA6C,yBAAA,EAAkBF,aAAlB,CAAL,EAAuC;QACrC/F,KAAK,CAAC,kDAAD,CAAL;QACA,OAAOoD,IAAI,CAACb,gBAAA,CAAW2D,aAAX,CAAyBtC,eAAA,CAAUuC,eAAnC,CAAD,CAAX;MACD;;MACD,MAAM;QAAE3F,MAAF;QAAU4F;MAAV,IAAuB,KAAKhG,MAAlC;;MAEA,IAAI,IAAAiG,mBAAA,EAAYD,QAAZ,CAAJ,EAA2B;QACzBpG,KAAK,CAAC,wCAAD,CAAL;;QACA,KAAKsG,oBAAL,CAA0BhB,GAA1B,EAA+Bc,QAA/B,EAAyC5F,MAAzC,EAAiDuF,aAAjD,EAAgE3C,IAAhE;MACD,CAHD,MAGO;QACLpD,KAAK,CAAC,qCAAD,CAAL;;QACA,KAAKuG,uBAAL,CAA6BjB,GAA7B,EAAkCc,QAAlC,EAA4C5F,MAA5C,EAAoDuF,aAApD,EAAmE3C,IAAnE;MACD;IACF,CA5CD;EA6CD;;EAEOmD,uBAAuB,CAC7BjB,GAD6B,EAE7Bc,QAF6B,EAG7B5F,MAH6B,EAI7BuF,aAJ6B,EAK7B3C,IAL6B,EAMvB;IACNpD,KAAK,CAAC,2BAAD,CAAL;IACA,MAAM;MAAEwG,MAAF;MAAU1D;IAAV,IAAoB,IAAA2D,4BAAA,EAAqBV,aAArB,CAA1B;;IACA,IAAIS,MAAM,CAACE,WAAP,OAAyBC,iBAAA,CAAYD,WAAZ,EAA7B,EAAwD;MACtD1G,KAAK,CAAC,oBAAD,CAAL,CADsD,CAEtD;;MACA,MAAM4G,WAAW,GAAG,IAAAC,8BAAA,EAAuB/D,KAAvB,EAA8BgE,QAA9B,EAApB;MACA,MAAM;QAAE9C,IAAF;QAAQhC;MAAR,IAAqB,IAAA+E,wBAAA,EAAkBH,WAAlB,CAA3B;MACA5G,KAAK,CAAC,mBAAD,EAAsBgE,IAAtB,CAAL;MACA,KAAKvC,YAAL,CAAkBuC,IAAlB,EAAwBhC,QAAxB,EAAkC,CAACW,GAAD,EAAMqB,IAAN,KAAqB;QACrD,IAAI,CAACrB,GAAL,EAAU;UACR3C,KAAK,CAAC,0BAAD,CAAL;UACAsF,GAAG,CAACK,WAAJ,GAAkB3B,IAAlB;UACAZ,IAAI;QACL,CAJD,MAIO;UACLpD,KAAK,CAAC,2BAAD,CAAL;UACAsF,GAAG,CAACK,WAAJ,GAAkB,IAAAN,iCAAA,GAAlB;UACAjC,IAAI,CAACT,GAAD,CAAJ;QACD;MACF,CAVD;IAWD,CAjBD,MAiBO;MACL3C,KAAK,CAAC,kBAAD,CAAL;MACA,MAAM4G,WAAgB,GAAG,IAAAI,gCAAA,EAAyBZ,QAAzB,EAAmC5F,MAAnC,EAA2CuF,aAA3C,CAAzB;;MACA,IAAIa,WAAJ,EAAiB;QACf;QACAtB,GAAG,CAACK,WAAJ,GAAkBiB,WAAlB;QACA5G,KAAK,CAAC,0BAAD,CAAL;QACAoD,IAAI;MACL,CALD,MAKO;QACL;QACApD,KAAK,CAAC,mBAAD,CAAL;QACAoD,IAAI,CAACb,gBAAA,CAAW0E,YAAX,CAAwBrD,eAAA,CAAUsD,qBAAlC,CAAD,CAAJ;MACD;IACF;EACF;;EAEOZ,oBAAoB,CAC1BhB,GAD0B,EAE1Bc,QAF0B,EAG1B5F,MAH0B,EAI1BuF,aAJ0B,EAK1B3C,IAL0B,EAMpB;IACNpD,KAAK,CAAC,8BAAD,CAAL;IACAA,KAAK,CAAC,0BAAD,EAA6B,OAAOQ,MAAP,KAAkB,QAA/C,CAAL;IACAR,KAAK,CAAC,iCAAD,EAAoC,OAAO+F,aAAP,KAAyB,QAA7D,CAAL;IACA,MAAMa,WAAgB,GAAG,IAAAI,gCAAA,EAAyBZ,QAAzB,EAAmC5F,MAAnC,EAA2CuF,aAA3C,CAAzB;IACA/F,KAAK,CAAC,+BAAD,EAAkC4G,WAAlC,aAAkCA,WAAlC,uBAAkCA,WAAW,CAAEnC,IAA/C,CAAL;;IACA,IAAImC,WAAJ,EAAiB;MACf,MAAM;QAAE5C,IAAF;QAAQhC;MAAR,IAAqB4E,WAA3B;MACA5G,KAAK,CAAC,mBAAD,EAAsBgE,IAAtB,CAAL;MACA,KAAKvC,YAAL,CAAkBuC,IAAlB,EAAwBhC,QAAxB,EAAkC,CAACW,GAAD,EAAMqB,IAAN,KAAqB;QACrD,IAAI,CAACrB,GAAL,EAAU;UACR2C,GAAG,CAACK,WAAJ,GAAkB3B,IAAlB;UACAhE,KAAK,CAAC,0BAAD,CAAL;UACAoD,IAAI;QACL,CAJD,MAIO;UACLkC,GAAG,CAACK,WAAJ,GAAkB,IAAAN,iCAAA,GAAlB;UACArF,KAAK,CAAC,2BAAD,CAAL;UACAoD,IAAI,CAACT,GAAD,CAAJ;QACD;MACF,CAVD;IAWD,CAdD,MAcO;MACL;MACA3C,KAAK,CAAC,uBAAD,CAAL;MACA,OAAOoD,IAAI,CAACb,gBAAA,CAAW2D,aAAX,CAAyBtC,eAAA,CAAUuC,eAAnC,CAAD,CAAX;IACD;EACF;;EAEOP,kBAAkB,CAACD,WAAD,EAAmC;IAC3D,OAAOhF,eAAA,CAAEwG,WAAF,CAAcxB,WAAd,MAA+B,KAA/B,IAAwChF,eAAA,CAAEwG,WAAF,CAAcxB,WAAW,CAAClB,IAA1B,MAAoC,KAAnF;EACD;EAED;AACF;AACA;;;EACS2C,kBAAkB,GAAa;IACpC,OAAO,CAAC9B,GAAD,EAAsBC,GAAtB,EAA4CC,KAA5C,KAA0E;MAC/E,IAAI,KAAKI,kBAAL,CAAwBN,GAAG,CAACK,WAA5B,CAAJ,EAA8C;QAC5C,OAAOH,KAAK,EAAZ;MACD;;MAEDF,GAAG,CAACG,KAAJ;;MACA,MAAMrC,IAAI,GAAIT,GAAD,IAAsC;QACjD2C,GAAG,CAACI,MAAJ;;QACA,IAAI/C,GAAJ,EAAS;UACP;UACA4C,GAAG,CAAC8B,MAAJ,CAAW1E,GAAG,CAAC2E,UAAf,EAA2BC,IAA3B,CAAgC5E,GAAG,CAACY,OAApC;QACD;;QAED,OAAOiC,KAAK,EAAZ;MACD,CARD;;MAUA,MAAM;QAAEO;MAAF,IAAoBT,GAAG,CAACU,OAA9B;;MACA,IAAIrF,eAAA,CAAEC,KAAF,CAAQmF,aAAR,CAAJ,EAA4B;QAC1B,OAAO3C,IAAI,EAAX;MACD;;MAED,IAAI,CAAC,IAAA6C,yBAAA,EAAkBF,aAAlB,CAAL,EAAuC;QACrC,OAAO3C,IAAI,CAACb,gBAAA,CAAW2D,aAAX,CAAyBtC,eAAA,CAAUuC,eAAnC,CAAD,CAAX;MACD;;MAED,MAAMrD,KAAK,GAAG,CAACiD,aAAa,IAAI,EAAlB,EAAsByB,OAAtB,CAA+B,GAAEC,kBAAa,GAA9C,EAAkD,EAAlD,CAAd;;MACA,IAAI,CAAC3E,KAAL,EAAY;QACV,OAAOM,IAAI,EAAX;MACD;;MAED,IAAIwD,WAAJ;;MACA,IAAI;QACFA,WAAW,GAAG,IAAAc,wBAAA,EAAiB5E,KAAjB,EAAwB,KAAK1C,MAAL,CAAYI,MAApC,CAAd;MACD,CAFD,CAEE,OAAOmC,GAAP,EAAiB,CACjB;MACD;;MAED,IAAI,KAAKiD,kBAAL,CAAwBgB,WAAxB,CAAJ,EAA0C;QACxC,MAAM;UAAEnC,IAAF;UAAQnB;QAAR,IAAmBsD,WAAzB,CADwC,CAExC;;QACAtB,GAAG,CAACK,WAAJ,GAAkB,IAAA7B,wBAAA,EAAiBW,IAAjB,EAAuBnB,MAAvB,CAAlB;MACD,CAJD,MAIO;QACLgC,GAAG,CAACK,WAAJ,GAAkB,IAAAN,iCAAA,GAAlB;MACD;;MAEDjC,IAAI;IACL,CA9CD;EA+CD;;EAEsB,MAAVuE,UAAU,CAAC3D,IAAD,EAAmB4D,WAAnB,EAAiE;IACtF,MAAM;MAAEC,WAAF;MAAepD,IAAf;MAAqBnB;IAArB,IAAgCU,IAAtC;IACAhE,KAAK,CAAC,gBAAD,EAAmByE,IAAnB,CAAL;IACA,MAAMqD,mBAAmB,GAAGnH,eAAA,CAAEC,KAAF,CAAQiH,WAAR,IAAuB,EAAvB,GAA4BA,WAAxD;IACA,MAAME,aAAa,GAAGpH,eAAA,CAAEC,KAAF,CAAQ0C,MAAR,IAAkBuE,WAAlB,GAAgCvE,MAAM,CAAC0E,MAAP,CAAcF,mBAAd,CAAtD;IACA,MAAMG,OAAmB,GAAG;MAC1BJ,WAAW,EAAEC,mBADa;MAE1BrD,IAF0B;MAG1BnB,MAAM,EAAEyE;IAHkB,CAA5B;IAMA,MAAMjF,KAAa,GAAG,MAAM,IAAAoF,qBAAA,EAAYD,OAAZ,EAAqB,KAAKzH,MAA1B,EAAkCoH,WAAlC,CAA5B;IAEA,OAAO9E,KAAP;EACD;EAED;AACF;AACA;;;EACSqF,UAAU,CAACC,KAAD,EAA+B;IAC9C,OAAO,IAAAD,uBAAA,EAAWC,KAAX,EAAkB,KAAK5H,MAAvB,CAAP;EACD;;AApgByB"}
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export { Auth, IAuth, TokenEncryption, IBasicAuth } from './auth';\nexport * from './utils';\nexport * from './legacy-token';\nexport * from './jwt-token';\nexport * from './token';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA"}
|
package/build/jwt-token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"jwt-token.js","names":["debug","buildDebug","signPayload","payload","secretOrPrivateKey","options","Promise","resolve","reject","jwt","sign","notBefore","error","token","verifyPayload","verify"],"sources":["../src/jwt-token.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport jwt from 'jsonwebtoken';\n\nimport { JWTSignOptions, RemoteUser } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:auth:token:jwt');\n/**\n * Sign the payload and return JWT\n * https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback\n * @param payload\n * @param secretOrPrivateKey\n * @param options\n */\nexport async function signPayload(\n payload: RemoteUser,\n secretOrPrivateKey: string,\n options: JWTSignOptions = {}\n): Promise<string> {\n return new Promise(function (resolve, reject): Promise<string> {\n debug('sign jwt token');\n return jwt.sign(\n payload,\n secretOrPrivateKey,\n // FIXME: upgrade to the latest library and types\n // @ts-ignore\n {\n // 1 === 1ms (one millisecond)\n notBefore: '1', // Make sure the time will not rollback :)\n ...options,\n },\n (error, token: string) => {\n debug('error on sign jwt token');\n return error ? reject(error) : resolve(token);\n }\n );\n });\n}\n\nexport function verifyPayload(token: string, secretOrPrivateKey: string): RemoteUser {\n debug('verify jwt token');\n return jwt.verify(token, secretOrPrivateKey) as RemoteUser;\n}\n"],"mappings":";;;;;;;;AAAA;;AACA;;;;AAIA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,0BAAX,CAAd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACO,eAAeC,WAAf,CACLC,OADK,EAELC,kBAFK,EAGLC,OAAuB,GAAG,EAHrB,EAIY;EACjB,OAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA4C;IAC7DR,KAAK,CAAC,gBAAD,CAAL;IACA,OAAOS,qBAAA,CAAIC,IAAJ,CACLP,OADK,EAELC,kBAFK,EAGL;IACA;IACA;MACE;MACAO,SAAS,EAAE,GAFb;MAEkB;MAChB,GAAGN;IAHL,CALK,EAUL,CAACO,KAAD,EAAQC,KAAR,KAA0B;MACxBb,KAAK,CAAC,yBAAD,CAAL;MACA,OAAOY,KAAK,GAAGJ,MAAM,CAACI,KAAD,CAAT,GAAmBL,OAAO,CAACM,KAAD,CAAtC;IACD,CAbI,CAAP;EAeD,CAjBM,CAAP;AAkBD;;AAEM,SAASC,aAAT,CAAuBD,KAAvB,EAAsCT,kBAAtC,EAA8E;EACnFJ,KAAK,CAAC,kBAAD,CAAL;EACA,OAAOS,qBAAA,CAAIM,MAAJ,CAAWF,KAAX,EAAkBT,kBAAlB,CAAP;AACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"legacy-token.js","names":["debug","buildDebug","defaultAlgorithm","process","env","VERDACCIO_LEGACY_ALGORITHM","inputEncoding","outputEncoding","IV_LENGTH","VERDACCIO_LEGACY_ENCRYPTION_KEY","aesEncrypt","value","key","iv","Buffer","from","randomBytes","secretKey","isKeyValid","length","TOKEN_VALID_LENGTH","cipher","createCipheriv","encrypted","update","final","token","toString","aesDecrypt","buff","textParts","split","IV","shift","encryptedText","join","decipher","createDecipheriv","decrypted","_"],"sources":["../src/legacy-token.ts"],"sourcesContent":["import {\n BinaryToTextEncoding,\n CharacterEncoding,\n createCipheriv,\n createDecipheriv,\n randomBytes,\n} from 'crypto';\nimport buildDebug from 'debug';\n\nimport { TOKEN_VALID_LENGTH } from '@verdaccio/config';\n\nconst debug = buildDebug('verdaccio:auth:token:legacy');\n\nexport const defaultAlgorithm = process.env.VERDACCIO_LEGACY_ALGORITHM || 'aes-256-ctr';\nconst inputEncoding: CharacterEncoding = 'utf8';\nconst outputEncoding: BinaryToTextEncoding = 'hex';\n// For AES, this is always 16\nconst IV_LENGTH = 16;\n// Must be 256 bits (32 characters)\n// https://stackoverflow.com/questions/50963160/invalid-key-length-in-crypto-createcipheriv#50963356\nconst VERDACCIO_LEGACY_ENCRYPTION_KEY = process.env.VERDACCIO_LEGACY_ENCRYPTION_KEY;\n\nexport function aesEncrypt(value: string, key: string): string | void {\n // https://nodejs.org/api/crypto.html#crypto_crypto_createcipher_algorithm_password_options\n // https://www.grainger.xyz/changing-from-cipher-to-cipheriv/\n debug('encrypt %o', value);\n debug('algorithm %o', defaultAlgorithm);\n const iv = Buffer.from(randomBytes(IV_LENGTH));\n const secretKey = VERDACCIO_LEGACY_ENCRYPTION_KEY || key;\n const isKeyValid = secretKey?.length === TOKEN_VALID_LENGTH;\n debug('length secret key %o', secretKey?.length);\n debug('is valid secret %o', isKeyValid);\n if (!value || !secretKey || !isKeyValid) {\n return;\n }\n\n const cipher = createCipheriv(defaultAlgorithm, secretKey, iv);\n let encrypted = cipher.update(value, inputEncoding, outputEncoding);\n // @ts-ignore\n encrypted += cipher.final(outputEncoding);\n const token = `${iv.toString('hex')}:${encrypted.toString()}`;\n debug('token generated successfully');\n return Buffer.from(token).toString('base64');\n}\n\nexport function aesDecrypt(value: string, key: string): string | void {\n try {\n const buff = Buffer.from(value, 'base64');\n const textParts = buff.toString().split(':');\n\n // extract the IV from the first half of the value\n // @ts-ignore\n const IV = Buffer.from(textParts.shift(), outputEncoding);\n // extract the encrypted text without the IV\n const encryptedText = Buffer.from(textParts.join(':'), outputEncoding);\n const secretKey = VERDACCIO_LEGACY_ENCRYPTION_KEY || key;\n // decipher the string\n const decipher = createDecipheriv(defaultAlgorithm, secretKey, IV);\n // FIXME: fix type here should allow Buffer\n let decrypted = decipher.update(encryptedText as any, outputEncoding, inputEncoding);\n decrypted += decipher.final(inputEncoding);\n debug('token decrypted successfully');\n return decrypted.toString();\n } catch (_: any) {\n return;\n }\n}\n"],"mappings":"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"}
|
package/build/token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"token.js","names":["parseBasicPayload","credentials","index","indexOf","user","slice","password"],"sources":["../src/token.ts"],"sourcesContent":["import { BasicPayload } from './utils';\n\nexport function parseBasicPayload(credentials: string): BasicPayload {\n const index = credentials.indexOf(':');\n if (index < 0) {\n return;\n }\n\n const user: string = credentials.slice(0, index);\n const password: string = credentials.slice(index + 1);\n\n return { user, password };\n}\n"],"mappings":";;;;;;;AAEO,SAASA,iBAAT,CAA2BC,WAA3B,EAA8D;EACnE,MAAMC,KAAK,GAAGD,WAAW,CAACE,OAAZ,CAAoB,GAApB,CAAd;;EACA,IAAID,KAAK,GAAG,CAAZ,EAAe;IACb;EACD;;EAED,MAAME,IAAY,GAAGH,WAAW,CAACI,KAAZ,CAAkB,CAAlB,EAAqBH,KAArB,CAArB;EACA,MAAMI,QAAgB,GAAGL,WAAW,CAACI,KAAZ,CAAkBH,KAAK,GAAG,CAA1B,CAAzB;EAEA,OAAO;IAAEE,IAAF;IAAQE;EAAR,CAAP;AACD"}
|
package/build/utils.js
CHANGED
|
@@ -182,7 +182,7 @@ function allow_action(action, logger) {
|
|
|
182
182
|
return function allowActionCallback(user, pkg, callback) {
|
|
183
183
|
logger.trace({
|
|
184
184
|
remote: user.name
|
|
185
|
-
}, `[auth/allow_action]: user: @{
|
|
185
|
+
}, `[auth/allow_action]: user: @{remote}`);
|
|
186
186
|
const {
|
|
187
187
|
name,
|
|
188
188
|
groups
|
|
@@ -194,12 +194,12 @@ function allow_action(action, logger) {
|
|
|
194
194
|
hasPermission,
|
|
195
195
|
remote: user.name,
|
|
196
196
|
groupAccess
|
|
197
|
-
}, `[auth/allow_action]: hasPermission? @{hasPermission} for user: @{
|
|
197
|
+
}, `[auth/allow_action]: hasPermission? @{hasPermission} for user: @{remote}, package: @{pkgName}`);
|
|
198
198
|
|
|
199
199
|
if (hasPermission) {
|
|
200
200
|
logger.trace({
|
|
201
201
|
remote: user.name
|
|
202
|
-
}, `auth/allow_action: access granted to: @{
|
|
202
|
+
}, `auth/allow_action: access granted to: @{remote}`);
|
|
203
203
|
return callback(null, true);
|
|
204
204
|
}
|
|
205
205
|
|
package/build/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts"],"names":["debug","parseAuthTokenHeader","authorizationHeader","parts","split","scheme","token","parseAESCredentials","secret","toUpperCase","TOKEN_BASIC","credentials","convertPayloadToBase64","toString","TOKEN_BEARER","getMiddlewareCredentials","security","secretKey","isAESLegacy","parsedCredentials","_","isString","verifyJWTPayload","legacy","jwt","api","isNil","getApiToken","auth","config","remoteUser","aesPassword","Promise","resolve","aesEncrypt","buildUser","name","sign","jwtEncrypt","expireReasons","payload","error","includes","errorUtils","getCode","HTTP_STATUS","UNAUTHORIZED","message","isAuthHeaderValid","authorization","length","getDefaultPlugins","logger","authenticate","user","password","cb","getForbidden","API_ERROR","BAD_USERNAME_PASSWORD","adduser","getConflict","allow_access","allow_action","allow_publish","allow_unpublish","handleSpecialUnpublish","action","allowActionCallback","pkg","callback","trace","remote","groups","groupAccess","hasPermission","some","group","pkgName","getUnauthorized","isUnpublishMissing","hasGroups","undefined","String","Buffer","from"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { createAnonymousRemoteUser } from '@verdaccio/config';\nimport {\n API_ERROR,\n HTTP_STATUS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n VerdaccioError,\n errorUtils,\n} from '@verdaccio/core';\nimport {\n AuthPackageAllow,\n Callback,\n Config,\n IPluginAuth,\n RemoteUser,\n Security,\n} from '@verdaccio/types';\n\nimport { AESPayload, TokenEncryption } from './auth';\nimport { verifyPayload } from './jwt-token';\nimport { aesDecrypt } from './legacy-token';\nimport { parseBasicPayload } from './token';\n\nconst debug = buildDebug('verdaccio:auth:utils');\n\nexport type BasicPayload = AESPayload | void;\nexport type AuthMiddlewarePayload = RemoteUser | BasicPayload;\n\nexport interface AuthTokenHeader {\n scheme: string;\n token: string;\n}\nexport type AllowActionCallbackResponse = boolean | undefined;\nexport type AllowActionCallback = (\n error: VerdaccioError | null,\n allowed?: AllowActionCallbackResponse\n) => void;\n\nexport type AllowAction = (\n user: RemoteUser,\n pkg: AuthPackageAllow,\n callback: AllowActionCallback\n) => void;\n\n/**\n * Split authentication header eg: Bearer [secret_token]\n * @param authorizationHeader auth token\n */\nexport function parseAuthTokenHeader(authorizationHeader: string): AuthTokenHeader {\n const parts = authorizationHeader.split(' ');\n const [scheme, token] = parts;\n\n return { scheme, token };\n}\n\nexport function parseAESCredentials(authorizationHeader: string, secret: string) {\n debug('parseAESCredentials');\n const { scheme, token } = parseAuthTokenHeader(authorizationHeader);\n\n // basic is deprecated and should not be enforced\n // basic is currently being used for functional test\n if (scheme.toUpperCase() === TOKEN_BASIC.toUpperCase()) {\n debug('legacy header basic');\n const credentials = convertPayloadToBase64(token).toString();\n\n return credentials;\n } else if (scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {\n debug('legacy header bearer');\n const credentials = aesDecrypt(token, secret);\n\n return credentials;\n }\n}\n\nexport function getMiddlewareCredentials(\n security: Security,\n secretKey: string,\n authorizationHeader: string\n): AuthMiddlewarePayload {\n debug('getMiddlewareCredentials');\n // comment out for debugging purposes\n if (isAESLegacy(security)) {\n debug('is legacy');\n const credentials = parseAESCredentials(authorizationHeader, secretKey);\n if (!credentials) {\n debug('parse legacy credentials failed');\n return;\n }\n\n const parsedCredentials = parseBasicPayload(credentials);\n if (!parsedCredentials) {\n debug('parse legacy basic payload credentials failed');\n return;\n }\n\n return parsedCredentials;\n }\n const { scheme, token } = parseAuthTokenHeader(authorizationHeader);\n\n debug('is jwt');\n if (_.isString(token) && scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {\n return verifyJWTPayload(token, secretKey);\n }\n}\n\nexport function isAESLegacy(security: Security): boolean {\n const { legacy, jwt } = security.api;\n\n return _.isNil(legacy) === false && _.isNil(jwt) && legacy === true;\n}\n\nexport async function getApiToken(\n auth: TokenEncryption,\n config: Config,\n remoteUser: RemoteUser,\n aesPassword: string\n): Promise<string | void> {\n debug('get api token');\n const { security } = config;\n\n if (isAESLegacy(security)) {\n debug('security legacy enabled');\n // fallback all goes to AES encryption\n return await new Promise((resolve): void => {\n resolve(auth.aesEncrypt(buildUser(remoteUser.name as string, aesPassword)));\n });\n }\n const { jwt } = security.api;\n\n if (jwt?.sign) {\n return await auth.jwtEncrypt(remoteUser, jwt.sign);\n }\n return await new Promise((resolve): void => {\n resolve(auth.aesEncrypt(buildUser(remoteUser.name as string, aesPassword)));\n });\n}\n\nexport const expireReasons: string[] = ['JsonWebTokenError', 'TokenExpiredError'];\n\nexport function verifyJWTPayload(token: string, secret: string): RemoteUser {\n try {\n const payload: RemoteUser = verifyPayload(token, secret);\n\n return payload;\n } catch (error: any) {\n // #168 this check should be removed as soon AES encrypt is removed.\n if (expireReasons.includes(error.name)) {\n // it might be possible the jwt configuration is enabled and\n // old tokens fails still remains in usage, thus\n // we return an anonymous user to force log in.\n return createAnonymousRemoteUser();\n }\n throw errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, error.message);\n }\n}\n\nexport function isAuthHeaderValid(authorization: string): boolean {\n return authorization.split(' ').length === 2;\n}\n\nexport function getDefaultPlugins(logger: any): IPluginAuth<Config> {\n return {\n authenticate(user: string, password: string, cb: Callback): void {\n cb(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));\n },\n\n adduser(user: string, password: string, cb: Callback): void {\n return cb(errorUtils.getConflict(API_ERROR.BAD_USERNAME_PASSWORD));\n },\n\n // FIXME: allow_action and allow_publish should be in the @verdaccio/types\n // @ts-ignore\n allow_access: allow_action('access', logger),\n // @ts-ignore\n allow_publish: allow_action('publish', logger),\n allow_unpublish: handleSpecialUnpublish(logger),\n };\n}\n\nexport type ActionsAllowed = 'publish' | 'unpublish' | 'access';\n\nexport function allow_action(action: ActionsAllowed, logger): AllowAction {\n return function allowActionCallback(\n user: RemoteUser,\n pkg: AuthPackageAllow,\n callback: AllowActionCallback\n ): void {\n logger.trace({ remote: user.name }, `[auth/allow_action]: user: @{user.name}`);\n const { name, groups } = user;\n const groupAccess = pkg[action] as string[];\n const hasPermission = groupAccess.some((group) => name === group || groups.includes(group));\n logger.trace(\n { pkgName: pkg.name, hasPermission, remote: user.name, groupAccess },\n `[auth/allow_action]: hasPermission? @{hasPermission} for user: @{user}`\n );\n\n if (hasPermission) {\n logger.trace({ remote: user.name }, `auth/allow_action: access granted to: @{user}`);\n return callback(null, true);\n }\n\n if (name) {\n callback(\n errorUtils.getForbidden(`user ${name} is not allowed to ${action} package ${pkg.name}`)\n );\n } else {\n callback(\n errorUtils.getUnauthorized(`authorization required to ${action} package ${pkg.name}`)\n );\n }\n };\n}\n\n/**\n *\n */\nexport function handleSpecialUnpublish(logger): any {\n return function (user: RemoteUser, pkg: AuthPackageAllow, callback: AllowActionCallback): void {\n const action = 'unpublish';\n // verify whether the unpublish prop has been defined\n const isUnpublishMissing: boolean = _.isNil(pkg[action]);\n const hasGroups: boolean = isUnpublishMissing ? false : (pkg[action] as string[]).length > 0;\n logger.trace(\n { user: user.name, name: pkg.name, hasGroups },\n `fallback unpublish for @{name} has groups: @{hasGroups} for @{user}`\n );\n\n if (isUnpublishMissing || hasGroups === false) {\n return callback(null, undefined);\n }\n\n logger.trace(\n { user: user.name, name: pkg.name, action, hasGroups },\n `allow_action for @{action} for @{name} has groups: @{hasGroups} for @{user}`\n );\n return allow_action(action, logger)(user, pkg, callback);\n };\n}\n\nexport function buildUser(name: string, password: string): string {\n return String(`${name}:${password}`);\n}\n\nexport function convertPayloadToBase64(payload: string): Buffer {\n return Buffer.from(payload, 'base64');\n}\n"],"file":"utils.js"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["debug","buildDebug","parseAuthTokenHeader","authorizationHeader","parts","split","scheme","token","parseAESCredentials","secret","toUpperCase","TOKEN_BASIC","credentials","convertPayloadToBase64","toString","TOKEN_BEARER","aesDecrypt","getMiddlewareCredentials","security","secretKey","isAESLegacy","parsedCredentials","parseBasicPayload","_","isString","verifyJWTPayload","legacy","jwt","api","isNil","getApiToken","auth","config","remoteUser","aesPassword","Promise","resolve","aesEncrypt","buildUser","name","sign","jwtEncrypt","expireReasons","payload","verifyPayload","error","includes","createAnonymousRemoteUser","errorUtils","getCode","HTTP_STATUS","UNAUTHORIZED","message","isAuthHeaderValid","authorization","length","getDefaultPlugins","logger","authenticate","user","password","cb","getForbidden","API_ERROR","BAD_USERNAME_PASSWORD","adduser","getConflict","allow_access","allow_action","allow_publish","allow_unpublish","handleSpecialUnpublish","action","allowActionCallback","pkg","callback","trace","remote","groups","groupAccess","hasPermission","some","group","pkgName","getUnauthorized","isUnpublishMissing","hasGroups","undefined","String","Buffer","from"],"sources":["../src/utils.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { createAnonymousRemoteUser } from '@verdaccio/config';\nimport {\n API_ERROR,\n HTTP_STATUS,\n TOKEN_BASIC,\n TOKEN_BEARER,\n VerdaccioError,\n errorUtils,\n} from '@verdaccio/core';\nimport {\n AuthPackageAllow,\n Callback,\n Config,\n IPluginAuth,\n RemoteUser,\n Security,\n} from '@verdaccio/types';\n\nimport { AESPayload, TokenEncryption } from './auth';\nimport { verifyPayload } from './jwt-token';\nimport { aesDecrypt } from './legacy-token';\nimport { parseBasicPayload } from './token';\n\nconst debug = buildDebug('verdaccio:auth:utils');\n\nexport type BasicPayload = AESPayload | void;\nexport type AuthMiddlewarePayload = RemoteUser | BasicPayload;\n\nexport interface AuthTokenHeader {\n scheme: string;\n token: string;\n}\nexport type AllowActionCallbackResponse = boolean | undefined;\nexport type AllowActionCallback = (\n error: VerdaccioError | null,\n allowed?: AllowActionCallbackResponse\n) => void;\n\nexport type AllowAction = (\n user: RemoteUser,\n pkg: AuthPackageAllow,\n callback: AllowActionCallback\n) => void;\n\n/**\n * Split authentication header eg: Bearer [secret_token]\n * @param authorizationHeader auth token\n */\nexport function parseAuthTokenHeader(authorizationHeader: string): AuthTokenHeader {\n const parts = authorizationHeader.split(' ');\n const [scheme, token] = parts;\n\n return { scheme, token };\n}\n\nexport function parseAESCredentials(authorizationHeader: string, secret: string) {\n debug('parseAESCredentials');\n const { scheme, token } = parseAuthTokenHeader(authorizationHeader);\n\n // basic is deprecated and should not be enforced\n // basic is currently being used for functional test\n if (scheme.toUpperCase() === TOKEN_BASIC.toUpperCase()) {\n debug('legacy header basic');\n const credentials = convertPayloadToBase64(token).toString();\n\n return credentials;\n } else if (scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {\n debug('legacy header bearer');\n const credentials = aesDecrypt(token, secret);\n\n return credentials;\n }\n}\n\nexport function getMiddlewareCredentials(\n security: Security,\n secretKey: string,\n authorizationHeader: string\n): AuthMiddlewarePayload {\n debug('getMiddlewareCredentials');\n // comment out for debugging purposes\n if (isAESLegacy(security)) {\n debug('is legacy');\n const credentials = parseAESCredentials(authorizationHeader, secretKey);\n if (!credentials) {\n debug('parse legacy credentials failed');\n return;\n }\n\n const parsedCredentials = parseBasicPayload(credentials);\n if (!parsedCredentials) {\n debug('parse legacy basic payload credentials failed');\n return;\n }\n\n return parsedCredentials;\n }\n const { scheme, token } = parseAuthTokenHeader(authorizationHeader);\n\n debug('is jwt');\n if (_.isString(token) && scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {\n return verifyJWTPayload(token, secretKey);\n }\n}\n\nexport function isAESLegacy(security: Security): boolean {\n const { legacy, jwt } = security.api;\n\n return _.isNil(legacy) === false && _.isNil(jwt) && legacy === true;\n}\n\nexport async function getApiToken(\n auth: TokenEncryption,\n config: Config,\n remoteUser: RemoteUser,\n aesPassword: string\n): Promise<string | void> {\n debug('get api token');\n const { security } = config;\n\n if (isAESLegacy(security)) {\n debug('security legacy enabled');\n // fallback all goes to AES encryption\n return await new Promise((resolve): void => {\n resolve(auth.aesEncrypt(buildUser(remoteUser.name as string, aesPassword)));\n });\n }\n const { jwt } = security.api;\n\n if (jwt?.sign) {\n return await auth.jwtEncrypt(remoteUser, jwt.sign);\n }\n return await new Promise((resolve): void => {\n resolve(auth.aesEncrypt(buildUser(remoteUser.name as string, aesPassword)));\n });\n}\n\nexport const expireReasons: string[] = ['JsonWebTokenError', 'TokenExpiredError'];\n\nexport function verifyJWTPayload(token: string, secret: string): RemoteUser {\n try {\n const payload: RemoteUser = verifyPayload(token, secret);\n\n return payload;\n } catch (error: any) {\n // #168 this check should be removed as soon AES encrypt is removed.\n if (expireReasons.includes(error.name)) {\n // it might be possible the jwt configuration is enabled and\n // old tokens fails still remains in usage, thus\n // we return an anonymous user to force log in.\n return createAnonymousRemoteUser();\n }\n throw errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, error.message);\n }\n}\n\nexport function isAuthHeaderValid(authorization: string): boolean {\n return authorization.split(' ').length === 2;\n}\n\nexport function getDefaultPlugins(logger: any): IPluginAuth<Config> {\n return {\n authenticate(user: string, password: string, cb: Callback): void {\n cb(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));\n },\n\n adduser(user: string, password: string, cb: Callback): void {\n return cb(errorUtils.getConflict(API_ERROR.BAD_USERNAME_PASSWORD));\n },\n\n // FIXME: allow_action and allow_publish should be in the @verdaccio/types\n // @ts-ignore\n allow_access: allow_action('access', logger),\n // @ts-ignore\n allow_publish: allow_action('publish', logger),\n allow_unpublish: handleSpecialUnpublish(logger),\n };\n}\n\nexport type ActionsAllowed = 'publish' | 'unpublish' | 'access';\n\nexport function allow_action(action: ActionsAllowed, logger): AllowAction {\n return function allowActionCallback(\n user: RemoteUser,\n pkg: AuthPackageAllow,\n callback: AllowActionCallback\n ): void {\n logger.trace({ remote: user.name }, `[auth/allow_action]: user: @{remote}`);\n const { name, groups } = user;\n const groupAccess = pkg[action] as string[];\n const hasPermission = groupAccess.some((group) => name === group || groups.includes(group));\n logger.trace(\n { pkgName: pkg.name, hasPermission, remote: user.name, groupAccess },\n `[auth/allow_action]: hasPermission? @{hasPermission} for user: @{remote}, package: @{pkgName}`\n );\n\n if (hasPermission) {\n logger.trace({ remote: user.name }, `auth/allow_action: access granted to: @{remote}`);\n return callback(null, true);\n }\n\n if (name) {\n callback(\n errorUtils.getForbidden(`user ${name} is not allowed to ${action} package ${pkg.name}`)\n );\n } else {\n callback(\n errorUtils.getUnauthorized(`authorization required to ${action} package ${pkg.name}`)\n );\n }\n };\n}\n\n/**\n *\n */\nexport function handleSpecialUnpublish(logger): any {\n return function (user: RemoteUser, pkg: AuthPackageAllow, callback: AllowActionCallback): void {\n const action = 'unpublish';\n // verify whether the unpublish prop has been defined\n const isUnpublishMissing: boolean = _.isNil(pkg[action]);\n const hasGroups: boolean = isUnpublishMissing ? false : (pkg[action] as string[]).length > 0;\n logger.trace(\n { user: user.name, name: pkg.name, hasGroups },\n `fallback unpublish for @{name} has groups: @{hasGroups} for @{user}`\n );\n\n if (isUnpublishMissing || hasGroups === false) {\n return callback(null, undefined);\n }\n\n logger.trace(\n { user: user.name, name: pkg.name, action, hasGroups },\n `allow_action for @{action} for @{name} has groups: @{hasGroups} for @{user}`\n );\n return allow_action(action, logger)(user, pkg, callback);\n };\n}\n\nexport function buildUser(name: string, password: string): string {\n return String(`${name}:${password}`);\n}\n\nexport function convertPayloadToBase64(payload: string): Buffer {\n return Buffer.from(payload, 'base64');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAEA;;AACA;;AAkBA;;AACA;;AACA;;;;AAEA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,sBAAX,CAAd;;AAqBA;AACA;AACA;AACA;AACO,SAASC,oBAAT,CAA8BC,mBAA9B,EAA4E;EACjF,MAAMC,KAAK,GAAGD,mBAAmB,CAACE,KAApB,CAA0B,GAA1B,CAAd;EACA,MAAM,CAACC,MAAD,EAASC,KAAT,IAAkBH,KAAxB;EAEA,OAAO;IAAEE,MAAF;IAAUC;EAAV,CAAP;AACD;;AAEM,SAASC,mBAAT,CAA6BL,mBAA7B,EAA0DM,MAA1D,EAA0E;EAC/ET,KAAK,CAAC,qBAAD,CAAL;EACA,MAAM;IAAEM,MAAF;IAAUC;EAAV,IAAoBL,oBAAoB,CAACC,mBAAD,CAA9C,CAF+E,CAI/E;EACA;;EACA,IAAIG,MAAM,CAACI,WAAP,OAAyBC,iBAAA,CAAYD,WAAZ,EAA7B,EAAwD;IACtDV,KAAK,CAAC,qBAAD,CAAL;IACA,MAAMY,WAAW,GAAGC,sBAAsB,CAACN,KAAD,CAAtB,CAA8BO,QAA9B,EAApB;IAEA,OAAOF,WAAP;EACD,CALD,MAKO,IAAIN,MAAM,CAACI,WAAP,OAAyBK,kBAAA,CAAaL,WAAb,EAA7B,EAAyD;IAC9DV,KAAK,CAAC,sBAAD,CAAL;IACA,MAAMY,WAAW,GAAG,IAAAI,uBAAA,EAAWT,KAAX,EAAkBE,MAAlB,CAApB;IAEA,OAAOG,WAAP;EACD;AACF;;AAEM,SAASK,wBAAT,CACLC,QADK,EAELC,SAFK,EAGLhB,mBAHK,EAIkB;EACvBH,KAAK,CAAC,0BAAD,CAAL,CADuB,CAEvB;;EACA,IAAIoB,WAAW,CAACF,QAAD,CAAf,EAA2B;IACzBlB,KAAK,CAAC,WAAD,CAAL;IACA,MAAMY,WAAW,GAAGJ,mBAAmB,CAACL,mBAAD,EAAsBgB,SAAtB,CAAvC;;IACA,IAAI,CAACP,WAAL,EAAkB;MAChBZ,KAAK,CAAC,iCAAD,CAAL;MACA;IACD;;IAED,MAAMqB,iBAAiB,GAAG,IAAAC,wBAAA,EAAkBV,WAAlB,CAA1B;;IACA,IAAI,CAACS,iBAAL,EAAwB;MACtBrB,KAAK,CAAC,+CAAD,CAAL;MACA;IACD;;IAED,OAAOqB,iBAAP;EACD;;EACD,MAAM;IAAEf,MAAF;IAAUC;EAAV,IAAoBL,oBAAoB,CAACC,mBAAD,CAA9C;EAEAH,KAAK,CAAC,QAAD,CAAL;;EACA,IAAIuB,eAAA,CAAEC,QAAF,CAAWjB,KAAX,KAAqBD,MAAM,CAACI,WAAP,OAAyBK,kBAAA,CAAaL,WAAb,EAAlD,EAA8E;IAC5E,OAAOe,gBAAgB,CAAClB,KAAD,EAAQY,SAAR,CAAvB;EACD;AACF;;AAEM,SAASC,WAAT,CAAqBF,QAArB,EAAkD;EACvD,MAAM;IAAEQ,MAAF;IAAUC;EAAV,IAAkBT,QAAQ,CAACU,GAAjC;EAEA,OAAOL,eAAA,CAAEM,KAAF,CAAQH,MAAR,MAAoB,KAApB,IAA6BH,eAAA,CAAEM,KAAF,CAAQF,GAAR,CAA7B,IAA6CD,MAAM,KAAK,IAA/D;AACD;;AAEM,eAAeI,WAAf,CACLC,IADK,EAELC,MAFK,EAGLC,UAHK,EAILC,WAJK,EAKmB;EACxBlC,KAAK,CAAC,eAAD,CAAL;EACA,MAAM;IAAEkB;EAAF,IAAec,MAArB;;EAEA,IAAIZ,WAAW,CAACF,QAAD,CAAf,EAA2B;IACzBlB,KAAK,CAAC,yBAAD,CAAL,CADyB,CAEzB;;IACA,OAAO,MAAM,IAAImC,OAAJ,CAAaC,OAAD,IAAmB;MAC1CA,OAAO,CAACL,IAAI,CAACM,UAAL,CAAgBC,SAAS,CAACL,UAAU,CAACM,IAAZ,EAA4BL,WAA5B,CAAzB,CAAD,CAAP;IACD,CAFY,CAAb;EAGD;;EACD,MAAM;IAAEP;EAAF,IAAUT,QAAQ,CAACU,GAAzB;;EAEA,IAAID,GAAJ,aAAIA,GAAJ,eAAIA,GAAG,CAAEa,IAAT,EAAe;IACb,OAAO,MAAMT,IAAI,CAACU,UAAL,CAAgBR,UAAhB,EAA4BN,GAAG,CAACa,IAAhC,CAAb;EACD;;EACD,OAAO,MAAM,IAAIL,OAAJ,CAAaC,OAAD,IAAmB;IAC1CA,OAAO,CAACL,IAAI,CAACM,UAAL,CAAgBC,SAAS,CAACL,UAAU,CAACM,IAAZ,EAA4BL,WAA5B,CAAzB,CAAD,CAAP;EACD,CAFY,CAAb;AAGD;;AAEM,MAAMQ,aAAuB,GAAG,CAAC,mBAAD,EAAsB,mBAAtB,CAAhC;;;AAEA,SAASjB,gBAAT,CAA0BlB,KAA1B,EAAyCE,MAAzC,EAAqE;EAC1E,IAAI;IACF,MAAMkC,OAAmB,GAAG,IAAAC,uBAAA,EAAcrC,KAAd,EAAqBE,MAArB,CAA5B;IAEA,OAAOkC,OAAP;EACD,CAJD,CAIE,OAAOE,KAAP,EAAmB;IACnB;IACA,IAAIH,aAAa,CAACI,QAAd,CAAuBD,KAAK,CAACN,IAA7B,CAAJ,EAAwC;MACtC;MACA;MACA;MACA,OAAO,IAAAQ,iCAAA,GAAP;IACD;;IACD,MAAMC,gBAAA,CAAWC,OAAX,CAAmBC,iBAAA,CAAYC,YAA/B,EAA6CN,KAAK,CAACO,OAAnD,CAAN;EACD;AACF;;AAEM,SAASC,iBAAT,CAA2BC,aAA3B,EAA2D;EAChE,OAAOA,aAAa,CAACjD,KAAd,CAAoB,GAApB,EAAyBkD,MAAzB,KAAoC,CAA3C;AACD;;AAEM,SAASC,iBAAT,CAA2BC,MAA3B,EAA6D;EAClE,OAAO;IACLC,YAAY,CAACC,IAAD,EAAeC,QAAf,EAAiCC,EAAjC,EAAqD;MAC/DA,EAAE,CAACb,gBAAA,CAAWc,YAAX,CAAwBC,eAAA,CAAUC,qBAAlC,CAAD,CAAF;IACD,CAHI;;IAKLC,OAAO,CAACN,IAAD,EAAeC,QAAf,EAAiCC,EAAjC,EAAqD;MAC1D,OAAOA,EAAE,CAACb,gBAAA,CAAWkB,WAAX,CAAuBH,eAAA,CAAUC,qBAAjC,CAAD,CAAT;IACD,CAPI;;IASL;IACA;IACAG,YAAY,EAAEC,YAAY,CAAC,QAAD,EAAWX,MAAX,CAXrB;IAYL;IACAY,aAAa,EAAED,YAAY,CAAC,SAAD,EAAYX,MAAZ,CAbtB;IAcLa,eAAe,EAAEC,sBAAsB,CAACd,MAAD;EAdlC,CAAP;AAgBD;;AAIM,SAASW,YAAT,CAAsBI,MAAtB,EAA8Cf,MAA9C,EAAmE;EACxE,OAAO,SAASgB,mBAAT,CACLd,IADK,EAELe,GAFK,EAGLC,QAHK,EAIC;IACNlB,MAAM,CAACmB,KAAP,CAAa;MAAEC,MAAM,EAAElB,IAAI,CAACpB;IAAf,CAAb,EAAqC,sCAArC;IACA,MAAM;MAAEA,IAAF;MAAQuC;IAAR,IAAmBnB,IAAzB;IACA,MAAMoB,WAAW,GAAGL,GAAG,CAACF,MAAD,CAAvB;IACA,MAAMQ,aAAa,GAAGD,WAAW,CAACE,IAAZ,CAAkBC,KAAD,IAAW3C,IAAI,KAAK2C,KAAT,IAAkBJ,MAAM,CAAChC,QAAP,CAAgBoC,KAAhB,CAA9C,CAAtB;IACAzB,MAAM,CAACmB,KAAP,CACE;MAAEO,OAAO,EAAET,GAAG,CAACnC,IAAf;MAAqByC,aAArB;MAAoCH,MAAM,EAAElB,IAAI,CAACpB,IAAjD;MAAuDwC;IAAvD,CADF,EAEG,+FAFH;;IAKA,IAAIC,aAAJ,EAAmB;MACjBvB,MAAM,CAACmB,KAAP,CAAa;QAAEC,MAAM,EAAElB,IAAI,CAACpB;MAAf,CAAb,EAAqC,iDAArC;MACA,OAAOoC,QAAQ,CAAC,IAAD,EAAO,IAAP,CAAf;IACD;;IAED,IAAIpC,IAAJ,EAAU;MACRoC,QAAQ,CACN3B,gBAAA,CAAWc,YAAX,CAAyB,QAAOvB,IAAK,sBAAqBiC,MAAO,YAAWE,GAAG,CAACnC,IAAK,EAArF,CADM,CAAR;IAGD,CAJD,MAIO;MACLoC,QAAQ,CACN3B,gBAAA,CAAWoC,eAAX,CAA4B,6BAA4BZ,MAAO,YAAWE,GAAG,CAACnC,IAAK,EAAnF,CADM,CAAR;IAGD;EACF,CA5BD;AA6BD;AAED;AACA;AACA;;;AACO,SAASgC,sBAAT,CAAgCd,MAAhC,EAA6C;EAClD,OAAO,UAAUE,IAAV,EAA4Be,GAA5B,EAAmDC,QAAnD,EAAwF;IAC7F,MAAMH,MAAM,GAAG,WAAf,CAD6F,CAE7F;;IACA,MAAMa,kBAA2B,GAAG9D,eAAA,CAAEM,KAAF,CAAQ6C,GAAG,CAACF,MAAD,CAAX,CAApC;;IACA,MAAMc,SAAkB,GAAGD,kBAAkB,GAAG,KAAH,GAAYX,GAAG,CAACF,MAAD,CAAJ,CAA0BjB,MAA1B,GAAmC,CAA3F;IACAE,MAAM,CAACmB,KAAP,CACE;MAAEjB,IAAI,EAAEA,IAAI,CAACpB,IAAb;MAAmBA,IAAI,EAAEmC,GAAG,CAACnC,IAA7B;MAAmC+C;IAAnC,CADF,EAEG,qEAFH;;IAKA,IAAID,kBAAkB,IAAIC,SAAS,KAAK,KAAxC,EAA+C;MAC7C,OAAOX,QAAQ,CAAC,IAAD,EAAOY,SAAP,CAAf;IACD;;IAED9B,MAAM,CAACmB,KAAP,CACE;MAAEjB,IAAI,EAAEA,IAAI,CAACpB,IAAb;MAAmBA,IAAI,EAAEmC,GAAG,CAACnC,IAA7B;MAAmCiC,MAAnC;MAA2Cc;IAA3C,CADF,EAEG,6EAFH;IAIA,OAAOlB,YAAY,CAACI,MAAD,EAASf,MAAT,CAAZ,CAA6BE,IAA7B,EAAmCe,GAAnC,EAAwCC,QAAxC,CAAP;EACD,CAnBD;AAoBD;;AAEM,SAASrC,SAAT,CAAmBC,IAAnB,EAAiCqB,QAAjC,EAA2D;EAChE,OAAO4B,MAAM,CAAE,GAAEjD,IAAK,IAAGqB,QAAS,EAArB,CAAb;AACD;;AAEM,SAAS/C,sBAAT,CAAgC8B,OAAhC,EAAyD;EAC9D,OAAO8C,MAAM,CAACC,IAAP,CAAY/C,OAAZ,EAAqB,QAArB,CAAP;AACD"}
|
package/jest.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
2
|
+
"name": "@verdaccio/auth",
|
|
3
|
+
"version": "6.0.0-6-next.23",
|
|
4
|
+
"description": "logger",
|
|
5
|
+
"main": "./build/index.js",
|
|
6
|
+
"types": "build/index.d.ts",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Juan Picado",
|
|
9
|
+
"email": "juanpicado19@gmail.com"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "https",
|
|
13
|
+
"url": "https://github.com/verdaccio/verdaccio"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://verdaccio.org",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"private",
|
|
18
|
+
"package",
|
|
19
|
+
"repository",
|
|
20
|
+
"registry",
|
|
21
|
+
"enterprise",
|
|
22
|
+
"modules",
|
|
23
|
+
"proxy",
|
|
24
|
+
"server",
|
|
25
|
+
"verdaccio"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=14",
|
|
29
|
+
"npm": ">=6"
|
|
30
|
+
},
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@verdaccio/core": "6.0.0-6-next.6",
|
|
34
|
+
"@verdaccio/config": "6.0.0-6-next.15",
|
|
35
|
+
"@verdaccio/loaders": "6.0.0-6-next.13",
|
|
36
|
+
"@verdaccio/logger": "6.0.0-6-next.12",
|
|
37
|
+
"@verdaccio/utils": "6.0.0-6-next.12",
|
|
38
|
+
"debug": "4.3.4",
|
|
39
|
+
"express": "4.18.1",
|
|
40
|
+
"jsonwebtoken": "8.5.1",
|
|
41
|
+
"lodash": "4.17.21",
|
|
42
|
+
"verdaccio-htpasswd": "11.0.0-6-next.14"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@verdaccio/types": "11.0.0-6-next.13"
|
|
46
|
+
},
|
|
47
|
+
"funding": {
|
|
48
|
+
"type": "opencollective",
|
|
49
|
+
"url": "https://opencollective.com/verdaccio"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"clean": "rimraf ./build",
|
|
53
|
+
"test": "jest",
|
|
54
|
+
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
|
55
|
+
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
|
|
56
|
+
"build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
|
|
57
|
+
"watch": "pnpm build:js -- --watch",
|
|
58
|
+
"build": "pnpm run build:js && pnpm run build:types"
|
|
59
|
+
},
|
|
60
|
+
"readme": "# @verdaccio/auth\n\n[](https://opencollective.com/verdaccio)\n[](https://stackshare.io/verdaccio)\n[](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)\n[](https://crowdin.com/project/verdaccio)\n[](https://www.tickgit.com/browse?repo=github.com/verdaccio/verdaccio)\n\n[](https://twitter.com/verdaccio_npm)\n[](https://github.com/verdaccio/verdaccio/stargazers)\n\n## Donations\n\nVerdaccio is run by **volunteers**; nobody is working full-time on it. If you find this project to be useful and would like to support its development, consider making a donation - **your logo might end up in this readme.** 😉\n\n**[Donate](https://opencollective.com/verdaccio)** 💵👍🏻 starting from _\\$1/month_ or just one single contribution.\n\n## Report a vulnerability\n\nIf you want to report a security vulnerability, please follow the steps which we have defined for you in our [security policy](https://github.com/verdaccio/verdaccio/security/policy).\n\n## Open Collective Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/verdaccio#sponsor)]\n\n[](https://opencollective.com/verdaccio/sponsor/0/website)\n[](https://opencollective.com/verdaccio/sponsor/1/website)\n[](https://opencollective.com/verdaccio/sponsor/2/website)\n[](https://opencollective.com/verdaccio/sponsor/3/website)\n[](https://opencollective.com/verdaccio/sponsor/4/website)\n[](https://opencollective.com/verdaccio/sponsor/5/website)\n[](https://opencollective.com/verdaccio/sponsor/6/website)\n[](https://opencollective.com/verdaccio/sponsor/7/website)\n[](https://opencollective.com/verdaccio/sponsor/8/website)\n[](https://opencollective.com/verdaccio/sponsor/9/website)\n\n## Open Collective Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/verdaccio#backer)]\n\n[](https://opencollective.com/verdaccio#backers)\n\n## Special Thanks\n\nThanks to the following companies to help us to achieve our goals providing free open source licenses.\n\n[](https://www.jetbrains.com/)\n[](https://crowdin.com/)\n[](https://balsamiq.com/)\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\n[](../../graphs/contributors)\n\n### FAQ / Contact / Troubleshoot\n\nIf you have any issue you can try the following options, do no desist to ask or check our issues database, perhaps someone has asked already what you are looking for.\n\n- [Blog](https://verdaccio.org/blog/)\n- [Donations](https://opencollective.com/verdaccio)\n- [Reporting an issue](https://github.com/verdaccio/verdaccio/blob/master/CONTRIBUTING.md#reporting-a-bug)\n- [Running discussions](https://github.com/verdaccio/verdaccio/issues?q=is%3Aissue+is%3Aopen+label%3Adiscuss)\n- [Chat](http://chat.verdaccio.org/)\n- [Logos](https://verdaccio.org/docs/en/logo)\n- [Docker Examples](https://github.com/verdaccio/docker-examples)\n- [FAQ](https://github.com/verdaccio/verdaccio/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20)\n\n### License\n\nVerdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)\n\nThe Verdaccio documentation and logos (excluding /thanks, e.g., .md, .png, .sketch) files within the /assets folder) is\n[Creative Commons licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE-docs).\n"
|
|
61
|
+
}
|
package/src/auth.ts
CHANGED
|
@@ -497,10 +497,10 @@ class Auth implements IAuth {
|
|
|
497
497
|
next: Function
|
|
498
498
|
): void {
|
|
499
499
|
debug('handle legacy api middleware');
|
|
500
|
-
debug('api middleware secret %o', secret);
|
|
501
|
-
debug('api middleware authorization %o', authorization);
|
|
500
|
+
debug('api middleware secret %o', typeof secret === 'string');
|
|
501
|
+
debug('api middleware authorization %o', typeof authorization === 'string');
|
|
502
502
|
const credentials: any = getMiddlewareCredentials(security, secret, authorization);
|
|
503
|
-
debug('api middleware credentials %o', credentials);
|
|
503
|
+
debug('api middleware credentials %o', credentials?.name);
|
|
504
504
|
if (credentials) {
|
|
505
505
|
const { user, password } = credentials;
|
|
506
506
|
debug('authenticating %o', user);
|
package/src/utils.ts
CHANGED
|
@@ -188,17 +188,17 @@ export function allow_action(action: ActionsAllowed, logger): AllowAction {
|
|
|
188
188
|
pkg: AuthPackageAllow,
|
|
189
189
|
callback: AllowActionCallback
|
|
190
190
|
): void {
|
|
191
|
-
logger.trace({ remote: user.name }, `[auth/allow_action]: user: @{
|
|
191
|
+
logger.trace({ remote: user.name }, `[auth/allow_action]: user: @{remote}`);
|
|
192
192
|
const { name, groups } = user;
|
|
193
193
|
const groupAccess = pkg[action] as string[];
|
|
194
194
|
const hasPermission = groupAccess.some((group) => name === group || groups.includes(group));
|
|
195
195
|
logger.trace(
|
|
196
196
|
{ pkgName: pkg.name, hasPermission, remote: user.name, groupAccess },
|
|
197
|
-
`[auth/allow_action]: hasPermission? @{hasPermission} for user: @{
|
|
197
|
+
`[auth/allow_action]: hasPermission? @{hasPermission} for user: @{remote}, package: @{pkgName}`
|
|
198
198
|
);
|
|
199
199
|
|
|
200
200
|
if (hasPermission) {
|
|
201
|
-
logger.trace({ remote: user.name }, `auth/allow_action: access granted to: @{
|
|
201
|
+
logger.trace({ remote: user.name }, `auth/allow_action: access granted to: @{remote}`);
|
|
202
202
|
return callback(null, true);
|
|
203
203
|
}
|
|
204
204
|
|
package/test/auth-utils.spec.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
createRemoteUser,
|
|
9
9
|
parseConfigFile,
|
|
10
10
|
} from '@verdaccio/config';
|
|
11
|
+
import { getDefaultConfig } from '@verdaccio/config';
|
|
11
12
|
import {
|
|
12
13
|
API_ERROR,
|
|
13
14
|
CHARACTER_ENCODING,
|
|
@@ -16,14 +17,9 @@ import {
|
|
|
16
17
|
errorUtils,
|
|
17
18
|
} from '@verdaccio/core';
|
|
18
19
|
import { setup } from '@verdaccio/logger';
|
|
19
|
-
import { configExample } from '@verdaccio/mock';
|
|
20
20
|
import { Config, RemoteUser, Security } from '@verdaccio/types';
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
buildToken,
|
|
24
|
-
buildUserBuffer,
|
|
25
|
-
getAuthenticatedMessage,
|
|
26
|
-
} from '@verdaccio/utils';
|
|
21
|
+
import { buildToken, buildUserBuffer, getAuthenticatedMessage } from '@verdaccio/utils';
|
|
22
|
+
import type { AllowActionCallbackResponse } from '@verdaccio/utils';
|
|
27
23
|
|
|
28
24
|
import {
|
|
29
25
|
ActionsAllowed,
|
|
@@ -58,7 +54,7 @@ describe('Auth utilities', () => {
|
|
|
58
54
|
function getConfig(configFileName: string, secret: string) {
|
|
59
55
|
const conf = parseConfigFile(parseConfigurationSecurityFile(configFileName));
|
|
60
56
|
// @ts-ignore
|
|
61
|
-
const secConf = _.merge(
|
|
57
|
+
const secConf = _.merge(getDefaultConfig(), conf);
|
|
62
58
|
secConf.secret = secret;
|
|
63
59
|
const config: Config = new AppConfig(secConf);
|
|
64
60
|
|
package/test/auth.spec.ts
CHANGED
|
@@ -51,7 +51,7 @@ describe('AuthTest', () => {
|
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
test('should be a fail on login', () => {
|
|
54
|
-
const config: Config = new AppConfig(
|
|
54
|
+
const config: Config = new AppConfig(authPluginFailureConf);
|
|
55
55
|
config.checkSecretKey('12345');
|
|
56
56
|
const auth: IAuth = new Auth(config);
|
|
57
57
|
|
package/test/helper/plugin.ts
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { getDefaultConfig } from '@verdaccio/config';
|
|
4
4
|
|
|
5
|
-
export const authProfileConf =
|
|
5
|
+
export const authProfileConf = {
|
|
6
|
+
...getDefaultConfig(),
|
|
6
7
|
auth: {
|
|
7
8
|
[`${path.join(__dirname, '../partials/plugin/authenticate.success')}`]: {},
|
|
8
9
|
},
|
|
9
|
-
}
|
|
10
|
+
};
|
|
10
11
|
|
|
11
|
-
export const authPluginFailureConf =
|
|
12
|
+
export const authPluginFailureConf = {
|
|
13
|
+
...getDefaultConfig(),
|
|
12
14
|
auth: {
|
|
13
|
-
[`${path.join(__dirname, '../partials/plugin/authenticate.fail')}`]: {},
|
|
15
|
+
[`${path.join(__dirname, '../partials/plugin/authenticate.fail.js')}`]: {},
|
|
14
16
|
},
|
|
15
|
-
}
|
|
17
|
+
};
|
|
16
18
|
|
|
17
|
-
export const authPluginPassThrougConf =
|
|
19
|
+
export const authPluginPassThrougConf = {
|
|
20
|
+
...getDefaultConfig(),
|
|
18
21
|
auth: {
|
|
19
22
|
[`${path.join(__dirname, '../partials/plugin/authenticate.passthroug')}`]: {},
|
|
20
23
|
},
|
|
21
|
-
}
|
|
24
|
+
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { errorUtils } from '@verdaccio/core';
|
|
2
2
|
|
|
3
3
|
module.exports = function () {
|
|
4
4
|
return {
|
|
5
5
|
authenticate(user, pass, callback) {
|
|
6
6
|
// we return an 500 error, the second argument must be false.
|
|
7
7
|
// https://verdaccio.org/docs/en/dev-plugins#onerror
|
|
8
|
-
callback(getInternalError(), false);
|
|
8
|
+
callback(errorUtils.getInternalError(), false);
|
|
9
9
|
},
|
|
10
10
|
};
|
|
11
11
|
};
|