@coopenomics/extension-kit 2026.9.4 → 2026.9.8-2
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/index.cjs +15 -4
- package/dist/index.d.cts +13 -5
- package/dist/index.d.mts +13 -5
- package/dist/index.d.ts +13 -5
- package/dist/index.mjs +15 -4
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -87,15 +87,26 @@ exports.GqlJwtAuthGuard = class GqlJwtAuthGuard extends passport.AuthGuard("jwt"
|
|
|
87
87
|
exports.GqlJwtAuthGuard = __decorateClass$g([
|
|
88
88
|
common.Injectable()
|
|
89
89
|
], exports.GqlJwtAuthGuard);
|
|
90
|
+
function hasAuthorizationHeader(headers) {
|
|
91
|
+
const value = headers?.authorization ?? headers?.Authorization;
|
|
92
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
93
|
+
}
|
|
90
94
|
exports.OptionalGqlJwtAuthGuard = class OptionalGqlJwtAuthGuard extends passport.AuthGuard("jwt") {
|
|
91
95
|
getRequest(context) {
|
|
92
96
|
const ctx = graphql.GqlExecutionContext.create(context);
|
|
93
97
|
return ctx.getContext().req;
|
|
94
98
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
handleRequest(err, user, _info, context) {
|
|
100
|
+
if (user) {
|
|
101
|
+
return user;
|
|
102
|
+
}
|
|
103
|
+
if (!hasAuthorizationHeader(this.getRequest(context)?.headers)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (err instanceof Error) {
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
throw new common.UnauthorizedException("\u0421\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0430\u044F \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F");
|
|
99
110
|
}
|
|
100
111
|
};
|
|
101
112
|
exports.OptionalGqlJwtAuthGuard = __decorateClass$g([
|
package/dist/index.d.cts
CHANGED
|
@@ -58,13 +58,22 @@ declare class GqlJwtAuthGuard extends GqlJwtAuthGuard_base {
|
|
|
58
58
|
}
|
|
59
59
|
declare const OptionalGqlJwtAuthGuard_base: _nestjs_passport.Type<_nestjs_passport.IAuthGuard>;
|
|
60
60
|
/**
|
|
61
|
-
* Опциональный JWT-гард для GraphQL:
|
|
62
|
-
*
|
|
63
|
-
*
|
|
61
|
+
* Опциональный JWT-гард для GraphQL: для запросов, доступных и гостю, и пайщику,
|
|
62
|
+
* где состав ответа зависит от того, кто спрашивает.
|
|
63
|
+
*
|
|
64
|
+
* Различает два случая, которые раньше сливались в один:
|
|
65
|
+
* - заголовка Authorization нет — гость, `request.user` пустой, запрос идёт дальше;
|
|
66
|
+
* - заголовок есть, но токен негоден (истёк, подделан, сессия завершена) — отказ.
|
|
67
|
+
*
|
|
68
|
+
* Молчаливое понижение до гостя здесь вредно: клиент, который представился,
|
|
69
|
+
* получал ответ «для незнакомца» с кодом 200 и принимал его за свой. Так рабочий
|
|
70
|
+
* стол приезжал без единого права, и пайщика уводило на «Недостаточно прав
|
|
71
|
+
* доступа». Отказ клиент умеет обрабатывать — обновить токен или войти заново;
|
|
72
|
+
* гостевой ответ он от настоящего отличить не может.
|
|
64
73
|
*/
|
|
65
74
|
declare class OptionalGqlJwtAuthGuard extends OptionalGqlJwtAuthGuard_base {
|
|
66
75
|
getRequest(context: ExecutionContext): any;
|
|
67
|
-
handleRequest(
|
|
76
|
+
handleRequest(err: any, user: any, _info: any, context: ExecutionContext): any;
|
|
68
77
|
}
|
|
69
78
|
declare const HttpJwtAuthGuard_base: _nestjs_passport.Type<_nestjs_passport.IAuthGuard>;
|
|
70
79
|
/** JWT-гард для обычных HTTP-ручек (не GraphQL). */
|
|
@@ -687,7 +696,6 @@ declare function isExtensionAvailable(availability: ExtensionAvailability, isMai
|
|
|
687
696
|
* презентационные данные в домен.
|
|
688
697
|
*/
|
|
689
698
|
interface IRegistryExtension {
|
|
690
|
-
is_builtin: boolean;
|
|
691
699
|
availability: ExtensionAvailability;
|
|
692
700
|
is_internal: boolean;
|
|
693
701
|
desktops?: IDesktopConfig[];
|
package/dist/index.d.mts
CHANGED
|
@@ -58,13 +58,22 @@ declare class GqlJwtAuthGuard extends GqlJwtAuthGuard_base {
|
|
|
58
58
|
}
|
|
59
59
|
declare const OptionalGqlJwtAuthGuard_base: _nestjs_passport.Type<_nestjs_passport.IAuthGuard>;
|
|
60
60
|
/**
|
|
61
|
-
* Опциональный JWT-гард для GraphQL:
|
|
62
|
-
*
|
|
63
|
-
*
|
|
61
|
+
* Опциональный JWT-гард для GraphQL: для запросов, доступных и гостю, и пайщику,
|
|
62
|
+
* где состав ответа зависит от того, кто спрашивает.
|
|
63
|
+
*
|
|
64
|
+
* Различает два случая, которые раньше сливались в один:
|
|
65
|
+
* - заголовка Authorization нет — гость, `request.user` пустой, запрос идёт дальше;
|
|
66
|
+
* - заголовок есть, но токен негоден (истёк, подделан, сессия завершена) — отказ.
|
|
67
|
+
*
|
|
68
|
+
* Молчаливое понижение до гостя здесь вредно: клиент, который представился,
|
|
69
|
+
* получал ответ «для незнакомца» с кодом 200 и принимал его за свой. Так рабочий
|
|
70
|
+
* стол приезжал без единого права, и пайщика уводило на «Недостаточно прав
|
|
71
|
+
* доступа». Отказ клиент умеет обрабатывать — обновить токен или войти заново;
|
|
72
|
+
* гостевой ответ он от настоящего отличить не может.
|
|
64
73
|
*/
|
|
65
74
|
declare class OptionalGqlJwtAuthGuard extends OptionalGqlJwtAuthGuard_base {
|
|
66
75
|
getRequest(context: ExecutionContext): any;
|
|
67
|
-
handleRequest(
|
|
76
|
+
handleRequest(err: any, user: any, _info: any, context: ExecutionContext): any;
|
|
68
77
|
}
|
|
69
78
|
declare const HttpJwtAuthGuard_base: _nestjs_passport.Type<_nestjs_passport.IAuthGuard>;
|
|
70
79
|
/** JWT-гард для обычных HTTP-ручек (не GraphQL). */
|
|
@@ -687,7 +696,6 @@ declare function isExtensionAvailable(availability: ExtensionAvailability, isMai
|
|
|
687
696
|
* презентационные данные в домен.
|
|
688
697
|
*/
|
|
689
698
|
interface IRegistryExtension {
|
|
690
|
-
is_builtin: boolean;
|
|
691
699
|
availability: ExtensionAvailability;
|
|
692
700
|
is_internal: boolean;
|
|
693
701
|
desktops?: IDesktopConfig[];
|
package/dist/index.d.ts
CHANGED
|
@@ -58,13 +58,22 @@ declare class GqlJwtAuthGuard extends GqlJwtAuthGuard_base {
|
|
|
58
58
|
}
|
|
59
59
|
declare const OptionalGqlJwtAuthGuard_base: _nestjs_passport.Type<_nestjs_passport.IAuthGuard>;
|
|
60
60
|
/**
|
|
61
|
-
* Опциональный JWT-гард для GraphQL:
|
|
62
|
-
*
|
|
63
|
-
*
|
|
61
|
+
* Опциональный JWT-гард для GraphQL: для запросов, доступных и гостю, и пайщику,
|
|
62
|
+
* где состав ответа зависит от того, кто спрашивает.
|
|
63
|
+
*
|
|
64
|
+
* Различает два случая, которые раньше сливались в один:
|
|
65
|
+
* - заголовка Authorization нет — гость, `request.user` пустой, запрос идёт дальше;
|
|
66
|
+
* - заголовок есть, но токен негоден (истёк, подделан, сессия завершена) — отказ.
|
|
67
|
+
*
|
|
68
|
+
* Молчаливое понижение до гостя здесь вредно: клиент, который представился,
|
|
69
|
+
* получал ответ «для незнакомца» с кодом 200 и принимал его за свой. Так рабочий
|
|
70
|
+
* стол приезжал без единого права, и пайщика уводило на «Недостаточно прав
|
|
71
|
+
* доступа». Отказ клиент умеет обрабатывать — обновить токен или войти заново;
|
|
72
|
+
* гостевой ответ он от настоящего отличить не может.
|
|
64
73
|
*/
|
|
65
74
|
declare class OptionalGqlJwtAuthGuard extends OptionalGqlJwtAuthGuard_base {
|
|
66
75
|
getRequest(context: ExecutionContext): any;
|
|
67
|
-
handleRequest(
|
|
76
|
+
handleRequest(err: any, user: any, _info: any, context: ExecutionContext): any;
|
|
68
77
|
}
|
|
69
78
|
declare const HttpJwtAuthGuard_base: _nestjs_passport.Type<_nestjs_passport.IAuthGuard>;
|
|
70
79
|
/** JWT-гард для обычных HTTP-ручек (не GraphQL). */
|
|
@@ -687,7 +696,6 @@ declare function isExtensionAvailable(availability: ExtensionAvailability, isMai
|
|
|
687
696
|
* презентационные данные в домен.
|
|
688
697
|
*/
|
|
689
698
|
interface IRegistryExtension {
|
|
690
|
-
is_builtin: boolean;
|
|
691
699
|
availability: ExtensionAvailability;
|
|
692
700
|
is_internal: boolean;
|
|
693
701
|
desktops?: IDesktopConfig[];
|
package/dist/index.mjs
CHANGED
|
@@ -79,15 +79,26 @@ let GqlJwtAuthGuard = class extends AuthGuard("jwt") {
|
|
|
79
79
|
GqlJwtAuthGuard = __decorateClass$g([
|
|
80
80
|
Injectable()
|
|
81
81
|
], GqlJwtAuthGuard);
|
|
82
|
+
function hasAuthorizationHeader(headers) {
|
|
83
|
+
const value = headers?.authorization ?? headers?.Authorization;
|
|
84
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
85
|
+
}
|
|
82
86
|
let OptionalGqlJwtAuthGuard = class extends AuthGuard("jwt") {
|
|
83
87
|
getRequest(context) {
|
|
84
88
|
const ctx = GqlExecutionContext.create(context);
|
|
85
89
|
return ctx.getContext().req;
|
|
86
90
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
+
handleRequest(err, user, _info, context) {
|
|
92
|
+
if (user) {
|
|
93
|
+
return user;
|
|
94
|
+
}
|
|
95
|
+
if (!hasAuthorizationHeader(this.getRequest(context)?.headers)) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
if (err instanceof Error) {
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
throw new UnauthorizedException("\u0421\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0430\u044F \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F");
|
|
91
102
|
}
|
|
92
103
|
};
|
|
93
104
|
OptionalGqlJwtAuthGuard = __decorateClass$g([
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coopenomics/extension-kit",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2026.9.
|
|
4
|
+
"version": "2026.9.8-2",
|
|
5
5
|
"description": "Служебный каркас расширения цифрового кооператива: базовый модуль, сущности и репозитории расширения, авторизация, каркас блокчейн-синхронизации, контракт миграций схемы, контракт реестра",
|
|
6
6
|
"author": "Alex Ant <dacom.dark.sun@gmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"typecheck": "tsc --noEmit"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@coopenomics/sdk": "2026.9.
|
|
41
|
+
"@coopenomics/sdk": "2026.9.8-2",
|
|
42
42
|
"@nestjs/common": "^10.0.0",
|
|
43
43
|
"@nestjs/core": "^10.0.0",
|
|
44
44
|
"@nestjs/graphql": "^12.2.1",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"@wharfkit/session": "^1.4.0",
|
|
69
69
|
"class-transformer": "^0.5.1",
|
|
70
70
|
"class-validator": "^0.14.1",
|
|
71
|
-
"cooptypes": "2026.9.
|
|
71
|
+
"cooptypes": "2026.9.8-2",
|
|
72
72
|
"graphql": "^16.9.0",
|
|
73
73
|
"graphql-type-json": "^0.3.2",
|
|
74
74
|
"moment": "^2.30.1",
|
|
@@ -80,5 +80,5 @@
|
|
|
80
80
|
"unbuild": "^2.0.0",
|
|
81
81
|
"zod": "^3.0.0"
|
|
82
82
|
},
|
|
83
|
-
"gitHead": "
|
|
83
|
+
"gitHead": "aa442a861e12e5577e8e58caef5d17a4331efec3"
|
|
84
84
|
}
|