@verdaccio/api 9.0.0-next-9.2 → 9.0.0-next-9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/_virtual/_rolldown/runtime.js +23 -0
- package/build/dist-tags.d.ts +4 -4
- package/build/dist-tags.js +52 -124
- package/build/dist-tags.js.map +1 -1
- package/build/dist-tags.mjs +52 -0
- package/build/dist-tags.mjs.map +1 -0
- package/build/index.d.ts +4 -4
- package/build/index.js +61 -78
- package/build/index.js.map +1 -1
- package/build/index.mjs +59 -0
- package/build/index.mjs.map +1 -0
- package/build/package.d.ts +3 -3
- package/build/package.js +69 -120
- package/build/package.js.map +1 -1
- package/build/package.mjs +69 -0
- package/build/package.mjs.map +1 -0
- package/build/ping.d.ts +1 -1
- package/build/ping.js +10 -11
- package/build/ping.js.map +1 -1
- package/build/ping.mjs +11 -0
- package/build/ping.mjs.map +1 -0
- package/build/publish.d.ts +4 -4
- package/build/publish.js +192 -268
- package/build/publish.js.map +1 -1
- package/build/publish.mjs +196 -0
- package/build/publish.mjs.map +1 -0
- package/build/search.d.ts +1 -1
- package/build/search.js +13 -17
- package/build/search.js.map +1 -1
- package/build/search.mjs +14 -0
- package/build/search.mjs.map +1 -0
- package/build/stars.d.ts +2 -2
- package/build/stars.js +21 -59
- package/build/stars.js.map +1 -1
- package/build/stars.mjs +21 -0
- package/build/stars.mjs.map +1 -0
- package/build/user.d.ts +3 -3
- package/build/user.js +106 -188
- package/build/user.js.map +1 -1
- package/build/user.mjs +106 -0
- package/build/user.mjs.map +1 -0
- package/build/v1/login.d.ts +4 -4
- package/build/v1/login.js +115 -246
- package/build/v1/login.js.map +1 -1
- package/build/v1/login.mjs +115 -0
- package/build/v1/login.mjs.map +1 -0
- package/build/v1/profile.d.ts +3 -3
- package/build/v1/profile.js +45 -67
- package/build/v1/profile.js.map +1 -1
- package/build/v1/profile.mjs +45 -0
- package/build/v1/profile.mjs.map +1 -0
- package/build/v1/search.d.ts +3 -3
- package/build/v1/search.js +64 -113
- package/build/v1/search.js.map +1 -1
- package/build/v1/search.mjs +64 -0
- package/build/v1/search.mjs.map +1 -0
- package/build/v1/token.d.ts +4 -4
- package/build/v1/token.js +100 -201
- package/build/v1/token.js.map +1 -1
- package/build/v1/token.mjs +102 -0
- package/build/v1/token.mjs.map +1 -0
- package/build/whoami.d.ts +1 -1
- package/build/whoami.js +20 -25
- package/build/whoami.js.map +1 -1
- package/build/whoami.mjs +20 -0
- package/build/whoami.mjs.map +1 -0
- package/package.json +25 -14
package/build/v1/token.js
CHANGED
|
@@ -1,205 +1,104 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var _auth = require("@verdaccio/auth");
|
|
9
|
-
var _core = require("@verdaccio/core");
|
|
10
|
-
var _middleware = require("@verdaccio/middleware");
|
|
11
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
12
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
13
|
-
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
14
|
-
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
|
15
|
-
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
16
|
-
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
17
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
18
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
19
|
-
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
20
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
21
|
-
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
22
|
-
// npm expects "cidr_whitelist" for token list
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.js");
|
|
2
|
+
let _verdaccio_middleware = require("@verdaccio/middleware");
|
|
3
|
+
let lodash = require("lodash");
|
|
4
|
+
lodash = require_runtime.__toESM(lodash);
|
|
5
|
+
let _verdaccio_core = require("@verdaccio/core");
|
|
6
|
+
let _verdaccio_auth = require("@verdaccio/auth");
|
|
7
|
+
//#region src/v1/token.ts
|
|
23
8
|
function normalizeToken(token) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
9
|
+
return {
|
|
10
|
+
...token,
|
|
11
|
+
cidr_whitelist: token.cidr || [],
|
|
12
|
+
created: new Date(token.created).toISOString()
|
|
13
|
+
};
|
|
28
14
|
}
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
throw _core.errorUtils.getInternalError();
|
|
116
|
-
case 4:
|
|
117
|
-
key = _core.cryptoUtils.stringToMD5(token); // TODO: use a utility here
|
|
118
|
-
maskedToken = _core.cryptoUtils.mask(token, 5);
|
|
119
|
-
created = new Date().getTime();
|
|
120
|
-
/**
|
|
121
|
-
* cidr_whitelist: is not being used, we pass it through
|
|
122
|
-
* token: we do not store the real token (it is generated once and retrieved
|
|
123
|
-
* to the user), just a mask of it.
|
|
124
|
-
*/
|
|
125
|
-
saveToken = {
|
|
126
|
-
user: name,
|
|
127
|
-
token: maskedToken,
|
|
128
|
-
key: key,
|
|
129
|
-
cidr: cidr_whitelist,
|
|
130
|
-
readonly: readonly,
|
|
131
|
-
created: created
|
|
132
|
-
};
|
|
133
|
-
_context2.n = 5;
|
|
134
|
-
return storage.saveToken(saveToken);
|
|
135
|
-
case 5:
|
|
136
|
-
logger.debug({
|
|
137
|
-
key: key,
|
|
138
|
-
name: name
|
|
139
|
-
}, 'token @{key} was created for user @{name}');
|
|
140
|
-
res.set(_core.HEADERS.CACHE_CONTROL, 'no-cache, no-store');
|
|
141
|
-
return _context2.a(2, next(normalizeToken({
|
|
142
|
-
token: token,
|
|
143
|
-
user: name,
|
|
144
|
-
key: saveToken.key,
|
|
145
|
-
cidr: cidr_whitelist,
|
|
146
|
-
readonly: readonly,
|
|
147
|
-
created: saveToken.created
|
|
148
|
-
})));
|
|
149
|
-
case 6:
|
|
150
|
-
_context2.p = 6;
|
|
151
|
-
_t2 = _context2.v;
|
|
152
|
-
logger.error({
|
|
153
|
-
error: _t2.msg
|
|
154
|
-
}, 'token creation has failed: @{error}');
|
|
155
|
-
return _context2.a(2, next(_core.errorUtils.getInternalError(_t2.message)));
|
|
156
|
-
}
|
|
157
|
-
}, _callee2, null, [[2, 6]]);
|
|
158
|
-
}));
|
|
159
|
-
return function (_x4, _x5) {
|
|
160
|
-
return _ref2.apply(this, arguments);
|
|
161
|
-
};
|
|
162
|
-
}());
|
|
163
|
-
});
|
|
164
|
-
route["delete"](_middleware.TOKEN_API_ENDPOINTS.delete_token, (0, _middleware.rateLimit)(config === null || config === void 0 ? void 0 : config.userRateLimit), /*#__PURE__*/function () {
|
|
165
|
-
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(req, res, next) {
|
|
166
|
-
var tokenKey, name, _t3;
|
|
167
|
-
return _regenerator().w(function (_context3) {
|
|
168
|
-
while (1) switch (_context3.p = _context3.n) {
|
|
169
|
-
case 0:
|
|
170
|
-
tokenKey = req.params.tokenKey;
|
|
171
|
-
name = req.remote_user.name;
|
|
172
|
-
if (!(_lodash["default"].isNil(name) === false)) {
|
|
173
|
-
_context3.n = 4;
|
|
174
|
-
break;
|
|
175
|
-
}
|
|
176
|
-
logger.debug({
|
|
177
|
-
name: name
|
|
178
|
-
}, '@{name} has requested remove a token');
|
|
179
|
-
_context3.p = 1;
|
|
180
|
-
_context3.n = 2;
|
|
181
|
-
return storage.deleteToken(name, tokenKey);
|
|
182
|
-
case 2:
|
|
183
|
-
logger.info({
|
|
184
|
-
tokenKey: tokenKey,
|
|
185
|
-
name: name
|
|
186
|
-
}, 'token id @{tokenKey} was revoked for user @{name}');
|
|
187
|
-
return _context3.a(2, next({}));
|
|
188
|
-
case 3:
|
|
189
|
-
_context3.p = 3;
|
|
190
|
-
_t3 = _context3.v;
|
|
191
|
-
logger.error({
|
|
192
|
-
error: _t3.msg
|
|
193
|
-
}, 'token creation has failed: @{error}');
|
|
194
|
-
return _context3.a(2, next(_core.errorUtils.getCode(_core.HTTP_STATUS.INTERNAL_ERROR, _t3.message)));
|
|
195
|
-
case 4:
|
|
196
|
-
return _context3.a(2, next(_core.errorUtils.getUnauthorized()));
|
|
197
|
-
}
|
|
198
|
-
}, _callee3, null, [[1, 3]]);
|
|
199
|
-
}));
|
|
200
|
-
return function (_x6, _x7, _x8) {
|
|
201
|
-
return _ref3.apply(this, arguments);
|
|
202
|
-
};
|
|
203
|
-
}());
|
|
15
|
+
function token_default(route, auth, storage, config, logger) {
|
|
16
|
+
route.get(_verdaccio_middleware.TOKEN_API_ENDPOINTS.get_tokens, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), async function(req, res, next) {
|
|
17
|
+
const { name } = req.remote_user;
|
|
18
|
+
if (lodash.default.isNil(name) === false) try {
|
|
19
|
+
const tokens = await storage.readTokens({ user: name });
|
|
20
|
+
const totalTokens = tokens.length;
|
|
21
|
+
logger.debug({ totalTokens }, "token list retrieved: @{totalTokens}");
|
|
22
|
+
res.status(_verdaccio_core.HTTP_STATUS.OK);
|
|
23
|
+
return next({
|
|
24
|
+
objects: tokens.map(normalizeToken),
|
|
25
|
+
urls: { next: "" }
|
|
26
|
+
});
|
|
27
|
+
} catch (error) {
|
|
28
|
+
logger.error({ error: error.msg }, "token list has failed: @{error}");
|
|
29
|
+
return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.INTERNAL_ERROR, error.message));
|
|
30
|
+
}
|
|
31
|
+
return next(_verdaccio_core.errorUtils.getUnauthorized());
|
|
32
|
+
});
|
|
33
|
+
route.post(_verdaccio_middleware.TOKEN_API_ENDPOINTS.get_tokens, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), function(req, res, next) {
|
|
34
|
+
const { password, readonly, cidr_whitelist } = req.body;
|
|
35
|
+
const { name } = req.remote_user;
|
|
36
|
+
if (!lodash.default.isBoolean(readonly) || !lodash.default.isArray(cidr_whitelist)) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.BAD_DATA, _verdaccio_core.SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
|
|
37
|
+
auth.authenticate(name, password, async (err, user) => {
|
|
38
|
+
if (err) {
|
|
39
|
+
const errorCode = err.message ? _verdaccio_core.HTTP_STATUS.UNAUTHORIZED : _verdaccio_core.HTTP_STATUS.INTERNAL_ERROR;
|
|
40
|
+
return next(_verdaccio_core.errorUtils.getCode(errorCode, err.message));
|
|
41
|
+
}
|
|
42
|
+
req.remote_user = user;
|
|
43
|
+
if (!lodash.default.isFunction(storage.saveToken)) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.NOT_IMPLEMENTED, _verdaccio_core.SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
|
|
44
|
+
try {
|
|
45
|
+
const token = await (0, _verdaccio_auth.getApiToken)(auth, config, user, password);
|
|
46
|
+
if (!token) throw _verdaccio_core.errorUtils.getInternalError();
|
|
47
|
+
const key = _verdaccio_core.cryptoUtils.stringToMD5(token);
|
|
48
|
+
/**
|
|
49
|
+
* cidr_whitelist: is not being used, we pass it through
|
|
50
|
+
* token: we do not store the real token (it is generated once and retrieved
|
|
51
|
+
* to the user), just a mask of it.
|
|
52
|
+
*/
|
|
53
|
+
const saveToken = {
|
|
54
|
+
user: name,
|
|
55
|
+
token: _verdaccio_core.cryptoUtils.mask(token, 5),
|
|
56
|
+
key,
|
|
57
|
+
cidr: cidr_whitelist,
|
|
58
|
+
readonly,
|
|
59
|
+
created: (/* @__PURE__ */ new Date()).getTime()
|
|
60
|
+
};
|
|
61
|
+
await storage.saveToken(saveToken);
|
|
62
|
+
logger.debug({
|
|
63
|
+
key,
|
|
64
|
+
name
|
|
65
|
+
}, "token @{key} was created for user @{name}");
|
|
66
|
+
res.set(_verdaccio_core.HEADERS.CACHE_CONTROL, "no-cache, no-store");
|
|
67
|
+
return next(normalizeToken({
|
|
68
|
+
token,
|
|
69
|
+
user: name,
|
|
70
|
+
key: saveToken.key,
|
|
71
|
+
cidr: cidr_whitelist,
|
|
72
|
+
readonly,
|
|
73
|
+
created: saveToken.created
|
|
74
|
+
}));
|
|
75
|
+
} catch (error) {
|
|
76
|
+
logger.error({ error: error.msg }, "token creation has failed: @{error}");
|
|
77
|
+
return next(_verdaccio_core.errorUtils.getInternalError(error.message));
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
route.delete(_verdaccio_middleware.TOKEN_API_ENDPOINTS.delete_token, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), async (req, res, next) => {
|
|
82
|
+
const { params: { tokenKey } } = req;
|
|
83
|
+
const { name } = req.remote_user;
|
|
84
|
+
if (lodash.default.isNil(name) === false) {
|
|
85
|
+
logger.debug({ name }, "@{name} has requested remove a token");
|
|
86
|
+
try {
|
|
87
|
+
await storage.deleteToken(name, tokenKey);
|
|
88
|
+
logger.info({
|
|
89
|
+
tokenKey,
|
|
90
|
+
name
|
|
91
|
+
}, "token id @{tokenKey} was revoked for user @{name}");
|
|
92
|
+
return next({});
|
|
93
|
+
} catch (error) {
|
|
94
|
+
logger.error({ error: error.msg }, "token creation has failed: @{error}");
|
|
95
|
+
return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.INTERNAL_ERROR, error.message));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return next(_verdaccio_core.errorUtils.getUnauthorized());
|
|
99
|
+
});
|
|
204
100
|
}
|
|
101
|
+
//#endregion
|
|
102
|
+
exports.default = token_default;
|
|
103
|
+
|
|
205
104
|
//# sourceMappingURL=token.js.map
|
package/build/v1/token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","names":["_lodash","_interopRequireDefault","require","_auth","_core","_middleware","e","__esModule","_typeof","o","Symbol","iterator","constructor","prototype","_regenerator","t","r","n","toStringTag","i","c","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","_objectSpread","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","_toPrimitive","toPrimitive","String","Number","normalizeToken","token","cidr_whitelist","cidr","created","Date","toISOString","_default","route","auth","storage","config","logger","get","TOKEN_API_ENDPOINTS","get_tokens","rateLimit","userRateLimit","_ref","_callee","req","res","next","name","tokens","totalTokens","_t","_context","remote_user","_","isNil","readTokens","user","debug","status","HTTP_STATUS","OK","objects","map","urls","error","msg","errorUtils","getCode","INTERNAL_ERROR","message","getUnauthorized","_x","_x2","_x3","post","_req$body","body","password","readonly","isBoolean","isArray","BAD_DATA","SUPPORT_ERRORS","PARAMETERS_NOT_VALID","authenticate","_ref2","_callee2","err","errorCode","key","maskedToken","saveToken","_t2","_context2","UNAUTHORIZED","isFunction","NOT_IMPLEMENTED","STORAGE_NOT_IMPLEMENT","getApiToken","getInternalError","cryptoUtils","stringToMD5","mask","getTime","set","HEADERS","CACHE_CONTROL","_x4","_x5","delete_token","_ref3","_callee3","tokenKey","_t3","_context3","params","deleteToken","info","_x6","_x7","_x8"],"sources":["../../src/v1/token.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { getApiToken } from '@verdaccio/auth';\nimport { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from '@verdaccio/core';\nimport { TOKEN_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Config, Logger, RemoteUser, Token } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n cidr_whitelist: string[];\n created: string;\n};\n\n// npm expects \"cidr_whitelist\" for token list\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n cidr_whitelist: token.cidr || [],\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 (\n route: Router,\n auth: Auth,\n storage: Storage,\n config: Config,\n logger: Logger\n): void {\n route.get(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\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 TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\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 as RemoteUser, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = cryptoUtils.stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = cryptoUtils.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 res.set(HEADERS.CACHE_CONTROL, 'no-cache, no-store');\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 TOKEN_API_ENDPOINTS.delete_token,\n rateLimit(config?.userRateLimit),\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"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"token.js","names":[],"sources":["../../src/v1/token.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { getApiToken } from '@verdaccio/auth';\nimport { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from '@verdaccio/core';\nimport { TOKEN_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Config, Logger, RemoteUser, Token } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n cidr_whitelist: string[];\n created: string;\n};\n\n// npm expects \"cidr_whitelist\" for token list\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n cidr_whitelist: token.cidr || [],\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 (\n route: Router,\n auth: Auth,\n storage: Storage,\n config: Config,\n logger: Logger\n): void {\n route.get(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\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 TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\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 as RemoteUser, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = cryptoUtils.stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = cryptoUtils.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 res.set(HEADERS.CACHE_CONTROL, 'no-cache, no-store');\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 TOKEN_API_ENDPOINTS.delete_token,\n rateLimit(config?.userRateLimit),\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"],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { TOKEN_API_ENDPOINTS, rateLimit } from "@verdaccio/middleware";
|
|
2
|
+
import _ from "lodash";
|
|
3
|
+
import { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from "@verdaccio/core";
|
|
4
|
+
import { getApiToken } from "@verdaccio/auth";
|
|
5
|
+
//#region src/v1/token.ts
|
|
6
|
+
function normalizeToken(token) {
|
|
7
|
+
return {
|
|
8
|
+
...token,
|
|
9
|
+
cidr_whitelist: token.cidr || [],
|
|
10
|
+
created: new Date(token.created).toISOString()
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function token_default(route, auth, storage, config, logger) {
|
|
14
|
+
route.get(TOKEN_API_ENDPOINTS.get_tokens, rateLimit(config?.userRateLimit), async function(req, res, next) {
|
|
15
|
+
const { name } = req.remote_user;
|
|
16
|
+
if (_.isNil(name) === false) try {
|
|
17
|
+
const tokens = await storage.readTokens({ user: name });
|
|
18
|
+
const totalTokens = tokens.length;
|
|
19
|
+
logger.debug({ totalTokens }, "token list retrieved: @{totalTokens}");
|
|
20
|
+
res.status(HTTP_STATUS.OK);
|
|
21
|
+
return next({
|
|
22
|
+
objects: tokens.map(normalizeToken),
|
|
23
|
+
urls: { next: "" }
|
|
24
|
+
});
|
|
25
|
+
} catch (error) {
|
|
26
|
+
logger.error({ error: error.msg }, "token list has failed: @{error}");
|
|
27
|
+
return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));
|
|
28
|
+
}
|
|
29
|
+
return next(errorUtils.getUnauthorized());
|
|
30
|
+
});
|
|
31
|
+
route.post(TOKEN_API_ENDPOINTS.get_tokens, rateLimit(config?.userRateLimit), function(req, res, next) {
|
|
32
|
+
const { password, readonly, cidr_whitelist } = req.body;
|
|
33
|
+
const { name } = req.remote_user;
|
|
34
|
+
if (!_.isBoolean(readonly) || !_.isArray(cidr_whitelist)) return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
|
|
35
|
+
auth.authenticate(name, password, async (err, user) => {
|
|
36
|
+
if (err) {
|
|
37
|
+
const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;
|
|
38
|
+
return next(errorUtils.getCode(errorCode, err.message));
|
|
39
|
+
}
|
|
40
|
+
req.remote_user = user;
|
|
41
|
+
if (!_.isFunction(storage.saveToken)) return next(errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
|
|
42
|
+
try {
|
|
43
|
+
const token = await getApiToken(auth, config, user, password);
|
|
44
|
+
if (!token) throw errorUtils.getInternalError();
|
|
45
|
+
const key = cryptoUtils.stringToMD5(token);
|
|
46
|
+
/**
|
|
47
|
+
* cidr_whitelist: is not being used, we pass it through
|
|
48
|
+
* token: we do not store the real token (it is generated once and retrieved
|
|
49
|
+
* to the user), just a mask of it.
|
|
50
|
+
*/
|
|
51
|
+
const saveToken = {
|
|
52
|
+
user: name,
|
|
53
|
+
token: cryptoUtils.mask(token, 5),
|
|
54
|
+
key,
|
|
55
|
+
cidr: cidr_whitelist,
|
|
56
|
+
readonly,
|
|
57
|
+
created: (/* @__PURE__ */ new Date()).getTime()
|
|
58
|
+
};
|
|
59
|
+
await storage.saveToken(saveToken);
|
|
60
|
+
logger.debug({
|
|
61
|
+
key,
|
|
62
|
+
name
|
|
63
|
+
}, "token @{key} was created for user @{name}");
|
|
64
|
+
res.set(HEADERS.CACHE_CONTROL, "no-cache, no-store");
|
|
65
|
+
return next(normalizeToken({
|
|
66
|
+
token,
|
|
67
|
+
user: name,
|
|
68
|
+
key: saveToken.key,
|
|
69
|
+
cidr: cidr_whitelist,
|
|
70
|
+
readonly,
|
|
71
|
+
created: saveToken.created
|
|
72
|
+
}));
|
|
73
|
+
} catch (error) {
|
|
74
|
+
logger.error({ error: error.msg }, "token creation has failed: @{error}");
|
|
75
|
+
return next(errorUtils.getInternalError(error.message));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
route.delete(TOKEN_API_ENDPOINTS.delete_token, rateLimit(config?.userRateLimit), async (req, res, next) => {
|
|
80
|
+
const { params: { tokenKey } } = req;
|
|
81
|
+
const { name } = req.remote_user;
|
|
82
|
+
if (_.isNil(name) === false) {
|
|
83
|
+
logger.debug({ name }, "@{name} has requested remove a token");
|
|
84
|
+
try {
|
|
85
|
+
await storage.deleteToken(name, tokenKey);
|
|
86
|
+
logger.info({
|
|
87
|
+
tokenKey,
|
|
88
|
+
name
|
|
89
|
+
}, "token id @{tokenKey} was revoked for user @{name}");
|
|
90
|
+
return next({});
|
|
91
|
+
} catch (error) {
|
|
92
|
+
logger.error({ error: error.msg }, "token creation has failed: @{error}");
|
|
93
|
+
return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return next(errorUtils.getUnauthorized());
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { token_default as default };
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=token.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.mjs","names":[],"sources":["../../src/v1/token.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { getApiToken } from '@verdaccio/auth';\nimport { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from '@verdaccio/core';\nimport { TOKEN_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Config, Logger, RemoteUser, Token } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n cidr_whitelist: string[];\n created: string;\n};\n\n// npm expects \"cidr_whitelist\" for token list\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n cidr_whitelist: token.cidr || [],\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 (\n route: Router,\n auth: Auth,\n storage: Storage,\n config: Config,\n logger: Logger\n): void {\n route.get(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\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 TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\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 as RemoteUser, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = cryptoUtils.stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = cryptoUtils.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 res.set(HEADERS.CACHE_CONTROL, 'no-cache, no-store');\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 TOKEN_API_ENDPOINTS.delete_token,\n rateLimit(config?.userRateLimit),\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"],"mappings":"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"}
|
package/build/whoami.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Router } from 'express';
|
|
2
2
|
export default function (route: Router): void;
|
package/build/whoami.js
CHANGED
|
@@ -1,27 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
debug('whoami: user not found');
|
|
19
|
-
return next(_core.errorUtils.getUnauthorized('Unauthorized'));
|
|
20
|
-
}
|
|
21
|
-
debug('whoami: response %o', username);
|
|
22
|
-
return next({
|
|
23
|
-
username: username
|
|
24
|
-
});
|
|
25
|
-
});
|
|
1
|
+
const require_runtime = require("./_virtual/_rolldown/runtime.js");
|
|
2
|
+
let debug = require("debug");
|
|
3
|
+
debug = require_runtime.__toESM(debug);
|
|
4
|
+
let _verdaccio_middleware = require("@verdaccio/middleware");
|
|
5
|
+
let _verdaccio_core = require("@verdaccio/core");
|
|
6
|
+
//#region src/whoami.ts
|
|
7
|
+
var debug$1 = (0, debug.default)("verdaccio:api:user");
|
|
8
|
+
function whoami_default(route) {
|
|
9
|
+
route.get(_verdaccio_middleware.USER_API_ENDPOINTS.whoami, (req, _res, next) => {
|
|
10
|
+
const username = req?.remote_user?.name;
|
|
11
|
+
if (!username) {
|
|
12
|
+
debug$1("whoami: user not found");
|
|
13
|
+
return next(_verdaccio_core.errorUtils.getUnauthorized("Unauthorized"));
|
|
14
|
+
}
|
|
15
|
+
debug$1("whoami: response %o", username);
|
|
16
|
+
return next({ username });
|
|
17
|
+
});
|
|
26
18
|
}
|
|
19
|
+
//#endregion
|
|
20
|
+
exports.default = whoami_default;
|
|
21
|
+
|
|
27
22
|
//# sourceMappingURL=whoami.js.map
|
package/build/whoami.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","names":[
|
|
1
|
+
{"version":3,"file":"whoami.js","names":[],"sources":["../src/whoami.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport type { Response, Router } from 'express';\n\nimport { errorUtils } from '@verdaccio/core';\nimport { USER_API_ENDPOINTS } from '@verdaccio/middleware';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:user');\n\nexport default function (route: Router): void {\n route.get(\n USER_API_ENDPOINTS.whoami,\n (req: $RequestExtend, _res: Response, next: $NextFunctionVer): any => {\n // remote_user is set by the auth middleware\n const username = req?.remote_user?.name;\n if (!username) {\n debug('whoami: user not found');\n return next(errorUtils.getUnauthorized('Unauthorized'));\n }\n\n debug('whoami: response %o', username);\n return next({ username: username });\n }\n );\n}\n"],"mappings":";;;;;;AAQA,IAAM,WAAA,GAAA,MAAA,SAAmB,qBAAqB;AAE9C,SAAA,eAAyB,OAAqB;AAC5C,OAAM,IACJ,sBAAA,mBAAmB,SAClB,KAAqB,MAAgB,SAAgC;EAEpE,MAAM,WAAW,KAAK,aAAa;AACnC,MAAI,CAAC,UAAU;AACb,WAAM,yBAAyB;AAC/B,UAAO,KAAK,gBAAA,WAAW,gBAAgB,eAAe,CAAC;;AAGzD,UAAM,uBAAuB,SAAS;AACtC,SAAO,KAAK,EAAY,UAAU,CAAC;GAEtC"}
|
package/build/whoami.mjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import buildDebug from "debug";
|
|
2
|
+
import { USER_API_ENDPOINTS } from "@verdaccio/middleware";
|
|
3
|
+
import { errorUtils } from "@verdaccio/core";
|
|
4
|
+
//#region src/whoami.ts
|
|
5
|
+
var debug = buildDebug("verdaccio:api:user");
|
|
6
|
+
function whoami_default(route) {
|
|
7
|
+
route.get(USER_API_ENDPOINTS.whoami, (req, _res, next) => {
|
|
8
|
+
const username = req?.remote_user?.name;
|
|
9
|
+
if (!username) {
|
|
10
|
+
debug("whoami: user not found");
|
|
11
|
+
return next(errorUtils.getUnauthorized("Unauthorized"));
|
|
12
|
+
}
|
|
13
|
+
debug("whoami: response %o", username);
|
|
14
|
+
return next({ username });
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { whoami_default as default };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=whoami.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.mjs","names":[],"sources":["../src/whoami.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport type { Response, Router } from 'express';\n\nimport { errorUtils } from '@verdaccio/core';\nimport { USER_API_ENDPOINTS } from '@verdaccio/middleware';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:user');\n\nexport default function (route: Router): void {\n route.get(\n USER_API_ENDPOINTS.whoami,\n (req: $RequestExtend, _res: Response, next: $NextFunctionVer): any => {\n // remote_user is set by the auth middleware\n const username = req?.remote_user?.name;\n if (!username) {\n debug('whoami: user not found');\n return next(errorUtils.getUnauthorized('Unauthorized'));\n }\n\n debug('whoami: response %o', username);\n return next({ username: username });\n }\n );\n}\n"],"mappings":";;;;AAQA,IAAM,QAAQ,WAAW,qBAAqB;AAE9C,SAAA,eAAyB,OAAqB;AAC5C,OAAM,IACJ,mBAAmB,SAClB,KAAqB,MAAgB,SAAgC;EAEpE,MAAM,WAAW,KAAK,aAAa;AACnC,MAAI,CAAC,UAAU;AACb,SAAM,yBAAyB;AAC/B,UAAO,KAAK,WAAW,gBAAgB,eAAe,CAAC;;AAGzD,QAAM,uBAAuB,SAAS;AACtC,SAAO,KAAK,EAAY,UAAU,CAAC;GAEtC"}
|