@verdaccio/api 6.0.0-6-next.15 → 6.0.0-6-next.19

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/build/dist-tags.d.ts +1 -1
  3. package/build/dist-tags.js +10 -10
  4. package/build/dist-tags.js.map +1 -1
  5. package/build/index.js +16 -10
  6. package/build/index.js.map +1 -1
  7. package/build/package.d.ts +1 -2
  8. package/build/package.js +30 -63
  9. package/build/package.js.map +1 -1
  10. package/build/ping.js.map +1 -1
  11. package/build/publish.d.ts +2 -2
  12. package/build/publish.js +28 -34
  13. package/build/publish.js.map +1 -1
  14. package/build/search.js +2 -2
  15. package/build/search.js.map +1 -1
  16. package/build/star.d.ts +1 -1
  17. package/build/star.js +9 -15
  18. package/build/star.js.map +1 -1
  19. package/build/stars.js +3 -3
  20. package/build/stars.js.map +1 -1
  21. package/build/user.d.ts +1 -1
  22. package/build/user.js +17 -17
  23. package/build/user.js.map +1 -1
  24. package/build/utils.js.map +1 -1
  25. package/build/v1/profile.js +10 -10
  26. package/build/v1/profile.js.map +1 -1
  27. package/build/v1/search.js +16 -7
  28. package/build/v1/search.js.map +1 -1
  29. package/build/v1/token.d.ts +1 -1
  30. package/build/v1/token.js +17 -23
  31. package/build/v1/token.js.map +1 -1
  32. package/build/whoami.js +0 -1
  33. package/build/whoami.js.map +1 -1
  34. package/package.json +18 -19
  35. package/src/dist-tags.ts +14 -13
  36. package/src/index.ts +16 -10
  37. package/src/package.ts +38 -57
  38. package/src/ping.ts +2 -1
  39. package/src/publish.ts +18 -11
  40. package/src/search.ts +1 -1
  41. package/src/star.ts +4 -3
  42. package/src/stars.ts +4 -4
  43. package/src/user.ts +13 -13
  44. package/src/utils.ts +2 -1
  45. package/src/v1/profile.ts +10 -9
  46. package/src/v1/search.ts +14 -7
  47. package/src/v1/token.ts +17 -16
  48. package/src/whoami.ts +3 -3
  49. package/test/integration/_helper.ts +7 -5
  50. package/test/integration/package.spec.ts +3 -2
  51. package/test/integration/ping.spec.ts +2 -1
  52. package/test/integration/publish.spec.ts +6 -9
  53. package/test/integration/user.spec.ts +9 -11
  54. package/test/integration/whoami.spec.ts +1 -1
  55. package/test/unit/publish.spec.ts +6 -6
  56. package/test/unit/validate.api.params.middleware.spec.ts +1 -1
  57. package/tsconfig.json +0 -3
  58. package/types/custom.d.ts +2 -1
package/build/user.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/user.ts"],"names":["debug","route","auth","config","get","req","res","next","message","remote_user","name","status","HTTP_STATUS","OK","ok","put","password","body","remoteName","_","isNil","authenticate","callbackAuthenticate","err","user","logger","trace","ErrorCode","getCode","UNAUTHORIZED","API_ERROR","BAD_USERNAME_PASSWORD","restoredRemoteUser","groups","token","getUnauthorized","CREATED","BAD_REQUEST","PASSWORD_SHORT","add_user","INTERNAL_ERROR","getConflict","undefined","delete","API_MESSAGE","LOGGED_OUT"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { Response, Router } from 'express';\nimport buildDebug from 'debug';\n\nimport { getAuthenticatedMessage, validatePassword, ErrorCode } from '@verdaccio/utils';\nimport { getApiToken } from '@verdaccio/auth';\nimport { logger } from '@verdaccio/logger';\nimport { createRemoteUser } from '@verdaccio/config';\n\nimport { Config, RemoteUser } from '@verdaccio/types';\nimport { IAuth } from '@verdaccio/auth';\nimport { API_ERROR, API_MESSAGE, HTTP_STATUS } from '@verdaccio/commons-api';\nimport { $RequestExtend, $NextFunctionVer } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:user');\n\nexport default function (route: Router, auth: IAuth, config: Config): void {\n route.get(\n '/-/user/:org_couchdb_user',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n debug('verifying user');\n const message = getAuthenticatedMessage(req.remote_user.name);\n debug('user authenticated message %o', message);\n res.status(HTTP_STATUS.OK);\n next({\n ok: message,\n });\n }\n );\n\n route.put(\n '/-/user/:org_couchdb_user/:_rev?/:revision?',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n const { name, password } = req.body;\n debug('login or adduser');\n const remoteName = req.remote_user.name;\n\n if (_.isNil(remoteName) === false && _.isNil(name) === false && remoteName === name) {\n debug('login: no remote user detected');\n auth.authenticate(\n name,\n password,\n async function callbackAuthenticate(err, user): Promise<void> {\n if (err) {\n logger.trace(\n { name, err },\n 'authenticating for user @{username} failed. Error: @{err.message}'\n );\n return next(\n ErrorCode.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.BAD_USERNAME_PASSWORD)\n );\n }\n\n const restoredRemoteUser: RemoteUser = createRemoteUser(name, user.groups || []);\n const token = await getApiToken(auth, config, restoredRemoteUser, password);\n debug('login: new token');\n if (!token) {\n return next(ErrorCode.getUnauthorized());\n }\n\n res.status(HTTP_STATUS.CREATED);\n\n const message = getAuthenticatedMessage(req.remote_user.name);\n debug('login: created user message %o', message);\n\n return next({\n ok: message,\n token,\n });\n }\n );\n } else {\n if (validatePassword(password) === false) {\n debug('adduser: invalid password');\n // eslint-disable-next-line new-cap\n return next(ErrorCode.getCode(HTTP_STATUS.BAD_REQUEST, API_ERROR.PASSWORD_SHORT()));\n }\n\n auth.add_user(name, password, async function (err, user): Promise<void> {\n if (err) {\n if (err.status >= HTTP_STATUS.BAD_REQUEST && err.status < HTTP_STATUS.INTERNAL_ERROR) {\n debug('adduser: error on create user');\n // With npm registering is the same as logging in,\n // and npm accepts only an 409 error.\n // So, changing status code here.\n return next(\n ErrorCode.getCode(err.status, err.message) || ErrorCode.getConflict(err.message)\n );\n }\n return next(err);\n }\n\n const token =\n name && password ? await getApiToken(auth, config, user, password) : undefined;\n debug('adduser: new token %o', token);\n if (!token) {\n return next(ErrorCode.getUnauthorized());\n }\n\n req.remote_user = user;\n res.status(HTTP_STATUS.CREATED);\n debug('adduser: user has been created');\n return next({\n ok: `user '${req.body.name}' created`,\n token,\n });\n });\n }\n }\n );\n\n route.delete(\n '/-/user/token/*',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n res.status(HTTP_STATUS.OK);\n next({\n ok: API_MESSAGE.LOGGED_OUT,\n });\n }\n );\n}\n"],"file":"user.js"}
1
+ {"version":3,"sources":["../src/user.ts"],"names":["debug","route","auth","config","get","req","res","next","message","remote_user","name","status","HTTP_STATUS","OK","ok","put","password","body","remoteName","_","isNil","authenticate","callbackAuthenticate","err","user","logger","trace","errorUtils","getCode","UNAUTHORIZED","API_ERROR","BAD_USERNAME_PASSWORD","restoredRemoteUser","groups","token","getUnauthorized","CREATED","BAD_REQUEST","PASSWORD_SHORT","add_user","INTERNAL_ERROR","getConflict","undefined","delete","API_MESSAGE","LOGGED_OUT"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { getApiToken } from '@verdaccio/auth';\nimport { IAuth } from '@verdaccio/auth';\nimport { createRemoteUser } from '@verdaccio/config';\nimport { API_ERROR, API_MESSAGE, HTTP_STATUS, errorUtils } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { Config, RemoteUser } from '@verdaccio/types';\nimport { getAuthenticatedMessage, validatePassword } from '@verdaccio/utils';\n\nimport { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:user');\n\nexport default function (route: Router, auth: IAuth, config: Config): void {\n route.get(\n '/-/user/:org_couchdb_user',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n debug('verifying user');\n const message = getAuthenticatedMessage(req.remote_user.name);\n debug('user authenticated message %o', message);\n res.status(HTTP_STATUS.OK);\n next({\n ok: message,\n });\n }\n );\n\n route.put(\n '/-/user/:org_couchdb_user/:_rev?/:revision?',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n const { name, password } = req.body;\n debug('login or adduser');\n const remoteName = req.remote_user.name;\n\n if (_.isNil(remoteName) === false && _.isNil(name) === false && remoteName === name) {\n debug('login: no remote user detected');\n auth.authenticate(\n name,\n password,\n async function callbackAuthenticate(err, user): Promise<void> {\n if (err) {\n logger.trace(\n { name, err },\n 'authenticating for user @{username} failed. Error: @{err.message}'\n );\n return next(\n errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.BAD_USERNAME_PASSWORD)\n );\n }\n\n const restoredRemoteUser: RemoteUser = createRemoteUser(name, user.groups || []);\n const token = await getApiToken(auth, config, restoredRemoteUser, password);\n debug('login: new token');\n if (!token) {\n return next(errorUtils.getUnauthorized());\n }\n\n res.status(HTTP_STATUS.CREATED);\n\n const message = getAuthenticatedMessage(req.remote_user.name);\n debug('login: created user message %o', message);\n\n return next({\n ok: message,\n token,\n });\n }\n );\n } else {\n if (validatePassword(password) === false) {\n debug('adduser: invalid password');\n // eslint-disable-next-line new-cap\n return next(errorUtils.getCode(HTTP_STATUS.BAD_REQUEST, API_ERROR.PASSWORD_SHORT()));\n }\n\n auth.add_user(name, password, async function (err, user): Promise<void> {\n if (err) {\n if (err.status >= HTTP_STATUS.BAD_REQUEST && err.status < HTTP_STATUS.INTERNAL_ERROR) {\n debug('adduser: error on create user');\n // With npm registering is the same as logging in,\n // and npm accepts only an 409 error.\n // So, changing status code here.\n return next(\n errorUtils.getCode(err.status, err.message) || errorUtils.getConflict(err.message)\n );\n }\n return next(err);\n }\n\n const token =\n name && password ? await getApiToken(auth, config, user, password) : undefined;\n debug('adduser: new token %o', token);\n if (!token) {\n return next(errorUtils.getUnauthorized());\n }\n\n req.remote_user = user;\n res.status(HTTP_STATUS.CREATED);\n debug('adduser: user has been created');\n return next({\n ok: `user '${req.body.name}' created`,\n token,\n });\n });\n }\n }\n );\n\n route.delete(\n '/-/user/token/*',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n res.status(HTTP_STATUS.OK);\n next({\n ok: API_MESSAGE.LOGGED_OUT,\n });\n }\n );\n}\n"],"file":"user.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts"],"names":["isPublishablePackage","pkg","keys","Object","_","includes","isRelatedToDeprecation","pkgInfo","versions","version","prototype","hasOwnProperty","call"],"mappings":";;;;;;;;AACA;;;;AAEA;AACA;AACA;AACA;AAEO,SAASA,oBAAT,CAA8BC,GAA9B,EAAqD;AAC1D,QAAMC,IAAc,GAAGC,MAAM,CAACD,IAAP,CAAYD,GAAZ,CAAvB;AAEA,SAAOG,gBAAEC,QAAF,CAAWH,IAAX,EAAiB,UAAjB,CAAP;AACD;;AAEM,SAASI,sBAAT,CAAgCC,OAAhC,EAA2D;AAChE,QAAM;AAAEC,IAAAA;AAAF,MAAeD,OAArB;;AACA,OAAK,MAAME,OAAX,IAAsBD,QAAtB,EAAgC;AAC9B,QAAIL,MAAM,CAACO,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCJ,QAAQ,CAACC,OAAD,CAA7C,EAAwD,YAAxD,CAAJ,EAA2E;AACzE,aAAO,IAAP;AACD;AACF;;AACD,SAAO,KAAP;AACD","sourcesContent":["import { Package } from '@verdaccio/types';\nimport _ from 'lodash';\n\n/**\n * Check whether the package metadta has enough data to be published\n * @param pkg metadata\n */\n\nexport function isPublishablePackage(pkg: Package): boolean {\n const keys: string[] = Object.keys(pkg);\n\n return _.includes(keys, 'versions');\n}\n\nexport function isRelatedToDeprecation(pkgInfo: Package): boolean {\n const { versions } = pkgInfo;\n for (const version in versions) {\n if (Object.prototype.hasOwnProperty.call(versions[version], 'deprecated')) {\n return true;\n }\n }\n return false;\n}\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../src/utils.ts"],"names":["isPublishablePackage","pkg","keys","Object","_","includes","isRelatedToDeprecation","pkgInfo","versions","version","prototype","hasOwnProperty","call"],"mappings":";;;;;;;;AAAA;;;;AAIA;AACA;AACA;AACA;AAEO,SAASA,oBAAT,CAA8BC,GAA9B,EAAqD;AAC1D,QAAMC,IAAc,GAAGC,MAAM,CAACD,IAAP,CAAYD,GAAZ,CAAvB;AAEA,SAAOG,gBAAEC,QAAF,CAAWH,IAAX,EAAiB,UAAjB,CAAP;AACD;;AAEM,SAASI,sBAAT,CAAgCC,OAAhC,EAA2D;AAChE,QAAM;AAAEC,IAAAA;AAAF,MAAeD,OAArB;;AACA,OAAK,MAAME,OAAX,IAAsBD,QAAtB,EAAgC;AAC9B,QAAIL,MAAM,CAACO,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCJ,QAAQ,CAACC,OAAD,CAA7C,EAAwD,YAAxD,CAAJ,EAA2E;AACzE,aAAO,IAAP;AACD;AACF;;AACD,SAAO,KAAP;AACD","sourcesContent":["import _ from 'lodash';\n\nimport { Package } from '@verdaccio/types';\n\n/**\n * Check whether the package metadta has enough data to be published\n * @param pkg metadata\n */\n\nexport function isPublishablePackage(pkg: Package): boolean {\n const keys: string[] = Object.keys(pkg);\n\n return _.includes(keys, 'versions');\n}\n\nexport function isRelatedToDeprecation(pkgInfo: Package): boolean {\n const { versions } = pkgInfo;\n for (const version in versions) {\n if (Object.prototype.hasOwnProperty.call(versions[version], 'deprecated')) {\n return true;\n }\n }\n return false;\n}\n"],"file":"utils.js"}
@@ -7,7 +7,7 @@ exports.default = _default;
7
7
 
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
 
10
- var _commonsApi = require("@verdaccio/commons-api");
10
+ var _core = require("@verdaccio/core");
11
11
 
12
12
  var _utils = require("@verdaccio/utils");
13
13
 
@@ -32,16 +32,16 @@ function _default(route, auth) {
32
32
  return next(buildProfile(req.remote_user.name));
33
33
  }
34
34
 
35
- res.status(_commonsApi.HTTP_STATUS.UNAUTHORIZED);
35
+ res.status(_core.HTTP_STATUS.UNAUTHORIZED);
36
36
  return next({
37
- message: _commonsApi.API_ERROR.MUST_BE_LOGGED
37
+ message: _core.API_ERROR.MUST_BE_LOGGED
38
38
  });
39
39
  });
40
40
  route.post('/-/npm/v1/user', function (req, res, next) {
41
41
  if (_lodash.default.isNil(req.remote_user.name)) {
42
- res.status(_commonsApi.HTTP_STATUS.UNAUTHORIZED);
42
+ res.status(_core.HTTP_STATUS.UNAUTHORIZED);
43
43
  return next({
44
- message: _commonsApi.API_ERROR.MUST_BE_LOGGED
44
+ message: _core.API_ERROR.MUST_BE_LOGGED
45
45
  });
46
46
  }
47
47
 
@@ -56,25 +56,25 @@ function _default(route, auth) {
56
56
  if (_lodash.default.isNil(password) === false) {
57
57
  if ((0, _utils.validatePassword)(password.new) === false) {
58
58
  /* eslint new-cap:off */
59
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.UNAUTHORIZED, _commonsApi.API_ERROR.PASSWORD_SHORT()));
59
+ return next(_core.errorUtils.getCode(_core.HTTP_STATUS.UNAUTHORIZED, _core.API_ERROR.PASSWORD_SHORT()));
60
60
  /* eslint new-cap:off */
61
61
  }
62
62
 
63
63
  auth.changePassword(name, password.old, password.new, (err, isUpdated) => {
64
64
  if (_lodash.default.isNull(err) === false) {
65
- return next(_utils.ErrorCode.getCode(err.status, err.message) || _utils.ErrorCode.getConflict(err.message));
65
+ return next(_core.errorUtils.getCode(err.status, err.message) || _core.errorUtils.getConflict(err.message));
66
66
  }
67
67
 
68
68
  if (isUpdated) {
69
69
  return next(buildProfile(req.remote_user.name));
70
70
  }
71
71
 
72
- return next(_utils.ErrorCode.getInternalError(_commonsApi.API_ERROR.INTERNAL_SERVER_ERROR));
72
+ return next(_core.errorUtils.getInternalError(_core.API_ERROR.INTERNAL_SERVER_ERROR));
73
73
  });
74
74
  } else if (_lodash.default.isNil(tfa) === false) {
75
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.SERVICE_UNAVAILABLE, _commonsApi.SUPPORT_ERRORS.TFA_DISABLED));
75
+ return next(_core.errorUtils.getCode(_core.HTTP_STATUS.SERVICE_UNAVAILABLE, _core.SUPPORT_ERRORS.TFA_DISABLED));
76
76
  } else {
77
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.INTERNAL_ERROR, _commonsApi.APP_ERROR.PROFILE_ERROR));
77
+ return next(_core.errorUtils.getCode(_core.HTTP_STATUS.INTERNAL_ERROR, _core.APP_ERROR.PROFILE_ERROR));
78
78
  }
79
79
  });
80
80
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/v1/profile.ts"],"names":["route","auth","buildProfile","name","tfa","email","email_verified","created","updated","cidr_whitelist","fullname","get","req","res","next","_","isNil","remote_user","status","HTTP_STATUS","UNAUTHORIZED","message","API_ERROR","MUST_BE_LOGGED","post","password","body","new","ErrorCode","getCode","PASSWORD_SHORT","changePassword","old","err","isUpdated","isNull","getConflict","getInternalError","INTERNAL_SERVER_ERROR","SERVICE_UNAVAILABLE","SUPPORT_ERRORS","TFA_DISABLED","INTERNAL_ERROR","APP_ERROR","PROFILE_ERROR"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { Response, Router } from 'express';\n\nimport { API_ERROR, APP_ERROR, HTTP_STATUS, SUPPORT_ERRORS } from '@verdaccio/commons-api';\nimport { ErrorCode, validatePassword } from '@verdaccio/utils';\nimport { IAuth } from '@verdaccio/auth';\nimport { $RequestExtend, $NextFunctionVer } from '../../types/custom';\n\nexport interface Profile {\n tfa: boolean;\n name: string;\n email: string;\n email_verified: boolean;\n created: string;\n updated: string;\n cidr_whitelist: string[] | null;\n fullname: string;\n}\n\nexport default function (route: Router, auth: IAuth): void {\n function buildProfile(name: string): Profile {\n return {\n tfa: false,\n name,\n email: '',\n email_verified: false,\n created: '',\n updated: '',\n cidr_whitelist: null,\n fullname: '',\n };\n }\n\n route.get(\n '/-/npm/v1/user',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name) === false) {\n return next(buildProfile(req.remote_user.name));\n }\n\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n );\n\n route.post(\n '/-/npm/v1/user',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password, tfa } = req.body;\n const { name } = req.remote_user;\n\n if (_.isNil(password) === false) {\n if (validatePassword(password.new) === false) {\n /* eslint new-cap:off */\n return next(ErrorCode.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT()));\n /* eslint new-cap:off */\n }\n\n auth.changePassword(\n name,\n password.old,\n password.new,\n (err, isUpdated): $NextFunctionVer => {\n if (_.isNull(err) === false) {\n return next(\n ErrorCode.getCode(err.status, err.message) || ErrorCode.getConflict(err.message)\n );\n }\n\n if (isUpdated) {\n return next(buildProfile(req.remote_user.name));\n }\n return next(ErrorCode.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n );\n } else if (_.isNil(tfa) === false) {\n return next(\n ErrorCode.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED)\n );\n } else {\n return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));\n }\n }\n );\n}\n"],"file":"profile.js"}
1
+ {"version":3,"sources":["../../src/v1/profile.ts"],"names":["route","auth","buildProfile","name","tfa","email","email_verified","created","updated","cidr_whitelist","fullname","get","req","res","next","_","isNil","remote_user","status","HTTP_STATUS","UNAUTHORIZED","message","API_ERROR","MUST_BE_LOGGED","post","password","body","new","errorUtils","getCode","PASSWORD_SHORT","changePassword","old","err","isUpdated","isNull","getConflict","getInternalError","INTERNAL_SERVER_ERROR","SERVICE_UNAVAILABLE","SUPPORT_ERRORS","TFA_DISABLED","INTERNAL_ERROR","APP_ERROR","PROFILE_ERROR"],"mappings":"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","sourcesContent":["import { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { API_ERROR, APP_ERROR, HTTP_STATUS, SUPPORT_ERRORS, errorUtils } from '@verdaccio/core';\nimport { validatePassword } from '@verdaccio/utils';\n\nimport { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport interface Profile {\n tfa: boolean;\n name: string;\n email: string;\n email_verified: boolean;\n created: string;\n updated: string;\n cidr_whitelist: string[] | null;\n fullname: string;\n}\n\nexport default function (route: Router, auth: IAuth): void {\n function buildProfile(name: string): Profile {\n return {\n tfa: false,\n name,\n email: '',\n email_verified: false,\n created: '',\n updated: '',\n cidr_whitelist: null,\n fullname: '',\n };\n }\n\n route.get(\n '/-/npm/v1/user',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name) === false) {\n return next(buildProfile(req.remote_user.name));\n }\n\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n );\n\n route.post(\n '/-/npm/v1/user',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password, tfa } = req.body;\n const { name } = req.remote_user;\n\n if (_.isNil(password) === false) {\n if (validatePassword(password.new) === false) {\n /* eslint new-cap:off */\n return next(errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT()));\n /* eslint new-cap:off */\n }\n\n auth.changePassword(\n name,\n password.old,\n password.new,\n (err, isUpdated): $NextFunctionVer => {\n if (_.isNull(err) === false) {\n return next(\n errorUtils.getCode(err.status, err.message) || errorUtils.getConflict(err.message)\n );\n }\n\n if (isUpdated) {\n return next(buildProfile(req.remote_user.name));\n }\n return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n );\n } else if (_.isNil(tfa) === false) {\n return next(\n errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED)\n );\n } else {\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));\n }\n }\n );\n}\n"],"file":"profile.js"}
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = _default;
7
7
 
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+
8
10
  var _lodash = _interopRequireDefault(require("lodash"));
9
11
 
10
- var _debug = _interopRequireDefault(require("debug"));
12
+ var _core = require("@verdaccio/core");
11
13
 
12
14
  var _logger = require("@verdaccio/logger");
13
15
 
14
- var _commonsApi = require("@verdaccio/commons-api");
15
-
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
18
  const debug = (0, _debug.default)('verdaccio:api:search');
@@ -48,8 +48,16 @@ function _default(route, auth, storage) {
48
48
  }
49
49
 
50
50
  route.get('/-/v1/search', async (req, res, next) => {
51
- let [size, from] = ['size', 'from'].map(k => req.query[k]);
51
+ const {
52
+ query,
53
+ url
54
+ } = req;
55
+ let [size, from] = ['size', 'from'].map(k => query[k]);
52
56
  let data;
57
+ const abort = new AbortController();
58
+ req.on('aborted', () => {
59
+ abort.abort();
60
+ });
53
61
  size = parseInt(size, 10) || 20;
54
62
  from = parseInt(from, 10) || 0;
55
63
 
@@ -57,8 +65,9 @@ function _default(route, auth, storage) {
57
65
  var _storage$searchManage;
58
66
 
59
67
  data = await ((_storage$searchManage = storage.searchManager) === null || _storage$searchManage === void 0 ? void 0 : _storage$searchManage.search({
60
- query: req.query,
61
- url: req.url
68
+ query,
69
+ url,
70
+ abort
62
71
  }));
63
72
  debug('stream finish');
64
73
  const checkAccessPromises = await Promise.all(data.map(pkgItem => {
@@ -73,7 +82,7 @@ function _default(route, auth, storage) {
73
82
  total: final.length,
74
83
  time: new Date().toUTCString()
75
84
  };
76
- res.status(_commonsApi.HTTP_STATUS.OK).json(response);
85
+ res.status(_core.HTTP_STATUS.OK).json(response);
77
86
  } catch (error) {
78
87
  _logger.logger.error({
79
88
  error
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/v1/search.ts"],"names":["debug","route","auth","storage","checkAccess","pkg","remoteUser","Promise","resolve","reject","allow_access","packageName","package","name","err","allowed","status","String","match","get","req","res","next","size","from","map","k","query","data","parseInt","searchManager","search","url","checkAccessPromises","all","pkgItem","remote_user","final","filter","i","_","isNull","slice","logger","length","response","objects","total","time","Date","toUTCString","HTTP_STATUS","OK","json","error"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport buildDebug from 'debug';\nimport { logger } from '@verdaccio/logger';\nimport { IAuth } from '@verdaccio/auth';\nimport { searchUtils } from '@verdaccio/core';\nimport { HTTP_STATUS } from '@verdaccio/commons-api';\nimport { Storage } from '@verdaccio/store';\nimport { Package } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:api:search');\n\n/**\n * Endpoint for npm search v1\n * Empty value\n * - {\"objects\":[],\"total\":0,\"time\":\"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)\"}\n * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'\n */\nexport default function (route, auth: IAuth, storage: Storage): void {\n function checkAccess(pkg: any, auth: any, remoteUser): Promise<Package | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n }\n\n route.get('/-/v1/search', async (req, res, next) => {\n let [size, from] = ['size', 'from'].map((k) => req.query[k]);\n let data;\n\n size = parseInt(size, 10) || 20;\n from = parseInt(from, 10) || 0;\n\n try {\n data = await storage.searchManager?.search({\n query: req.query,\n url: req.url,\n });\n debug('stream finish');\n const checkAccessPromises: searchUtils.SearchItemPkg[] = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final: searchUtils.SearchItemPkg[] = checkAccessPromises\n .filter((i) => !_.isNull(i))\n .slice(from, size);\n logger.debug(`search results ${final?.length}`);\n\n const response: searchUtils.SearchResults = {\n objects: final,\n total: final.length,\n time: new Date().toUTCString(),\n };\n\n res.status(HTTP_STATUS.OK).json(response);\n } catch (error) {\n logger.error({ error }, 'search endpoint has failed @{error.message}');\n next(next);\n return;\n }\n });\n}\n"],"file":"search.js"}
1
+ {"version":3,"sources":["../../src/v1/search.ts"],"names":["debug","route","auth","storage","checkAccess","pkg","remoteUser","Promise","resolve","reject","allow_access","packageName","package","name","err","allowed","status","String","match","get","req","res","next","query","url","size","from","map","k","data","abort","AbortController","on","parseInt","searchManager","search","checkAccessPromises","all","pkgItem","remote_user","final","filter","i","_","isNull","slice","logger","length","response","objects","total","time","Date","toUTCString","HTTP_STATUS","OK","json","error"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { HTTP_STATUS, searchUtils } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { Storage } from '@verdaccio/store';\nimport { Package } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:api:search');\n\n/**\n * Endpoint for npm search v1\n * Empty value\n * - {\"objects\":[],\"total\":0,\"time\":\"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)\"}\n * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'\n */\nexport default function (route, auth: IAuth, storage: Storage): void {\n function checkAccess(pkg: any, auth: any, remoteUser): Promise<Package | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n }\n\n route.get('/-/v1/search', async (req, res, next) => {\n const { query, url } = req;\n let [size, from] = ['size', 'from'].map((k) => query[k]);\n let data;\n const abort = new AbortController();\n\n req.on('aborted', () => {\n abort.abort();\n });\n\n size = parseInt(size, 10) || 20;\n from = parseInt(from, 10) || 0;\n\n try {\n data = await storage.searchManager?.search({\n query,\n url,\n abort,\n });\n debug('stream finish');\n const checkAccessPromises: searchUtils.SearchItemPkg[] = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final: searchUtils.SearchItemPkg[] = checkAccessPromises\n .filter((i) => !_.isNull(i))\n .slice(from, size);\n logger.debug(`search results ${final?.length}`);\n\n const response: searchUtils.SearchResults = {\n objects: final,\n total: final.length,\n time: new Date().toUTCString(),\n };\n\n res.status(HTTP_STATUS.OK).json(response);\n } catch (error) {\n logger.error({ error }, 'search endpoint has failed @{error.message}');\n next(next);\n return;\n }\n });\n}\n"],"file":"search.js"}
@@ -1,7 +1,7 @@
1
1
  import { Router } from 'express';
2
- import { Config, Token } from '@verdaccio/types';
3
2
  import { IAuth } from '@verdaccio/auth';
4
3
  import { Storage } from '@verdaccio/store';
4
+ import { Config, Token } from '@verdaccio/types';
5
5
  export declare type NormalizeToken = Token & {
6
6
  created: string;
7
7
  };
package/build/v1/token.js CHANGED
@@ -7,26 +7,20 @@ exports.default = _default;
7
7
 
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
 
10
- var _commonsApi = require("@verdaccio/commons-api");
11
-
12
- var _utils = require("@verdaccio/utils");
13
-
14
10
  var _auth = require("@verdaccio/auth");
15
11
 
16
- var _logger = require("@verdaccio/logger");
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ var _core = require("@verdaccio/core");
19
13
 
20
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
14
+ var _logger = require("@verdaccio/logger");
21
15
 
22
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
+ var _utils = require("@verdaccio/utils");
23
17
 
24
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
19
 
26
20
  function normalizeToken(token) {
27
- return _objectSpread(_objectSpread({}, token), {}, {
21
+ return { ...token,
28
22
  created: new Date(token.created).toISOString()
29
- });
23
+ };
30
24
  } // https://github.com/npm/npm-profile/blob/latest/lib/index.js
31
25
 
32
26
 
@@ -47,7 +41,7 @@ function _default(route, auth, storage, config) {
47
41
  totalTokens
48
42
  }, 'token list retrieved: @{totalTokens}');
49
43
 
50
- res.status(_commonsApi.HTTP_STATUS.OK);
44
+ res.status(_core.HTTP_STATUS.OK);
51
45
  return next({
52
46
  objects: tokens.map(normalizeToken),
53
47
  urls: {
@@ -60,11 +54,11 @@ function _default(route, auth, storage, config) {
60
54
  error: error.msg
61
55
  }, 'token list has failed: @{error}');
62
56
 
63
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.INTERNAL_ERROR, error.message));
57
+ return next(_core.errorUtils.getCode(_core.HTTP_STATUS.INTERNAL_ERROR, error.message));
64
58
  }
65
59
  }
66
60
 
67
- return next(_utils.ErrorCode.getUnauthorized());
61
+ return next(_core.errorUtils.getUnauthorized());
68
62
  });
69
63
  route.post('/-/npm/v1/tokens', function (req, res, next) {
70
64
  const {
@@ -77,26 +71,26 @@ function _default(route, auth, storage, config) {
77
71
  } = req.remote_user;
78
72
 
79
73
  if (!_lodash.default.isBoolean(readonly) || !_lodash.default.isArray(cidr_whitelist)) {
80
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.BAD_DATA, _commonsApi.SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
74
+ return next(_core.errorUtils.getCode(_core.HTTP_STATUS.BAD_DATA, _core.SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
81
75
  }
82
76
 
83
77
  auth.authenticate(name, password, async (err, user) => {
84
78
  if (err) {
85
- const errorCode = err.message ? _commonsApi.HTTP_STATUS.UNAUTHORIZED : _commonsApi.HTTP_STATUS.INTERNAL_ERROR;
86
- return next(_utils.ErrorCode.getCode(errorCode, err.message));
79
+ const errorCode = err.message ? _core.HTTP_STATUS.UNAUTHORIZED : _core.HTTP_STATUS.INTERNAL_ERROR;
80
+ return next(_core.errorUtils.getCode(errorCode, err.message));
87
81
  }
88
82
 
89
83
  req.remote_user = user;
90
84
 
91
85
  if (!_lodash.default.isFunction(storage.saveToken)) {
92
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.NOT_IMPLEMENTED, _commonsApi.SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
86
+ return next(_core.errorUtils.getCode(_core.HTTP_STATUS.NOT_IMPLEMENTED, _core.SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
93
87
  }
94
88
 
95
89
  try {
96
90
  const token = await (0, _auth.getApiToken)(auth, config, user, password);
97
91
 
98
92
  if (!token) {
99
- throw (0, _commonsApi.getInternalError)();
93
+ throw _core.errorUtils.getInternalError();
100
94
  }
101
95
 
102
96
  const key = (0, _utils.stringToMD5)(token); // TODO: use a utility here
@@ -137,7 +131,7 @@ function _default(route, auth, storage, config) {
137
131
  error: error.msg
138
132
  }, 'token creation has failed: @{error}');
139
133
 
140
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.INTERNAL_ERROR, error.message));
134
+ return next(_core.errorUtils.getInternalError(error.message));
141
135
  }
142
136
  });
143
137
  });
@@ -170,11 +164,11 @@ function _default(route, auth, storage, config) {
170
164
  error: error.msg
171
165
  }, 'token creation has failed: @{error}');
172
166
 
173
- return next(_utils.ErrorCode.getCode(_commonsApi.HTTP_STATUS.INTERNAL_ERROR, error.message));
167
+ return next(_core.errorUtils.getCode(_core.HTTP_STATUS.INTERNAL_ERROR, error.message));
174
168
  }
175
169
  }
176
170
 
177
- return next(_utils.ErrorCode.getUnauthorized());
171
+ return next(_core.errorUtils.getUnauthorized());
178
172
  });
179
173
  }
180
174
  //# sourceMappingURL=token.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/v1/token.ts"],"names":["normalizeToken","token","created","Date","toISOString","route","auth","storage","config","get","req","res","next","name","remote_user","_","isNil","tokens","readTokens","user","totalTokens","length","logger","debug","status","HTTP_STATUS","OK","objects","map","urls","error","msg","ErrorCode","getCode","INTERNAL_ERROR","message","getUnauthorized","post","password","readonly","cidr_whitelist","body","isBoolean","isArray","BAD_DATA","SUPPORT_ERRORS","PARAMETERS_NOT_VALID","authenticate","err","errorCode","UNAUTHORIZED","isFunction","saveToken","NOT_IMPLEMENTED","STORAGE_NOT_IMPLEMENT","key","maskedToken","getTime","cidr","delete","params","tokenKey","deleteToken","info"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { HTTP_STATUS, SUPPORT_ERRORS, getInternalError } from '@verdaccio/commons-api';\nimport { ErrorCode, stringToMD5, mask } from '@verdaccio/utils';\nimport { getApiToken } from '@verdaccio/auth';\nimport { logger } from '@verdaccio/logger';\nimport { Response, Router } from 'express';\n\nimport { Config, RemoteUser, Token } from '@verdaccio/types';\nimport { IAuth } from '@verdaccio/auth';\nimport { Storage } from '@verdaccio/store';\nimport { $RequestExtend, $NextFunctionVer } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n created: string;\n};\n\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n created: new Date(token.created).toISOString(),\n };\n}\n\n// https://github.com/npm/npm-profile/blob/latest/lib/index.js\nexport default function (route: Router, auth: IAuth, storage: Storage, config: Config): void {\n route.get(\n '/-/npm/v1/tokens',\n async function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n try {\n const tokens = await storage.readTokens({ user: name });\n const totalTokens = tokens.length;\n logger.debug({ totalTokens }, 'token list retrieved: @{totalTokens}');\n\n res.status(HTTP_STATUS.OK);\n return next({\n objects: tokens.map(normalizeToken),\n urls: {\n next: '', // TODO: pagination?\n },\n });\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token list has failed: @{error}');\n return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(ErrorCode.getUnauthorized());\n }\n );\n\n route.post(\n '/-/npm/v1/tokens',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { password, readonly, cidr_whitelist } = req.body;\n const { name } = req.remote_user;\n\n if (!_.isBoolean(readonly) || !_.isArray(cidr_whitelist)) {\n return next(ErrorCode.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));\n }\n\n auth.authenticate(name, password, async (err, user: RemoteUser) => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n return next(ErrorCode.getCode(errorCode, err.message));\n }\n\n req.remote_user = user;\n\n if (!_.isFunction(storage.saveToken)) {\n return next(\n ErrorCode.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)\n );\n }\n\n try {\n const token = await getApiToken(auth, config, user, password);\n if (!token) {\n throw getInternalError();\n }\n\n const key = stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = mask(token, 5);\n const created = new Date().getTime();\n\n /**\n * cidr_whitelist: is not being used, we pass it through\n * token: we do not store the real token (it is generated once and retrieved\n * to the user), just a mask of it.\n */\n const saveToken: Token = {\n user: name,\n token: maskedToken,\n key,\n cidr: cidr_whitelist,\n readonly,\n created,\n };\n\n await storage.saveToken(saveToken);\n logger.debug({ key, name }, 'token @{key} was created for user @{name}');\n return next(\n normalizeToken({\n token,\n user: name,\n key: saveToken.key,\n cidr: cidr_whitelist,\n readonly,\n created: saveToken.created,\n })\n );\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n });\n }\n );\n\n route.delete(\n '/-/npm/v1/tokens/token/:tokenKey',\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer) => {\n const {\n params: { tokenKey },\n } = req;\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n logger.debug({ name }, '@{name} has requested remove a token');\n try {\n await storage.deleteToken(name, tokenKey);\n logger.info({ tokenKey, name }, 'token id @{tokenKey} was revoked for user @{name}');\n return next({});\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(ErrorCode.getUnauthorized());\n }\n );\n}\n"],"file":"token.js"}
1
+ {"version":3,"sources":["../../src/v1/token.ts"],"names":["normalizeToken","token","created","Date","toISOString","route","auth","storage","config","get","req","res","next","name","remote_user","_","isNil","tokens","readTokens","user","totalTokens","length","logger","debug","status","HTTP_STATUS","OK","objects","map","urls","error","msg","errorUtils","getCode","INTERNAL_ERROR","message","getUnauthorized","post","password","readonly","cidr_whitelist","body","isBoolean","isArray","BAD_DATA","SUPPORT_ERRORS","PARAMETERS_NOT_VALID","authenticate","err","errorCode","UNAUTHORIZED","isFunction","saveToken","NOT_IMPLEMENTED","STORAGE_NOT_IMPLEMENT","getInternalError","key","maskedToken","getTime","cidr","delete","params","tokenKey","deleteToken","info"],"mappings":"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","sourcesContent":["import { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { getApiToken } from '@verdaccio/auth';\nimport { IAuth } from '@verdaccio/auth';\nimport { HTTP_STATUS, SUPPORT_ERRORS, errorUtils } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { Storage } from '@verdaccio/store';\nimport { Config, RemoteUser, Token } from '@verdaccio/types';\nimport { mask, stringToMD5 } from '@verdaccio/utils';\n\nimport { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n created: string;\n};\n\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n created: new Date(token.created).toISOString(),\n };\n}\n\n// https://github.com/npm/npm-profile/blob/latest/lib/index.js\nexport default function (route: Router, auth: IAuth, storage: Storage, config: Config): void {\n route.get(\n '/-/npm/v1/tokens',\n async function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n try {\n const tokens = await storage.readTokens({ user: name });\n const totalTokens = tokens.length;\n logger.debug({ totalTokens }, 'token list retrieved: @{totalTokens}');\n\n res.status(HTTP_STATUS.OK);\n return next({\n objects: tokens.map(normalizeToken),\n urls: {\n next: '', // TODO: pagination?\n },\n });\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token list has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n\n route.post(\n '/-/npm/v1/tokens',\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { password, readonly, cidr_whitelist } = req.body;\n const { name } = req.remote_user;\n\n if (!_.isBoolean(readonly) || !_.isArray(cidr_whitelist)) {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));\n }\n\n auth.authenticate(name, password, async (err, user: RemoteUser) => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n return next(errorUtils.getCode(errorCode, err.message));\n }\n\n req.remote_user = user;\n\n if (!_.isFunction(storage.saveToken)) {\n return next(\n errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)\n );\n }\n\n try {\n const token = await getApiToken(auth, config, user, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = mask(token, 5);\n const created = new Date().getTime();\n\n /**\n * cidr_whitelist: is not being used, we pass it through\n * token: we do not store the real token (it is generated once and retrieved\n * to the user), just a mask of it.\n */\n const saveToken: Token = {\n user: name,\n token: maskedToken,\n key,\n cidr: cidr_whitelist,\n readonly,\n created,\n };\n\n await storage.saveToken(saveToken);\n logger.debug({ key, name }, 'token @{key} was created for user @{name}');\n return next(\n normalizeToken({\n token,\n user: name,\n key: saveToken.key,\n cidr: cidr_whitelist,\n readonly,\n created: saveToken.created,\n })\n );\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getInternalError(error.message));\n }\n });\n }\n );\n\n route.delete(\n '/-/npm/v1/tokens/token/:tokenKey',\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer) => {\n const {\n params: { tokenKey },\n } = req;\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n logger.debug({ name }, '@{name} has requested remove a token');\n try {\n await storage.deleteToken(name, tokenKey);\n logger.info({ tokenKey, name }, 'token id @{tokenKey} was revoked for user @{name}');\n return next({});\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n}\n"],"file":"token.js"}
package/build/whoami.js CHANGED
@@ -9,7 +9,6 @@ var _debug = _interopRequireDefault(require("debug"));
9
9
 
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
- // import { getUnauthorized } from '@verdaccio/commons-api';
13
12
  const debug = (0, _debug.default)('verdaccio:api:user');
14
13
 
15
14
  function _default(route) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/whoami.ts"],"names":["debug","route","get","req","res","next","headers","referer","username","remote_user","name"],"mappings":";;;;;;;AACA;;;;AAEA;AAEA,MAAMA,KAAK,GAAG,oBAAW,oBAAX,CAAd;;AAEe,kBAAUC,KAAV,EAA+B;AAC5CA,EAAAA,KAAK,CAACC,GAAN,CAAU,SAAV,EAAqB,CAACC,GAAD,EAAsBC,GAAtB,EAAqCC,IAArC,KAAsE;AACzFL,IAAAA,KAAK,CAAC,kBAAD,CAAL;;AACA,QAAIG,GAAG,CAACG,OAAJ,CAAYC,OAAZ,KAAwB,QAA5B,EAAsC;AACpC,YAAMC,QAAQ,GAAGL,GAAG,CAACM,WAAJ,CAAgBC,IAAjC,CADoC,CAEpC;AACA;AACA;AACA;AACA;;AACAV,MAAAA,KAAK,CAAC,wBAAD,CAAL;AACA,aAAOK,IAAI,CAAC;AAAEG,QAAAA,QAAQ,EAAEA;AAAZ,OAAD,CAAX;AACD,KATD,MASO;AACLR,MAAAA,KAAK,CAAC,6BAAD,CAAL,CADK,CAEL;;AACA,aAAOK,IAAI,CAAC,OAAD,CAAX;AACD;AACF,GAhBD;AAkBAJ,EAAAA,KAAK,CAACC,GAAN,CAAU,WAAV,EAAuB,CAACC,GAAD,EAAsBC,GAAtB,EAAqCC,IAArC,KAAqE;AAC1F,UAAMG,QAAQ,GAAGL,GAAG,CAACM,WAAJ,CAAgBC,IAAjC,CAD0F,CAE1F;AACA;AACA;AACA;AACA;;AAEAV,IAAAA,KAAK,CAAC,qBAAD,EAAwBQ,QAAxB,CAAL;AACA,WAAOH,IAAI,CAAC;AAAEG,MAAAA,QAAQ,EAAEA;AAAZ,KAAD,CAAX;AACD,GAVD;AAWD","sourcesContent":["import { Response, Router } from 'express';\nimport buildDebug from 'debug';\nimport { $RequestExtend, $NextFunctionVer } from '../types/custom';\n// import { getUnauthorized } from '@verdaccio/commons-api';\n\nconst debug = buildDebug('verdaccio:api:user');\n\nexport default function (route: Router): void {\n route.get('/whoami', (req: $RequestExtend, res: Response, next: $NextFunctionVer): void => {\n debug('whoami: reditect');\n if (req.headers.referer === 'whoami') {\n const username = req.remote_user.name;\n // FIXME: this service should return 401 if user missing\n // if (!username) {\n // debug('whoami: user not found');\n // return next(getUnauthorized('Unauthorized'));\n // }\n debug('whoami: logged by user');\n return next({ username: username });\n } else {\n debug('whoami: redirect next route');\n // redirect to the route below\n return next('route');\n }\n });\n\n route.get('/-/whoami', (req: $RequestExtend, res: Response, next: $NextFunctionVer): any => {\n const username = req.remote_user.name;\n // FIXME: this service should return 401 if user missing\n // if (!username) {\n // debug('whoami: user not found');\n // return next(getUnauthorized('Unauthorized'));\n // }\n\n debug('whoami: response %o', username);\n return next({ username: username });\n });\n}\n"],"file":"whoami.js"}
1
+ {"version":3,"sources":["../src/whoami.ts"],"names":["debug","route","get","req","res","next","headers","referer","username","remote_user","name"],"mappings":";;;;;;;AAAA;;;;AAKA,MAAMA,KAAK,GAAG,oBAAW,oBAAX,CAAd;;AAEe,kBAAUC,KAAV,EAA+B;AAC5CA,EAAAA,KAAK,CAACC,GAAN,CAAU,SAAV,EAAqB,CAACC,GAAD,EAAsBC,GAAtB,EAAqCC,IAArC,KAAsE;AACzFL,IAAAA,KAAK,CAAC,kBAAD,CAAL;;AACA,QAAIG,GAAG,CAACG,OAAJ,CAAYC,OAAZ,KAAwB,QAA5B,EAAsC;AACpC,YAAMC,QAAQ,GAAGL,GAAG,CAACM,WAAJ,CAAgBC,IAAjC,CADoC,CAEpC;AACA;AACA;AACA;AACA;;AACAV,MAAAA,KAAK,CAAC,wBAAD,CAAL;AACA,aAAOK,IAAI,CAAC;AAAEG,QAAAA,QAAQ,EAAEA;AAAZ,OAAD,CAAX;AACD,KATD,MASO;AACLR,MAAAA,KAAK,CAAC,6BAAD,CAAL,CADK,CAEL;;AACA,aAAOK,IAAI,CAAC,OAAD,CAAX;AACD;AACF,GAhBD;AAkBAJ,EAAAA,KAAK,CAACC,GAAN,CAAU,WAAV,EAAuB,CAACC,GAAD,EAAsBC,GAAtB,EAAqCC,IAArC,KAAqE;AAC1F,UAAMG,QAAQ,GAAGL,GAAG,CAACM,WAAJ,CAAgBC,IAAjC,CAD0F,CAE1F;AACA;AACA;AACA;AACA;;AAEAV,IAAAA,KAAK,CAAC,qBAAD,EAAwBQ,QAAxB,CAAL;AACA,WAAOH,IAAI,CAAC;AAAEG,MAAAA,QAAQ,EAAEA;AAAZ,KAAD,CAAX;AACD,GAVD;AAWD","sourcesContent":["import buildDebug from 'debug';\nimport { Response, Router } from 'express';\n\nimport { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:user');\n\nexport default function (route: Router): void {\n route.get('/whoami', (req: $RequestExtend, res: Response, next: $NextFunctionVer): void => {\n debug('whoami: reditect');\n if (req.headers.referer === 'whoami') {\n const username = req.remote_user.name;\n // FIXME: this service should return 401 if user missing\n // if (!username) {\n // debug('whoami: user not found');\n // return next(getUnauthorized('Unauthorized'));\n // }\n debug('whoami: logged by user');\n return next({ username: username });\n } else {\n debug('whoami: redirect next route');\n // redirect to the route below\n return next('route');\n }\n });\n\n route.get('/-/whoami', (req: $RequestExtend, res: Response, next: $NextFunctionVer): any => {\n const username = req.remote_user.name;\n // FIXME: this service should return 401 if user missing\n // if (!username) {\n // debug('whoami: user not found');\n // return next(getUnauthorized('Unauthorized'));\n // }\n\n debug('whoami: response %o', username);\n return next({ username: username });\n });\n}\n"],"file":"whoami.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/api",
3
- "version": "6.0.0-6-next.15",
3
+ "version": "6.0.0-6-next.19",
4
4
  "description": "loaders logic",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -25,34 +25,33 @@
25
25
  "verdaccio"
26
26
  ],
27
27
  "engines": {
28
- "node": ">=10",
28
+ "node": ">=14",
29
29
  "npm": ">=6"
30
30
  },
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
- "@verdaccio/auth": "6.0.0-6-next.12",
34
- "@verdaccio/commons-api": "11.0.0-6-next.4",
35
- "@verdaccio/config": "6.0.0-6-next.8",
36
- "@verdaccio/core": "6.0.0-6-next.1",
37
- "@verdaccio/hooks": "6.0.0-6-next.7",
38
- "@verdaccio/logger": "6.0.0-6-next.5",
39
- "@verdaccio/middleware": "6.0.0-6-next.12",
40
- "@verdaccio/store": "6.0.0-6-next.13",
41
- "@verdaccio/tarball": "11.0.0-6-next.7",
42
- "@verdaccio/utils": "6.0.0-6-next.6",
33
+ "@verdaccio/auth": "6.0.0-6-next.16",
34
+ "@verdaccio/config": "6.0.0-6-next.12",
35
+ "@verdaccio/core": "6.0.0-6-next.4",
36
+ "@verdaccio/hooks": "6.0.0-6-next.10",
37
+ "@verdaccio/logger": "6.0.0-6-next.8",
38
+ "@verdaccio/middleware": "6.0.0-6-next.16",
39
+ "@verdaccio/store": "6.0.0-6-next.17",
40
+ "@verdaccio/utils": "6.0.0-6-next.10",
41
+ "abortcontroller-polyfill": "1.7.3",
43
42
  "cookies": "0.8.0",
44
- "debug": "4.3.2",
43
+ "debug": "4.3.3",
44
+ "body-parser": "1.19.1",
45
45
  "express": "4.17.1",
46
46
  "lodash": "4.17.21",
47
- "mime": "2.5.2",
47
+ "mime": "2.6.0",
48
48
  "semver": "7.3.5"
49
49
  },
50
50
  "devDependencies": {
51
- "@types/node": "16.9.1",
52
- "@verdaccio/server": "6.0.0-6-next.20",
53
- "@verdaccio/types": "11.0.0-6-next.8",
54
- "body-parser": "1.19.0",
55
- "lodash": "4.17.21",
51
+ "@types/node": "16.11.12",
52
+ "@verdaccio/server": "6.0.0-6-next.24",
53
+ "@verdaccio/types": "11.0.0-6-next.10",
54
+ "@verdaccio/helper": "1.0.0",
56
55
  "supertest": "6.1.6"
57
56
  },
58
57
  "funding": {
package/src/dist-tags.ts CHANGED
@@ -1,12 +1,13 @@
1
- import mime from 'mime';
2
- import _ from 'lodash';
3
1
  import { Router } from 'express';
2
+ import _ from 'lodash';
3
+ import mime from 'mime';
4
4
 
5
- import { media, allow } from '@verdaccio/middleware';
6
- import { API_MESSAGE, HTTP_STATUS, DIST_TAGS, VerdaccioError } from '@verdaccio/commons-api';
7
- import { Package } from '@verdaccio/types';
8
- import { Storage } from '@verdaccio/store';
9
5
  import { IAuth } from '@verdaccio/auth';
6
+ import { VerdaccioError, constants } from '@verdaccio/core';
7
+ import { allow, media } from '@verdaccio/middleware';
8
+ import { Storage } from '@verdaccio/store';
9
+ import { Package } from '@verdaccio/types';
10
+
10
11
  import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';
11
12
 
12
13
  export default function (route: Router, auth: IAuth, storage: Storage): void {
@@ -26,8 +27,8 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
26
27
  if (err) {
27
28
  return next(err);
28
29
  }
29
- res.status(HTTP_STATUS.CREATED);
30
- return next({ ok: API_MESSAGE.TAG_ADDED });
30
+ res.status(constants.HTTP_STATUS.CREATED);
31
+ return next({ ok: constants.API_MESSAGE.TAG_ADDED });
31
32
  });
32
33
  };
33
34
 
@@ -58,9 +59,9 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
58
59
  if (err) {
59
60
  return next(err);
60
61
  }
61
- res.status(HTTP_STATUS.CREATED);
62
+ res.status(constants.HTTP_STATUS.CREATED);
62
63
  return next({
63
- ok: API_MESSAGE.TAG_REMOVED,
64
+ ok: constants.API_MESSAGE.TAG_REMOVED,
64
65
  });
65
66
  });
66
67
  }
@@ -79,7 +80,7 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
79
80
  return next(err);
80
81
  }
81
82
 
82
- next(info[DIST_TAGS]);
83
+ next(info[constants.DIST_TAGS]);
83
84
  },
84
85
  });
85
86
  }
@@ -96,9 +97,9 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
96
97
  if (err) {
97
98
  return next(err);
98
99
  }
99
- res.status(HTTP_STATUS.CREATED);
100
+ res.status(constants.HTTP_STATUS.CREATED);
100
101
  return next({
101
- ok: API_MESSAGE.TAG_UPDATED,
102
+ ok: constants.API_MESSAGE.TAG_UPDATED,
102
103
  });
103
104
  }
104
105
  );
package/src/index.ts CHANGED
@@ -1,27 +1,33 @@
1
+ import bodyParser from 'body-parser';
1
2
  import express, { Router } from 'express';
3
+ import semver from 'semver';
4
+
5
+ import { IAuth } from '@verdaccio/auth';
2
6
  import {
7
+ antiLoop,
8
+ encodeScopePackage,
3
9
  match,
4
10
  validateName,
5
11
  validatePackage,
6
- encodeScopePackage,
7
- antiLoop,
8
12
  } from '@verdaccio/middleware';
9
- import { IAuth } from '@verdaccio/auth';
10
13
  import { Storage } from '@verdaccio/store';
11
14
  import { Config } from '@verdaccio/types';
12
- import bodyParser from 'body-parser';
13
15
 
14
- import whoami from './whoami';
15
- import ping from './ping';
16
- import user from './user';
17
16
  import distTags from './dist-tags';
17
+ import pkg from './package';
18
+ import ping from './ping';
18
19
  import publish from './publish';
19
20
  import search from './search';
20
- import pkg from './package';
21
21
  import stars from './stars';
22
+ import user from './user';
22
23
  import profile from './v1/profile';
23
- import token from './v1/token';
24
24
  import v1Search from './v1/search';
25
+ import token from './v1/token';
26
+ import whoami from './whoami';
27
+
28
+ if (semver.lte(process.version, 'v15.0.0')) {
29
+ global.AbortController = require('abortcontroller-polyfill/dist/cjs-ponyfill').AbortController;
30
+ }
25
31
 
26
32
  export default function (config: Config, auth: IAuth, storage: Storage): Router {
27
33
  /* eslint new-cap:off */
@@ -50,7 +56,7 @@ export default function (config: Config, auth: IAuth, storage: Storage): Router
50
56
  app.use(encodeScopePackage);
51
57
  // for "npm whoami"
52
58
  whoami(app);
53
- pkg(app, auth, storage, config);
59
+ pkg(app, auth, storage);
54
60
  profile(app, auth);
55
61
  // @deprecated endpoint, 404 by default
56
62
  search(app);