@memberjunction/server 6.1.4 → 6.1.6
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/README.md +30 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionManager.d.ts +5 -2
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +17 -8
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
- package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
- package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
- package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
- package/dist/agentSessions/index.d.ts +1 -0
- package/dist/agentSessions/index.d.ts.map +1 -1
- package/dist/agentSessions/index.js +1 -0
- package/dist/agentSessions/index.js.map +1 -1
- package/dist/auth/actionAuthorization.d.ts +40 -0
- package/dist/auth/actionAuthorization.d.ts.map +1 -0
- package/dist/auth/actionAuthorization.js +94 -0
- package/dist/auth/actionAuthorization.js.map +1 -0
- package/dist/auth/exampleNewUserSubClass.js +2 -1
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +55 -38
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.d.ts +14 -33
- package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.js +20 -52
- package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +15 -11
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/context.d.ts +6 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +24 -34
- package/dist/context.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +3417 -3428
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +44 -8
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +59 -19
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +95 -11
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +186 -76
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +12 -0
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -45
- package/dist/index.js.map +1 -1
- package/dist/isolatedProvider.d.ts +20 -0
- package/dist/isolatedProvider.d.ts.map +1 -0
- package/dist/isolatedProvider.js +22 -0
- package/dist/isolatedProvider.js.map +1 -0
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +22 -2
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/postgresqlCompat.d.ts +8 -0
- package/dist/postgresqlCompat.d.ts.map +1 -0
- package/dist/postgresqlCompat.js +19 -0
- package/dist/postgresqlCompat.js.map +1 -0
- package/dist/postgresqlPoolSettings.d.ts +108 -0
- package/dist/postgresqlPoolSettings.d.ts.map +1 -0
- package/dist/postgresqlPoolSettings.js +134 -0
- package/dist/postgresqlPoolSettings.js.map +1 -0
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +4 -2
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +4 -2
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +31 -5
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +75 -14
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts +35 -17
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +92 -166
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts +24 -3
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +57 -8
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +8 -23
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +11 -48
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +2 -2
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +117 -38
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +13 -1
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +2 -1
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +83 -22
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +174 -72
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +2 -1
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +12 -11
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeResolver.d.ts +1 -0
- package/dist/resolvers/SearchKnowledgeResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeResolver.js +5 -0
- package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.js +1 -0
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +6 -2
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.js +14 -10
- package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
- package/dist/resolvers/adhocTimeout.d.ts +7 -0
- package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
- package/dist/resolvers/adhocTimeout.js +12 -0
- package/dist/resolvers/adhocTimeout.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts +3 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +29 -17
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +21 -8
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +43 -16
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/package.json +92 -92
- package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
- package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
- package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
- package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
- package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +310 -31
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +227 -0
- package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
- package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
- package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +24 -2
- package/src/__tests__/ResolverBase.isaPromotionCreate.test.ts +412 -0
- package/src/__tests__/RunTemplateResolver.test.ts +132 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SessionManager.test.ts +94 -17
- package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +131 -0
- package/src/__tests__/TaskGraphActionRunner.storableOutputs.test.ts +76 -0
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/actionAuthorization.test.ts +130 -0
- package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
- package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
- package/src/__tests__/magicLink.test.ts +15 -76
- package/src/__tests__/magicLinkService.consume.test.ts +230 -0
- package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -0
- package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
- package/src/__tests__/multiTenancy.security.test.ts +51 -0
- package/src/__tests__/multiTenancy.test.ts +1 -1
- package/src/__tests__/newUsers.test.ts +62 -5
- package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
- package/src/__tests__/translateBracketsToPG.test.ts +20 -0
- package/src/agentSessions/SessionManager.ts +23 -25
- package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
- package/src/agentSessions/index.ts +1 -0
- package/src/auth/actionAuthorization.ts +119 -0
- package/src/auth/exampleNewUserSubClass.ts +2 -2
- package/src/auth/magicLink/MagicLinkService.ts +61 -39
- package/src/auth/magicLink/magicLinkCore.ts +19 -56
- package/src/auth/newUsers.ts +15 -11
- package/src/context.ts +25 -34
- package/src/generated/graphql-schemas/__mj.ts +3417 -3428
- package/src/generic/CacheInvalidationResolver.ts +74 -19
- package/src/generic/ResolverBase.ts +207 -80
- package/src/generic/RunViewResolver.ts +17 -0
- package/src/index.ts +49 -46
- package/src/isolatedProvider.ts +22 -0
- package/src/multiTenancy/index.ts +24 -2
- package/src/postgresqlCompat.ts +21 -0
- package/src/postgresqlPoolSettings.ts +213 -0
- package/src/realtimeWidget/widgetGuestElevation.ts +4 -2
- package/src/resolvers/ActionResolver.ts +84 -21
- package/src/resolvers/AdhocQueryResolver.ts +105 -187
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityRecordNameResolver.ts +11 -52
- package/src/resolvers/FetchEntityVectorsResolver.ts +2 -2
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +14 -1
- package/src/resolvers/QuerySystemUserResolver.ts +2 -1
- package/src/resolvers/RealtimeClientSessionResolver.ts +196 -77
- package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
- package/src/resolvers/RunAIAgentResolver.ts +4 -1
- package/src/resolvers/RunTemplateResolver.ts +13 -12
- package/src/resolvers/SearchKnowledgeResolver.ts +4 -0
- package/src/resolvers/SearchKnowledgeSystemUserResolver.ts +1 -0
- package/src/resolvers/SyncDataResolver.ts +6 -2
- package/src/resolvers/VectorizeEntityResolver.ts +16 -11
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/adhocTimeout.ts +12 -0
- package/src/rest/ViewOperationsHandler.ts +37 -18
- package/src/services/TaskGraphActionRunner.ts +45 -16
- package/dist/resolvers/adhoc-query-helpers.d.ts +0 -27
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
- package/dist/resolvers/adhoc-query-helpers.js +0 -42
- package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
- package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
- package/src/resolvers/adhoc-query-helpers.ts +0 -50
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CompositeKey, DatabaseProviderBase
|
|
1
|
+
import { CompositeKey, DatabaseProviderBase } from '@memberjunction/core';
|
|
2
2
|
import { AppContext, UserPayload } from '../types.js';
|
|
3
3
|
import { CompositeKeyInputType } from '../generic/KeyInputOutputTypes.js';
|
|
4
4
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
@@ -17,34 +17,19 @@ export declare class EntityRecordNameResult {
|
|
|
17
17
|
* Resolves a record's display NAME from its primary key — the lookup behind every foreign-key
|
|
18
18
|
* link, breadcrumb and picker label in the UI.
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* form-field FK control falls through to this query precisely WHEN the joined display column is
|
|
25
|
-
* denied, so the one case the fallback exists for was the case that leaked.
|
|
20
|
+
* Entity-level read permission is checked here ({@link ResolverBase.CheckUserReadPermissions}).
|
|
21
|
+
* Field- and row-level security are applied by the provider's lookup, for the acting user passed
|
|
22
|
+
* to it: when any field the name is built from is withheld, it answers with no name, and it reads
|
|
23
|
+
* only rows the user's read row filter allows. Without an acting user there is no lookup.
|
|
26
24
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* A field-level denial answers `Success: false` with no name rather than throwing. Callers
|
|
32
|
-
* already treat "no name" as "show the primary key", which is the intended degradation — and it
|
|
33
|
-
* keeps this query from becoming a probe that distinguishes "restricted" from "missing".
|
|
25
|
+
* A withheld name answers `Success: false` with the same status as a record that does not exist.
|
|
26
|
+
* Callers already treat "no name" as "show the primary key", and the identical answer keeps this
|
|
27
|
+
* query from becoming a probe that distinguishes "restricted" from "missing".
|
|
34
28
|
*/
|
|
35
29
|
export declare class EntityRecordNameResolver extends ResolverBase {
|
|
36
30
|
GetEntityRecordName(EntityName: string, primaryKey: CompositeKey, { providers, userPayload }: AppContext): Promise<EntityRecordNameResult>;
|
|
37
31
|
GetEntityRecordNames(info: EntityRecordNameInput[], { providers, userPayload }: AppContext): Promise<EntityRecordNameResult[]>;
|
|
38
32
|
InnerGetEntityRecordName(md: DatabaseProviderBase, EntityName: string, primaryKey: CompositeKeyInputType, userPayload?: UserPayload): Promise<EntityRecordNameResult>;
|
|
39
|
-
/**
|
|
40
|
-
* Whether field security withholds this entity's NAME field from the user.
|
|
41
|
-
*
|
|
42
|
-
* Resolves the name field the same way the provider's own lookup does — the designated
|
|
43
|
-
* `IsNameField`, else a field literally called `Name` — so the check cannot drift from the
|
|
44
|
-
* value it is guarding. Fails OPEN only where field security does not apply at all (flag off,
|
|
45
|
-
* no user, no name field), matching every other FLS gate.
|
|
46
|
-
*/
|
|
47
|
-
protected IsNameFieldDeniedToUser(entity: EntityInfo, contextUser?: UserInfo): boolean;
|
|
48
33
|
}
|
|
49
34
|
export default EntityRecordNameResolver;
|
|
50
35
|
//# sourceMappingURL=EntityRecordNameResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityRecordNameResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/EntityRecordNameResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"EntityRecordNameResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/EntityRecordNameResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAA0B,MAAM,mCAAmC,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,qBACa,qBAAqB;IAEhC,UAAU,EAAE,MAAM,CAAC;IAGnB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,qBACa,sBAAsB;IAEjC,OAAO,EAAE,OAAO,CAAC;IAGjB,MAAM,EAAE,MAAM,CAAC;IAGf,YAAY,EAAE,YAAY,CAAC;IAG3B,UAAU,EAAE,MAAM,CAAC;IAGnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,qBACa,wBAAyB,SAAQ,YAAY;IAElD,mBAAmB,CACU,UAAU,EAAE,MAAM,EACD,UAAU,EAAE,YAAY,EACnE,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,UAAU,GAC5C,OAAO,CAAC,sBAAsB,CAAC;IAQ5B,oBAAoB,CACoB,IAAI,EAAE,qBAAqB,EAAE,EAClE,EAAC,SAAS,EAAE,WAAW,EAAC,EAAE,UAAU,GAC1C,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAY9B,wBAAwB,CAC5B,EAAE,EAAE,oBAAoB,EACxB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,qBAAqB,EACjC,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,sBAAsB,CAAC;CAiBnC;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -10,7 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
|
-
import { CompositeKey
|
|
13
|
+
import { CompositeKey } from '@memberjunction/core';
|
|
14
14
|
import { Arg, Ctx, Field, InputType, ObjectType, Query, Resolver } from 'type-graphql';
|
|
15
15
|
import { CompositeKeyInputType, CompositeKeyOutputType } from '../generic/KeyInputOutputTypes.js';
|
|
16
16
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
@@ -59,20 +59,14 @@ export { EntityRecordNameResult };
|
|
|
59
59
|
* Resolves a record's display NAME from its primary key — the lookup behind every foreign-key
|
|
60
60
|
* link, breadcrumb and picker label in the UI.
|
|
61
61
|
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* form-field FK control falls through to this query precisely WHEN the joined display column is
|
|
67
|
-
* denied, so the one case the fallback exists for was the case that leaked.
|
|
62
|
+
* Entity-level read permission is checked here ({@link ResolverBase.CheckUserReadPermissions}).
|
|
63
|
+
* Field- and row-level security are applied by the provider's lookup, for the acting user passed
|
|
64
|
+
* to it: when any field the name is built from is withheld, it answers with no name, and it reads
|
|
65
|
+
* only rows the user's read row filter allows. Without an acting user there is no lookup.
|
|
68
66
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* A field-level denial answers `Success: false` with no name rather than throwing. Callers
|
|
74
|
-
* already treat "no name" as "show the primary key", which is the intended degradation — and it
|
|
75
|
-
* keeps this query from becoming a probe that distinguishes "restricted" from "missing".
|
|
67
|
+
* A withheld name answers `Success: false` with the same status as a record that does not exist.
|
|
68
|
+
* Callers already treat "no name" as "show the primary key", and the identical answer keeps this
|
|
69
|
+
* query from becoming a probe that distinguishes "restricted" from "missing".
|
|
76
70
|
*/
|
|
77
71
|
let EntityRecordNameResolver = class EntityRecordNameResolver extends ResolverBase {
|
|
78
72
|
async GetEntityRecordName(EntityName, primaryKey, { providers, userPayload }) {
|
|
@@ -96,26 +90,14 @@ let EntityRecordNameResolver = class EntityRecordNameResolver extends ResolverBa
|
|
|
96
90
|
const e = md.Entities.find((e) => e.Name === EntityName);
|
|
97
91
|
if (e) {
|
|
98
92
|
const contextUser = userPayload ? this.GetUserFromPayload(userPayload) : undefined;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
`the name field is not readable by this user`);
|
|
102
|
-
return {
|
|
103
|
-
Success: false,
|
|
104
|
-
Status: `Name for record, or record ${pk.ToString()} itself not found, could be an access issue`,
|
|
105
|
-
CompositeKey: pk,
|
|
106
|
-
EntityName,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
// Pass the acting user through: the provider signature accepts it, and omitting it ran the
|
|
110
|
-
// underlying lookup with no identity at all — so row-level security had nothing to filter on
|
|
111
|
-
// either. The field-level gate above is the column half; this is the row half.
|
|
112
|
-
const recordName = await md.GetEntityRecordName(e.Name, pk, contextUser);
|
|
93
|
+
// The acting user is what field- and row-level security are applied for.
|
|
94
|
+
const recordName = contextUser ? await md.GetEntityRecordName(e.Name, pk, contextUser) : '';
|
|
113
95
|
if (recordName)
|
|
114
96
|
return { Success: true, Status: 'OK', CompositeKey: pk, RecordName: recordName, EntityName };
|
|
115
97
|
else
|
|
116
98
|
return {
|
|
117
99
|
Success: false,
|
|
118
|
-
Status: `Name for record, or record ${pk.ToString()} itself not found, could be an access issue
|
|
100
|
+
Status: `Name for record, or record ${pk.ToString()} itself not found, could be an access issue`,
|
|
119
101
|
CompositeKey: pk,
|
|
120
102
|
EntityName,
|
|
121
103
|
};
|
|
@@ -123,25 +105,6 @@ let EntityRecordNameResolver = class EntityRecordNameResolver extends ResolverBa
|
|
|
123
105
|
else
|
|
124
106
|
return { Success: false, Status: `Entity ${EntityName} not found`, CompositeKey: pk, EntityName };
|
|
125
107
|
}
|
|
126
|
-
/**
|
|
127
|
-
* Whether field security withholds this entity's NAME field from the user.
|
|
128
|
-
*
|
|
129
|
-
* Resolves the name field the same way the provider's own lookup does — the designated
|
|
130
|
-
* `IsNameField`, else a field literally called `Name` — so the check cannot drift from the
|
|
131
|
-
* value it is guarding. Fails OPEN only where field security does not apply at all (flag off,
|
|
132
|
-
* no user, no name field), matching every other FLS gate.
|
|
133
|
-
*/
|
|
134
|
-
IsNameFieldDeniedToUser(entity, contextUser) {
|
|
135
|
-
if (!entity?.EnableFieldLevelSecurity || !contextUser) {
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
const nameField = entity.Fields?.find(f => f.IsNameField) ??
|
|
139
|
-
entity.Fields?.find(f => f.Name?.trim().toLowerCase() === 'name');
|
|
140
|
-
if (!nameField) {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
return entity.GetDeniedReadFields(contextUser).has(nameField.Name.trim().toLowerCase());
|
|
144
|
-
}
|
|
145
108
|
};
|
|
146
109
|
__decorate([
|
|
147
110
|
Query(() => EntityRecordNameResult),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityRecordNameResolver.js","sourceRoot":"","sources":["../../src/resolvers/EntityRecordNameResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"EntityRecordNameResolver.js","sourceRoot":"","sources":["../../src/resolvers/EntityRecordNameResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ import { LogError, LogStatus, RunView } from '@memberjunction/core';
|
|
|
15
15
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
16
16
|
import { GetAIAPIKey } from '@memberjunction/ai';
|
|
17
17
|
import { VectorDBBase } from '@memberjunction/ai-vectordb';
|
|
18
|
-
import { MJGlobal, UUIDsEqual } from '@memberjunction/global';
|
|
18
|
+
import { EscapeSQLString, MJGlobal, UUIDsEqual } from '@memberjunction/global';
|
|
19
19
|
/* ───── GraphQL types ───── */
|
|
20
20
|
let EntityVectorItem = class EntityVectorItem {
|
|
21
21
|
};
|
|
@@ -135,7 +135,7 @@ let FetchEntityVectorsResolver = class FetchEntityVectorsResolver extends Resolv
|
|
|
135
135
|
const rv = new RunView();
|
|
136
136
|
const result = await rv.RunView({
|
|
137
137
|
EntityName: 'MJ: Entity Documents',
|
|
138
|
-
ExtraFilter: `ID='${entityDocumentID}'`,
|
|
138
|
+
ExtraFilter: `ID='${EscapeSQLString(entityDocumentID)}'`,
|
|
139
139
|
ResultType: 'entity_object',
|
|
140
140
|
}, contextUser);
|
|
141
141
|
if (!result.Success || result.Results.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchEntityVectorsResolver.js","sourceRoot":"","sources":["../../src/resolvers/FetchEntityVectorsResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAY,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"FetchEntityVectorsResolver.js","sourceRoot":"","sources":["../../src/resolvers/FetchEntityVectorsResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,16 @@ export declare class GetDataContextDataOutputType {
|
|
|
19
19
|
*/
|
|
20
20
|
Results: (string | null)[];
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Loads the data of data contexts and their items.
|
|
24
|
+
*
|
|
25
|
+
* Items of type `sql` hold raw SQL, which is held to the rules ExecuteAdhocQuery applies to
|
|
26
|
+
* caller-supplied SQL. It runs only for the data context's owner or an administrator (Owner-type
|
|
27
|
+
* user), never for a scope-limited session, only on the read-only provider, and only as a single read
|
|
28
|
+
* statement over entity base views the caller may read in full. A SQL item that may not run is
|
|
29
|
+
* refused on its own, and the other items still load. Items of the other types load through entity
|
|
30
|
+
* permissions for the calling user.
|
|
31
|
+
*/
|
|
22
32
|
export declare class GetDataContextDataResolver extends ResolverBase {
|
|
23
33
|
/**
|
|
24
34
|
* Returns data for a given data context item.
|
|
@@ -26,21 +36,37 @@ export declare class GetDataContextDataResolver extends ResolverBase {
|
|
|
26
36
|
*/
|
|
27
37
|
GetDataContextItemData(DataContextItemID: string, appCtx: AppContext): Promise<{
|
|
28
38
|
Success: boolean;
|
|
29
|
-
ErrorMessage:
|
|
39
|
+
ErrorMessage: string;
|
|
30
40
|
Result: string;
|
|
31
|
-
} | {
|
|
32
|
-
Success: boolean;
|
|
33
|
-
ErrorMessage: any;
|
|
34
|
-
Result: any;
|
|
35
41
|
}>;
|
|
36
42
|
/**
|
|
37
|
-
* Returns data for a given data context.
|
|
43
|
+
* Returns data for a given data context. `Results` and `ErrorMessages` hold one entry per item, in
|
|
44
|
+
* item order. `Success` is true, and `ErrorMessages` null, only when every item loaded.
|
|
38
45
|
* @param DataContextID
|
|
39
46
|
*/
|
|
40
47
|
GetDataContextData(DataContextID: string, appCtx: AppContext): Promise<{
|
|
41
48
|
Success: boolean;
|
|
42
|
-
ErrorMessages:
|
|
49
|
+
ErrorMessages: string[];
|
|
43
50
|
Results: string[];
|
|
44
51
|
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Decides which `sql` items among `items` may run. Returns the read-only provider they run on, and
|
|
54
|
+
* the reason for each SQL item that may not run.
|
|
55
|
+
*/
|
|
56
|
+
private authorizeSQLItems;
|
|
57
|
+
/** Returns why `item` may not run for `user`, or null when it may. */
|
|
58
|
+
private sqlItemRefusal;
|
|
59
|
+
/** True when `user` owns the data context or is an administrator (Owner-type user). */
|
|
60
|
+
private mayRunDataContextSQL;
|
|
61
|
+
/**
|
|
62
|
+
* Returns why `sqlText` may not run, or null when it is a single read statement whose every table
|
|
63
|
+
* reference is an entity base view `user` may read without row-level or field-level narrowing. It is
|
|
64
|
+
* the check ExecuteAdhocQuery makes on the rendered SQL.
|
|
65
|
+
*/
|
|
66
|
+
private screenItemSQL;
|
|
67
|
+
/** Loads one item's data unless `gate` refused it. Returns the data as JSON, or why there is none. */
|
|
68
|
+
private loadItem;
|
|
69
|
+
/** Returns the owner (`UserID`) of a data context, or null when the caller cannot load it. */
|
|
70
|
+
private loadDataContextOwnerID;
|
|
45
71
|
}
|
|
46
72
|
//# sourceMappingURL=GetDataContextDataResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetDataContextDataResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/GetDataContextDataResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GetDataContextDataResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/GetDataContextDataResolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,qBACa,gCAAgC;IAEzC,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IAEH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B;;OAEG;IAEH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,qBACa,4BAA4B;IAErC,OAAO,EAAE,OAAO,CAAC;IAGjB,aAAa,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAEjC;;OAEG;IAEH,OAAO,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC9B;AAeD;;;;;;;;;GASG;AACH,qBACa,0BAA2B,SAAQ,YAAY;IACxD;;;OAGG;IAEG,sBAAsB,CACgB,iBAAiB,EAAE,MAAM,EAC1D,MAAM,EAAE,UAAU;;;;;IA0C7B;;;;OAIG;IAEG,kBAAkB,CACgB,aAAa,EAAE,MAAM,EAClD,MAAM,EAAE,UAAU;;;;;IAuC7B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiBzB,sEAAsE;IACtE,OAAO,CAAC,cAAc;IAatB,uFAAuF;IACvF,OAAO,CAAC,oBAAoB;IAK5B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAYrB,sGAAsG;YACxF,QAAQ;IAWtB,8FAA8F;YAChF,sBAAsB;CAIvC"}
|
|
@@ -11,9 +11,12 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { Arg, Ctx, Field, ObjectType, Query, Resolver } from "type-graphql";
|
|
14
|
+
import { IsValidUUID, UUIDsEqual } from "@memberjunction/global";
|
|
14
15
|
import { DataContext } from "@memberjunction/data-context";
|
|
15
|
-
import {
|
|
16
|
+
import { RenderPipeline } from "@memberjunction/generic-database-provider";
|
|
17
|
+
import { GetReadOnlyProvider } from "../util.js";
|
|
16
18
|
import { ResolverBase } from "../generic/ResolverBase.js";
|
|
19
|
+
import { IsScopeLimitedPrincipal } from "../auth/scopeLimitedPrincipal.js";
|
|
17
20
|
let GetDataContextItemDataOutputType = class GetDataContextItemDataOutputType {
|
|
18
21
|
};
|
|
19
22
|
__decorate([
|
|
@@ -52,6 +55,16 @@ GetDataContextDataOutputType = __decorate([
|
|
|
52
55
|
ObjectType()
|
|
53
56
|
], GetDataContextDataOutputType);
|
|
54
57
|
export { GetDataContextDataOutputType };
|
|
58
|
+
/**
|
|
59
|
+
* Loads the data of data contexts and their items.
|
|
60
|
+
*
|
|
61
|
+
* Items of type `sql` hold raw SQL, which is held to the rules ExecuteAdhocQuery applies to
|
|
62
|
+
* caller-supplied SQL. It runs only for the data context's owner or an administrator (Owner-type
|
|
63
|
+
* user), never for a scope-limited session, only on the read-only provider, and only as a single read
|
|
64
|
+
* statement over entity base views the caller may read in full. A SQL item that may not run is
|
|
65
|
+
* refused on its own, and the other items still load. Items of the other types load through entity
|
|
66
|
+
* permissions for the calling user.
|
|
67
|
+
*/
|
|
55
68
|
let GetDataContextDataResolver = class GetDataContextDataResolver extends ResolverBase {
|
|
56
69
|
/**
|
|
57
70
|
* Returns data for a given data context item.
|
|
@@ -60,30 +73,25 @@ let GetDataContextDataResolver = class GetDataContextDataResolver extends Resolv
|
|
|
60
73
|
async GetDataContextItemData(DataContextItemID, appCtx) {
|
|
61
74
|
// Check API key scope authorization for data context read
|
|
62
75
|
await this.CheckAPIKeyScopeAuthorization('datacontext:read', DataContextItemID, appCtx.userPayload);
|
|
76
|
+
if (!IsValidUUID(DataContextItemID)) {
|
|
77
|
+
return { Success: false, ErrorMessage: 'DataContextItemID must be a UUID', Result: null };
|
|
78
|
+
}
|
|
63
79
|
try {
|
|
64
|
-
const
|
|
65
|
-
allowFallbackToReadWrite: true,
|
|
66
|
-
});
|
|
80
|
+
const user = appCtx.userPayload.userRecord;
|
|
67
81
|
const md = GetReadOnlyProvider(appCtx.providers, { allowFallbackToReadWrite: true });
|
|
68
|
-
const dciData = await md.GetEntityObject("MJ: Data Context Items",
|
|
82
|
+
const dciData = await md.GetEntityObject("MJ: Data Context Items", user);
|
|
69
83
|
if (await dciData.Load(DataContextItemID)) {
|
|
70
84
|
const dci = DataContext.CreateDataContextItem(); // use class factory to get whatever lowest level sub-class is registered
|
|
71
|
-
await dci.LoadMetadataFromEntityRecord(dciData, md,
|
|
85
|
+
await dci.LoadMetadataFromEntityRecord(dciData, md, user);
|
|
86
|
+
const ownerID = dci.Type === 'sql' ? await this.loadDataContextOwnerID(dciData.DataContextID, md, user) : null;
|
|
87
|
+
const gate = this.authorizeSQLItems([dci], ownerID, appCtx);
|
|
72
88
|
// now the metadata is loaded so we can call the regular load function
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
return {
|
|
82
|
-
Success: false,
|
|
83
|
-
ErrorMessage: 'Error loading data context item data',
|
|
84
|
-
Result: null,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
89
|
+
const outcome = await this.loadItem(dci, gate, user, false);
|
|
90
|
+
return {
|
|
91
|
+
Success: outcome.Error === null,
|
|
92
|
+
ErrorMessage: outcome.Error,
|
|
93
|
+
Result: outcome.Result,
|
|
94
|
+
};
|
|
87
95
|
}
|
|
88
96
|
else {
|
|
89
97
|
return {
|
|
@@ -96,51 +104,122 @@ let GetDataContextDataResolver = class GetDataContextDataResolver extends Resolv
|
|
|
96
104
|
catch (e) {
|
|
97
105
|
return {
|
|
98
106
|
Success: false,
|
|
99
|
-
ErrorMessage: e,
|
|
107
|
+
ErrorMessage: e instanceof Error ? e.message : String(e),
|
|
100
108
|
Result: null,
|
|
101
109
|
};
|
|
102
110
|
}
|
|
103
111
|
}
|
|
104
112
|
/**
|
|
105
|
-
* Returns data for a given data context.
|
|
113
|
+
* Returns data for a given data context. `Results` and `ErrorMessages` hold one entry per item, in
|
|
114
|
+
* item order. `Success` is true, and `ErrorMessages` null, only when every item loaded.
|
|
106
115
|
* @param DataContextID
|
|
107
116
|
*/
|
|
108
117
|
async GetDataContextData(DataContextID, appCtx) {
|
|
109
118
|
// Check API key scope authorization for data context read
|
|
110
119
|
await this.CheckAPIKeyScopeAuthorization('datacontext:read', DataContextID, appCtx.userPayload);
|
|
120
|
+
// DataContext.LoadMetadata places this ID in the item filter, so it must be a plain UUID.
|
|
121
|
+
if (!IsValidUUID(DataContextID)) {
|
|
122
|
+
return { Success: false, ErrorMessages: ['DataContextID must be a UUID'], Results: null };
|
|
123
|
+
}
|
|
111
124
|
try {
|
|
112
125
|
// our job here is to load the entire data context, so we do that with the Data Context object
|
|
126
|
+
const user = appCtx.userPayload.userRecord;
|
|
127
|
+
const md = GetReadOnlyProvider(appCtx.providers, { allowFallbackToReadWrite: true });
|
|
113
128
|
const dc = new DataContext();
|
|
114
|
-
|
|
115
|
-
allowFallbackToReadWrite: true,
|
|
116
|
-
});
|
|
117
|
-
const success = await dc.Load(DataContextID, ds, true, false, 0, appCtx.userPayload.userRecord);
|
|
118
|
-
if (success) {
|
|
119
|
-
const retVal = {
|
|
120
|
-
Success: true,
|
|
121
|
-
ErrorMessages: null,
|
|
122
|
-
Results: dc.Items.map((item) => {
|
|
123
|
-
return JSON.stringify(item.Data);
|
|
124
|
-
}),
|
|
125
|
-
};
|
|
126
|
-
return retVal;
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
+
if (!(await dc.LoadMetadata(DataContextID, user, md))) {
|
|
129
130
|
return {
|
|
130
131
|
Success: false,
|
|
131
132
|
ErrorMessages: ['Error loading data context'],
|
|
132
133
|
Results: null,
|
|
133
134
|
};
|
|
134
135
|
}
|
|
136
|
+
const gate = this.authorizeSQLItems(dc.Items, dc.MJDataContextEntity.UserID, appCtx);
|
|
137
|
+
const outcomes = await Promise.all(dc.Items.map((item) => this.loadItem(item, gate, user, true)));
|
|
138
|
+
const allLoaded = outcomes.every((outcome) => outcome.Error === null);
|
|
139
|
+
return {
|
|
140
|
+
Success: allLoaded,
|
|
141
|
+
ErrorMessages: allLoaded ? null : outcomes.map((outcome) => outcome.Error),
|
|
142
|
+
Results: outcomes.map((outcome) => outcome.Result),
|
|
143
|
+
};
|
|
135
144
|
}
|
|
136
145
|
catch (e) {
|
|
137
146
|
return {
|
|
138
147
|
Success: false,
|
|
139
|
-
ErrorMessages: [e],
|
|
148
|
+
ErrorMessages: [e instanceof Error ? e.message : String(e)],
|
|
140
149
|
Results: null,
|
|
141
150
|
};
|
|
142
151
|
}
|
|
143
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Decides which `sql` items among `items` may run. Returns the read-only provider they run on, and
|
|
155
|
+
* the reason for each SQL item that may not run.
|
|
156
|
+
*/
|
|
157
|
+
authorizeSQLItems(items, ownerID, appCtx) {
|
|
158
|
+
const refusals = new Map();
|
|
159
|
+
const sqlItems = items.filter((item) => item.Type === 'sql');
|
|
160
|
+
if (sqlItems.length === 0) {
|
|
161
|
+
return { Provider: null, Refusals: refusals };
|
|
162
|
+
}
|
|
163
|
+
const user = appCtx.userPayload?.userRecord;
|
|
164
|
+
const provider = GetReadOnlyProvider(appCtx.providers, { allowFallbackToReadWrite: false });
|
|
165
|
+
for (const item of sqlItems) {
|
|
166
|
+
const refusal = this.sqlItemRefusal(item, ownerID, user, provider);
|
|
167
|
+
if (refusal !== null) {
|
|
168
|
+
refusals.set(item, refusal);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { Provider: provider, Refusals: refusals };
|
|
172
|
+
}
|
|
173
|
+
/** Returns why `item` may not run for `user`, or null when it may. */
|
|
174
|
+
sqlItemRefusal(item, ownerID, user, provider) {
|
|
175
|
+
if (!user || IsScopeLimitedPrincipal(user)) {
|
|
176
|
+
return 'SQL data context items cannot be run by a scope-limited or unidentified session.';
|
|
177
|
+
}
|
|
178
|
+
if (!this.mayRunDataContextSQL(ownerID, user)) {
|
|
179
|
+
return 'Only the owner of this data context, or an administrator, may run its SQL items.';
|
|
180
|
+
}
|
|
181
|
+
if (!provider) {
|
|
182
|
+
return 'No read-only data source is configured, so SQL data context items cannot run.';
|
|
183
|
+
}
|
|
184
|
+
return this.screenItemSQL(item.SQL ?? '', provider, user);
|
|
185
|
+
}
|
|
186
|
+
/** True when `user` owns the data context or is an administrator (Owner-type user). */
|
|
187
|
+
mayRunDataContextSQL(ownerID, user) {
|
|
188
|
+
const isOwner = !!ownerID && UUIDsEqual(ownerID, user.ID);
|
|
189
|
+
return isOwner || user.Type?.trim().toLowerCase() === 'owner';
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Returns why `sqlText` may not run, or null when it is a single read statement whose every table
|
|
193
|
+
* reference is an entity base view `user` may read without row-level or field-level narrowing. It is
|
|
194
|
+
* the check ExecuteAdhocQuery makes on the rendered SQL.
|
|
195
|
+
*/
|
|
196
|
+
screenItemSQL(sqlText, provider, user) {
|
|
197
|
+
try {
|
|
198
|
+
const rendered = RenderPipeline.Run(sqlText, { Platform: provider.PlatformKey, ContextUser: user, RequireReadStatement: true });
|
|
199
|
+
this.assertFullQueryUsesReadableEntityViews(rendered.Trace.AfterTemplates, provider, user, 'data context SQL');
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
204
|
+
return reason || 'The SQL of this item did not pass the read-only check.';
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/** Loads one item's data unless `gate` refused it. Returns the data as JSON, or why there is none. */
|
|
208
|
+
async loadItem(item, gate, user, forceRefresh) {
|
|
209
|
+
const refusal = gate.Refusals.get(item);
|
|
210
|
+
if (refusal !== undefined) {
|
|
211
|
+
return { Result: null, Error: refusal };
|
|
212
|
+
}
|
|
213
|
+
if (await item.LoadData(gate.Provider, forceRefresh, false, 0, user)) {
|
|
214
|
+
return { Result: JSON.stringify(item.Data), Error: null };
|
|
215
|
+
}
|
|
216
|
+
return { Result: null, Error: item.DataLoadingError || 'Error loading data context item data' };
|
|
217
|
+
}
|
|
218
|
+
/** Returns the owner (`UserID`) of a data context, or null when the caller cannot load it. */
|
|
219
|
+
async loadDataContextOwnerID(dataContextID, provider, user) {
|
|
220
|
+
const dataContext = await provider.GetEntityObject('MJ: Data Contexts', user);
|
|
221
|
+
return (await dataContext.Load(dataContextID)) ? dataContext.UserID : null;
|
|
222
|
+
}
|
|
144
223
|
};
|
|
145
224
|
__decorate([
|
|
146
225
|
Query(() => GetDataContextItemDataOutputType),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetDataContextDataResolver.js","sourceRoot":"","sources":["../../src/resolvers/GetDataContextDataResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"GetDataContextDataResolver.js","sourceRoot":"","sources":["../../src/resolvers/GetDataContextDataResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetDataResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/GetDataResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GetDataResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/GetDataResolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzC,qBACa,gBAAgB;IAGzB,KAAK,EAAE,MAAM,CAAC;IAGd,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB;AAGD,qBACa,iBAAiB;IAE1B,OAAO,EAAE,OAAO,CAAC;IAGjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlB,aAAa,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAEjC;;OAEG;IAEH,OAAO,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC9B;AAED,qBACa,sBAAsB;IAE/B,OAAO,EAAE,OAAO,CAAC;IAGjB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,OAAO,EAAE,sBAAsB,EAAE,CAAC;CACrC;AAED,qBACa,sBAAsB;IAE/B,EAAE,EAAE,MAAM,CAAC;IAGX,IAAI,EAAE,MAAM,CAAC;IAGb,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAE,MAAM,CAAC;IAGnB,QAAQ,EAAE,MAAM,CAAC;IAGjB,SAAS,EAAE,MAAM,CAAC;IAGlB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,MAAM,EAAE,2BAA2B,EAAE,CAAC;CACzC;AAED,qBACa,2BAA2B;IAEpC,EAAE,EAAE,MAAM,CAAC;IAGX,IAAI,EAAE,MAAM,CAAC;IAGb,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,IAAI,EAAE,MAAM,CAAC;IAGb,UAAU,EAAE,OAAO,CAAC;IAGpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,eAAe;IACxB;;;;OAIG;IAGG,OAAO,CACyB,KAAK,EAAE,gBAAgB,EACtD,OAAO,EAAE,UAAU,GACvB,OAAO,CAAC,iBAAiB,CAAC;IAiHvB,cAAc,CACb,OAAO,EAAE,UAAU,GACvB,OAAO,CAAC,sBAAsB,CAAC;CAsCrC;AAGD,qBAAa,WAAW;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,IAAI,CAAC;IACb,UAAU,EAAE,GAAG,CAAC;CACnB;AACD;;;;GAIG;AACH,qBAAa,kBAAkB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB;;OAEG;IACH,gBAAgB,EAAE,GAAG,CAAC;IACtB,SAAS,EAAE,WAAW,EAAE,CAAC;CAC5B;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,IAAiB,GAAG,IAAI,CAM/D;AAED,wGAAwG;AACxG,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA+B,EAAE,gBAAgB,CAAC,EAAE,GAAG,GAAG,kBAAkB,CAiBzI;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,QAQ9C;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,WAExC;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,WAMzC;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,QAW5D"}
|
|
@@ -11,6 +11,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { Arg, Ctx, Field, InputType, ObjectType, Query } from 'type-graphql';
|
|
14
|
+
import { SQLExpressionValidator } from '@memberjunction/global';
|
|
14
15
|
import { LogError, LogStatus, LogStatusEx } from '@memberjunction/core';
|
|
15
16
|
import { QueryCompositionEngine } from '@memberjunction/generic-database-provider';
|
|
16
17
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
@@ -190,8 +191,19 @@ export class GetDataResolver {
|
|
|
190
191
|
const compositionResult = compositionEngine.ResolveComposition(query, platform, systemUser);
|
|
191
192
|
resolvedSQL = compositionResult.ResolvedSQL;
|
|
192
193
|
}
|
|
194
|
+
// Defense-in-depth: even system-token holders get SELECT-only SQL here.
|
|
195
|
+
// The read-only pool is the primary control, but if it is ever
|
|
196
|
+
// misconfigured to a read-write login this validator still refuses DML/DDL
|
|
197
|
+
// (mirrors AdhocQueryResolver). The validator reads exactly the text that
|
|
198
|
+
// runs: it is trimmed here as validate() trims it, and literal \n sequences
|
|
199
|
+
// are not rewritten as validateFullQuery would.
|
|
200
|
+
const sqlToRun = resolvedSQL.trim();
|
|
201
|
+
const validation = SQLExpressionValidator.Instance.validate(sqlToRun, { context: 'full_query', Dialect: platform });
|
|
202
|
+
if (!validation.valid) {
|
|
203
|
+
return { result: null, error: validation.error || 'SQL validation failed' };
|
|
204
|
+
}
|
|
193
205
|
const request = new sql.Request(readOnlyDataSource);
|
|
194
|
-
const result = await request.query(
|
|
206
|
+
const result = await request.query(sqlToRun);
|
|
195
207
|
return { result: result.recordset, error: null };
|
|
196
208
|
}
|
|
197
209
|
catch (err) {
|