@coopenomics/extension-kit 2026.9.16-1 → 2026.9.18
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 +33 -4
- package/dist/index.d.cts +58 -3
- package/dist/index.d.mts +58 -3
- package/dist/index.d.ts +58 -3
- package/dist/index.mjs +32 -6
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -4,6 +4,7 @@ const common = require('@nestjs/common');
|
|
|
4
4
|
const graphql = require('@nestjs/graphql');
|
|
5
5
|
const core = require('@nestjs/core');
|
|
6
6
|
const passport = require('@nestjs/passport');
|
|
7
|
+
const node_crypto = require('node:crypto');
|
|
7
8
|
const zod = require('zod');
|
|
8
9
|
const classValidator = require('class-validator');
|
|
9
10
|
const classTransformer = require('class-transformer');
|
|
@@ -14,6 +15,7 @@ const moment = require('moment');
|
|
|
14
15
|
const moment$1 = require('moment-timezone');
|
|
15
16
|
require('moment/locale/ru');
|
|
16
17
|
const crypto = require('crypto');
|
|
18
|
+
const cooptypes = require('cooptypes');
|
|
17
19
|
|
|
18
20
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
19
21
|
|
|
@@ -21,10 +23,17 @@ const moment__default = /*#__PURE__*/_interopDefaultCompat(moment);
|
|
|
21
23
|
const moment__default$1 = /*#__PURE__*/_interopDefaultCompat(moment$1);
|
|
22
24
|
const crypto__default = /*#__PURE__*/_interopDefaultCompat(crypto);
|
|
23
25
|
|
|
26
|
+
const ROLES_DENY_SELF_KEY = "roles_deny_self";
|
|
27
|
+
const ROLES_ANY_STATUS_KEY = "roles_any_status";
|
|
24
28
|
function AuthRoles(roles, options = {}) {
|
|
25
29
|
const self = options.self ?? [];
|
|
26
30
|
const args = self.length ? `roles: ${JSON.stringify(roles)}, self: ${JSON.stringify(self)}` : `roles: ${JSON.stringify(roles)}`;
|
|
27
|
-
|
|
31
|
+
const decorators = [common.SetMetadata("roles", roles), graphql.Directive(`@auth(${args})`)];
|
|
32
|
+
if (options.allowSelf === false)
|
|
33
|
+
decorators.push(common.SetMetadata(ROLES_DENY_SELF_KEY, true));
|
|
34
|
+
if (options.anyStatus === true)
|
|
35
|
+
decorators.push(common.SetMetadata(ROLES_ANY_STATUS_KEY, true));
|
|
36
|
+
return common.applyDecorators(...decorators);
|
|
28
37
|
}
|
|
29
38
|
const CurrentUser = common.createParamDecorator((data, context) => {
|
|
30
39
|
const ctx = graphql.GqlExecutionContext.create(context);
|
|
@@ -48,7 +57,12 @@ function configureExtensionAuth(options) {
|
|
|
48
57
|
function hasServerSecret(headers) {
|
|
49
58
|
if (!serverSecret)
|
|
50
59
|
return false;
|
|
51
|
-
|
|
60
|
+
const provided = headers?.["server-secret"];
|
|
61
|
+
if (typeof provided !== "string")
|
|
62
|
+
return false;
|
|
63
|
+
const a = Buffer.from(provided);
|
|
64
|
+
const b = Buffer.from(serverSecret);
|
|
65
|
+
return a.length === b.length && node_crypto.timingSafeEqual(a, b);
|
|
52
66
|
}
|
|
53
67
|
|
|
54
68
|
var __defProp$g = Object.defineProperty;
|
|
@@ -63,6 +77,8 @@ var __decorateClass$g = (decorators, target, key, kind) => {
|
|
|
63
77
|
return result;
|
|
64
78
|
};
|
|
65
79
|
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
80
|
+
const ACTIVE_USER_STATUS = "active";
|
|
81
|
+
const PARTICIPANT_ROLE = "user";
|
|
66
82
|
exports.GqlJwtAuthGuard = class GqlJwtAuthGuard extends passport.AuthGuard("jwt") {
|
|
67
83
|
getRequest(context) {
|
|
68
84
|
const ctx = graphql.GqlExecutionContext.create(context);
|
|
@@ -149,10 +165,15 @@ exports.RolesGuard = class RolesGuard {
|
|
|
149
165
|
const args = ctx.getArgs();
|
|
150
166
|
const data = args.data;
|
|
151
167
|
const filter = args.filter;
|
|
152
|
-
|
|
168
|
+
const denySelf = this.reflector.get(ROLES_DENY_SELF_KEY, context.getHandler()) === true;
|
|
169
|
+
if (!denySelf && (data && data.username && user.username === data.username || filter && filter.username && user.username === filter.username || args.username && user.username === args.username)) {
|
|
153
170
|
return true;
|
|
154
171
|
}
|
|
155
172
|
if (allowedRoles.includes(user.role)) {
|
|
173
|
+
const anyStatus = this.reflector.get(ROLES_ANY_STATUS_KEY, context.getHandler()) === true;
|
|
174
|
+
if (user.role === PARTICIPANT_ROLE && !anyStatus && user.status !== ACTIVE_USER_STATUS) {
|
|
175
|
+
throw new common.ForbiddenException("\u0414\u043E\u0441\u0442\u0443\u043F \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043F\u0430\u0439\u0449\u0438\u043A\u043E\u0432 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430");
|
|
176
|
+
}
|
|
156
177
|
return true;
|
|
157
178
|
}
|
|
158
179
|
throw new common.UnauthorizedException(`\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430`);
|
|
@@ -162,7 +183,6 @@ exports.RolesGuard = __decorateClass$g([
|
|
|
162
183
|
common.Injectable(),
|
|
163
184
|
__decorateParam(0, common.Inject(core.Reflector))
|
|
164
185
|
], exports.RolesGuard);
|
|
165
|
-
const ACTIVE_USER_STATUS = "active";
|
|
166
186
|
exports.ActiveUserStatusGuard = class ActiveUserStatusGuard {
|
|
167
187
|
canActivate(context) {
|
|
168
188
|
const ctx = graphql.GqlExecutionContext.create(context);
|
|
@@ -1894,6 +1914,12 @@ function generateHashFromString(input) {
|
|
|
1894
1914
|
return crypto__default.createHash("sha256").update(input).digest("hex");
|
|
1895
1915
|
}
|
|
1896
1916
|
|
|
1917
|
+
function sanitizeUserText(value) {
|
|
1918
|
+
if (typeof value !== "string" || !value)
|
|
1919
|
+
return value;
|
|
1920
|
+
return cooptypes._Common.Text.sanitizeEditorMarkdown(value);
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1897
1923
|
function rethrowChainError(error) {
|
|
1898
1924
|
const raw = error?.message ?? String(error);
|
|
1899
1925
|
const match = raw.match(/assertion failure with message: (.+?)(?:\n|$)/);
|
|
@@ -1929,6 +1955,8 @@ exports.OptionalCurrentUser = OptionalCurrentUser;
|
|
|
1929
1955
|
exports.PaginationResult = PaginationResult;
|
|
1930
1956
|
exports.PaginationUtils = PaginationUtils;
|
|
1931
1957
|
exports.QuantityUtils = QuantityUtils;
|
|
1958
|
+
exports.ROLES_ANY_STATUS_KEY = ROLES_ANY_STATUS_KEY;
|
|
1959
|
+
exports.ROLES_DENY_SELF_KEY = ROLES_DENY_SELF_KEY;
|
|
1932
1960
|
exports.UseBucket = UseBucket;
|
|
1933
1961
|
exports.bucketProvidersFor = bucketProvidersFor;
|
|
1934
1962
|
exports.bucketTokenFor = bucketTokenFor;
|
|
@@ -1955,5 +1983,6 @@ exports.redactSecretConfig = redactSecretConfig;
|
|
|
1955
1983
|
exports.registerExtensionEntities = registerExtensionEntities;
|
|
1956
1984
|
exports.resetExtensionEntities = resetExtensionEntities;
|
|
1957
1985
|
exports.rethrowChainError = rethrowChainError;
|
|
1986
|
+
exports.sanitizeUserText = sanitizeUserText;
|
|
1958
1987
|
exports.verifySignedDocumentAgainstStoredDraft = verifySignedDocumentAgainstStoredDraft;
|
|
1959
1988
|
exports.waitAfterTransactBeforeChainTableRead = waitAfterTransactBeforeChainTableRead;
|
package/dist/index.d.cts
CHANGED
|
@@ -16,7 +16,28 @@ import { Cooperative } from 'cooptypes';
|
|
|
16
16
|
*/
|
|
17
17
|
interface AuthRolesOptions {
|
|
18
18
|
self?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Пускает ли `RolesGuard` пайщика без нужной роли, когда `username` в
|
|
21
|
+
* аргументах — он сам. По умолчанию да: так пайщик читает свои записи и
|
|
22
|
+
* подаёт свои заявления. Для полномочий совета, где `username` — адресат
|
|
23
|
+
* действия (подтвердить соглашение, внести данные, импортировать вклад),
|
|
24
|
+
* ставится `false`: иначе пайщик выполнил бы его над собой.
|
|
25
|
+
*/
|
|
26
|
+
allowSelf?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
|
|
29
|
+
* исключил). По умолчанию нет: `user` в списке ролей означает «принятый
|
|
30
|
+
* пайщик», и учётная запись со статусом вступления по роли не проходит —
|
|
31
|
+
* иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
|
|
32
|
+
* `true` — для того, что нужно и кандидату: входящие уведомления о ходе
|
|
33
|
+
* его же заявления.
|
|
34
|
+
*/
|
|
35
|
+
anyStatus?: boolean;
|
|
19
36
|
}
|
|
37
|
+
/** Ключ метаданных: самообход `RolesGuard` запрещён. */
|
|
38
|
+
declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
|
|
39
|
+
/** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
|
|
40
|
+
declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
|
|
20
41
|
/**
|
|
21
42
|
* Ограничение доступа к резолверу или к отдельному полю объекта.
|
|
22
43
|
*
|
|
@@ -87,8 +108,14 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
|
|
|
87
108
|
* 1. Валидный `server-secret` — доступ разрешён.
|
|
88
109
|
* 2. Роли не заданы — доступ открыт.
|
|
89
110
|
* 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
|
|
90
|
-
* либо плоским аргументом совпадает с `user.username`) —
|
|
91
|
-
*
|
|
111
|
+
* либо плоским аргументом совпадает с `user.username`) — разрешено, если
|
|
112
|
+
* операция не объявила `AuthRoles(..., { allowSelf: false })`.
|
|
113
|
+
* 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
|
|
114
|
+
* при этом означает принятого пайщика: учётная запись в статусе вступления
|
|
115
|
+
* или исключения по ней не проходит (если операция не объявила
|
|
116
|
+
* `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
|
|
117
|
+
* любом статусе: членов совета, заведённых при установке, цепь в
|
|
118
|
+
* `active` не переводит.
|
|
92
119
|
* 5. Иначе — отказ.
|
|
93
120
|
*/
|
|
94
121
|
declare class RolesGuard implements CanActivate {
|
|
@@ -822,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
|
|
|
822
849
|
* Необязательное поле.
|
|
823
850
|
*/
|
|
824
851
|
maxRows?: number;
|
|
852
|
+
/**
|
|
853
|
+
* Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
|
|
854
|
+
* растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
|
|
855
|
+
* что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
|
|
856
|
+
* Необязательное поле.
|
|
857
|
+
*/
|
|
858
|
+
minRows?: number;
|
|
859
|
+
/**
|
|
860
|
+
* Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
|
|
861
|
+
* поле не выглядело пустым. Исчезает, как только человек начинает ввод.
|
|
862
|
+
* Необязательное поле.
|
|
863
|
+
*/
|
|
864
|
+
placeholder?: string;
|
|
825
865
|
/**
|
|
826
866
|
* Добавляет текст после значения поля в интерфейсе (например, символ валюты).
|
|
827
867
|
* Необязательное поле.
|
|
@@ -1494,6 +1534,21 @@ declare class CurrencyValidationUtil {
|
|
|
1494
1534
|
static formatAmount(value: number, precision?: number): string;
|
|
1495
1535
|
}
|
|
1496
1536
|
|
|
1537
|
+
/**
|
|
1538
|
+
* Очистка текста, который человек пишет в редакторе: описание проекта или
|
|
1539
|
+
* задачи, приглашение, краткое содержание звонка.
|
|
1540
|
+
*
|
|
1541
|
+
* Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
|
|
1542
|
+
* удобная точка вызова для расширений и обработка пустых значений. До
|
|
1543
|
+
* 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
|
|
1544
|
+
* клал в базу произвольную разметку, а она потом попадала в собираемые
|
|
1545
|
+
* документы.
|
|
1546
|
+
*
|
|
1547
|
+
* Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
|
|
1548
|
+
* схемами BPMN — убирается только исполняемое.
|
|
1549
|
+
*/
|
|
1550
|
+
declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
|
|
1551
|
+
|
|
1497
1552
|
/**
|
|
1498
1553
|
* Ошибка API с кодом состояния HTTP.
|
|
1499
1554
|
*
|
|
@@ -1520,5 +1575,5 @@ declare class HttpApiError extends HttpException {
|
|
|
1520
1575
|
*/
|
|
1521
1576
|
declare function rethrowChainError(error: unknown): never;
|
|
1522
1577
|
|
|
1523
|
-
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
|
1578
|
+
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
|
1524
1579
|
export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
|
package/dist/index.d.mts
CHANGED
|
@@ -16,7 +16,28 @@ import { Cooperative } from 'cooptypes';
|
|
|
16
16
|
*/
|
|
17
17
|
interface AuthRolesOptions {
|
|
18
18
|
self?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Пускает ли `RolesGuard` пайщика без нужной роли, когда `username` в
|
|
21
|
+
* аргументах — он сам. По умолчанию да: так пайщик читает свои записи и
|
|
22
|
+
* подаёт свои заявления. Для полномочий совета, где `username` — адресат
|
|
23
|
+
* действия (подтвердить соглашение, внести данные, импортировать вклад),
|
|
24
|
+
* ставится `false`: иначе пайщик выполнил бы его над собой.
|
|
25
|
+
*/
|
|
26
|
+
allowSelf?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
|
|
29
|
+
* исключил). По умолчанию нет: `user` в списке ролей означает «принятый
|
|
30
|
+
* пайщик», и учётная запись со статусом вступления по роли не проходит —
|
|
31
|
+
* иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
|
|
32
|
+
* `true` — для того, что нужно и кандидату: входящие уведомления о ходе
|
|
33
|
+
* его же заявления.
|
|
34
|
+
*/
|
|
35
|
+
anyStatus?: boolean;
|
|
19
36
|
}
|
|
37
|
+
/** Ключ метаданных: самообход `RolesGuard` запрещён. */
|
|
38
|
+
declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
|
|
39
|
+
/** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
|
|
40
|
+
declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
|
|
20
41
|
/**
|
|
21
42
|
* Ограничение доступа к резолверу или к отдельному полю объекта.
|
|
22
43
|
*
|
|
@@ -87,8 +108,14 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
|
|
|
87
108
|
* 1. Валидный `server-secret` — доступ разрешён.
|
|
88
109
|
* 2. Роли не заданы — доступ открыт.
|
|
89
110
|
* 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
|
|
90
|
-
* либо плоским аргументом совпадает с `user.username`) —
|
|
91
|
-
*
|
|
111
|
+
* либо плоским аргументом совпадает с `user.username`) — разрешено, если
|
|
112
|
+
* операция не объявила `AuthRoles(..., { allowSelf: false })`.
|
|
113
|
+
* 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
|
|
114
|
+
* при этом означает принятого пайщика: учётная запись в статусе вступления
|
|
115
|
+
* или исключения по ней не проходит (если операция не объявила
|
|
116
|
+
* `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
|
|
117
|
+
* любом статусе: членов совета, заведённых при установке, цепь в
|
|
118
|
+
* `active` не переводит.
|
|
92
119
|
* 5. Иначе — отказ.
|
|
93
120
|
*/
|
|
94
121
|
declare class RolesGuard implements CanActivate {
|
|
@@ -822,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
|
|
|
822
849
|
* Необязательное поле.
|
|
823
850
|
*/
|
|
824
851
|
maxRows?: number;
|
|
852
|
+
/**
|
|
853
|
+
* Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
|
|
854
|
+
* растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
|
|
855
|
+
* что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
|
|
856
|
+
* Необязательное поле.
|
|
857
|
+
*/
|
|
858
|
+
minRows?: number;
|
|
859
|
+
/**
|
|
860
|
+
* Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
|
|
861
|
+
* поле не выглядело пустым. Исчезает, как только человек начинает ввод.
|
|
862
|
+
* Необязательное поле.
|
|
863
|
+
*/
|
|
864
|
+
placeholder?: string;
|
|
825
865
|
/**
|
|
826
866
|
* Добавляет текст после значения поля в интерфейсе (например, символ валюты).
|
|
827
867
|
* Необязательное поле.
|
|
@@ -1494,6 +1534,21 @@ declare class CurrencyValidationUtil {
|
|
|
1494
1534
|
static formatAmount(value: number, precision?: number): string;
|
|
1495
1535
|
}
|
|
1496
1536
|
|
|
1537
|
+
/**
|
|
1538
|
+
* Очистка текста, который человек пишет в редакторе: описание проекта или
|
|
1539
|
+
* задачи, приглашение, краткое содержание звонка.
|
|
1540
|
+
*
|
|
1541
|
+
* Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
|
|
1542
|
+
* удобная точка вызова для расширений и обработка пустых значений. До
|
|
1543
|
+
* 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
|
|
1544
|
+
* клал в базу произвольную разметку, а она потом попадала в собираемые
|
|
1545
|
+
* документы.
|
|
1546
|
+
*
|
|
1547
|
+
* Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
|
|
1548
|
+
* схемами BPMN — убирается только исполняемое.
|
|
1549
|
+
*/
|
|
1550
|
+
declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
|
|
1551
|
+
|
|
1497
1552
|
/**
|
|
1498
1553
|
* Ошибка API с кодом состояния HTTP.
|
|
1499
1554
|
*
|
|
@@ -1520,5 +1575,5 @@ declare class HttpApiError extends HttpException {
|
|
|
1520
1575
|
*/
|
|
1521
1576
|
declare function rethrowChainError(error: unknown): never;
|
|
1522
1577
|
|
|
1523
|
-
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
|
1578
|
+
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
|
1524
1579
|
export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
|
package/dist/index.d.ts
CHANGED
|
@@ -16,7 +16,28 @@ import { Cooperative } from 'cooptypes';
|
|
|
16
16
|
*/
|
|
17
17
|
interface AuthRolesOptions {
|
|
18
18
|
self?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Пускает ли `RolesGuard` пайщика без нужной роли, когда `username` в
|
|
21
|
+
* аргументах — он сам. По умолчанию да: так пайщик читает свои записи и
|
|
22
|
+
* подаёт свои заявления. Для полномочий совета, где `username` — адресат
|
|
23
|
+
* действия (подтвердить соглашение, внести данные, импортировать вклад),
|
|
24
|
+
* ставится `false`: иначе пайщик выполнил бы его над собой.
|
|
25
|
+
*/
|
|
26
|
+
allowSelf?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
|
|
29
|
+
* исключил). По умолчанию нет: `user` в списке ролей означает «принятый
|
|
30
|
+
* пайщик», и учётная запись со статусом вступления по роли не проходит —
|
|
31
|
+
* иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
|
|
32
|
+
* `true` — для того, что нужно и кандидату: входящие уведомления о ходе
|
|
33
|
+
* его же заявления.
|
|
34
|
+
*/
|
|
35
|
+
anyStatus?: boolean;
|
|
19
36
|
}
|
|
37
|
+
/** Ключ метаданных: самообход `RolesGuard` запрещён. */
|
|
38
|
+
declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
|
|
39
|
+
/** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
|
|
40
|
+
declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
|
|
20
41
|
/**
|
|
21
42
|
* Ограничение доступа к резолверу или к отдельному полю объекта.
|
|
22
43
|
*
|
|
@@ -87,8 +108,14 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
|
|
|
87
108
|
* 1. Валидный `server-secret` — доступ разрешён.
|
|
88
109
|
* 2. Роли не заданы — доступ открыт.
|
|
89
110
|
* 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
|
|
90
|
-
* либо плоским аргументом совпадает с `user.username`) —
|
|
91
|
-
*
|
|
111
|
+
* либо плоским аргументом совпадает с `user.username`) — разрешено, если
|
|
112
|
+
* операция не объявила `AuthRoles(..., { allowSelf: false })`.
|
|
113
|
+
* 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
|
|
114
|
+
* при этом означает принятого пайщика: учётная запись в статусе вступления
|
|
115
|
+
* или исключения по ней не проходит (если операция не объявила
|
|
116
|
+
* `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
|
|
117
|
+
* любом статусе: членов совета, заведённых при установке, цепь в
|
|
118
|
+
* `active` не переводит.
|
|
92
119
|
* 5. Иначе — отказ.
|
|
93
120
|
*/
|
|
94
121
|
declare class RolesGuard implements CanActivate {
|
|
@@ -822,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
|
|
|
822
849
|
* Необязательное поле.
|
|
823
850
|
*/
|
|
824
851
|
maxRows?: number;
|
|
852
|
+
/**
|
|
853
|
+
* Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
|
|
854
|
+
* растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
|
|
855
|
+
* что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
|
|
856
|
+
* Необязательное поле.
|
|
857
|
+
*/
|
|
858
|
+
minRows?: number;
|
|
859
|
+
/**
|
|
860
|
+
* Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
|
|
861
|
+
* поле не выглядело пустым. Исчезает, как только человек начинает ввод.
|
|
862
|
+
* Необязательное поле.
|
|
863
|
+
*/
|
|
864
|
+
placeholder?: string;
|
|
825
865
|
/**
|
|
826
866
|
* Добавляет текст после значения поля в интерфейсе (например, символ валюты).
|
|
827
867
|
* Необязательное поле.
|
|
@@ -1494,6 +1534,21 @@ declare class CurrencyValidationUtil {
|
|
|
1494
1534
|
static formatAmount(value: number, precision?: number): string;
|
|
1495
1535
|
}
|
|
1496
1536
|
|
|
1537
|
+
/**
|
|
1538
|
+
* Очистка текста, который человек пишет в редакторе: описание проекта или
|
|
1539
|
+
* задачи, приглашение, краткое содержание звонка.
|
|
1540
|
+
*
|
|
1541
|
+
* Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
|
|
1542
|
+
* удобная точка вызова для расширений и обработка пустых значений. До
|
|
1543
|
+
* 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
|
|
1544
|
+
* клал в базу произвольную разметку, а она потом попадала в собираемые
|
|
1545
|
+
* документы.
|
|
1546
|
+
*
|
|
1547
|
+
* Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
|
|
1548
|
+
* схемами BPMN — убирается только исполняемое.
|
|
1549
|
+
*/
|
|
1550
|
+
declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
|
|
1551
|
+
|
|
1497
1552
|
/**
|
|
1498
1553
|
* Ошибка API с кодом состояния HTTP.
|
|
1499
1554
|
*
|
|
@@ -1520,5 +1575,5 @@ declare class HttpApiError extends HttpException {
|
|
|
1520
1575
|
*/
|
|
1521
1576
|
declare function rethrowChainError(error: unknown): never;
|
|
1522
1577
|
|
|
1523
|
-
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
|
1578
|
+
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
|
1524
1579
|
export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { createParamDecorator, UnauthorizedException,
|
|
1
|
+
import { createParamDecorator, UnauthorizedException, SetMetadata, applyDecorators, Injectable, Inject, ForbiddenException, HttpException, HttpStatus, BadRequestException } from '@nestjs/common';
|
|
2
2
|
import { GqlExecutionContext, Directive, Field, InputType, registerEnumType, Int, IntersectionType, OmitType, ObjectType } from '@nestjs/graphql';
|
|
3
3
|
import { Reflector } from '@nestjs/core';
|
|
4
4
|
import { AuthGuard } from '@nestjs/passport';
|
|
5
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
5
6
|
import { z } from 'zod';
|
|
6
7
|
import { IsNumber, IsString, IsArray, ArrayMinSize, ValidateNested, IsEnum, IsInt, IsOptional, Matches, IsNotEmpty, IsObject } from 'class-validator';
|
|
7
8
|
import { Type } from 'class-transformer';
|
|
@@ -12,11 +13,19 @@ import moment from 'moment';
|
|
|
12
13
|
import moment$1 from 'moment-timezone';
|
|
13
14
|
import 'moment/locale/ru';
|
|
14
15
|
import crypto from 'crypto';
|
|
16
|
+
import { _Common } from 'cooptypes';
|
|
15
17
|
|
|
18
|
+
const ROLES_DENY_SELF_KEY = "roles_deny_self";
|
|
19
|
+
const ROLES_ANY_STATUS_KEY = "roles_any_status";
|
|
16
20
|
function AuthRoles(roles, options = {}) {
|
|
17
21
|
const self = options.self ?? [];
|
|
18
22
|
const args = self.length ? `roles: ${JSON.stringify(roles)}, self: ${JSON.stringify(self)}` : `roles: ${JSON.stringify(roles)}`;
|
|
19
|
-
|
|
23
|
+
const decorators = [SetMetadata("roles", roles), Directive(`@auth(${args})`)];
|
|
24
|
+
if (options.allowSelf === false)
|
|
25
|
+
decorators.push(SetMetadata(ROLES_DENY_SELF_KEY, true));
|
|
26
|
+
if (options.anyStatus === true)
|
|
27
|
+
decorators.push(SetMetadata(ROLES_ANY_STATUS_KEY, true));
|
|
28
|
+
return applyDecorators(...decorators);
|
|
20
29
|
}
|
|
21
30
|
const CurrentUser = createParamDecorator((data, context) => {
|
|
22
31
|
const ctx = GqlExecutionContext.create(context);
|
|
@@ -40,7 +49,12 @@ function configureExtensionAuth(options) {
|
|
|
40
49
|
function hasServerSecret(headers) {
|
|
41
50
|
if (!serverSecret)
|
|
42
51
|
return false;
|
|
43
|
-
|
|
52
|
+
const provided = headers?.["server-secret"];
|
|
53
|
+
if (typeof provided !== "string")
|
|
54
|
+
return false;
|
|
55
|
+
const a = Buffer.from(provided);
|
|
56
|
+
const b = Buffer.from(serverSecret);
|
|
57
|
+
return a.length === b.length && timingSafeEqual(a, b);
|
|
44
58
|
}
|
|
45
59
|
|
|
46
60
|
var __defProp$g = Object.defineProperty;
|
|
@@ -55,6 +69,8 @@ var __decorateClass$g = (decorators, target, key, kind) => {
|
|
|
55
69
|
return result;
|
|
56
70
|
};
|
|
57
71
|
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
72
|
+
const ACTIVE_USER_STATUS = "active";
|
|
73
|
+
const PARTICIPANT_ROLE = "user";
|
|
58
74
|
let GqlJwtAuthGuard = class extends AuthGuard("jwt") {
|
|
59
75
|
getRequest(context) {
|
|
60
76
|
const ctx = GqlExecutionContext.create(context);
|
|
@@ -141,10 +157,15 @@ let RolesGuard = class {
|
|
|
141
157
|
const args = ctx.getArgs();
|
|
142
158
|
const data = args.data;
|
|
143
159
|
const filter = args.filter;
|
|
144
|
-
|
|
160
|
+
const denySelf = this.reflector.get(ROLES_DENY_SELF_KEY, context.getHandler()) === true;
|
|
161
|
+
if (!denySelf && (data && data.username && user.username === data.username || filter && filter.username && user.username === filter.username || args.username && user.username === args.username)) {
|
|
145
162
|
return true;
|
|
146
163
|
}
|
|
147
164
|
if (allowedRoles.includes(user.role)) {
|
|
165
|
+
const anyStatus = this.reflector.get(ROLES_ANY_STATUS_KEY, context.getHandler()) === true;
|
|
166
|
+
if (user.role === PARTICIPANT_ROLE && !anyStatus && user.status !== ACTIVE_USER_STATUS) {
|
|
167
|
+
throw new ForbiddenException("\u0414\u043E\u0441\u0442\u0443\u043F \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043F\u0430\u0439\u0449\u0438\u043A\u043E\u0432 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430");
|
|
168
|
+
}
|
|
148
169
|
return true;
|
|
149
170
|
}
|
|
150
171
|
throw new UnauthorizedException(`\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430`);
|
|
@@ -154,7 +175,6 @@ RolesGuard = __decorateClass$g([
|
|
|
154
175
|
Injectable(),
|
|
155
176
|
__decorateParam(0, Inject(Reflector))
|
|
156
177
|
], RolesGuard);
|
|
157
|
-
const ACTIVE_USER_STATUS = "active";
|
|
158
178
|
let ActiveUserStatusGuard = class {
|
|
159
179
|
canActivate(context) {
|
|
160
180
|
const ctx = GqlExecutionContext.create(context);
|
|
@@ -1886,6 +1906,12 @@ function generateHashFromString(input) {
|
|
|
1886
1906
|
return crypto.createHash("sha256").update(input).digest("hex");
|
|
1887
1907
|
}
|
|
1888
1908
|
|
|
1909
|
+
function sanitizeUserText(value) {
|
|
1910
|
+
if (typeof value !== "string" || !value)
|
|
1911
|
+
return value;
|
|
1912
|
+
return _Common.Text.sanitizeEditorMarkdown(value);
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1889
1915
|
function rethrowChainError(error) {
|
|
1890
1916
|
const raw = error?.message ?? String(error);
|
|
1891
1917
|
const match = raw.match(/assertion failure with message: (.+?)(?:\n|$)/);
|
|
@@ -1893,4 +1919,4 @@ function rethrowChainError(error) {
|
|
|
1893
1919
|
throw new BadRequestException(clean);
|
|
1894
1920
|
}
|
|
1895
1921
|
|
|
1896
|
-
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
|
1922
|
+
export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
|
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.18",
|
|
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.18",
|
|
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.18",
|
|
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": "0f980a64f09af16c6ac217e5467be87a2d0ab634"
|
|
84
84
|
}
|