@proteinjs/db 1.35.1 → 1.36.0
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/CHANGELOG.md +11 -0
- package/dist/generated/index.d.ts.map +1 -1
- package/dist/generated/index.js +7 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.d.ts.map +1 -1
- package/dist/generated/test/index.js +7 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/src/Db.d.ts +25 -0
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +219 -22
- package/dist/src/Db.js.map +1 -1
- package/dist/src/Record.d.ts +7 -1
- package/dist/src/Record.d.ts.map +1 -1
- package/dist/src/Record.js +56 -21
- package/dist/src/Record.js.map +1 -1
- package/dist/src/Table.d.ts +82 -1
- package/dist/src/Table.d.ts.map +1 -1
- package/dist/src/Table.js +24 -1
- package/dist/src/Table.js.map +1 -1
- package/dist/src/TableQueryTransformProvider.d.ts +17 -0
- package/dist/src/TableQueryTransformProvider.d.ts.map +1 -0
- package/dist/src/TableQueryTransformProvider.js +34 -0
- package/dist/src/TableQueryTransformProvider.js.map +1 -0
- package/dist/src/encryption/Base64Url.d.ts +12 -0
- package/dist/src/encryption/Base64Url.d.ts.map +1 -0
- package/dist/src/encryption/Base64Url.js +21 -0
- package/dist/src/encryption/Base64Url.js.map +1 -0
- package/dist/src/encryption/DataEncryptionKeyTable.d.ts +33 -0
- package/dist/src/encryption/DataEncryptionKeyTable.d.ts.map +1 -0
- package/dist/src/encryption/DataEncryptionKeyTable.js +45 -0
- package/dist/src/encryption/DataEncryptionKeyTable.js.map +1 -0
- package/dist/src/encryption/DataKeyStore.d.ts +84 -0
- package/dist/src/encryption/DataKeyStore.d.ts.map +1 -0
- package/dist/src/encryption/DataKeyStore.js +481 -0
- package/dist/src/encryption/DataKeyStore.js.map +1 -0
- package/dist/src/encryption/DbEncryptionConfig.d.ts +62 -0
- package/dist/src/encryption/DbEncryptionConfig.d.ts.map +1 -0
- package/dist/src/encryption/DbEncryptionConfig.js +67 -0
- package/dist/src/encryption/DbEncryptionConfig.js.map +1 -0
- package/dist/src/encryption/EncryptedColumnQueryError.d.ts +10 -0
- package/dist/src/encryption/EncryptedColumnQueryError.d.ts.map +1 -0
- package/dist/src/encryption/EncryptedColumnQueryError.js +38 -0
- package/dist/src/encryption/EncryptedColumnQueryError.js.map +1 -0
- package/dist/src/encryption/EncryptedColumnQueryTransform.d.ts +52 -0
- package/dist/src/encryption/EncryptedColumnQueryTransform.d.ts.map +1 -0
- package/dist/src/encryption/EncryptedColumnQueryTransform.js +423 -0
- package/dist/src/encryption/EncryptedColumnQueryTransform.js.map +1 -0
- package/dist/src/encryption/EncryptedColumns.d.ts +69 -0
- package/dist/src/encryption/EncryptedColumns.d.ts.map +1 -0
- package/dist/src/encryption/EncryptedColumns.js +286 -0
- package/dist/src/encryption/EncryptedColumns.js.map +1 -0
- package/dist/src/encryption/EncryptionDerivedTableRegistry.d.ts +20 -0
- package/dist/src/encryption/EncryptionDerivedTableRegistry.d.ts.map +1 -0
- package/dist/src/encryption/EncryptionDerivedTableRegistry.js +36 -0
- package/dist/src/encryption/EncryptionDerivedTableRegistry.js.map +1 -0
- package/dist/src/encryption/EncryptionEnvelope.d.ts +25 -0
- package/dist/src/encryption/EncryptionEnvelope.d.ts.map +1 -0
- package/dist/src/encryption/EncryptionEnvelope.js +59 -0
- package/dist/src/encryption/EncryptionEnvelope.js.map +1 -0
- package/dist/src/encryption/EncryptionLifecycleWalker.d.ts +65 -0
- package/dist/src/encryption/EncryptionLifecycleWalker.d.ts.map +1 -0
- package/dist/src/encryption/EncryptionLifecycleWalker.js +343 -0
- package/dist/src/encryption/EncryptionLifecycleWalker.js.map +1 -0
- package/dist/src/encryption/EncryptionRecordHooks.d.ts +47 -0
- package/dist/src/encryption/EncryptionRecordHooks.d.ts.map +1 -0
- package/dist/src/encryption/EncryptionRecordHooks.js +229 -0
- package/dist/src/encryption/EncryptionRecordHooks.js.map +1 -0
- package/dist/src/encryption/EncryptionTokenMaintenance.d.ts +34 -0
- package/dist/src/encryption/EncryptionTokenMaintenance.d.ts.map +1 -0
- package/dist/src/encryption/EncryptionTokenMaintenance.js +211 -0
- package/dist/src/encryption/EncryptionTokenMaintenance.js.map +1 -0
- package/dist/src/encryption/InMemoryMasterKeyProvider.d.ts +20 -0
- package/dist/src/encryption/InMemoryMasterKeyProvider.d.ts.map +1 -0
- package/dist/src/encryption/InMemoryMasterKeyProvider.js +87 -0
- package/dist/src/encryption/InMemoryMasterKeyProvider.js.map +1 -0
- package/dist/src/encryption/MasterKeyProvider.d.ts +27 -0
- package/dist/src/encryption/MasterKeyProvider.d.ts.map +1 -0
- package/dist/src/encryption/MasterKeyProvider.js +3 -0
- package/dist/src/encryption/MasterKeyProvider.js.map +1 -0
- package/dist/src/encryption/SearchTokenizer.d.ts +49 -0
- package/dist/src/encryption/SearchTokenizer.d.ts.map +1 -0
- package/dist/src/encryption/SearchTokenizer.js +106 -0
- package/dist/src/encryption/SearchTokenizer.js.map +1 -0
- package/dist/src/schema/TableManager.d.ts +10 -0
- package/dist/src/schema/TableManager.d.ts.map +1 -1
- package/dist/src/schema/TableManager.js +62 -5
- package/dist/src/schema/TableManager.js.map +1 -1
- package/dist/src/tables/MigrationTable.d.ts +2 -2
- package/dist/test/EncryptedColumnsSchema.test.d.ts +2 -0
- package/dist/test/EncryptedColumnsSchema.test.d.ts.map +1 -0
- package/dist/test/EncryptedColumnsSchema.test.js +151 -0
- package/dist/test/EncryptedColumnsSchema.test.js.map +1 -0
- package/dist/test/EncryptionEnvelope.test.d.ts +2 -0
- package/dist/test/EncryptionEnvelope.test.d.ts.map +1 -0
- package/dist/test/EncryptionEnvelope.test.js +109 -0
- package/dist/test/EncryptionEnvelope.test.js.map +1 -0
- package/dist/test/EncryptionQueryContract.test.d.ts +2 -0
- package/dist/test/EncryptionQueryContract.test.d.ts.map +1 -0
- package/dist/test/EncryptionQueryContract.test.js +399 -0
- package/dist/test/EncryptionQueryContract.test.js.map +1 -0
- package/dist/test/SearchTokenizer.test.d.ts +2 -0
- package/dist/test/SearchTokenizer.test.d.ts.map +1 -0
- package/dist/test/SearchTokenizer.test.js +64 -0
- package/dist/test/SearchTokenizer.test.js.map +1 -0
- package/dist/test/reusable/CascadeDeleteTests.js +2 -2
- package/dist/test/reusable/CascadeDeleteTests.js.map +1 -1
- package/dist/test/reusable/ColumnTypesTests.js +2 -2
- package/dist/test/reusable/ColumnTypesTests.js.map +1 -1
- package/dist/test/reusable/CrudTests.js +2 -2
- package/dist/test/reusable/CrudTests.js.map +1 -1
- package/dist/test/reusable/DynamicReferenceColumnTests.js +2 -2
- package/dist/test/reusable/DynamicReferenceColumnTests.js.map +1 -1
- package/dist/test/reusable/PreloadReferencesTests.js +2 -2
- package/dist/test/reusable/PreloadReferencesTests.js.map +1 -1
- package/dist/test/reusable/RecordIteratorTests.js +2 -2
- package/dist/test/reusable/RecordIteratorTests.js.map +1 -1
- package/dist/test/reusable/TableManagerTests.js +2 -2
- package/dist/test/reusable/TableManagerTests.js.map +1 -1
- package/dist/test/reusable/TransactionTests.js +2 -2
- package/dist/test/reusable/TransactionTests.js.map +1 -1
- package/generated/index.ts +7 -1
- package/generated/test/index.ts +7 -1
- package/index.ts +16 -0
- package/package.json +3 -3
- package/src/Db.ts +137 -12
- package/src/Record.ts +21 -4
- package/src/Table.ts +109 -2
- package/src/TableQueryTransformProvider.ts +31 -0
- package/src/encryption/Base64Url.ts +14 -0
- package/src/encryption/DataEncryptionKeyTable.ts +40 -0
- package/src/encryption/DataKeyStore.ts +305 -0
- package/src/encryption/DbEncryptionConfig.ts +92 -0
- package/src/encryption/EncryptedColumnQueryError.ts +15 -0
- package/src/encryption/EncryptedColumnQueryTransform.ts +383 -0
- package/src/encryption/EncryptedColumns.ts +318 -0
- package/src/encryption/EncryptionDerivedTableRegistry.ts +34 -0
- package/src/encryption/EncryptionEnvelope.ts +60 -0
- package/src/encryption/EncryptionLifecycleWalker.ts +243 -0
- package/src/encryption/EncryptionRecordHooks.ts +167 -0
- package/src/encryption/EncryptionTokenMaintenance.ts +123 -0
- package/src/encryption/InMemoryMasterKeyProvider.ts +42 -0
- package/src/encryption/MasterKeyProvider.ts +26 -0
- package/src/encryption/SearchTokenizer.ts +103 -0
- package/src/schema/TableManager.ts +43 -1
- package/test/EncryptedColumnsSchema.test.ts +172 -0
- package/test/EncryptionEnvelope.test.ts +66 -0
- package/test/EncryptionQueryContract.test.ts +195 -0
- package/test/SearchTokenizer.test.ts +67 -0
- package/test/reusable/CascadeDeleteTests.ts +2 -2
- package/test/reusable/ColumnTypesTests.ts +2 -2
- package/test/reusable/CrudTests.ts +2 -2
- package/test/reusable/DynamicReferenceColumnTests.ts +2 -2
- package/test/reusable/PreloadReferencesTests.ts +2 -2
- package/test/reusable/RecordIteratorTests.ts +2 -2
- package/test/reusable/TableManagerTests.ts +2 -2
- package/test/reusable/TransactionTests.ts +2 -2
package/dist/src/Record.js
CHANGED
|
@@ -14,6 +14,29 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
14
14
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
15
|
};
|
|
16
16
|
})();
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
17
40
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
41
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
42
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -97,13 +120,14 @@ function withRecordColumns(columns) {
|
|
|
97
120
|
}
|
|
98
121
|
exports.withRecordColumns = withRecordColumns;
|
|
99
122
|
var RecordSerializer = /** @class */ (function () {
|
|
100
|
-
function RecordSerializer(table) {
|
|
123
|
+
function RecordSerializer(table, encryptionContext) {
|
|
101
124
|
this.logger = new logger_1.Logger({ name: this.constructor.name });
|
|
102
125
|
this.table = table;
|
|
126
|
+
this.encryptionContext = encryptionContext;
|
|
103
127
|
}
|
|
104
128
|
RecordSerializer.prototype.serialize = function (record) {
|
|
105
129
|
return __awaiter(this, void 0, void 0, function () {
|
|
106
|
-
var serialized, fieldSerializer, omittedFields, _a, _b, _c, _i, fieldPropertyName, fieldValue, undefinedFieldValueError, _d, columnName, serializedFieldValue, MissingFieldError_1;
|
|
130
|
+
var serialized, fieldSerializer, omittedFields, _a, _b, _c, _i, fieldPropertyName, fieldValue, undefinedFieldValueError, _d, columnName, serializedFieldValue, MissingFieldError_1, EncryptionRecordHooks;
|
|
107
131
|
return __generator(this, function (_e) {
|
|
108
132
|
switch (_e.label) {
|
|
109
133
|
case 0:
|
|
@@ -151,6 +175,12 @@ var RecordSerializer = /** @class */ (function () {
|
|
|
151
175
|
// could mean the developer is passing in an object they don't expect
|
|
152
176
|
this.logger.warn({ message: "Fields were omitted during serialization", obj: { omittedFields: omittedFields } });
|
|
153
177
|
}
|
|
178
|
+
return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('./encryption/EncryptionRecordHooks')); })];
|
|
179
|
+
case 8:
|
|
180
|
+
EncryptionRecordHooks = (_e.sent()).EncryptionRecordHooks;
|
|
181
|
+
return [4 /*yield*/, new EncryptionRecordHooks().onSerialize(this.table, serialized, this.encryptionContext)];
|
|
182
|
+
case 9:
|
|
183
|
+
_e.sent();
|
|
154
184
|
return [2 /*return*/, serialized];
|
|
155
185
|
}
|
|
156
186
|
});
|
|
@@ -158,41 +188,46 @@ var RecordSerializer = /** @class */ (function () {
|
|
|
158
188
|
};
|
|
159
189
|
RecordSerializer.prototype.deserialize = function (serializedRecord) {
|
|
160
190
|
return __awaiter(this, void 0, void 0, function () {
|
|
161
|
-
var deserialized, fieldSerializer, omittedFields, _a, _b, _c, _i, columnName, serializedFieldValue, _d, fieldPropertyName, fieldValue, MissingFieldError_2;
|
|
191
|
+
var EncryptionRecordHooks, prepared, deserialized, fieldSerializer, omittedFields, _a, _b, _c, _i, columnName, serializedFieldValue, _d, fieldPropertyName, fieldValue, MissingFieldError_2;
|
|
162
192
|
return __generator(this, function (_e) {
|
|
163
193
|
switch (_e.label) {
|
|
164
|
-
case 0:
|
|
194
|
+
case 0: return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('./encryption/EncryptionRecordHooks')); })];
|
|
195
|
+
case 1:
|
|
196
|
+
EncryptionRecordHooks = (_e.sent()).EncryptionRecordHooks;
|
|
197
|
+
return [4 /*yield*/, new EncryptionRecordHooks().onDeserialize(this.table, serializedRecord)];
|
|
198
|
+
case 2:
|
|
199
|
+
prepared = _e.sent();
|
|
165
200
|
deserialized = {};
|
|
166
201
|
fieldSerializer = new FieldSerializer(this.table);
|
|
167
202
|
omittedFields = [];
|
|
168
|
-
_a =
|
|
203
|
+
_a = prepared;
|
|
169
204
|
_b = [];
|
|
170
205
|
for (_c in _a)
|
|
171
206
|
_b.push(_c);
|
|
172
207
|
_i = 0;
|
|
173
|
-
_e.label =
|
|
174
|
-
case
|
|
175
|
-
if (!(_i < _b.length)) return [3 /*break*/,
|
|
208
|
+
_e.label = 3;
|
|
209
|
+
case 3:
|
|
210
|
+
if (!(_i < _b.length)) return [3 /*break*/, 8];
|
|
176
211
|
_c = _b[_i];
|
|
177
|
-
if (!(_c in _a)) return [3 /*break*/,
|
|
212
|
+
if (!(_c in _a)) return [3 /*break*/, 7];
|
|
178
213
|
columnName = _c;
|
|
179
|
-
serializedFieldValue =
|
|
180
|
-
_e.label =
|
|
181
|
-
case
|
|
182
|
-
_e.trys.push([
|
|
183
|
-
return [4 /*yield*/, fieldSerializer.deserialize(columnName, serializedFieldValue,
|
|
184
|
-
case
|
|
214
|
+
serializedFieldValue = prepared[columnName];
|
|
215
|
+
_e.label = 4;
|
|
216
|
+
case 4:
|
|
217
|
+
_e.trys.push([4, 6, , 7]);
|
|
218
|
+
return [4 /*yield*/, fieldSerializer.deserialize(columnName, serializedFieldValue, prepared)];
|
|
219
|
+
case 5:
|
|
185
220
|
_d = _e.sent(), fieldPropertyName = _d.fieldPropertyName, fieldValue = _d.fieldValue;
|
|
186
221
|
deserialized[fieldPropertyName] = fieldValue;
|
|
187
|
-
return [3 /*break*/,
|
|
188
|
-
case
|
|
222
|
+
return [3 /*break*/, 7];
|
|
223
|
+
case 6:
|
|
189
224
|
MissingFieldError_2 = _e.sent();
|
|
190
225
|
omittedFields.push(columnName);
|
|
191
|
-
return [3 /*break*/,
|
|
192
|
-
case
|
|
226
|
+
return [3 /*break*/, 7];
|
|
227
|
+
case 7:
|
|
193
228
|
_i++;
|
|
194
|
-
return [3 /*break*/,
|
|
195
|
-
case
|
|
229
|
+
return [3 /*break*/, 3];
|
|
230
|
+
case 8:
|
|
196
231
|
if (omittedFields.length > 0) {
|
|
197
232
|
// expected when passing a base table into the query api
|
|
198
233
|
this.logger.debug({ message: "Fields were omitted during deserialization", obj: { omittedFields: omittedFields } });
|
package/dist/src/Record.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Record.js","sourceRoot":"","sources":["../../src/Record.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Record.js","sourceRoot":"","sources":["../../src/Record.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Table.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Loadable } from '@proteinjs/reflection';
|
|
2
2
|
import { CustomSerializableObject } from '@proteinjs/serializer';
|
|
3
3
|
import { Record } from './Record';
|
|
4
|
-
import { QueryBuilder } from '@proteinjs/db-query';
|
|
4
|
+
import { ColumnQueryTransform, QueryBuilder } from '@proteinjs/db-query';
|
|
5
5
|
import { Identity, TableOperationsAuth } from './auth/TableAuth';
|
|
6
6
|
import { Db } from './Db';
|
|
7
7
|
export declare const isTable: (obj: any) => boolean;
|
|
@@ -67,6 +67,19 @@ export type Columns<T> = {
|
|
|
67
67
|
} & {
|
|
68
68
|
[P in OptionalProps<T>]?: Column<T[P] | undefined, any>;
|
|
69
69
|
};
|
|
70
|
+
/**
|
|
71
|
+
* What a column's query transform runs WITH: the current operation's authority and its
|
|
72
|
+
* driver/transaction-riding query runners. Supplied by `Db` per operation
|
|
73
|
+
* (`Db.addColumnQueries`), so a transform's own reads behave like part of the query that
|
|
74
|
+
* carried them.
|
|
75
|
+
*/
|
|
76
|
+
export interface ColumnQueryRuntime {
|
|
77
|
+
runAsSystem: boolean;
|
|
78
|
+
/** Query with the CALLER's authority (auth + column queries apply). */
|
|
79
|
+
query: (table: Table<any>, qb: QueryBuilder<any>) => Promise<any[]>;
|
|
80
|
+
/** System-authority query — for framework-derived tables that are default-deny to callers. */
|
|
81
|
+
systemQuery: (table: Table<any>, qb: QueryBuilder<any>) => Promise<any[]>;
|
|
82
|
+
}
|
|
70
83
|
export type Column<T, Serialized> = {
|
|
71
84
|
name: string;
|
|
72
85
|
/**
|
|
@@ -78,13 +91,81 @@ export type Column<T, Serialized> = {
|
|
|
78
91
|
options?: ColumnOptions;
|
|
79
92
|
serialize?: (fieldValue: T | null | undefined) => Promise<Serialized | null | undefined>;
|
|
80
93
|
deserialize?: (serializedFieldValue: Serialized | null, serializedRecord: any) => Promise<T | null | void>;
|
|
94
|
+
/**
|
|
95
|
+
* The column's QUERY-side contract, paralleling `serialize`/`deserialize` on the storage
|
|
96
|
+
* side: how uses of this column in a query (conditions, ORDER BY, aggregation, GROUP BY)
|
|
97
|
+
* translate into uses of what the database actually stores and indexes for it — see
|
|
98
|
+
* `ColumnQueryTransform` (@proteinjs/db-query). Applied by
|
|
99
|
+
* `QueryBuilder.applyColumnTransforms` on every query, through
|
|
100
|
+
* `TableQueryTransformProvider`.
|
|
101
|
+
*
|
|
102
|
+
* A factory rather than a bare transform: translation may consult derived index state
|
|
103
|
+
* (e.g. an encrypted column's token table), so a transform is built per operation with
|
|
104
|
+
* the operation's `ColumnQueryRuntime` — its driver-riding query runners and authority.
|
|
105
|
+
* Derived by the framework for encrypted columns (`EncryptedColumns.ensureSchema`);
|
|
106
|
+
* any column may supply one.
|
|
107
|
+
*/
|
|
108
|
+
queryTransform?: (runtime: ColumnQueryRuntime) => ColumnQueryTransform;
|
|
81
109
|
beforeDelete?: (table: Table<any>, columnPropertyName: string, records: any[], getTable?: (tableName: string) => Table<any>, db?: Db) => Promise<void>;
|
|
82
110
|
};
|
|
111
|
+
/**
|
|
112
|
+
* Capabilities of an encrypted column. Nested INSIDE the `encrypted` declaration on purpose:
|
|
113
|
+
* `searchable` and `sortKey` only mean anything on an encrypted column (a plaintext column
|
|
114
|
+
* is inherently searchable and sortable through normal SQL), so the invalid state — a
|
|
115
|
+
* search/sort capability declared without encryption — is unrepresentable.
|
|
116
|
+
*/
|
|
117
|
+
export type EncryptedColumnConfig = {
|
|
118
|
+
/**
|
|
119
|
+
* Index the value for native querying over ciphertext (derived automatically at the
|
|
120
|
+
* database layer — see `EncryptedColumns`):
|
|
121
|
+
* - `'contains'` — word + trigram search tokens, keyed-fingerprinted per owner, serving
|
|
122
|
+
* the LIKE contains/prefix family with exact results (candidate cover + decrypt-verify).
|
|
123
|
+
* - `'equality'` — one whole-value fingerprint companion column serving `=` / `IN` /
|
|
124
|
+
* get-by-value as a single indexed lookup (and value uniqueness, per owner).
|
|
125
|
+
* Encrypted columns that are never queried by value declare neither and carry no
|
|
126
|
+
* derivatives — the default.
|
|
127
|
+
*/
|
|
128
|
+
searchable?: 'contains' | 'equality';
|
|
129
|
+
/**
|
|
130
|
+
* Native ORDER BY at any scale through a DECLARED bounded reveal: an ordered
|
|
131
|
+
* representation of the value's first `revealPrefix` characters (normalized) is stored
|
|
132
|
+
* beside the ciphertext and the database sorts on it. The leak, stated plainly: raw
|
|
133
|
+
* database access can see each value's first `revealPrefix` characters — nothing else.
|
|
134
|
+
* A conscious, schema-author-declared tradeoff; never the default. Rows sharing a prefix
|
|
135
|
+
* tie-break app-side within the returned page.
|
|
136
|
+
*/
|
|
137
|
+
sortKey?: {
|
|
138
|
+
revealPrefix: number;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
83
141
|
export type ColumnOptions = {
|
|
84
142
|
unique?: {
|
|
85
143
|
unique: boolean;
|
|
86
144
|
indexName?: string;
|
|
87
145
|
};
|
|
146
|
+
/**
|
|
147
|
+
* Whether this column's values are stored encrypted (AES-256-GCM under per-owner data
|
|
148
|
+
* keys wrapped by the deployment's master key — see `DbEncryptionConfig`). The value is
|
|
149
|
+
* either `false` (plaintext — said out loud) or a config object:
|
|
150
|
+
*
|
|
151
|
+
* ```ts
|
|
152
|
+
* encrypted: false // plaintext (explicit)
|
|
153
|
+
* encrypted: {} // encrypted, never queried by value
|
|
154
|
+
* encrypted: { searchable: 'contains' } // + indexed contains/prefix search
|
|
155
|
+
* encrypted: { searchable: 'equality' } // + indexed exact-match lookup
|
|
156
|
+
* encrypted: { sortKey: { revealPrefix: 3 } } // + native ORDER BY via a declared bounded reveal
|
|
157
|
+
* ```
|
|
158
|
+
*
|
|
159
|
+
* Everything downstream — the transparent encrypt/decrypt seam, companion index
|
|
160
|
+
* derivation, query translation, loud contract rejections, lifecycle backfills — is
|
|
161
|
+
* derived automatically at the database layer; callers never write an encrypt or decrypt
|
|
162
|
+
* call. Query shapes outside the contract are rejected at query-build time
|
|
163
|
+
* (`EncryptionQueryTranslator`).
|
|
164
|
+
*
|
|
165
|
+
* When `DbEncryptionConfig.requireEncryptedDeclarations` is on, every text-holding
|
|
166
|
+
* column MUST carry this declaration — registration fails loudly otherwise.
|
|
167
|
+
*/
|
|
168
|
+
encrypted?: false | EncryptedColumnConfig;
|
|
88
169
|
/**
|
|
89
170
|
* The column in the reference table `table` is the primary key of the table (`id` unless otherwise specified in the Table definition)
|
|
90
171
|
*
|
package/dist/src/Table.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAkB,MAAM,EAAE,MAAM,UAAU,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAkB,MAAM,EAAE,MAAM,UAAU,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,eAAO,MAAM,OAAO,QAAS,GAAG,YAA6C,CAAC;AAE9E,eAAO,MAAM,SAAS,0CAAgG,CAAC;AAEvH,eAAO,MAAM,WAAW,SAAU,MAAM,eAiBvC,CAAC;AAmBF,eAAO,MAAM,qBAAqB,UAAW,MAAM,GAAG,CAAC,cAAc,MAAM,kBAS1E,CAAC;AAEF,eAAO,MAAM,eAAe,UAAW,MAAM,GAAG,CAAC,cAAc,MAAM,4BASpE,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAAiB,MAAM,GAAG,CAAC,UAAU,GAAG,eAAe,OAAO,kBAe/F,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAiB,MAAM,GAAG,CAAC,UAAU,GAAG,kBAUxE,CAAC;AAEF;;GAEG;AACH,8BAAsB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,QAAQ,EAAE,wBAAwB;IAClF,cAAc,SAAqB;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B;;;;OAIG;IACI,OAAO,EAAE;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAM;IACjF,6FAA6F;IACtF,uBAAuB,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,EAAE,CAAY;IAC9F,8EAA8E;IACvE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAM;IACjD,IAAI,CAAC,EAAE;QACZ,EAAE,CAAC,EAAE,mBAAmB,CAAC;QACzB,OAAO,CAAC,EAAE,mBAAmB,CAAC;QAC9B;;;;;;;WAOG;QACH,uBAAuB,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;QAC/C,EAAE,CAAC,EAAE;YACH,WAAW,CAAC,EAAE,QAAQ,CAAC;YACvB,UAAU,CAAC,EAAE,QAAQ,CAAC;SACvB,CAAC;KACH,CAAC;CACH;AAED,KAAK,gBAAgB,CAAC,CAAC,IAAI;KACxB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF,KAAK,aAAa,CAAC,CAAC,IAAI;KACrB,CAAC,IAAI,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC;CACvF,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7B,KAAK,aAAa,CAAC,CAAC,IAAI;KACrB,CAAC,IAAI,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,KAAK;CACvF,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7B,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;KACtB,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;CAC3C,GAAG;KACD,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,CAAC;CACxD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpE,8FAA8F;IAC9F,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;CAC3E;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,UAAU,IAAI;IAClC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACzF,WAAW,CAAC,EAAE,CAAC,oBAAoB,EAAE,UAAU,GAAG,IAAI,EAAE,gBAAgB,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IAC3G;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,oBAAoB,CAAC;IACvE,YAAY,CAAC,EAAE,CACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,GAAG,EAAE,EACd,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG,CAAC,EAC5C,EAAE,CAAC,EAAE,EAAE,KACJ,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,qBAAqB,CAAC;IAC1C;;;;OAIG;IACH,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5E,yGAAyG;IACzG,iBAAiB,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IAClE,6BAA6B;IAC7B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAClE;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IAC1D,mEAAmE;IACnE,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/G;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,EAAE,CACvB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,OAAO,GAAG,QAAQ,EAC7B,WAAW,EAAE,OAAO,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,EAAE,CAAC,EAAE;QACH,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,GAAG,IAAI;IACzC;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC;IAC7D;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC9B,EAAE,CAAC,EAAE;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;CACH,CAAC"}
|
package/dist/src/Table.js
CHANGED
|
@@ -40,6 +40,7 @@ exports.Table = exports.addUpdateFieldValues = exports.addDefaultFieldValues = e
|
|
|
40
40
|
var reflection_1 = require("@proteinjs/reflection");
|
|
41
41
|
var Record_1 = require("./Record");
|
|
42
42
|
var TableSerializer_1 = require("./serializers/TableSerializer");
|
|
43
|
+
var EncryptionDerivedTableRegistry_1 = require("./encryption/EncryptionDerivedTableRegistry");
|
|
43
44
|
var isTable = function (obj) { return obj.__serializerId === TableSerializer_1.TableSerializerId; };
|
|
44
45
|
exports.isTable = isTable;
|
|
45
46
|
var getTables = function () { return reflection_1.SourceRepository.get().objects('@proteinjs/db/Table'); };
|
|
@@ -49,12 +50,34 @@ var tableByName = function (name) {
|
|
|
49
50
|
for (var _i = 0, tables_1 = tables; _i < tables_1.length; _i++) {
|
|
50
51
|
var table = tables_1[_i];
|
|
51
52
|
if (table.name == name) {
|
|
52
|
-
return table;
|
|
53
|
+
return ensureEncryptionSchema(table);
|
|
53
54
|
}
|
|
54
55
|
}
|
|
56
|
+
// Framework-DERIVED tables (search-token tables beside encrypted columns) are synthesized
|
|
57
|
+
// from column config rather than declared in source, so the reflection registry never
|
|
58
|
+
// sees them (see EncryptionDerivedTableRegistry — a runtime-cycle-free, type-only import).
|
|
59
|
+
var derivedTable = EncryptionDerivedTableRegistry_1.EncryptionDerivedTableRegistry.get(name);
|
|
60
|
+
if (derivedTable) {
|
|
61
|
+
return derivedTable;
|
|
62
|
+
}
|
|
55
63
|
throw new Error("Unable to find table: ".concat(name));
|
|
56
64
|
};
|
|
57
65
|
exports.tableByName = tableByName;
|
|
66
|
+
/**
|
|
67
|
+
* Table instances are constructed ad hoc all over consumer code, and the encryption-derived
|
|
68
|
+
* physical schema (companion columns — see `EncryptedColumns.ensureSchema`) is injected
|
|
69
|
+
* per-instance at the seams that use an instance. Name-based resolution is one of those
|
|
70
|
+
* seams: statement generation and driver column-type lookups resolve the REGISTRY's
|
|
71
|
+
* instance through here, which must carry the same derived columns as the instance the
|
|
72
|
+
* caller handed the Db. Idempotent (marker-checked); a call-time require keeps the module
|
|
73
|
+
* graph acyclic at load time.
|
|
74
|
+
*/
|
|
75
|
+
var ensureEncryptionSchema = function (table) {
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
77
|
+
var EncryptedColumns = require('./encryption/EncryptedColumns').EncryptedColumns;
|
|
78
|
+
new EncryptedColumns().ensureSchema(table);
|
|
79
|
+
return table;
|
|
80
|
+
};
|
|
58
81
|
var getColumnPropertyName = function (table, columnName) {
|
|
59
82
|
for (var columnPropertyName in table.columns) {
|
|
60
83
|
var column = table.columns[columnPropertyName];
|
package/dist/src/Table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.js","sourceRoot":"","sources":["../../src/Table.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAmE;AAEnE,mCAAkD;AAClD,iEAAkE;
|
|
1
|
+
{"version":3,"file":"Table.js","sourceRoot":"","sources":["../../src/Table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ColumnQueryTransform, ColumnQueryTransformProvider } from '@proteinjs/db-query';
|
|
2
|
+
import { ColumnQueryRuntime, Table } from './Table';
|
|
3
|
+
/**
|
|
4
|
+
* The Table-model side of db-query's column query-transform seam: resolves a
|
|
5
|
+
* (tableName, columnProperty) pair to the column's own `Column.queryTransform`, built with
|
|
6
|
+
* the current operation's `ColumnQueryRuntime`. `Db.addColumnQueries` hands one of these
|
|
7
|
+
* to `QueryBuilder.applyColumnTransforms` on every query, so a column's query contract is
|
|
8
|
+
* consulted wherever the column is used — including inside subquery values on other
|
|
9
|
+
* tables, resolved through the same table registry the statement layer uses.
|
|
10
|
+
*/
|
|
11
|
+
export declare class TableQueryTransformProvider implements ColumnQueryTransformProvider {
|
|
12
|
+
private getTable;
|
|
13
|
+
private runtime;
|
|
14
|
+
constructor(getTable: (tableName: string) => Table<any>, runtime: ColumnQueryRuntime);
|
|
15
|
+
getTransform(tableName: string, columnPropertyName: string): ColumnQueryTransform | undefined;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=TableQueryTransformProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableQueryTransformProvider.d.ts","sourceRoot":"","sources":["../../src/TableQueryTransformProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAU,kBAAkB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE5D;;;;;;;GAOG;AACH,qBAAa,2BAA4B,YAAW,4BAA4B;IAE5E,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;gBADP,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG,CAAC,EAC3C,OAAO,EAAE,kBAAkB;IAGrC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;CAa9F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TableQueryTransformProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* The Table-model side of db-query's column query-transform seam: resolves a
|
|
6
|
+
* (tableName, columnProperty) pair to the column's own `Column.queryTransform`, built with
|
|
7
|
+
* the current operation's `ColumnQueryRuntime`. `Db.addColumnQueries` hands one of these
|
|
8
|
+
* to `QueryBuilder.applyColumnTransforms` on every query, so a column's query contract is
|
|
9
|
+
* consulted wherever the column is used — including inside subquery values on other
|
|
10
|
+
* tables, resolved through the same table registry the statement layer uses.
|
|
11
|
+
*/
|
|
12
|
+
var TableQueryTransformProvider = /** @class */ (function () {
|
|
13
|
+
function TableQueryTransformProvider(getTable, runtime) {
|
|
14
|
+
this.getTable = getTable;
|
|
15
|
+
this.runtime = runtime;
|
|
16
|
+
}
|
|
17
|
+
TableQueryTransformProvider.prototype.getTransform = function (tableName, columnPropertyName) {
|
|
18
|
+
var _a;
|
|
19
|
+
var table;
|
|
20
|
+
try {
|
|
21
|
+
table = this.getTable(tableName);
|
|
22
|
+
}
|
|
23
|
+
catch (_b) {
|
|
24
|
+
// Not a registered table (e.g. an aggregate '*' field, or a name outside the model) —
|
|
25
|
+
// nothing to consult.
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
var column = table.columns[columnPropertyName];
|
|
29
|
+
return (_a = column === null || column === void 0 ? void 0 : column.queryTransform) === null || _a === void 0 ? void 0 : _a.call(column, this.runtime);
|
|
30
|
+
};
|
|
31
|
+
return TableQueryTransformProvider;
|
|
32
|
+
}());
|
|
33
|
+
exports.TableQueryTransformProvider = TableQueryTransformProvider;
|
|
34
|
+
//# sourceMappingURL=TableQueryTransformProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableQueryTransformProvider.js","sourceRoot":"","sources":["../../src/TableQueryTransformProvider.ts"],"names":[],"mappings":";;;AAGA;;;;;;;GAOG;AACH;IACE,qCACU,QAA2C,EAC3C,OAA2B;QAD3B,aAAQ,GAAR,QAAQ,CAAmC;QAC3C,YAAO,GAAP,OAAO,CAAoB;IAClC,CAAC;IAEJ,kDAAY,GAAZ,UAAa,SAAiB,EAAE,kBAA0B;;QACxD,IAAI,KAAiB,CAAC;QACtB,IAAI;YACF,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SAClC;QAAC,WAAM;YACN,sFAAsF;YACtF,sBAAsB;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAM,MAAM,GAAI,KAAK,CAAC,OAAe,CAAC,kBAAkB,CAAiC,CAAC;QAC1F,OAAO,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,uDAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IACH,kCAAC;AAAD,CAAC,AAnBD,IAmBC;AAnBY,kEAA2B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/**
|
|
4
|
+
* Base64url (RFC 4648 §5) over Buffers, hand-rolled because the package's @types/node
|
|
5
|
+
* predates the 'base64url' BufferEncoding. URL/filename-safe alphabet, no padding — safe
|
|
6
|
+
* inside the colon-delimited ciphertext envelope and as index-column values.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Base64Url {
|
|
9
|
+
static encode(bytes: Buffer): string;
|
|
10
|
+
static decode(encoded: string): Buffer;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=Base64Url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base64Url.d.ts","sourceRoot":"","sources":["../../../src/encryption/Base64Url.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,qBAAa,SAAS;IACpB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAGvC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Base64Url = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base64url (RFC 4648 §5) over Buffers, hand-rolled because the package's @types/node
|
|
6
|
+
* predates the 'base64url' BufferEncoding. URL/filename-safe alphabet, no padding — safe
|
|
7
|
+
* inside the colon-delimited ciphertext envelope and as index-column values.
|
|
8
|
+
*/
|
|
9
|
+
var Base64Url = /** @class */ (function () {
|
|
10
|
+
function Base64Url() {
|
|
11
|
+
}
|
|
12
|
+
Base64Url.encode = function (bytes) {
|
|
13
|
+
return bytes.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
|
|
14
|
+
};
|
|
15
|
+
Base64Url.decode = function (encoded) {
|
|
16
|
+
return Buffer.from(encoded.replace(/-/g, '+').replace(/_/g, '/'), 'base64');
|
|
17
|
+
};
|
|
18
|
+
return Base64Url;
|
|
19
|
+
}());
|
|
20
|
+
exports.Base64Url = Base64Url;
|
|
21
|
+
//# sourceMappingURL=Base64Url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base64Url.js","sourceRoot":"","sources":["../../../src/encryption/Base64Url.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH;IAAA;IAQA,CAAC;IAPQ,gBAAM,GAAb,UAAc,KAAa;QACzB,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IAEM,gBAAM,GAAb,UAAc,OAAe;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9E,CAAC;IACH,gBAAC;AAAD,CAAC,AARD,IAQC;AARY,8BAAS"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Table } from '../Table';
|
|
2
|
+
import { Record } from '../Record';
|
|
3
|
+
/**
|
|
4
|
+
* One wrapped per-owner data key version (see `DataKeyStore`).
|
|
5
|
+
*
|
|
6
|
+
* - `active` — encrypts new writes (the highest active version) and fingerprints queries.
|
|
7
|
+
* - `retired` — decrypt-only: envelopes referencing it still unwrap, but no new writes or
|
|
8
|
+
* query fingerprints use it. A rotation walk moves every row off a version, then retires it.
|
|
9
|
+
*
|
|
10
|
+
* Crypto-shred = deleting an owner's rows here: every envelope naming that owner becomes
|
|
11
|
+
* permanently unreadable, including inside backups.
|
|
12
|
+
*/
|
|
13
|
+
export interface DataEncryptionKey extends Record {
|
|
14
|
+
/** The key owner (a user id — the row's permission-source scope owner). */
|
|
15
|
+
owner: string;
|
|
16
|
+
/** Monotonic per-owner version; envelopes name (owner, version). */
|
|
17
|
+
version: number;
|
|
18
|
+
/** The data-key material, wrapped by the master key (`MasterKeyProvider`). */
|
|
19
|
+
wrappedKey: string;
|
|
20
|
+
status: 'active' | 'retired';
|
|
21
|
+
}
|
|
22
|
+
export declare class DataEncryptionKeyTable extends Table<DataEncryptionKey> {
|
|
23
|
+
name: string;
|
|
24
|
+
columns: Table<DataEncryptionKey>['columns'];
|
|
25
|
+
/** (owner, version) is the identity an envelope names — the race loser on concurrent
|
|
26
|
+
* first-write key creation fails here and re-reads the winner's key. */
|
|
27
|
+
indexes: {
|
|
28
|
+
columns: (keyof DataEncryptionKey)[];
|
|
29
|
+
name?: string;
|
|
30
|
+
unique?: boolean;
|
|
31
|
+
}[];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=DataEncryptionKeyTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataEncryptionKeyTable.d.ts","sourceRoot":"","sources":["../../../src/encryption/DataEncryptionKeyTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,MAAM,EAAqB,MAAM,WAAW,CAAC;AAGtD;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAkB,SAAQ,MAAM;IAC/C,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9B;AAED,qBAAa,sBAAuB,SAAQ,KAAK,CAAC,iBAAiB,CAAC;IAC3D,IAAI,SAAyB;IAC7B,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAKhD;IACH;6EACyE;IAClE,OAAO,EAAE;QAAE,OAAO,EAAE,CAAC,MAAM,iBAAiB,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAEzF;CAGH"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.DataEncryptionKeyTable = void 0;
|
|
19
|
+
var Table_1 = require("../Table");
|
|
20
|
+
var Record_1 = require("../Record");
|
|
21
|
+
var Columns_1 = require("../Columns");
|
|
22
|
+
var DataEncryptionKeyTable = /** @class */ (function (_super) {
|
|
23
|
+
__extends(DataEncryptionKeyTable, _super);
|
|
24
|
+
function DataEncryptionKeyTable() {
|
|
25
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
26
|
+
_this.name = 'data_encryption_key';
|
|
27
|
+
_this.columns = (0, Record_1.withRecordColumns)({
|
|
28
|
+
owner: new Columns_1.StringColumn('owner', { nullable: false }, 36),
|
|
29
|
+
version: new Columns_1.IntegerColumn('version', { nullable: false }),
|
|
30
|
+
wrappedKey: new Columns_1.StringColumn('wrapped_key', { nullable: false }, 'MAX'),
|
|
31
|
+
status: new Columns_1.StringColumn('status', { nullable: false }, 16),
|
|
32
|
+
});
|
|
33
|
+
/** (owner, version) is the identity an envelope names — the race loser on concurrent
|
|
34
|
+
* first-write key creation fails here and re-reads the winner's key. */
|
|
35
|
+
_this.indexes = [
|
|
36
|
+
{ columns: ['owner', 'version'], name: 'data_encryption_key_owner_version_unique', unique: true },
|
|
37
|
+
];
|
|
38
|
+
return _this;
|
|
39
|
+
// No auth block: default-deny for every non-system caller. Key rows are framework
|
|
40
|
+
// machinery, only ever touched through system paths (DataKeyStore).
|
|
41
|
+
}
|
|
42
|
+
return DataEncryptionKeyTable;
|
|
43
|
+
}(Table_1.Table));
|
|
44
|
+
exports.DataEncryptionKeyTable = DataEncryptionKeyTable;
|
|
45
|
+
//# sourceMappingURL=DataEncryptionKeyTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataEncryptionKeyTable.js","sourceRoot":"","sources":["../../../src/encryption/DataEncryptionKeyTable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,kCAAiC;AACjC,oCAAsD;AACtD,sCAAyD;AAsBzD;IAA4C,0CAAwB;IAApE;QAAA,qEAeC;QAdQ,UAAI,GAAG,qBAAqB,CAAC;QAC7B,aAAO,GAAwC,IAAA,0BAAiB,EAAoB;YACzF,KAAK,EAAE,IAAI,sBAAY,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACzD,OAAO,EAAE,IAAI,uBAAa,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC1D,UAAU,EAAE,IAAI,sBAAY,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC;YACvE,MAAM,EAAE,IAAI,sBAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SAC5D,CAAC,CAAC;QACH;iFACyE;QAClE,aAAO,GAAgF;YAC5F,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,0CAA0C,EAAE,MAAM,EAAE,IAAI,EAAE;SAClG,CAAC;;QACF,kFAAkF;QAClF,oEAAoE;IACtE,CAAC;IAAD,6BAAC;AAAD,CAAC,AAfD,CAA4C,aAAK,GAehD;AAfY,wDAAsB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/**
|
|
4
|
+
* Decrypt was asked for a key that does not exist — most often because the owner's keys were
|
|
5
|
+
* crypto-shredded (account deletion): the ciphertext is permanently unreadable, by design.
|
|
6
|
+
*/
|
|
7
|
+
export declare class EncryptionKeyUnavailableError extends Error {
|
|
8
|
+
constructor(owner: string, version: number);
|
|
9
|
+
}
|
|
10
|
+
/** Unwrapped material of one data-key version. */
|
|
11
|
+
export interface DataKeyMaterial {
|
|
12
|
+
owner: string;
|
|
13
|
+
version: number;
|
|
14
|
+
/** AES-256 key for row values (first half of the 64-byte material). */
|
|
15
|
+
cipherKey: Buffer;
|
|
16
|
+
/** HMAC key for search-token fingerprints (second half). */
|
|
17
|
+
indexKey: Buffer;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Per-owner data keys for column encryption: creation, unwrap-once caching, rotation,
|
|
21
|
+
* retirement, and crypto-shred. Key rows live in `DataEncryptionKeyTable`, wrapped by the
|
|
22
|
+
* deployment's `MasterKeyProvider`; the vault is called once per key (then cached), never
|
|
23
|
+
* per row.
|
|
24
|
+
*
|
|
25
|
+
* All database access runs as system, OUTSIDE any ambient transaction: a key row must be
|
|
26
|
+
* durable independent of the caller's transaction outcome, because unwrapped material is
|
|
27
|
+
* cached in-process the moment it exists — a key created inside a transaction that later
|
|
28
|
+
* rolls back would leave the cache claiming a key the database lost. An orphaned key row
|
|
29
|
+
* from a rolled-back first write is harmless (a key no envelope names).
|
|
30
|
+
*
|
|
31
|
+
* The caches live on the global object (the per-package-install duplicate-module pattern —
|
|
32
|
+
* see `Db.getDefaultDbDriver`), so every live copy of this package shares one cache.
|
|
33
|
+
*/
|
|
34
|
+
export declare class DataKeyStore {
|
|
35
|
+
/** Unwrapped material cache TTL — bounds how long a shredded key can linger in a warm process. */
|
|
36
|
+
private static readonly MATERIAL_TTL_MS;
|
|
37
|
+
/** Owner key-row list TTL — bounds cross-process staleness of the active-version set. */
|
|
38
|
+
private static readonly OWNER_ROWS_TTL_MS;
|
|
39
|
+
private static readonly CACHES_GLOBAL_KEY;
|
|
40
|
+
private static readonly KEY_MATERIAL_BYTES;
|
|
41
|
+
private logger;
|
|
42
|
+
private table;
|
|
43
|
+
/**
|
|
44
|
+
* The key that encrypts new writes for `owner`: the highest active version, created on
|
|
45
|
+
* first use (each owner gets a randomly generated data key, wrapped by the master key).
|
|
46
|
+
*/
|
|
47
|
+
getWriteKey(owner: string): Promise<DataKeyMaterial>;
|
|
48
|
+
/** The key an envelope names — any status; decrypt must work until the key is shredded. */
|
|
49
|
+
getKeyByVersion(owner: string, version: number): Promise<DataKeyMaterial>;
|
|
50
|
+
/**
|
|
51
|
+
* The index keys a query fingerprints with: every ACTIVE version of every accessible
|
|
52
|
+
* owner (normally one per owner; two during a rotation window). Owners with no keys yet
|
|
53
|
+
* contribute nothing — they cannot have encrypted rows.
|
|
54
|
+
*/
|
|
55
|
+
getQueryIndexKeys(owners: string[]): Promise<DataKeyMaterial[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Mint the next key version for `owner` (new writes use it immediately; the old version
|
|
58
|
+
* stays active — still fingerprinting queries — until a rotation walk
|
|
59
|
+
* (`EncryptionLifecycleWalker` mode 'rotate-keys') has rewritten every row, after which
|
|
60
|
+
* the caller retires it via `retireKeyVersion`).
|
|
61
|
+
* @returns the new version number
|
|
62
|
+
*/
|
|
63
|
+
rotateKey(owner: string): Promise<number>;
|
|
64
|
+
/** Retire a version: envelopes naming it still decrypt; queries and writes stop using it. */
|
|
65
|
+
retireKeyVersion(owner: string, version: number): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Crypto-shred: delete every key version of `owner` and evict the caches. Every envelope
|
|
68
|
+
* naming the owner — in live rows and in every backup — becomes permanently unreadable.
|
|
69
|
+
*/
|
|
70
|
+
shredOwnerKeys(owner: string): Promise<number>;
|
|
71
|
+
private createKeyVersion;
|
|
72
|
+
private getOwnerRows;
|
|
73
|
+
private unwrap;
|
|
74
|
+
private highestActive;
|
|
75
|
+
private requireOwner;
|
|
76
|
+
/**
|
|
77
|
+
* A system Db pinned OUTSIDE any ambient transaction (see class doc). Imported lazily —
|
|
78
|
+
* this module is reachable from the serializer layer, below `Db` in the module graph.
|
|
79
|
+
*/
|
|
80
|
+
private systemDb;
|
|
81
|
+
private caches;
|
|
82
|
+
private evictOwner;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=DataKeyStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataKeyStore.d.ts","sourceRoot":"","sources":["../../../src/encryption/DataKeyStore.ts"],"names":[],"mappings":";;AAKA;;;GAGG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAQ3C;AAED,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAiBD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAY;IACvB,kGAAkG;IAClG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAkB;IACzD,yFAAyF;IACzF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IAC3E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAM;IAChD,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,KAAK,CAAgC;IAE7C;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB1D,2FAA2F;IACrF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAkB/E;;;;OAIG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAcrE;;;;;;OAMG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU/C,6FAA6F;IACvF,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAarE;;;OAGG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAetC,gBAAgB;YAsBhB,YAAY;YAsBZ,MAAM;IA2BpB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,YAAY;IAMpB;;;OAGG;YACW,QAAQ;IAuBtB,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,UAAU;CAGnB"}
|