@hed-hog/core 0.0.382 → 0.0.384
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/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +14 -0
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/mcp/decorators/allow-mcp-token.decorator.d.ts +3 -0
- package/dist/mcp/decorators/allow-mcp-token.decorator.d.ts.map +1 -0
- package/dist/mcp/decorators/allow-mcp-token.decorator.js +10 -0
- package/dist/mcp/decorators/allow-mcp-token.decorator.js.map +1 -0
- package/dist/mcp/mcp.controller.d.ts.map +1 -1
- package/dist/mcp/mcp.controller.js +2 -0
- package/dist/mcp/mcp.controller.js.map +1 -1
- package/package.json +3 -3
- package/src/auth/guards/auth.guard.spec.ts +49 -1
- package/src/auth/guards/auth.guard.ts +15 -0
- package/src/mcp/decorators/allow-mcp-token.decorator.ts +7 -0
- package/src/mcp/mcp.controller.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/auth.guard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,gBAAgB,EAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/auth.guard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,gBAAgB,EAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,qBACa,SAAU,YAAW,WAAW;IAIzC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IANlB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;gBAG3C,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,eAAe;IAG7B,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;YAoFhD,YAAY;IAwB1B,OAAO,CAAC,sBAAsB;CAK/B"}
|
|
@@ -16,6 +16,7 @@ const api_locale_1 = require("@hed-hog/api-locale");
|
|
|
16
16
|
const api_prisma_1 = require("@hed-hog/api-prisma");
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
18
|
const core_1 = require("@nestjs/core");
|
|
19
|
+
const allow_mcp_token_decorator_1 = require("../../mcp/decorators/allow-mcp-token.decorator");
|
|
19
20
|
const security_service_1 = require("../../security/security.service");
|
|
20
21
|
const token_service_1 = require("../../token/token.service");
|
|
21
22
|
let AuthGuard = AuthGuard_1 = class AuthGuard {
|
|
@@ -40,12 +41,25 @@ let AuthGuard = AuthGuard_1 = class AuthGuard {
|
|
|
40
41
|
context.getHandler(),
|
|
41
42
|
context.getClass(),
|
|
42
43
|
]);
|
|
44
|
+
const allowMcpToken = this.reflector.getAllAndOverride(allow_mcp_token_decorator_1.ALLOW_MCP_TOKEN, [
|
|
45
|
+
context.getHandler(),
|
|
46
|
+
context.getClass(),
|
|
47
|
+
]);
|
|
43
48
|
const request = context.switchToHttp().getRequest();
|
|
44
49
|
const token = this.extractTokenFromHeader(request);
|
|
45
50
|
const locale = request.headers['locale'] || request.headers['accept-language'] || 'en';
|
|
46
51
|
if (token === null || token === void 0 ? void 0 : token.startsWith('hedhog_api_')) {
|
|
47
52
|
return this.verifyApiKey(request, token, isPublic);
|
|
48
53
|
}
|
|
54
|
+
if (token === null || token === void 0 ? void 0 : token.startsWith('hedhog_mcp_')) {
|
|
55
|
+
if (allowMcpToken) {
|
|
56
|
+
// Real validation (mcp_api_key lookup) happens in McpAuthGuard on /mcp.
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (isPublic)
|
|
60
|
+
return true;
|
|
61
|
+
throw new common_1.UnauthorizedException('Invalid API key');
|
|
62
|
+
}
|
|
49
63
|
// If endpoint requires role/authentication and no token provided
|
|
50
64
|
if (!token) {
|
|
51
65
|
if (isPublic) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../../src/auth/guards/auth.guard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../../src/auth/guards/auth.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allow-mcp-token.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/allow-mcp-token.decorator.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C,wBAAgB,aAAa,qDAE5B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ALLOW_MCP_TOKEN = void 0;
|
|
4
|
+
exports.AllowMcpToken = AllowMcpToken;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
exports.ALLOW_MCP_TOKEN = 'allowMcpToken';
|
|
7
|
+
function AllowMcpToken() {
|
|
8
|
+
return (0, common_1.SetMetadata)(exports.ALLOW_MCP_TOKEN, true);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=allow-mcp-token.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allow-mcp-token.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/allow-mcp-token.decorator.ts"],"names":[],"mappings":";;;AAIA,sCAEC;AAND,2CAA6C;AAEhC,QAAA,eAAe,GAAG,eAAe,CAAC;AAE/C,SAAgB,aAAa;IAC3B,OAAO,IAAA,oBAAW,EAAC,uBAAe,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.controller.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.controller.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,qBAIa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,cAAc;IAIpC,MAAM,CAAQ,GAAG,EAAE,OAAO,EAAS,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBvE"}
|
|
@@ -16,6 +16,7 @@ exports.McpController = void 0;
|
|
|
16
16
|
const api_1 = require("@hed-hog/api");
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
18
|
const setting_service_1 = require("../setting/setting.service");
|
|
19
|
+
const allow_mcp_token_decorator_1 = require("./decorators/allow-mcp-token.decorator");
|
|
19
20
|
const mcp_auth_guard_1 = require("./guards/mcp-auth.guard");
|
|
20
21
|
const mcp_permission_guard_1 = require("./guards/mcp-permission.guard");
|
|
21
22
|
const mcp_server_service_1 = require("./mcp-server.service");
|
|
@@ -54,6 +55,7 @@ __decorate([
|
|
|
54
55
|
], McpController.prototype, "handle", null);
|
|
55
56
|
exports.McpController = McpController = __decorate([
|
|
56
57
|
(0, api_1.NoRole)(),
|
|
58
|
+
(0, allow_mcp_token_decorator_1.AllowMcpToken)(),
|
|
57
59
|
(0, common_1.UseGuards)(mcp_auth_guard_1.McpAuthGuard, mcp_permission_guard_1.McpPermissionGuard),
|
|
58
60
|
(0, common_1.Controller)('mcp'),
|
|
59
61
|
__metadata("design:paramtypes", [mcp_server_service_1.McpServerService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.controller.js","sourceRoot":"","sources":["../../src/mcp/mcp.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sCAAsC;AACtC,2CAAsE;AAEtE,gEAA4D;AAC5D,4DAAuD;AACvD,wEAAmE;AACnE,6DAAwD;
|
|
1
|
+
{"version":3,"file":"mcp.controller.js","sourceRoot":"","sources":["../../src/mcp/mcp.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sCAAsC;AACtC,2CAAsE;AAEtE,gEAA4D;AAC5D,sFAAuE;AACvE,4DAAuD;AACvD,wEAAmE;AACnE,6DAAwD;AAMjD,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YACmB,SAA2B,EAC3B,OAAuB;QADvB,cAAS,GAAT,SAAS,CAAkB;QAC3B,YAAO,GAAP,OAAO,CAAgB;IACvC,CAAC;IAGE,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAY,EAAS,GAAa;;QACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACtE,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,CAAC;YACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAI,GAAW,CAAC,IAAI,CAAC;QAC/B,MAAM,MAAM,GACV,MAAA,MAAA,MAAA,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,mCAAI,IAAI,CAAC;QACvE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAW,CAAC;QAC7B,MAAM,QAAQ,GACZ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,MAAK,YAAY,CAAC,CAAC,CAAC,CAAC,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,0CAAE,IAAI,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,GAAG;YAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACjC,MAAM;YACN,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AA5BY,sCAAa;AAOlB;IADL,IAAA,YAAG,GAAE;IACQ,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;2CAoBvC;wBA3BU,aAAa;IAJzB,IAAA,YAAM,GAAE;IACR,IAAA,yCAAa,GAAE;IACf,IAAA,kBAAS,EAAC,6BAAY,EAAE,yCAAkB,CAAC;IAC3C,IAAA,mBAAU,EAAC,KAAK,CAAC;qCAGc,qCAAgB;QAClB,gCAAc;GAH/B,aAAa,CA4BzB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hed-hog/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.384",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
"uuid": "^11.1.0",
|
|
44
44
|
"@hed-hog/api-prisma": "0.0.6",
|
|
45
45
|
"@hed-hog/api-mail": "0.0.9",
|
|
46
|
+
"@hed-hog/api-locale": "0.0.14",
|
|
46
47
|
"@hed-hog/api": "0.0.8",
|
|
47
48
|
"@hed-hog/api-types": "0.0.1",
|
|
48
|
-
"@hed-hog/api-pagination": "0.0.7"
|
|
49
|
-
"@hed-hog/api-locale": "0.0.14"
|
|
49
|
+
"@hed-hog/api-pagination": "0.0.7"
|
|
50
50
|
},
|
|
51
51
|
"exports": {
|
|
52
52
|
".": {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, jest } from '@jest/globals';
|
|
2
2
|
import { UnauthorizedException } from '@nestjs/common';
|
|
3
3
|
import { IS_PUBLIC_KEY, WITH_NO_ROLE, WITH_ROLE } from '@hed-hog/api';
|
|
4
|
+
import { ALLOW_MCP_TOKEN } from '../../mcp/decorators/allow-mcp-token.decorator';
|
|
4
5
|
import { AuthGuard } from './auth.guard';
|
|
5
6
|
|
|
6
7
|
const makeContext = (request: any) => ({
|
|
@@ -29,12 +30,18 @@ const makeService = (deps = makeDeps()) => ({
|
|
|
29
30
|
|
|
30
31
|
const setMeta = (
|
|
31
32
|
reflector: any,
|
|
32
|
-
meta: {
|
|
33
|
+
meta: {
|
|
34
|
+
public?: boolean;
|
|
35
|
+
withRole?: boolean;
|
|
36
|
+
withNoRole?: boolean;
|
|
37
|
+
allowMcpToken?: boolean;
|
|
38
|
+
},
|
|
33
39
|
) => {
|
|
34
40
|
reflector.getAllAndOverride.mockImplementation((key: any) => {
|
|
35
41
|
if (key === IS_PUBLIC_KEY) return meta.public;
|
|
36
42
|
if (key === WITH_ROLE) return meta.withRole;
|
|
37
43
|
if (key === WITH_NO_ROLE) return meta.withNoRole;
|
|
44
|
+
if (key === ALLOW_MCP_TOKEN) return meta.allowMcpToken;
|
|
38
45
|
return undefined;
|
|
39
46
|
});
|
|
40
47
|
};
|
|
@@ -174,4 +181,45 @@ describe('AuthGuard', () => {
|
|
|
174
181
|
);
|
|
175
182
|
});
|
|
176
183
|
});
|
|
184
|
+
|
|
185
|
+
describe('mcp token (hedhog_mcp_)', () => {
|
|
186
|
+
it('defere para o McpAuthGuard quando a rota permite (allowMcpToken)', async () => {
|
|
187
|
+
const { guard, deps } = makeService();
|
|
188
|
+
setMeta(deps.reflector, { allowMcpToken: true });
|
|
189
|
+
const request: any = {
|
|
190
|
+
headers: { authorization: 'Bearer hedhog_mcp_x' },
|
|
191
|
+
};
|
|
192
|
+
await expect(guard.canActivate(makeContext(request) as any)).resolves.toBe(
|
|
193
|
+
true,
|
|
194
|
+
);
|
|
195
|
+
expect(deps.token.verify).not.toHaveBeenCalled();
|
|
196
|
+
expect(deps.prisma.mcp_api_key.findFirst).not.toHaveBeenCalled();
|
|
197
|
+
expect(request.auth).toBeUndefined();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('nega em rota sem allowMcpToken, sem tentar validar como JWT', async () => {
|
|
201
|
+
const { guard, deps } = makeService();
|
|
202
|
+
setMeta(deps.reflector, {});
|
|
203
|
+
const request: any = {
|
|
204
|
+
headers: { authorization: 'Bearer hedhog_mcp_x' },
|
|
205
|
+
method: 'GET',
|
|
206
|
+
url: '/profile',
|
|
207
|
+
};
|
|
208
|
+
await expect(guard.canActivate(makeContext(request) as any)).rejects.toThrow(
|
|
209
|
+
UnauthorizedException,
|
|
210
|
+
);
|
|
211
|
+
expect(deps.token.verify).not.toHaveBeenCalled();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('permite em rota pública sem allowMcpToken', async () => {
|
|
215
|
+
const { guard, deps } = makeService();
|
|
216
|
+
setMeta(deps.reflector, { public: true });
|
|
217
|
+
const request: any = {
|
|
218
|
+
headers: { authorization: 'Bearer hedhog_mcp_x' },
|
|
219
|
+
};
|
|
220
|
+
await expect(guard.canActivate(makeContext(request) as any)).resolves.toBe(
|
|
221
|
+
true,
|
|
222
|
+
);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
177
225
|
});
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from '@nestjs/common';
|
|
11
11
|
import { Reflector } from '@nestjs/core';
|
|
12
12
|
import { Request } from 'express';
|
|
13
|
+
import { ALLOW_MCP_TOKEN } from '../../mcp/decorators/allow-mcp-token.decorator';
|
|
13
14
|
import { SecurityService } from '../../security/security.service';
|
|
14
15
|
import { TokenService } from '../../token/token.service';
|
|
15
16
|
|
|
@@ -40,6 +41,11 @@ export class AuthGuard implements CanActivate {
|
|
|
40
41
|
context.getClass(),
|
|
41
42
|
]);
|
|
42
43
|
|
|
44
|
+
const allowMcpToken = this.reflector.getAllAndOverride<boolean>(ALLOW_MCP_TOKEN, [
|
|
45
|
+
context.getHandler(),
|
|
46
|
+
context.getClass(),
|
|
47
|
+
]);
|
|
48
|
+
|
|
43
49
|
const request = context.switchToHttp().getRequest();
|
|
44
50
|
const token = this.extractTokenFromHeader(request);
|
|
45
51
|
const locale = request.headers['locale'] || request.headers['accept-language'] || 'en';
|
|
@@ -48,6 +54,15 @@ export class AuthGuard implements CanActivate {
|
|
|
48
54
|
return this.verifyApiKey(request, token, isPublic);
|
|
49
55
|
}
|
|
50
56
|
|
|
57
|
+
if (token?.startsWith('hedhog_mcp_')) {
|
|
58
|
+
if (allowMcpToken) {
|
|
59
|
+
// Real validation (mcp_api_key lookup) happens in McpAuthGuard on /mcp.
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (isPublic) return true;
|
|
63
|
+
throw new UnauthorizedException('Invalid API key');
|
|
64
|
+
}
|
|
65
|
+
|
|
51
66
|
// If endpoint requires role/authentication and no token provided
|
|
52
67
|
if (!token) {
|
|
53
68
|
if (isPublic) {
|
|
@@ -2,11 +2,13 @@ import { NoRole } from '@hed-hog/api';
|
|
|
2
2
|
import { All, Controller, Req, Res, UseGuards } from '@nestjs/common';
|
|
3
3
|
import { Request, Response } from 'express';
|
|
4
4
|
import { SettingService } from '../setting/setting.service';
|
|
5
|
+
import { AllowMcpToken } from './decorators/allow-mcp-token.decorator';
|
|
5
6
|
import { McpAuthGuard } from './guards/mcp-auth.guard';
|
|
6
7
|
import { McpPermissionGuard } from './guards/mcp-permission.guard';
|
|
7
8
|
import { McpServerService } from './mcp-server.service';
|
|
8
9
|
|
|
9
10
|
@NoRole()
|
|
11
|
+
@AllowMcpToken()
|
|
10
12
|
@UseGuards(McpAuthGuard, McpPermissionGuard)
|
|
11
13
|
@Controller('mcp')
|
|
12
14
|
export class McpController {
|