@peerbit/trusted-network 6.0.99 → 6.0.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,59 +1,46 @@
1
1
  # Trusted network
2
- ## 🚧 Experimental state 🚧
3
-
4
- A store that lets you build trusted networks of identities.
5
-
6
- The store is defined by the "root trust" which has the responsibility in the beginning to trust additional identities. Later, these identities can add more identities to the network.
7
- Trusted identities can also be revoked.
8
-
9
- Distributing content among untrusted peers will be unreliable, and not resilient to malicious parties that start to participate in the replication process with large amount (>> min replicas) of nodes followed by shutting them down simultaneously (no way for the original peers recover all lost data). To mitigate this, you can launch your program in a "Network", which is basically a list of nodes that trust each other. Symbolically you could thing of this as a VPC.
10
-
11
- To do this, you only have to implement the "Network" interface:
12
- ```typescript
13
- import { Peerbit, Network } from 'peerbit'
14
- import { Log } from '@peerbit/log'
15
- import { Program } from '@peerbit/program'
16
- import { TrustedNetwork } from '@peerbit/trusted-network'
17
- import { field, variant } from '@dao-xyz/borst-ts'
18
-
19
- @variant("string_store")
20
- @network({property: 'network'})
21
- class StringStore extends Program
22
- {
23
- @field({type: Store})
24
- log: Log<Uint8Array>
25
-
26
- @field({type: TrustedNetwork})
27
- network: TrustedNetwork // this is a database storing all peers. Peers that are trusted can add new peers
28
-
29
- constructor(properties:{ log: Store<any>, network: TrustedNetwork }) {
30
-
31
- this.log = properties.store
32
- this.network = properties.network;
33
-
34
- }
35
-
36
- async setup()
37
- {
38
- await store.setup({ encoding: ... , canPerform: ..., index: {... canRead ...}})
39
- await trustedNetwork.setup()
40
- }
41
- }
42
2
 
3
+ ## 🚧 Experimental state 🚧
43
4
 
44
- // Later
45
- const peer1 = await Peerbit.create(LIBP2P_CLIENT, {... options ...})
46
- const peer2 = await Peerbit.create(LIBP2P_CLIENT_2, {... options ...})
5
+ `@peerbit/trusted-network` stores a directed graph of trust between signing
6
+ identities. A configured root identity is always trusted. An identity is also
7
+ trusted when the replicated graph contains a path from the root to that
8
+ identity.
47
9
 
48
- const programPeer1 = await peer1.open(new StringStore({log: new Log(), network: new TrustedNetwork()}), {... options ...})
10
+ ```ts
11
+ import { TrustedNetwork } from "@peerbit/trusted-network";
49
12
 
50
- // add trust to another peer
51
- await program.network.add(peer2.identity.publicKey)
13
+ const network = await peer.open(
14
+ new TrustedNetwork({ rootTrust: rootPeer.identity.publicKey }),
15
+ );
52
16
 
17
+ // The local append identity owns the new local -> member edge.
18
+ await network.add(memberPeer.identity.publicKey);
53
19
 
54
- // peer2 also has to "join" the network, in practice this means that peer2 adds a record telling that its Peer ID trusts its libp2p Id
55
- const programPeer2 = await peer2.open(programPeer1.address, {... options ...})
56
- await peer2.join(programPeer2) // This might fail with "AccessError" if you do this too quickly after "open", because it has not yet received the full trust graph from peer1 yet
20
+ // Only that same owner can remove the edge.
21
+ await network.revoke(memberPeer.identity.publicKey);
57
22
  ```
58
23
 
59
- See [this test(s)](./src/__tests__/network.test.ts) for working examples
24
+ Trust relations are directional. A trusted identity may add an outgoing edge
25
+ of its own, but it cannot add an edge on behalf of another identity. Likewise,
26
+ `revoke()` removes only the caller's direct outgoing edge while that owner is
27
+ still trusted. For example, B may revoke B → C, and the root may revoke root →
28
+ B, but B cannot delete root → C. Calling `revoke()` for an absent local edge is
29
+ a no-op and returns `undefined`.
30
+
31
+ Revoking an edge immediately affects future `isTrusted()` checks after the
32
+ operation has replicated. Removing root → B also makes identities reachable
33
+ only through B untrusted. It does not retroactively revalidate application
34
+ writes that replicas accepted before the revocation.
35
+
36
+ The graph itself is currently readable by any peer (`canRead` allows all), and
37
+ replication is not a confidentiality boundary. Applications that require a
38
+ private membership graph or confidential content must add content-layer
39
+ encryption and key rotation.
40
+
41
+ ## Upgrade note
42
+
43
+ Releases before the owner-authorized revoke change accepted a relation delete
44
+ signed by any currently trusted identity. Deploy the security update across all
45
+ writers and validating replicas before relying on the stronger rule; an old
46
+ replica can still accept an unauthorized delete that an updated replica rejects.
@@ -37,6 +37,13 @@ export declare class TrustedNetwork extends Program<TrustedNetworkArgs> {
37
37
  canPerform(properties: CanPerformOperations<IdentityRelation>): Promise<boolean>;
38
38
  canRead(relation: any, publicKey?: PublicSignKey): Promise<boolean>;
39
39
  add(trustee: PublicSignKey | PeerId, options?: AppendOptions<Operation>): Promise<IdentityRelation>;
40
+ /**
41
+ * Revoke this identity's direct trust in `trustee`.
42
+ *
43
+ * A caller can only remove the outgoing edge signed by the append identity.
44
+ * The operation is idempotent and returns `undefined` when that edge is absent.
45
+ */
46
+ revoke(trustee: PublicSignKey | PeerId, options?: AppendOptions<Operation>): Promise<IdentityRelation | undefined>;
40
47
  hasRelation(trustee: PublicSignKey | PeerId, truster?: PublicSignKey | PeerId): Promise<boolean>;
41
48
  getRelation(trustee: PublicSignKey | PeerId, truster?: PublicSignKey | PeerId): Promise<IdentityRelation>;
42
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACN,aAAa,EAGb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,OAAO,EAEZ,KAAK,aAAa,EAClB,KAAK,SAAS,EAGd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACN,MAAM,EACN,gBAAgB,EAOhB,MAAM,qBAAqB,CAAC;AAwE7B,KAAK,iBAAiB,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF,qBACa,aAAc,SAAQ,OAAO,CAAC,iBAAiB,CAAC;IAE5D,aAAa,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;gBAE3C,KAAK,CAAC,EAAE;QACnB,EAAE,CAAC,EAAE,UAAU,CAAC;QAChB,aAAa,CAAC,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;KACxD;IAQK,UAAU,CACf,UAAU,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC;IAIb,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB;IAgBhC,WAAW,CAChB,EAAE,EAAE,aAAa,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC;CAanC;AAED;;GAEG;AAEH,KAAK,kBAAkB,GAAG;IAAE,SAAS,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE7D,qBACa,cAAe,SAAQ,OAAO,CAAC,kBAAkB,CAAC;IAE9D,SAAS,EAAE,aAAa,CAAC;IAGzB,UAAU,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAIpD,OAAO,CAAC,aAAa,CAAK;gBAEd,KAAK,EAAE;QAAE,EAAE,CAAC,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAAA;KAAE;IAMnE,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB;IAejC,UAAU,CACf,UAAU,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC;IAIb,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAInE,GAAG,CACR,OAAO,EAAE,aAAa,GAAG,MAAM,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC;IAiB7B,WAAW,CAChB,OAAO,EAAE,aAAa,GAAG,MAAM,EAC/B,OAAO,GAAE,aAAa,GAAG,MAAuB;IAIjD,WAAW,CACV,OAAO,EAAE,aAAa,GAAG,MAAM,EAC/B,OAAO,GAAE,aAAa,GAAG,MAAuB;IASjD;;;;;;;;;OASG;IACG,SAAS,CACd,OAAO,EAAE,aAAa,GAAG,MAAM,EAC/B,OAAO,GAAE,aAAa,GAAG,MAAuB,GAC9C,OAAO,CAAC,OAAO,CAAC;IA4Bb,eAAe,CACpB,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,aAA8B,GACrC,OAAO,CAAC,OAAO,CAAC;IAUb,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAU5C,QAAQ,IAAI,MAAM;CAGlB"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
@@ -65,21 +65,27 @@ const coercePublicKey = (publicKey) => {
65
65
  return getPublicKeyFromPeerId(publicKey);
66
66
  };
67
67
  const canPerformByRelation = async (properties, isTrusted) => {
68
- // verify the payload
68
+ let owner;
69
+ try {
70
+ if (!properties.value) {
71
+ return false;
72
+ }
73
+ owner = coercePublicKey(properties.value.from);
74
+ }
75
+ catch {
76
+ return false;
77
+ }
69
78
  const keys = await properties.entry.getPublicKeys();
70
79
  const checkKey = async (key) => {
71
- if (properties.type === "put") {
72
- try {
73
- const from = coercePublicKey(properties.value.from);
74
- const signer = coercePublicKey(key);
75
- if (!from.equals(signer)) {
76
- return false;
77
- }
78
- }
79
- catch {
80
+ try {
81
+ const signer = coercePublicKey(key);
82
+ if (!owner.equals(signer)) {
80
83
  return false;
81
84
  }
82
85
  }
86
+ catch {
87
+ return false;
88
+ }
83
89
  if (isTrusted) {
84
90
  const trusted = await isTrusted(key);
85
91
  return trusted;
@@ -96,7 +102,7 @@ const canPerformByRelation = async (properties, isTrusted) => {
96
102
  }
97
103
  return false;
98
104
  };
99
- const defaultIdentityGraphCanPerform = policy.or(policy.put(policy.signedByField("_from")), policy.delete(policy.allowAll()));
105
+ const defaultIdentityGraphCanPerform = policy.or(policy.put(policy.signedByField("_from")), policy.deleteSignedByExistingField("_from"));
100
106
  let IdentityGraph = (() => {
101
107
  let _classDecorators = [variant("relations")];
102
108
  let _classDescriptor;
@@ -204,25 +210,51 @@ let TrustedNetwork = (() => {
204
210
  }); // self referencing access controller
205
211
  }
206
212
  async canPerform(properties) {
207
- return canPerformByRelation(properties, (key) => this.isTrusted(key));
213
+ if (properties.type === "put") {
214
+ return canPerformByRelation(properties, (key) => this.isTrusted(key));
215
+ }
216
+ // Arbitrary canPerform callbacks do not make Documents decode the removed
217
+ // value. Resolve it locally so the delete signature can be checked against
218
+ // the owner of the exact relation being removed.
219
+ const relation = await this.trustGraph.index.get(properties.operation.key, {
220
+ remote: false,
221
+ local: true,
222
+ });
223
+ return canPerformByRelation({ ...properties, value: relation }, (key) => this.isTrusted(key));
208
224
  }
209
225
  async canRead(relation, publicKey) {
210
226
  return true; // TODO should we have read access control?
211
227
  }
212
228
  async add(trustee, options) {
213
229
  const key = coercePublicKey(trustee);
214
- const truster = coercePublicKey(this.node.identity.publicKey);
215
- const existingRelation = await this.getRelation(key, truster);
230
+ const truster = coercePublicKey(options?.identity?.publicKey || this.node.identity.publicKey);
231
+ const existingRelation = await this.getRelation(truster, key);
216
232
  if (!existingRelation) {
217
233
  const relation = new IdentityRelation({
218
234
  to: key,
219
235
  from: truster,
220
236
  });
221
- await this.trustGraph.put(relation);
237
+ await this.trustGraph.put(relation, options);
222
238
  return relation;
223
239
  }
224
240
  return existingRelation;
225
241
  }
242
+ /**
243
+ * Revoke this identity's direct trust in `trustee`.
244
+ *
245
+ * A caller can only remove the outgoing edge signed by the append identity.
246
+ * The operation is idempotent and returns `undefined` when that edge is absent.
247
+ */
248
+ async revoke(trustee, options) {
249
+ const key = coercePublicKey(trustee);
250
+ const truster = coercePublicKey(options?.identity?.publicKey || this.node.identity.publicKey);
251
+ const relation = await this.getRelation(truster, key);
252
+ if (!relation) {
253
+ return;
254
+ }
255
+ await this.trustGraph.del(relation.id, options);
256
+ return relation;
257
+ }
226
258
  async hasRelation(trustee, truster = this.rootTrust) {
227
259
  return !!(await this.getRelation(trustee, truster));
228
260
  }
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/trusted-network",
3
- "version": "6.0.99",
3
+ "version": "6.0.101",
4
4
  "description": "Access controller that operates on a DB",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -56,14 +56,14 @@
56
56
  "@libp2p/interface": "^3.2.5",
57
57
  "uint8arrays": "^5.1.0",
58
58
  "@peerbit/crypto": "3.1.6",
59
- "@peerbit/log": "6.2.23",
60
- "@peerbit/document": "15.0.13",
61
- "@peerbit/shared-log": "16.0.13",
62
- "@peerbit/program": "6.0.54"
59
+ "@peerbit/log": "6.2.24",
60
+ "@peerbit/document": "15.0.15",
61
+ "@peerbit/program": "6.0.55",
62
+ "@peerbit/shared-log": "16.0.14"
63
63
  },
64
64
  "devDependencies": {
65
65
  "ethers": "^6.17.0",
66
- "@peerbit/test-utils": "3.1.33",
66
+ "@peerbit/test-utils": "3.1.34",
67
67
  "@peerbit/time": "3.0.1"
68
68
  },
69
69
  "repository": {
package/src/controller.ts CHANGED
@@ -63,20 +63,27 @@ const canPerformByRelation = async (
63
63
  properties: CanPerformOperations<IdentityRelation>,
64
64
  isTrusted?: (key: PublicSignKey) => Promise<boolean>,
65
65
  ): Promise<boolean> => {
66
- // verify the payload
66
+ let owner: PublicSignKey;
67
+ try {
68
+ if (!properties.value) {
69
+ return false;
70
+ }
71
+ owner = coercePublicKey(properties.value.from);
72
+ } catch {
73
+ return false;
74
+ }
75
+
67
76
  const keys = await properties.entry.getPublicKeys();
68
77
  const checkKey = async (key: PublicSignKey): Promise<boolean> => {
69
- if (properties.type === "put") {
70
- try {
71
- const from = coercePublicKey(properties.value.from);
72
- const signer = coercePublicKey(key);
73
- if (!from.equals(signer)) {
74
- return false;
75
- }
76
- } catch {
78
+ try {
79
+ const signer = coercePublicKey(key);
80
+ if (!owner.equals(signer)) {
77
81
  return false;
78
82
  }
83
+ } catch {
84
+ return false;
79
85
  }
86
+
80
87
  if (isTrusted) {
81
88
  const trusted = await isTrusted(key);
82
89
  return trusted;
@@ -95,7 +102,7 @@ const canPerformByRelation = async (
95
102
 
96
103
  const defaultIdentityGraphCanPerform = policy.or<IdentityRelation>(
97
104
  policy.put(policy.signedByField<IdentityRelation>("_from")),
98
- policy.delete(policy.allowAll<IdentityRelation>()),
105
+ policy.deleteSignedByExistingField<IdentityRelation>("_from"),
99
106
  );
100
107
 
101
108
  type IdentityGraphArgs = {
@@ -200,7 +207,20 @@ export class TrustedNetwork extends Program<TrustedNetworkArgs> {
200
207
  async canPerform(
201
208
  properties: CanPerformOperations<IdentityRelation>,
202
209
  ): Promise<boolean> {
203
- return canPerformByRelation(properties, (key) => this.isTrusted(key));
210
+ if (properties.type === "put") {
211
+ return canPerformByRelation(properties, (key) => this.isTrusted(key));
212
+ }
213
+
214
+ // Arbitrary canPerform callbacks do not make Documents decode the removed
215
+ // value. Resolve it locally so the delete signature can be checked against
216
+ // the owner of the exact relation being removed.
217
+ const relation = await this.trustGraph.index.get(properties.operation.key, {
218
+ remote: false,
219
+ local: true,
220
+ });
221
+ return canPerformByRelation({ ...properties, value: relation }, (key) =>
222
+ this.isTrusted(key),
223
+ );
204
224
  }
205
225
 
206
226
  async canRead(relation: any, publicKey?: PublicSignKey): Promise<boolean> {
@@ -212,20 +232,44 @@ export class TrustedNetwork extends Program<TrustedNetworkArgs> {
212
232
  options?: AppendOptions<Operation>,
213
233
  ) {
214
234
  const key = coercePublicKey(trustee);
215
- const truster = coercePublicKey(this.node.identity.publicKey);
235
+ const truster = coercePublicKey(
236
+ options?.identity?.publicKey || this.node.identity.publicKey,
237
+ );
216
238
 
217
- const existingRelation = await this.getRelation(key, truster);
239
+ const existingRelation = await this.getRelation(truster, key);
218
240
  if (!existingRelation) {
219
241
  const relation = new IdentityRelation({
220
242
  to: key,
221
243
  from: truster,
222
244
  });
223
- await this.trustGraph!.put(relation);
245
+ await this.trustGraph!.put(relation, options);
224
246
  return relation;
225
247
  }
226
248
  return existingRelation;
227
249
  }
228
250
 
251
+ /**
252
+ * Revoke this identity's direct trust in `trustee`.
253
+ *
254
+ * A caller can only remove the outgoing edge signed by the append identity.
255
+ * The operation is idempotent and returns `undefined` when that edge is absent.
256
+ */
257
+ async revoke(
258
+ trustee: PublicSignKey | PeerId,
259
+ options?: AppendOptions<Operation>,
260
+ ): Promise<IdentityRelation | undefined> {
261
+ const key = coercePublicKey(trustee);
262
+ const truster = coercePublicKey(
263
+ options?.identity?.publicKey || this.node.identity.publicKey,
264
+ );
265
+ const relation = await this.getRelation(truster, key);
266
+ if (!relation) {
267
+ return;
268
+ }
269
+ await this.trustGraph.del(relation.id, options);
270
+ return relation;
271
+ }
272
+
229
273
  async hasRelation(
230
274
  trustee: PublicSignKey | PeerId,
231
275
  truster: PublicSignKey | PeerId = this.rootTrust,