@proteinjs/db-driver-spanner 1.23.5 → 1.24.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 +16 -0
- package/dist/generated/test/index.d.ts.map +1 -1
- package/dist/generated/test/index.js +15 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/src/SpannerSchemaOperations.d.ts.map +1 -1
- package/dist/src/SpannerSchemaOperations.js +4 -1
- package/dist/src/SpannerSchemaOperations.js.map +1 -1
- package/dist/test/ColumnEncryption.test.d.ts +2 -0
- package/dist/test/ColumnEncryption.test.d.ts.map +1 -0
- package/dist/test/ColumnEncryption.test.js +482 -0
- package/dist/test/ColumnEncryption.test.js.map +1 -0
- package/dist/test/EncryptedSearch.test.d.ts +2 -0
- package/dist/test/EncryptedSearch.test.d.ts.map +1 -0
- package/dist/test/EncryptedSearch.test.js +455 -0
- package/dist/test/EncryptedSearch.test.js.map +1 -0
- package/dist/test/EncryptionLifecycleWalker.test.d.ts +2 -0
- package/dist/test/EncryptionLifecycleWalker.test.d.ts.map +1 -0
- package/dist/test/EncryptionLifecycleWalker.test.js +408 -0
- package/dist/test/EncryptionLifecycleWalker.test.js.map +1 -0
- package/dist/test/EncryptionPerf.test.d.ts +2 -0
- package/dist/test/EncryptionPerf.test.d.ts.map +1 -0
- package/dist/test/EncryptionPerf.test.js +278 -0
- package/dist/test/EncryptionPerf.test.js.map +1 -0
- package/dist/test/EncryptionSortAndUnique.test.d.ts +2 -0
- package/dist/test/EncryptionSortAndUnique.test.d.ts.map +1 -0
- package/dist/test/EncryptionSortAndUnique.test.js +229 -0
- package/dist/test/EncryptionSortAndUnique.test.js.map +1 -0
- package/dist/test/index.d.ts +1 -0
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +1 -0
- package/dist/test/index.js.map +1 -1
- package/dist/test/util/columnEncryptionTestHarness.d.ts +23 -0
- package/dist/test/util/columnEncryptionTestHarness.d.ts.map +1 -0
- package/dist/test/util/columnEncryptionTestHarness.js +136 -0
- package/dist/test/util/columnEncryptionTestHarness.js.map +1 -0
- package/dist/test/util/columnEncryptionTestTables.d.ts +75 -0
- package/dist/test/util/columnEncryptionTestTables.d.ts.map +1 -0
- package/dist/test/util/columnEncryptionTestTables.js +124 -0
- package/dist/test/util/columnEncryptionTestTables.js.map +1 -0
- package/dist/test/util/serviceUpdateVerbsTestTables.d.ts +2 -2
- package/generated/test/index.ts +15 -1
- package/package.json +6 -6
- package/src/SpannerSchemaOperations.ts +4 -1
- package/test/ColumnEncryption.test.ts +252 -0
- package/test/EncryptedSearch.test.ts +247 -0
- package/test/EncryptionLifecycleWalker.test.ts +223 -0
- package/test/EncryptionPerf.test.ts +156 -0
- package/test/EncryptionSortAndUnique.test.ts +130 -0
- package/test/index.ts +1 -0
- package/test/util/columnEncryptionTestHarness.ts +54 -0
- package/test/util/columnEncryptionTestTables.ts +115 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var db_1 = require("@proteinjs/db");
|
|
40
|
+
var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
|
|
41
|
+
var db_transaction_context_1 = require("@proteinjs/db-transaction-context");
|
|
42
|
+
var getDropTestTable_1 = require("./util/getDropTestTable");
|
|
43
|
+
var SpannerEmulatorProvisioner_1 = require("./util/SpannerEmulatorProvisioner");
|
|
44
|
+
var columnEncryptionTestTables_1 = require("./util/columnEncryptionTestTables");
|
|
45
|
+
var columnEncryptionTestHarness_1 = require("./util/columnEncryptionTestHarness");
|
|
46
|
+
var test_1 = require("@proteinjs/db/test");
|
|
47
|
+
require("../generated/test/index");
|
|
48
|
+
var spannerDriver = new db_driver_spanner_1.SpannerDriver({
|
|
49
|
+
projectId: 'proteinjs-test',
|
|
50
|
+
instanceName: 'proteinjs-test',
|
|
51
|
+
databaseName: 'test',
|
|
52
|
+
});
|
|
53
|
+
globalThis['__proteinjs_db_defaultDbDriver'] = spannerDriver;
|
|
54
|
+
var OWNER_A = 'enc-search-owner-a';
|
|
55
|
+
var OWNER_B = 'enc-search-owner-b';
|
|
56
|
+
var accessibleOwners = [OWNER_A];
|
|
57
|
+
var docTable = new columnEncryptionTestTables_1.EncSearchDocTable();
|
|
58
|
+
var db = new db_1.Db(spannerDriver, undefined, new db_transaction_context_1.TransactionContext());
|
|
59
|
+
var titleLike = function (pattern) {
|
|
60
|
+
return new db_1.QueryBuilder(docTable.name).condition({ field: 'title', operator: 'LIKE', value: pattern });
|
|
61
|
+
};
|
|
62
|
+
var titlesOf = function (rows) { return rows.map(function (row) { return row.title; }).sort(); };
|
|
63
|
+
/**
|
|
64
|
+
* Search exactness over encrypted columns — the recheck contract: the token index answers a
|
|
65
|
+
* candidate set, each candidate is verified against the decrypted value, so NO false
|
|
66
|
+
* positive surfaces and NO true match is missed (query words >= 3 chars); 1-2 character
|
|
67
|
+
* query words behave as word-prefix search (the documented narrowing).
|
|
68
|
+
*/
|
|
69
|
+
describe('Encrypted search: exact contains/prefix, equality, shared-scope OR', function () {
|
|
70
|
+
var dropTable = (0, getDropTestTable_1.getDropTestTable)(spannerDriver);
|
|
71
|
+
var tableManager = spannerDriver.getTableManager();
|
|
72
|
+
var seeded = [];
|
|
73
|
+
var seed = function (scope, title, name, kind) { return __awaiter(void 0, void 0, void 0, function () {
|
|
74
|
+
var row;
|
|
75
|
+
return __generator(this, function (_a) {
|
|
76
|
+
switch (_a.label) {
|
|
77
|
+
case 0: return [4 /*yield*/, db.insert(docTable, { scope: scope, title: title, name: name !== null && name !== void 0 ? name : null, kind: kind !== null && kind !== void 0 ? kind : 'doc' })];
|
|
78
|
+
case 1:
|
|
79
|
+
row = _a.sent();
|
|
80
|
+
seeded.push(row.id);
|
|
81
|
+
return [2 /*return*/, row];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}); };
|
|
85
|
+
beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
86
|
+
return __generator(this, function (_a) {
|
|
87
|
+
switch (_a.label) {
|
|
88
|
+
case 0: return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.ensureProvisioned({
|
|
89
|
+
projectId: 'proteinjs-test',
|
|
90
|
+
instanceName: 'proteinjs-test',
|
|
91
|
+
databaseName: 'test',
|
|
92
|
+
})];
|
|
93
|
+
case 1:
|
|
94
|
+
_a.sent();
|
|
95
|
+
(0, test_1.registerTestUser)();
|
|
96
|
+
(0, db_1.setDbEncryptionConfig)({
|
|
97
|
+
masterKeyProvider: new db_1.InMemoryMasterKeyProvider('column-encryption-test'),
|
|
98
|
+
getAccessibleKeyOwners: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
99
|
+
return [2 /*return*/, accessibleOwners];
|
|
100
|
+
}); }); },
|
|
101
|
+
});
|
|
102
|
+
return [4 /*yield*/, (0, columnEncryptionTestHarness_1.loadColumnEncryptionTestSchema)(tableManager, [docTable])];
|
|
103
|
+
case 2:
|
|
104
|
+
_a.sent();
|
|
105
|
+
return [4 /*yield*/, (0, columnEncryptionTestHarness_1.purgeColumnEncryptionTestRows)(spannerDriver, [docTable])];
|
|
106
|
+
case 3:
|
|
107
|
+
_a.sent();
|
|
108
|
+
// The corpus: owner A's documents...
|
|
109
|
+
return [4 /*yield*/, seed(OWNER_A, 'Groceries list')];
|
|
110
|
+
case 4:
|
|
111
|
+
// The corpus: owner A's documents...
|
|
112
|
+
_a.sent();
|
|
113
|
+
return [4 /*yield*/, seed(OWNER_A, 'Grocery budget planning')];
|
|
114
|
+
case 5:
|
|
115
|
+
_a.sent();
|
|
116
|
+
return [4 /*yield*/, seed(OWNER_A, 'Pancake factory notes')];
|
|
117
|
+
case 6:
|
|
118
|
+
_a.sent();
|
|
119
|
+
return [4 /*yield*/, seed(OWNER_A, 'cake factory shift plan')];
|
|
120
|
+
case 7:
|
|
121
|
+
_a.sent();
|
|
122
|
+
return [4 /*yield*/, seed(OWNER_A, 'Therapy notes — divorce')];
|
|
123
|
+
case 8:
|
|
124
|
+
_a.sent();
|
|
125
|
+
return [4 /*yield*/, seed(OWNER_A, 'n3xa notes')];
|
|
126
|
+
case 9:
|
|
127
|
+
_a.sent();
|
|
128
|
+
return [4 /*yield*/, seed(OWNER_A, null, 'tag-null-title')];
|
|
129
|
+
case 10:
|
|
130
|
+
_a.sent();
|
|
131
|
+
return [4 /*yield*/, seed(OWNER_A, 'Once and future factories')];
|
|
132
|
+
case 11:
|
|
133
|
+
_a.sent();
|
|
134
|
+
// holds every fragment of "cake factory" NON-contiguously — a token-cover candidate the
|
|
135
|
+
// verify step must reject
|
|
136
|
+
return [4 /*yield*/, seed(OWNER_A, 'factory made cake platter')];
|
|
137
|
+
case 12:
|
|
138
|
+
// holds every fragment of "cake factory" NON-contiguously — a token-cover candidate the
|
|
139
|
+
// verify step must reject
|
|
140
|
+
_a.sent();
|
|
141
|
+
// ...and owner B's (a sharer), including an overlapping word
|
|
142
|
+
return [4 /*yield*/, seed(OWNER_B, 'Groceries for the trip')];
|
|
143
|
+
case 13:
|
|
144
|
+
// ...and owner B's (a sharer), including an overlapping word
|
|
145
|
+
_a.sent();
|
|
146
|
+
return [4 /*yield*/, seed(OWNER_B, 'B-only cake recipe')];
|
|
147
|
+
case 14:
|
|
148
|
+
_a.sent();
|
|
149
|
+
return [2 /*return*/];
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}); }, 120000);
|
|
153
|
+
afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
154
|
+
var _i, seeded_1, id;
|
|
155
|
+
return __generator(this, function (_a) {
|
|
156
|
+
switch (_a.label) {
|
|
157
|
+
case 0:
|
|
158
|
+
_i = 0, seeded_1 = seeded;
|
|
159
|
+
_a.label = 1;
|
|
160
|
+
case 1:
|
|
161
|
+
if (!(_i < seeded_1.length)) return [3 /*break*/, 4];
|
|
162
|
+
id = seeded_1[_i];
|
|
163
|
+
return [4 /*yield*/, db.delete(docTable, { id: id }).catch(function () { return undefined; })];
|
|
164
|
+
case 2:
|
|
165
|
+
_a.sent();
|
|
166
|
+
_a.label = 3;
|
|
167
|
+
case 3:
|
|
168
|
+
_i++;
|
|
169
|
+
return [3 /*break*/, 1];
|
|
170
|
+
case 4:
|
|
171
|
+
(0, db_1.setDbEncryptionConfig)(undefined);
|
|
172
|
+
(0, test_1.clearTestUser)();
|
|
173
|
+
return [4 /*yield*/, dropTable(new db_1.EncryptedColumns().tokenTableFor(docTable))];
|
|
174
|
+
case 5:
|
|
175
|
+
_a.sent();
|
|
176
|
+
return [4 /*yield*/, dropTable(docTable)];
|
|
177
|
+
case 6:
|
|
178
|
+
_a.sent();
|
|
179
|
+
return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.release()];
|
|
180
|
+
case 7:
|
|
181
|
+
_a.sent();
|
|
182
|
+
return [2 /*return*/];
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}); }, 120000);
|
|
186
|
+
beforeEach(function () {
|
|
187
|
+
accessibleOwners = [OWNER_A];
|
|
188
|
+
});
|
|
189
|
+
test('contains search is exact: every true match returned, nothing else (the home-search shape)', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
190
|
+
var rows, factoryRows;
|
|
191
|
+
return __generator(this, function (_a) {
|
|
192
|
+
switch (_a.label) {
|
|
193
|
+
case 0: return [4 /*yield*/, db.query(docTable, titleLike('%Groceries%'))];
|
|
194
|
+
case 1:
|
|
195
|
+
rows = _a.sent();
|
|
196
|
+
expect(titlesOf(rows)).toEqual(['Groceries list']);
|
|
197
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%cake factory%'))];
|
|
198
|
+
case 2:
|
|
199
|
+
factoryRows = _a.sent();
|
|
200
|
+
expect(titlesOf(factoryRows)).toEqual(['Pancake factory notes', 'cake factory shift plan']);
|
|
201
|
+
return [2 /*return*/];
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}); });
|
|
205
|
+
test('no false positives: rows holding all fragments non-contiguously are rejected by the verify step', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
206
|
+
var rows;
|
|
207
|
+
return __generator(this, function (_a) {
|
|
208
|
+
switch (_a.label) {
|
|
209
|
+
case 0: return [4 /*yield*/, db.query(docTable, titleLike('%factory shift%'))];
|
|
210
|
+
case 1:
|
|
211
|
+
rows = _a.sent();
|
|
212
|
+
expect(titlesOf(rows)).toEqual(['cake factory shift plan']);
|
|
213
|
+
return [2 /*return*/];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}); });
|
|
217
|
+
test('case-insensitive LIKE (caseSensitive=false) matches across case', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
218
|
+
var qb, rows, strict;
|
|
219
|
+
return __generator(this, function (_a) {
|
|
220
|
+
switch (_a.label) {
|
|
221
|
+
case 0:
|
|
222
|
+
qb = new db_1.QueryBuilder(docTable.name);
|
|
223
|
+
qb.condition({ field: 'title', operator: 'LIKE', value: '%GROCERIES%' }, undefined, false);
|
|
224
|
+
return [4 /*yield*/, db.query(docTable, qb)];
|
|
225
|
+
case 1:
|
|
226
|
+
rows = _a.sent();
|
|
227
|
+
expect(titlesOf(rows)).toEqual(['Groceries list']);
|
|
228
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%GROCERIES%'))];
|
|
229
|
+
case 2:
|
|
230
|
+
strict = _a.sent();
|
|
231
|
+
expect(strict.length).toBe(0);
|
|
232
|
+
return [2 /*return*/];
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}); });
|
|
236
|
+
test('prefix search (q%) matches value starts only', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
237
|
+
var rows;
|
|
238
|
+
return __generator(this, function (_a) {
|
|
239
|
+
switch (_a.label) {
|
|
240
|
+
case 0: return [4 /*yield*/, db.query(docTable, titleLike('Groc%'))];
|
|
241
|
+
case 1:
|
|
242
|
+
rows = _a.sent();
|
|
243
|
+
expect(titlesOf(rows)).toEqual(['Groceries list', 'Grocery budget planning']);
|
|
244
|
+
return [2 /*return*/];
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}); });
|
|
248
|
+
test('1-2 character queries behave as word-prefix search (the documented narrowing)', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
249
|
+
var rows, _i, rows_1, row, midWord;
|
|
250
|
+
var _a;
|
|
251
|
+
return __generator(this, function (_b) {
|
|
252
|
+
switch (_b.label) {
|
|
253
|
+
case 0: return [4 /*yield*/, db.query(docTable, titleLike('%n%'))];
|
|
254
|
+
case 1:
|
|
255
|
+
rows = _b.sent();
|
|
256
|
+
for (_i = 0, rows_1 = rows; _i < rows_1.length; _i++) {
|
|
257
|
+
row = rows_1[_i];
|
|
258
|
+
expect(((_a = row.title) !== null && _a !== void 0 ? _a : '')
|
|
259
|
+
.toLowerCase()
|
|
260
|
+
.split(/[^a-z0-9]+/)
|
|
261
|
+
.some(function (word) { return word.startsWith('n'); })).toBe(true);
|
|
262
|
+
}
|
|
263
|
+
expect(titlesOf(rows)).toContain('n3xa notes');
|
|
264
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%x%'))];
|
|
265
|
+
case 2:
|
|
266
|
+
midWord = _b.sent();
|
|
267
|
+
expect(titlesOf(midWord)).toEqual([]);
|
|
268
|
+
return [2 /*return*/];
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}); });
|
|
272
|
+
test('composition: encrypted search ANDs with metadata conditions natively', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
273
|
+
var rows, noRows;
|
|
274
|
+
return __generator(this, function (_a) {
|
|
275
|
+
switch (_a.label) {
|
|
276
|
+
case 0: return [4 /*yield*/, db.query(docTable, titleLike('%Groceries%').condition({ field: 'kind', operator: '=', value: 'doc' }))];
|
|
277
|
+
case 1:
|
|
278
|
+
rows = _a.sent();
|
|
279
|
+
expect(titlesOf(rows)).toEqual(['Groceries list']);
|
|
280
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%Groceries%').condition({ field: 'kind', operator: '=', value: 'other' }))];
|
|
281
|
+
case 2:
|
|
282
|
+
noRows = _a.sent();
|
|
283
|
+
expect(noRows.length).toBe(0);
|
|
284
|
+
return [2 /*return*/];
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}); });
|
|
288
|
+
test('getRowCount over an encrypted search is exact', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
289
|
+
var _a;
|
|
290
|
+
return __generator(this, function (_b) {
|
|
291
|
+
switch (_b.label) {
|
|
292
|
+
case 0:
|
|
293
|
+
_a = expect;
|
|
294
|
+
return [4 /*yield*/, db.getRowCount(docTable, titleLike('%cake factory%'))];
|
|
295
|
+
case 1:
|
|
296
|
+
_a.apply(void 0, [_b.sent()]).toBe(2);
|
|
297
|
+
return [2 /*return*/];
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}); });
|
|
301
|
+
test('equality lookup rides the whole-value fingerprint: exact, case-exact (the tag get-or-create shape)', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
302
|
+
var exact, lower, missing;
|
|
303
|
+
return __generator(this, function (_a) {
|
|
304
|
+
switch (_a.label) {
|
|
305
|
+
case 0: return [4 /*yield*/, seed(OWNER_A, 'eq holder', 'Divorce')];
|
|
306
|
+
case 1:
|
|
307
|
+
_a.sent();
|
|
308
|
+
return [4 /*yield*/, seed(OWNER_A, 'eq holder 2', 'divorce')];
|
|
309
|
+
case 2:
|
|
310
|
+
_a.sent();
|
|
311
|
+
return [4 /*yield*/, db.get(docTable, { name: 'Divorce' })];
|
|
312
|
+
case 3:
|
|
313
|
+
exact = _a.sent();
|
|
314
|
+
expect(exact.title).toBe('eq holder');
|
|
315
|
+
return [4 /*yield*/, db.query(docTable, { name: 'divorce' })];
|
|
316
|
+
case 4:
|
|
317
|
+
lower = _a.sent();
|
|
318
|
+
expect(lower.length).toBe(1);
|
|
319
|
+
expect(lower[0].title).toBe('eq holder 2');
|
|
320
|
+
return [4 /*yield*/, db.get(docTable, { name: 'no-such-tag' })];
|
|
321
|
+
case 5:
|
|
322
|
+
missing = _a.sent();
|
|
323
|
+
expect(missing).toBeFalsy();
|
|
324
|
+
return [2 /*return*/];
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}); });
|
|
328
|
+
test('shared-scope search: fingerprints once per accessible owner, ORs the matches', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
329
|
+
var own, shared;
|
|
330
|
+
return __generator(this, function (_a) {
|
|
331
|
+
switch (_a.label) {
|
|
332
|
+
case 0: return [4 /*yield*/, db.query(docTable, titleLike('%Groceries%'))];
|
|
333
|
+
case 1:
|
|
334
|
+
own = _a.sent();
|
|
335
|
+
expect(titlesOf(own)).toEqual(['Groceries list']);
|
|
336
|
+
// B shares with A: the same caller query now covers both owners' keys
|
|
337
|
+
accessibleOwners = [OWNER_A, OWNER_B];
|
|
338
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%Groceries%'))];
|
|
339
|
+
case 2:
|
|
340
|
+
shared = _a.sent();
|
|
341
|
+
expect(titlesOf(shared)).toEqual(['Groceries for the trip', 'Groceries list']);
|
|
342
|
+
return [2 /*return*/];
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}); });
|
|
346
|
+
test('token rows follow the row lifecycle: update rewrites them, delete removes them', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
347
|
+
var row, _a, _b, _c, _d, _e, _f, tokenTable, orphans;
|
|
348
|
+
return __generator(this, function (_g) {
|
|
349
|
+
switch (_g.label) {
|
|
350
|
+
case 0: return [4 /*yield*/, db.insert(docTable, {
|
|
351
|
+
scope: OWNER_A,
|
|
352
|
+
title: 'ephemeral zebra thoughts',
|
|
353
|
+
name: null,
|
|
354
|
+
kind: 'doc',
|
|
355
|
+
})];
|
|
356
|
+
case 1:
|
|
357
|
+
row = _g.sent();
|
|
358
|
+
_a = expect;
|
|
359
|
+
_b = titlesOf;
|
|
360
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%zebra%'))];
|
|
361
|
+
case 2:
|
|
362
|
+
_a.apply(void 0, [_b.apply(void 0, [_g.sent()])]).toEqual(['ephemeral zebra thoughts']);
|
|
363
|
+
return [4 /*yield*/, db.update(docTable, { id: row.id, title: 'renamed giraffe thoughts' })];
|
|
364
|
+
case 3:
|
|
365
|
+
_g.sent();
|
|
366
|
+
_c = expect;
|
|
367
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%zebra%'))];
|
|
368
|
+
case 4:
|
|
369
|
+
_c.apply(void 0, [(_g.sent()).length]).toBe(0);
|
|
370
|
+
_d = expect;
|
|
371
|
+
_e = titlesOf;
|
|
372
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%giraffe%'))];
|
|
373
|
+
case 5:
|
|
374
|
+
_d.apply(void 0, [_e.apply(void 0, [_g.sent()])]).toEqual(['renamed giraffe thoughts']);
|
|
375
|
+
return [4 /*yield*/, db.delete(docTable, { id: row.id })];
|
|
376
|
+
case 6:
|
|
377
|
+
_g.sent();
|
|
378
|
+
_f = expect;
|
|
379
|
+
return [4 /*yield*/, db.query(docTable, titleLike('%giraffe%'))];
|
|
380
|
+
case 7:
|
|
381
|
+
_f.apply(void 0, [(_g.sent()).length]).toBe(0);
|
|
382
|
+
tokenTable = new db_1.EncryptedColumns().tokenTableFor(docTable);
|
|
383
|
+
return [4 /*yield*/, spannerDriver.runQuery(function () { return ({
|
|
384
|
+
sql: "SELECT COUNT(*) as tokenCount FROM `".concat(tokenTable.name, "` WHERE `record_id` = '").concat(row.id, "'"),
|
|
385
|
+
}); })];
|
|
386
|
+
case 8:
|
|
387
|
+
orphans = _g.sent();
|
|
388
|
+
expect(Number(orphans[0].tokenCount)).toBe(0);
|
|
389
|
+
return [2 /*return*/];
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
}); });
|
|
393
|
+
test('delete by encrypted search: WHERE title LIKE deletes exactly the true matches', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
394
|
+
var kept, doomed, deleteCount, _a, _b;
|
|
395
|
+
return __generator(this, function (_c) {
|
|
396
|
+
switch (_c.label) {
|
|
397
|
+
case 0: return [4 /*yield*/, db.insert(docTable, { scope: OWNER_A, title: 'wombat keep', name: null, kind: 'doc' })];
|
|
398
|
+
case 1:
|
|
399
|
+
kept = _c.sent();
|
|
400
|
+
return [4 /*yield*/, db.insert(docTable, { scope: OWNER_A, title: 'wombat purge now', name: null, kind: 'doc' })];
|
|
401
|
+
case 2:
|
|
402
|
+
doomed = _c.sent();
|
|
403
|
+
return [4 /*yield*/, db.delete(docTable, titleLike('%purge now%'))];
|
|
404
|
+
case 3:
|
|
405
|
+
deleteCount = _c.sent();
|
|
406
|
+
expect(deleteCount).toBe(1);
|
|
407
|
+
_a = expect;
|
|
408
|
+
return [4 /*yield*/, db.get(docTable, { id: kept.id })];
|
|
409
|
+
case 4:
|
|
410
|
+
_a.apply(void 0, [(_c.sent()).title]).toBe('wombat keep');
|
|
411
|
+
_b = expect;
|
|
412
|
+
return [4 /*yield*/, db.get(docTable, { id: doomed.id })];
|
|
413
|
+
case 5:
|
|
414
|
+
_b.apply(void 0, [_c.sent()]).toBeFalsy();
|
|
415
|
+
return [4 /*yield*/, db.delete(docTable, { id: kept.id })];
|
|
416
|
+
case 6:
|
|
417
|
+
_c.sent();
|
|
418
|
+
return [2 /*return*/];
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
}); });
|
|
422
|
+
test('update by encrypted search: WHERE title LIKE updates exactly the true matches', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
423
|
+
var target, bystander, updateCount, _a, _b;
|
|
424
|
+
return __generator(this, function (_c) {
|
|
425
|
+
switch (_c.label) {
|
|
426
|
+
case 0: return [4 /*yield*/, db.insert(docTable, { scope: OWNER_A, title: 'quokka target row', name: null, kind: 'doc' })];
|
|
427
|
+
case 1:
|
|
428
|
+
target = _c.sent();
|
|
429
|
+
return [4 /*yield*/, db.insert(docTable, { scope: OWNER_A, title: 'quokka bystander', name: null, kind: 'doc' })];
|
|
430
|
+
case 2:
|
|
431
|
+
bystander = _c.sent();
|
|
432
|
+
return [4 /*yield*/, db.update(docTable, { kind: 'flagged' }, titleLike('%target row%'))];
|
|
433
|
+
case 3:
|
|
434
|
+
updateCount = _c.sent();
|
|
435
|
+
expect(updateCount).toBe(1);
|
|
436
|
+
_a = expect;
|
|
437
|
+
return [4 /*yield*/, db.get(docTable, { id: target.id })];
|
|
438
|
+
case 4:
|
|
439
|
+
_a.apply(void 0, [(_c.sent()).kind]).toBe('flagged');
|
|
440
|
+
_b = expect;
|
|
441
|
+
return [4 /*yield*/, db.get(docTable, { id: bystander.id })];
|
|
442
|
+
case 5:
|
|
443
|
+
_b.apply(void 0, [(_c.sent()).kind]).toBe('doc');
|
|
444
|
+
return [4 /*yield*/, db.delete(docTable, { id: target.id })];
|
|
445
|
+
case 6:
|
|
446
|
+
_c.sent();
|
|
447
|
+
return [4 /*yield*/, db.delete(docTable, { id: bystander.id })];
|
|
448
|
+
case 7:
|
|
449
|
+
_c.sent();
|
|
450
|
+
return [2 /*return*/];
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
}); });
|
|
454
|
+
});
|
|
455
|
+
//# sourceMappingURL=EncryptedSearch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EncryptedSearch.test.js","sourceRoot":"","sources":["../../test/EncryptedSearch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EncryptionLifecycleWalker.test.d.ts","sourceRoot":"","sources":["../../test/EncryptionLifecycleWalker.test.ts"],"names":[],"mappings":"AAqBA,OAAO,yBAAyB,CAAC"}
|