@coopenomics/extension-kit 2026.9.4 → 2026.9.8-1

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 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
- // passport бросает на отсутствии/невалидном токене — гасим в null,
96
- // запрос продолжается как гостевой.
97
- handleRequest(_err, user) {
98
- return user ?? null;
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
- * токена, оставляет `request.user` пустым. Для запросов, доступных и гостю,
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(_err: any, user: any): any;
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
- * токена, оставляет `request.user` пустым. Для запросов, доступных и гостю,
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(_err: any, user: any): any;
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
- * токена, оставляет `request.user` пустым. Для запросов, доступных и гостю,
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(_err: any, user: any): any;
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
- // passport бросает на отсутствии/невалидном токене — гасим в null,
88
- // запрос продолжается как гостевой.
89
- handleRequest(_err, user) {
90
- return user ?? null;
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",
4
+ "version": "2026.9.8-1",
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.4",
41
+ "@coopenomics/sdk": "2026.9.8-1",
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.4",
71
+ "cooptypes": "2026.9.8-1",
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": "3d15a5767af4453fa943e301783d0d2ed3e1dd16"
83
+ "gitHead": "b123c4bd8d4fc234ccb2a15105832390e8fa4fbc"
84
84
  }