jinaga-server 1.0.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/LICENSE +22 -0
- package/dist/authentication/authentication-device.d.ts +20 -0
- package/dist/authentication/authentication-device.js +61 -0
- package/dist/authentication/authentication-device.js.map +1 -0
- package/dist/authentication/authentication-impl.d.ts +21 -0
- package/dist/authentication/authentication-impl.js +61 -0
- package/dist/authentication/authentication-impl.js.map +1 -0
- package/dist/authentication/authentication-session.d.ts +23 -0
- package/dist/authentication/authentication-session.js +85 -0
- package/dist/authentication/authentication-session.js.map +1 -0
- package/dist/authentication/authentication.d.ts +5 -0
- package/dist/authentication/authentication.js +3 -0
- package/dist/authentication/authentication.js.map +1 -0
- package/dist/authentication.d.ts +17 -0
- package/dist/authentication.js +52 -0
- package/dist/authentication.js.map +1 -0
- package/dist/authorization/authorization-keystore.d.ts +13 -0
- package/dist/authorization/authorization-keystore.js +61 -0
- package/dist/authorization/authorization-keystore.js.map +1 -0
- package/dist/http/node-http.d.ts +7 -0
- package/dist/http/node-http.js +126 -0
- package/dist/http/node-http.js.map +1 -0
- package/dist/http/router.d.ts +20 -0
- package/dist/http/router.js +223 -0
- package/dist/http/router.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/jinaga-server.d.ts +18 -0
- package/dist/jinaga-server.js +101 -0
- package/dist/jinaga-server.js.map +1 -0
- package/dist/keystore.d.ts +9 -0
- package/dist/keystore.js +3 -0
- package/dist/keystore.js.map +1 -0
- package/dist/memory/memory-keystore.d.ts +16 -0
- package/dist/memory/memory-keystore.js +86 -0
- package/dist/memory/memory-keystore.js.map +1 -0
- package/dist/postgres/connection.d.ts +12 -0
- package/dist/postgres/connection.js +83 -0
- package/dist/postgres/connection.js.map +1 -0
- package/dist/postgres/edge-record.d.ts +9 -0
- package/dist/postgres/edge-record.js +30 -0
- package/dist/postgres/edge-record.js.map +1 -0
- package/dist/postgres/maps.d.ts +21 -0
- package/dist/postgres/maps.js +86 -0
- package/dist/postgres/maps.js.map +1 -0
- package/dist/postgres/postgres-keystore.d.ts +20 -0
- package/dist/postgres/postgres-keystore.js +168 -0
- package/dist/postgres/postgres-keystore.js.map +1 -0
- package/dist/postgres/postgres-store.d.ts +20 -0
- package/dist/postgres/postgres-store.js +717 -0
- package/dist/postgres/postgres-store.js.map +1 -0
- package/dist/postgres/query-description-builder.d.ts +13 -0
- package/dist/postgres/query-description-builder.js +104 -0
- package/dist/postgres/query-description-builder.js.map +1 -0
- package/dist/postgres/query-description.d.ts +71 -0
- package/dist/postgres/query-description.js +256 -0
- package/dist/postgres/query-description.js.map +1 -0
- package/dist/postgres/specification-result-sql.d.ts +41 -0
- package/dist/postgres/specification-result-sql.js +260 -0
- package/dist/postgres/specification-result-sql.js.map +1 -0
- package/dist/postgres/specification-sql.d.ts +3 -0
- package/dist/postgres/specification-sql.js +119 -0
- package/dist/postgres/specification-sql.js.map +1 -0
- package/dist/postgres/sql.d.ts +10 -0
- package/dist/postgres/sql.js +396 -0
- package/dist/postgres/sql.js.map +1 -0
- package/dist/util/fn.d.ts +6 -0
- package/dist/util/fn.js +81 -0
- package/dist/util/fn.js.map +1 -0
- package/dist/util/promise.d.ts +1 -0
- package/dist/util/promise.js +10 -0
- package/dist/util/promise.js.map +1 -0
- package/docs/registrations.sql +22 -0
- package/docs/specification.txt +41 -0
- package/docs/sql-generator.gv +25 -0
- package/integration-test/docker-compose.yaml +13 -0
- package/integration-test/jinaga-test/Dockerfile +12 -0
- package/integration-test/jinaga-test/jinaga.test.js +425 -0
- package/integration-test/jinaga-test/package-lock.json +6767 -0
- package/integration-test/jinaga-test/package.json +25 -0
- package/integration-test/postgres/0-init-app-db.sh +16 -0
- package/integration-test/postgres/1-setup.sql +219 -0
- package/integration-test/postgres/2-grant.sh +17 -0
- package/integration-test/postgres/Dockerfile +5 -0
- package/integration-test/run.sh +17 -0
- package/integration-test/start_db.sh +2 -0
- package/integration-test/stop_db.sh +3 -0
- package/integration-test/test.sh +8 -0
- package/interactive/index.js +56 -0
- package/jest.config.js +12 -0
- package/package.json +51 -0
- package/scripts/combined.sql +46 -0
- package/scripts/cte.sql +55 -0
- package/scripts/separate.sql +27 -0
- package/setup.sh +34 -0
- package/setup.sql +329 -0
- package/src/authentication/authentication-device.ts +68 -0
- package/src/authentication/authentication-impl.ts +59 -0
- package/src/authentication/authentication-session.ts +95 -0
- package/src/authentication/authentication.ts +6 -0
- package/src/authentication.ts +45 -0
- package/src/authorization/authorization-keystore.ts +67 -0
- package/src/http/node-http.ts +106 -0
- package/src/http/router.ts +237 -0
- package/src/index.ts +1 -0
- package/src/jinaga-server.ts +125 -0
- package/src/keystore.ts +10 -0
- package/src/memory/memory-keystore.ts +93 -0
- package/src/postgres/connection.ts +73 -0
- package/src/postgres/edge-record.ts +36 -0
- package/src/postgres/maps.ts +89 -0
- package/src/postgres/postgres-keystore.ts +167 -0
- package/src/postgres/postgres-store.ts +874 -0
- package/src/postgres/query-description-builder.ts +116 -0
- package/src/postgres/query-description.ts +385 -0
- package/src/postgres/specification-result-sql.ts +362 -0
- package/src/postgres/specification-sql.ts +138 -0
- package/src/postgres/sql.ts +482 -0
- package/src/util/fn.ts +63 -0
- package/src/util/promise.ts +5 -0
- package/test/authorization/authorizationSpec.ts +209 -0
- package/test/postgres/postgresSpec.ts +385 -0
- package/test/postgres/postgresSpecificationSpec.ts +742 -0
- package/test/reporter.js +25 -0
- package/tsconfig.json +25 -0
- package/upgrade.sh +21 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare type FactTypeMap = Map<string, number>;
|
|
2
|
+
export declare function emptyFactTypeMap(): Map<string, number>;
|
|
3
|
+
export declare function copyFactTypeMap(map: FactTypeMap): Map<string, number>;
|
|
4
|
+
export declare function addFactType(map: FactTypeMap, name: string, fact_type_id: number): FactTypeMap;
|
|
5
|
+
export declare function getFactTypeId(map: FactTypeMap, name: string): number;
|
|
6
|
+
export declare function mergeFactTypes(map1: FactTypeMap, map2: FactTypeMap): Map<string, number>;
|
|
7
|
+
export declare type RoleMap = Map<number, Map<string, number>>;
|
|
8
|
+
export declare function emptyRoleMap(): Map<number, Map<string, number>>;
|
|
9
|
+
export declare function copyRoleMap(map: RoleMap): Map<number, Map<string, number>>;
|
|
10
|
+
export declare function addRole(map: RoleMap, defining_fact_type_id: number, name: string, role_id: number): RoleMap;
|
|
11
|
+
export declare function hasRole(map: RoleMap, defining_fact_type_id: number, name: string): boolean;
|
|
12
|
+
export declare function getRoleId(map: RoleMap, defining_fact_type_id: number, name: string): number;
|
|
13
|
+
export declare function mergeRoleMaps(map1: RoleMap, map2: RoleMap): Map<number, Map<string, number>>;
|
|
14
|
+
export declare type FactMap = Map<string, Map<number, number>>;
|
|
15
|
+
export declare function emptyFactMap(): Map<string, Map<number, number>>;
|
|
16
|
+
export declare function addFact(map: FactMap, hash: string, fact_type_id: number, fact_id: number): FactMap;
|
|
17
|
+
export declare function hasFact(map: FactMap, hash: string, fact_type_id: number): boolean;
|
|
18
|
+
export declare function getFactId(map: FactMap, hash: string, fact_type_id: number): number;
|
|
19
|
+
export declare type PublicKeyMap = Map<string, number>;
|
|
20
|
+
export declare function emptyPublicKeyMap(): Map<string, number>;
|
|
21
|
+
export declare function getPublicKeyId(publicKeyMap: PublicKeyMap, publicKey: string): number;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPublicKeyId = exports.emptyPublicKeyMap = exports.getFactId = exports.hasFact = exports.addFact = exports.emptyFactMap = exports.mergeRoleMaps = exports.getRoleId = exports.hasRole = exports.addRole = exports.copyRoleMap = exports.emptyRoleMap = exports.mergeFactTypes = exports.getFactTypeId = exports.addFactType = exports.copyFactTypeMap = exports.emptyFactTypeMap = void 0;
|
|
4
|
+
function emptyFactTypeMap() {
|
|
5
|
+
return new Map();
|
|
6
|
+
}
|
|
7
|
+
exports.emptyFactTypeMap = emptyFactTypeMap;
|
|
8
|
+
function copyFactTypeMap(map) {
|
|
9
|
+
return new Map(map);
|
|
10
|
+
}
|
|
11
|
+
exports.copyFactTypeMap = copyFactTypeMap;
|
|
12
|
+
function addFactType(map, name, fact_type_id) {
|
|
13
|
+
return map.set(name, fact_type_id);
|
|
14
|
+
}
|
|
15
|
+
exports.addFactType = addFactType;
|
|
16
|
+
function getFactTypeId(map, name) {
|
|
17
|
+
return map.get(name);
|
|
18
|
+
}
|
|
19
|
+
exports.getFactTypeId = getFactTypeId;
|
|
20
|
+
function mergeFactTypes(map1, map2) {
|
|
21
|
+
return new Map([...map1, ...map2]);
|
|
22
|
+
}
|
|
23
|
+
exports.mergeFactTypes = mergeFactTypes;
|
|
24
|
+
function emptyRoleMap() {
|
|
25
|
+
return new Map();
|
|
26
|
+
}
|
|
27
|
+
exports.emptyRoleMap = emptyRoleMap;
|
|
28
|
+
function copyRoleMap(map) {
|
|
29
|
+
return new Map(map);
|
|
30
|
+
}
|
|
31
|
+
exports.copyRoleMap = copyRoleMap;
|
|
32
|
+
function addRole(map, defining_fact_type_id, name, role_id) {
|
|
33
|
+
const factTypeRoles = map.get(defining_fact_type_id) || new Map();
|
|
34
|
+
const modifiedFactTypeRoles = factTypeRoles.set(name, role_id);
|
|
35
|
+
return map.set(defining_fact_type_id, modifiedFactTypeRoles);
|
|
36
|
+
}
|
|
37
|
+
exports.addRole = addRole;
|
|
38
|
+
function hasRole(map, defining_fact_type_id, name) {
|
|
39
|
+
const roleMap = map.get(defining_fact_type_id);
|
|
40
|
+
return roleMap && roleMap.has(name);
|
|
41
|
+
}
|
|
42
|
+
exports.hasRole = hasRole;
|
|
43
|
+
function getRoleId(map, defining_fact_type_id, name) {
|
|
44
|
+
const roleMap = map.get(defining_fact_type_id);
|
|
45
|
+
return roleMap && roleMap.get(name);
|
|
46
|
+
}
|
|
47
|
+
exports.getRoleId = getRoleId;
|
|
48
|
+
function mergeRoleMaps(map1, map2) {
|
|
49
|
+
let merged = new Map(map1);
|
|
50
|
+
for (const [defining_fact_type_id, roleMap] of map2) {
|
|
51
|
+
const mergedRoleMap = merged.get(defining_fact_type_id) || new Map();
|
|
52
|
+
const mergedFactTypeRoles = new Map([...mergedRoleMap, ...roleMap]);
|
|
53
|
+
merged = merged.set(defining_fact_type_id, mergedFactTypeRoles);
|
|
54
|
+
}
|
|
55
|
+
return merged;
|
|
56
|
+
}
|
|
57
|
+
exports.mergeRoleMaps = mergeRoleMaps;
|
|
58
|
+
function emptyFactMap() {
|
|
59
|
+
return new Map();
|
|
60
|
+
}
|
|
61
|
+
exports.emptyFactMap = emptyFactMap;
|
|
62
|
+
function addFact(map, hash, fact_type_id, fact_id) {
|
|
63
|
+
const typeMap = map.get(hash) || new Map();
|
|
64
|
+
const modifiedTypeMap = typeMap.set(fact_type_id, fact_id);
|
|
65
|
+
return map.set(hash, modifiedTypeMap);
|
|
66
|
+
}
|
|
67
|
+
exports.addFact = addFact;
|
|
68
|
+
function hasFact(map, hash, fact_type_id) {
|
|
69
|
+
const typeMap = map.get(hash);
|
|
70
|
+
return typeMap && typeMap.has(fact_type_id);
|
|
71
|
+
}
|
|
72
|
+
exports.hasFact = hasFact;
|
|
73
|
+
function getFactId(map, hash, fact_type_id) {
|
|
74
|
+
const typeMap = map.get(hash) || new Map();
|
|
75
|
+
return typeMap.get(fact_type_id);
|
|
76
|
+
}
|
|
77
|
+
exports.getFactId = getFactId;
|
|
78
|
+
function emptyPublicKeyMap() {
|
|
79
|
+
return new Map();
|
|
80
|
+
}
|
|
81
|
+
exports.emptyPublicKeyMap = emptyPublicKeyMap;
|
|
82
|
+
function getPublicKeyId(publicKeyMap, publicKey) {
|
|
83
|
+
return publicKeyMap.get(publicKey);
|
|
84
|
+
}
|
|
85
|
+
exports.getPublicKeyId = getPublicKeyId;
|
|
86
|
+
//# sourceMappingURL=maps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maps.js","sourceRoot":"","sources":["../../src/postgres/maps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FactEnvelope, FactRecord, UserIdentity } from "jinaga";
|
|
2
|
+
import { Keystore } from "../keystore";
|
|
3
|
+
export declare class PostgresKeystore implements Keystore {
|
|
4
|
+
private connectionFactory;
|
|
5
|
+
private cache;
|
|
6
|
+
constructor(postgresUri: string);
|
|
7
|
+
close(): Promise<void>;
|
|
8
|
+
getOrCreateUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
|
|
9
|
+
getOrCreateDeviceFact(deviceIdentity: UserIdentity): Promise<FactRecord>;
|
|
10
|
+
getUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
|
|
11
|
+
getDeviceFact(deviceIdentity: UserIdentity): Promise<FactRecord>;
|
|
12
|
+
signFacts(userIdentity: UserIdentity, facts: FactRecord[]): Promise<FactEnvelope[]>;
|
|
13
|
+
private getOrCreateIdentityFact;
|
|
14
|
+
private getIdentityFact;
|
|
15
|
+
private getKeyPair;
|
|
16
|
+
private selectKeyPair;
|
|
17
|
+
private getOrGenerateKeyPair;
|
|
18
|
+
private selectOrInsertKeyPair;
|
|
19
|
+
private generateKeyPair;
|
|
20
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PostgresKeystore = void 0;
|
|
13
|
+
const jinaga_1 = require("jinaga");
|
|
14
|
+
const node_forge_1 = require("node-forge");
|
|
15
|
+
const connection_1 = require("./connection");
|
|
16
|
+
;
|
|
17
|
+
class PostgresKeystore {
|
|
18
|
+
constructor(postgresUri) {
|
|
19
|
+
this.cache = new Map();
|
|
20
|
+
this.connectionFactory = new connection_1.ConnectionFactory(postgresUri);
|
|
21
|
+
}
|
|
22
|
+
close() {
|
|
23
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
yield this.connectionFactory.close();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
getOrCreateUserFact(userIdentity) {
|
|
28
|
+
return this.getOrCreateIdentityFact('Jinaga.User', userIdentity);
|
|
29
|
+
}
|
|
30
|
+
getOrCreateDeviceFact(deviceIdentity) {
|
|
31
|
+
return this.getOrCreateIdentityFact('Jinaga.Device', deviceIdentity);
|
|
32
|
+
}
|
|
33
|
+
getUserFact(userIdentity) {
|
|
34
|
+
return this.getIdentityFact('Jinaga.User', userIdentity);
|
|
35
|
+
}
|
|
36
|
+
getDeviceFact(deviceIdentity) {
|
|
37
|
+
return this.getIdentityFact('Jinaga.Device', deviceIdentity);
|
|
38
|
+
}
|
|
39
|
+
signFacts(userIdentity, facts) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
if (!userIdentity) {
|
|
42
|
+
return facts.map(fact => ({ fact, signatures: [] }));
|
|
43
|
+
}
|
|
44
|
+
const { publicPem, privatePem } = yield this.getKeyPair(userIdentity);
|
|
45
|
+
const privateKey = node_forge_1.pki.privateKeyFromPem(privatePem);
|
|
46
|
+
const envelopes = facts.map(fact => signFact(fact, publicPem, privateKey));
|
|
47
|
+
return envelopes;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
getOrCreateIdentityFact(type, identity) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
if (!identity) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const { publicPem } = yield this.getOrGenerateKeyPair(identity);
|
|
56
|
+
const predecessors = {};
|
|
57
|
+
const fields = {
|
|
58
|
+
publicKey: publicPem
|
|
59
|
+
};
|
|
60
|
+
const hash = (0, jinaga_1.computeHash)(fields, predecessors);
|
|
61
|
+
return { type, hash, predecessors, fields };
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
getIdentityFact(type, identity) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
if (!identity) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const { publicPem } = yield this.getKeyPair(identity);
|
|
70
|
+
const predecessors = {};
|
|
71
|
+
const fields = {
|
|
72
|
+
publicKey: publicPem
|
|
73
|
+
};
|
|
74
|
+
const hash = (0, jinaga_1.computeHash)(fields, predecessors);
|
|
75
|
+
return { type, hash, predecessors, fields };
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
getKeyPair(userIdentity) {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
const key = getUserIdentityKey(userIdentity);
|
|
81
|
+
if (this.cache.has(key)) {
|
|
82
|
+
return this.cache.get(key);
|
|
83
|
+
}
|
|
84
|
+
const keyPair = yield this.connectionFactory.with(connection => this.selectKeyPair(connection, userIdentity));
|
|
85
|
+
this.cache.set(key, keyPair);
|
|
86
|
+
return keyPair;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
selectKeyPair(connection, userIdentity) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const { rows } = yield connection.query('SELECT public_key, private_key FROM public.user WHERE provider = $1 AND user_identifier = $2', [userIdentity.provider, userIdentity.id]);
|
|
92
|
+
if (rows.length > 1) {
|
|
93
|
+
throw new Error('Duplicate entries found in the keystore');
|
|
94
|
+
}
|
|
95
|
+
else if (rows.length === 1) {
|
|
96
|
+
const publicPem = rows[0]["public_key"];
|
|
97
|
+
const privatePem = rows[0]["private_key"];
|
|
98
|
+
return { publicPem, privatePem };
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
throw new Error('No entry found in the keystore');
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
getOrGenerateKeyPair(userIdentity) {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
const key = getUserIdentityKey(userIdentity);
|
|
108
|
+
if (this.cache.has(key)) {
|
|
109
|
+
return this.cache.get(key);
|
|
110
|
+
}
|
|
111
|
+
const keyPair = yield this.connectionFactory.withTransaction(connection => this.selectOrInsertKeyPair(connection, userIdentity));
|
|
112
|
+
this.cache.set(key, keyPair);
|
|
113
|
+
return keyPair;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
selectOrInsertKeyPair(connection, userIdentity) {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
const { rows } = yield connection.query('SELECT public_key, private_key FROM public.user WHERE provider = $1 AND user_identifier = $2', [userIdentity.provider, userIdentity.id]);
|
|
119
|
+
if (rows.length > 1) {
|
|
120
|
+
throw new Error('Duplicate entries found in the keystore');
|
|
121
|
+
}
|
|
122
|
+
else if (rows.length === 1) {
|
|
123
|
+
const publicPem = rows[0]["public_key"];
|
|
124
|
+
const privatePem = rows[0]["private_key"];
|
|
125
|
+
return { publicPem, privatePem };
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const keyPair = yield this.generateKeyPair(connection, userIdentity);
|
|
129
|
+
return keyPair;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
generateKeyPair(connection, userIdentity) {
|
|
134
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
const keypair = node_forge_1.pki.rsa.generateKeyPair({ bits: 2048 });
|
|
136
|
+
const privatePem = node_forge_1.pki.privateKeyToPem(keypair.privateKey);
|
|
137
|
+
const publicPem = node_forge_1.pki.publicKeyToPem(keypair.publicKey);
|
|
138
|
+
yield connection.query('INSERT INTO public.user (provider, user_identifier, private_key, public_key) VALUES ($1, $2, $3, $4)', [userIdentity.provider, userIdentity.id, privatePem, publicPem]);
|
|
139
|
+
return { publicPem, privatePem };
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.PostgresKeystore = PostgresKeystore;
|
|
144
|
+
function getUserIdentityKey(userIdentity) {
|
|
145
|
+
return `${userIdentity.provider}-${userIdentity.id}`;
|
|
146
|
+
}
|
|
147
|
+
function signFact(fact, publicPem, privateKey) {
|
|
148
|
+
const canonicalString = (0, jinaga_1.canonicalizeFact)(fact.fields, fact.predecessors);
|
|
149
|
+
const encodedString = node_forge_1.util.encodeUtf8(canonicalString);
|
|
150
|
+
const digest = node_forge_1.md.sha512.create().update(encodedString);
|
|
151
|
+
const hash = node_forge_1.util.encode64(digest.digest().getBytes());
|
|
152
|
+
if (fact.hash !== hash) {
|
|
153
|
+
jinaga_1.Trace.error(`Hash does not match. "${fact.hash}" !== "${hash}"\nFact: ${canonicalString}`);
|
|
154
|
+
return {
|
|
155
|
+
fact,
|
|
156
|
+
signatures: []
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const signature = node_forge_1.util.encode64(privateKey.sign(digest));
|
|
160
|
+
return {
|
|
161
|
+
fact,
|
|
162
|
+
signatures: [{
|
|
163
|
+
signature,
|
|
164
|
+
publicKey: publicPem
|
|
165
|
+
}]
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=postgres-keystore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-keystore.js","sourceRoot":"","sources":["../../src/postgres/postgres-keystore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FactBookmark, FactEnvelope, FactPath, FactRecord, FactReference, FactStream, Query, Specification, Storage } from "jinaga";
|
|
2
|
+
import { FactTypeMap, RoleMap } from "./maps";
|
|
3
|
+
export declare class PostgresStore implements Storage {
|
|
4
|
+
private connectionFactory;
|
|
5
|
+
private factTypeMap;
|
|
6
|
+
private roleMap;
|
|
7
|
+
constructor(postgresUri: string);
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
save(envelopes: FactEnvelope[]): Promise<FactEnvelope[]>;
|
|
10
|
+
query(start: FactReference, query: Query): Promise<FactPath[]>;
|
|
11
|
+
read(start: FactReference[], specification: Specification): Promise<any[]>;
|
|
12
|
+
streamsFromSpecification(start: FactReference[], bookmarks: FactBookmark[], limit: number, specification: Specification): Promise<FactStream[]>;
|
|
13
|
+
private loadFactTypesFromSteps;
|
|
14
|
+
loadFactTypesFromSpecification(specification: Specification): Promise<FactTypeMap>;
|
|
15
|
+
private loadRolesFromSteps;
|
|
16
|
+
loadRolesFromSpecification(specification: Specification, factTypes: FactTypeMap): Promise<RoleMap>;
|
|
17
|
+
whichExist(references: FactReference[]): Promise<FactReference[]>;
|
|
18
|
+
load(references: FactReference[]): Promise<FactRecord[]>;
|
|
19
|
+
private loadFactTypesFromReferences;
|
|
20
|
+
}
|