Hex Artifact Content
Not logged in

Artifact 56a340cf1c5eaf74cb24938499042d8731e0afae:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 35 20 4d 61 69 64 53 61 66 65 2e 6e 65 74 20 6c  5 MaidSafe.net l
0020: 69 6d 69 74 65 64 2e 0a 2f 2f 0a 2f 2f 20 54 68  imited..//.// Th
0030: 69 73 20 53 41 46 45 20 4e 65 74 77 6f 72 6b 20  is SAFE Network 
0040: 53 6f 66 74 77 61 72 65 20 69 73 20 6c 69 63 65  Software is lice
0050: 6e 73 65 64 20 74 6f 20 79 6f 75 20 75 6e 64 65  nsed to you unde
0060: 72 20 28 31 29 20 74 68 65 20 4d 61 69 64 53 61  r (1) the MaidSa
0070: 66 65 2e 6e 65 74 20 43 6f 6d 6d 65 72 63 69 61  fe.net Commercia
0080: 6c 20 4c 69 63 65 6e 73 65 2c 0a 2f 2f 20 76 65  l License,.// ve
0090: 72 73 69 6f 6e 20 31 2e 30 20 6f 72 20 6c 61 74  rsion 1.0 or lat
00a0: 65 72 2c 20 6f 72 20 28 32 29 20 54 68 65 20 47  er, or (2) The G
00b0: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
00c0: 63 65 6e 73 65 20 28 47 50 4c 29 2c 20 76 65 72  cense (GPL), ver
00d0: 73 69 6f 6e 20 33 2c 20 64 65 70 65 6e 64 69 6e  sion 3, dependin
00e0: 67 20 6f 6e 20 77 68 69 63 68 0a 2f 2f 20 6c 69  g on which.// li
00f0: 63 65 6e 63 65 20 79 6f 75 20 61 63 63 65 70 74  cence you accept
0100: 65 64 20 6f 6e 20 69 6e 69 74 69 61 6c 20 61 63  ed on initial ac
0110: 63 65 73 73 20 74 6f 20 74 68 65 20 53 6f 66 74  cess to the Soft
0120: 77 61 72 65 20 28 74 68 65 20 22 4c 69 63 65 6e  ware (the "Licen
0130: 63 65 73 22 29 2e 0a 2f 2f 0a 2f 2f 20 42 79 20  ces")..//.// By 
0140: 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 63 6f 64  contributing cod
0150: 65 20 74 6f 20 74 68 65 20 53 41 46 45 20 4e 65  e to the SAFE Ne
0160: 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 2c 20  twork Software, 
0170: 6f 72 20 74 6f 20 74 68 69 73 20 70 72 6f 6a 65  or to this proje
0180: 63 74 20 67 65 6e 65 72 61 6c 6c 79 2c 20 79 6f  ct generally, yo
0190: 75 20 61 67 72 65 65 20 74 6f 20 62 65 0a 2f 2f  u agree to be.//
01a0: 20 62 6f 75 6e 64 20 62 79 20 74 68 65 20 74 65   bound by the te
01b0: 72 6d 73 20 6f 66 20 74 68 65 20 4d 61 69 64 53  rms of the MaidS
01c0: 61 66 65 20 43 6f 6e 74 72 69 62 75 74 6f 72 20  afe Contributor 
01d0: 41 67 72 65 65 6d 65 6e 74 2c 20 76 65 72 73 69  Agreement, versi
01e0: 6f 6e 20 31 2e 31 2e 20 20 54 68 69 73 2c 20 61  on 1.1.  This, a
01f0: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 2f 2f  long with the.//
0200: 20 4c 69 63 65 6e 73 65 73 20 63 61 6e 20 62 65   Licenses can be
0210: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 72 6f   found in the ro
0220: 6f 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  ot directory of 
0230: 74 68 69 73 20 70 72 6f 6a 65 63 74 20 61 74 20  this project at 
0240: 4c 49 43 45 4e 53 45 2c 20 43 4f 50 59 49 4e 47  LICENSE, COPYING
0250: 20 61 6e 64 20 43 4f 4e 54 52 49 42 55 54 4f 52   and CONTRIBUTOR
0260: 2e 0a 2f 2f 0a 2f 2f 20 55 6e 6c 65 73 73 20 72  ..//.// Unless r
0270: 65 71 75 69 72 65 64 20 62 79 20 61 70 70 6c 69  equired by appli
0280: 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61 67 72  cable law or agr
0290: 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74 69 6e  eed to in writin
02a0: 67 2c 20 74 68 65 20 53 41 46 45 20 4e 65 74 77  g, the SAFE Netw
02b0: 6f 72 6b 20 53 6f 66 74 77 61 72 65 20 64 69 73  ork Software dis
02c0: 74 72 69 62 75 74 65 64 0a 2f 2f 20 75 6e 64 65  tributed.// unde
02d0: 72 20 74 68 65 20 47 50 4c 20 4c 69 63 65 6e 63  r the GPL Licenc
02e0: 65 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  e is distributed
02f0: 20 6f 6e 20 61 6e 20 22 41 53 20 49 53 22 20 42   on an "AS IS" B
0300: 41 53 49 53 2c 20 57 49 54 48 4f 55 54 20 57 41  ASIS, WITHOUT WA
0310: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
0320: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 0a 2f 2f  ITIONS OF ANY.//
0330: 20 4b 49 4e 44 2c 20 65 69 74 68 65 72 20 65 78   KIND, either ex
0340: 70 72 65 73 73 20 6f 72 20 69 6d 70 6c 69 65 64  press or implied
0350: 2e 0a 2f 2f 0a 2f 2f 20 50 6c 65 61 73 65 20 72  ..//.// Please r
0360: 65 76 69 65 77 20 74 68 65 20 4c 69 63 65 6e 63  eview the Licenc
0370: 65 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  es for the speci
0380: 66 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76  fic language gov
0390: 65 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f  erning permissio
03a0: 6e 73 20 61 6e 64 20 6c 69 6d 69 74 61 74 69 6f  ns and limitatio
03b0: 6e 73 0a 2f 2f 20 72 65 6c 61 74 69 6e 67 20 74  ns.// relating t
03c0: 6f 20 75 73 65 20 6f 66 20 74 68 65 20 53 41 46  o use of the SAF
03d0: 45 20 4e 65 74 77 6f 72 6b 20 53 6f 66 74 77 61  E Network Softwa
03e0: 72 65 2e 0a 0a 75 73 65 20 63 72 75 73 74 3a 3a  re...use crust::
03f0: 50 65 65 72 49 64 3b 0a 75 73 65 20 72 75 73 74  PeerId;.use rust
0400: 5f 73 6f 64 69 75 6d 3a 3a 63 72 79 70 74 6f 3a  _sodium::crypto:
0410: 3a 7b 68 61 73 68 2c 20 73 69 67 6e 7d 3b 0a 75  :{hash, sign};.u
0420: 73 65 20 73 74 64 3a 3a 66 6d 74 3a 3a 7b 73 65  se std::fmt::{se
0430: 6c 66 2c 20 42 69 6e 61 72 79 2c 20 44 65 62 75  lf, Binary, Debu
0440: 67 2c 20 44 69 73 70 6c 61 79 2c 20 46 6f 72 6d  g, Display, Form
0450: 61 74 74 65 72 7d 3b 0a 75 73 65 20 73 75 70 65  atter};.use supe
0460: 72 3a 3a 7b 50 72 65 66 69 78 2c 20 58 6f 72 61  r::{Prefix, Xora
0470: 62 6c 65 7d 3b 0a 0a 2f 2f 2f 20 41 6e 20 65 6e  ble};../// An en
0480: 74 69 74 79 20 74 68 61 74 20 63 61 6e 20 61 63  tity that can ac
0490: 74 20 61 73 20 61 20 73 6f 75 72 63 65 20 6f 72  t as a source or
04a0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20   destination of 
04b0: 61 20 6d 65 73 73 61 67 65 2e 0a 2f 2f 2f 0a 2f  a message..///./
04c0: 2f 2f 20 60 43 6c 69 65 6e 74 60 20 61 6e 64 20  // `Client` and 
04d0: 60 4d 61 6e 61 67 65 64 4e 6f 64 65 60 20 61 72  `ManagedNode` ar
04e0: 65 20 73 69 6e 67 6c 65 2d 6e 6f 64 65 20 61 75  e single-node au
04f0: 74 68 6f 72 69 74 69 65 73 20 28 69 2e 65 2e 20  thorities (i.e. 
0500: 6e 6f 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  no verification 
0510: 6f 66 20 6d 65 73 73 61 67 65 73 20 66 72 6f 6d  of messages from
0520: 0a 2f 2f 2f 20 61 64 64 69 74 69 6f 6e 61 6c 20  ./// additional 
0530: 73 6f 75 72 63 65 73 20 6e 65 65 64 65 64 29 3b  sources needed);
0540: 20 6f 74 68 65 72 20 61 75 74 68 6f 72 69 74 69   other authoriti
0550: 65 73 20 72 65 71 75 69 72 65 20 61 67 72 65 65  es require agree
0560: 6d 65 6e 74 20 62 79 20 61 20 71 75 6f 72 75 6d  ment by a quorum
0570: 20 6f 66 20 73 6f 6d 65 20 73 65 74 2e 0a 2f 2f   of some set..//
0580: 2f 20 60 4e 6f 64 65 4d 61 6e 61 67 65 72 60 2c  / `NodeManager`,
0590: 20 60 43 6c 69 65 6e 74 4d 61 6e 61 67 65 72 60   `ClientManager`
05a0: 20 61 6e 64 20 60 4e 61 65 4d 61 6e 61 67 65 72   and `NaeManager
05b0: 60 20 75 73 65 20 5f 67 72 6f 75 70 5f 20 76 65  ` use _group_ ve
05c0: 72 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 6d 65  rification of me
05d0: 73 73 61 67 65 73 3a 20 74 68 65 79 0a 2f 2f 2f  ssages: they.///
05e0: 20 72 65 71 75 69 72 65 20 71 75 6f 72 75 6d 20   require quorum 
05f0: 61 67 72 65 65 6d 65 6e 74 20 66 72 6f 6d 20 74  agreement from t
0600: 68 65 20 67 72 6f 75 70 20 6f 66 20 6e 6f 64 65  he group of node
0610: 73 20 63 6c 6f 73 65 73 74 20 74 6f 20 74 68 65  s closest to the
0620: 20 73 6f 75 72 63 65 2c 20 77 68 69 6c 65 20 60   source, while `
0630: 53 65 63 74 69 6f 6e 60 20 61 6e 64 0a 2f 2f 2f  Section` and.///
0640: 20 60 50 72 65 66 69 78 53 65 63 74 69 6f 6e 60   `PrefixSection`
0650: 20 75 73 65 20 5f 73 65 63 74 69 6f 6e 5f 20 76   use _section_ v
0660: 65 72 69 66 69 63 61 74 69 6f 6e 3a 20 74 68 65  erification: the
0670: 20 73 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20   set from which 
0680: 61 20 71 75 6f 72 75 6d 20 69 73 20 72 65 71 75  a quorum is requ
0690: 69 72 65 64 20 69 73 20 61 6c 6c 0a 2f 2f 2f 20  ired is all./// 
06a0: 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 73  members of the s
06b0: 65 63 74 69 6f 6e 20 28 60 53 65 63 74 69 6f 6e  ection (`Section
06c0: 60 29 20 6f 72 20 6f 66 20 61 6c 6c 20 73 65 63  `) or of all sec
06d0: 74 69 6f 6e 73 20 6d 61 74 63 68 69 6e 67 20 74  tions matching t
06e0: 68 65 20 70 72 65 66 69 78 20 28 60 50 72 65 66  he prefix (`Pref
06f0: 69 78 53 65 63 74 69 6f 6e 60 29 2e 0a 23 5b 64  ixSection`)..#[d
0700: 65 72 69 76 65 28 52 75 73 74 63 45 6e 63 6f 64  erive(RustcEncod
0710: 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64  able, RustcDecod
0720: 61 62 6c 65 2c 20 50 61 72 74 69 61 6c 45 71 2c  able, PartialEq,
0730: 20 50 61 72 74 69 61 6c 4f 72 64 2c 20 45 71 2c   PartialOrd, Eq,
0740: 20 4f 72 64 2c 20 43 6c 6f 6e 65 2c 20 43 6f 70   Ord, Clone, Cop
0750: 79 2c 20 48 61 73 68 29 5d 0a 70 75 62 20 65 6e  y, Hash)].pub en
0760: 75 6d 20 41 75 74 68 6f 72 69 74 79 3c 4e 3a 20  um Authority<N: 
0770: 58 6f 72 61 62 6c 65 20 2b 20 43 6c 6f 6e 65 20  Xorable + Clone 
0780: 2b 20 43 6f 70 79 20 2b 20 42 69 6e 61 72 79 20  + Copy + Binary 
0790: 2b 20 44 65 66 61 75 6c 74 3e 20 7b 0a 20 20 20  + Default> {.   
07a0: 20 2f 2f 2f 20 4d 61 6e 61 67 65 72 20 6f 66 20   /// Manager of 
07b0: 61 20 43 6c 69 65 6e 74 2e 20 20 58 6f 72 4e 61  a Client.  XorNa
07c0: 6d 65 20 69 73 20 74 68 65 20 68 61 73 68 20 6f  me is the hash o
07d0: 66 20 74 68 65 20 43 6c 69 65 6e 74 27 73 20 60  f the Client's `
07e0: 63 6c 69 65 6e 74 5f 6b 65 79 60 2e 0a 20 20 20  client_key`..   
07f0: 20 43 6c 69 65 6e 74 4d 61 6e 61 67 65 72 28 4e   ClientManager(N
0800: 29 2c 0a 20 20 20 20 2f 2f 2f 20 4d 61 6e 61 67  ),.    /// Manag
0810: 65 72 20 6f 66 20 61 20 6e 65 74 77 6f 72 6b 2d  er of a network-
0820: 61 64 64 72 65 73 73 61 62 6c 65 20 65 6c 65 6d  addressable elem
0830: 65 6e 74 2c 20 69 2e 65 2e 20 74 68 65 20 67 72  ent, i.e. the gr
0840: 6f 75 70 20 6d 61 74 63 68 69 6e 67 20 74 68 69  oup matching thi
0850: 73 20 6e 61 6d 65 2e 0a 20 20 20 20 2f 2f 2f 20  s name..    /// 
0860: 60 58 6f 72 4e 61 6d 65 60 20 69 73 20 74 68 65  `XorName` is the
0870: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 65 6c 65   name of the ele
0880: 6d 65 6e 74 20 69 6e 20 71 75 65 73 74 69 6f 6e  ment in question
0890: 2e 0a 20 20 20 20 4e 61 65 4d 61 6e 61 67 65 72  ..    NaeManager
08a0: 28 4e 29 2c 0a 20 20 20 20 2f 2f 2f 20 4d 61 6e  (N),.    /// Man
08b0: 61 67 65 72 20 6f 66 20 61 20 4d 61 6e 61 67 65  ager of a Manage
08c0: 64 4e 6f 64 65 2e 20 20 58 6f 72 4e 61 6d 65 20  dNode.  XorName 
08d0: 69 73 20 74 68 61 74 20 6f 66 20 74 68 65 20 4d  is that of the M
08e0: 61 6e 61 67 65 64 4e 6f 64 65 2e 0a 20 20 20 20  anagedNode..    
08f0: 4e 6f 64 65 4d 61 6e 61 67 65 72 28 4e 29 2c 0a  NodeManager(N),.
0900: 20 20 20 20 2f 2f 2f 20 41 20 73 65 74 20 6f 66      /// A set of
0910: 20 6e 6f 64 65 73 20 77 69 74 68 20 6e 61 6d 65   nodes with name
0920: 73 20 73 68 61 72 69 6e 67 20 61 20 63 6f 6d 6d  s sharing a comm
0930: 6f 6e 20 70 72 65 66 69 78 2e 0a 20 20 20 20 53  on prefix..    S
0940: 65 63 74 69 6f 6e 28 4e 29 2c 0a 20 20 20 20 2f  ection(N),.    /
0950: 2f 2f 20 41 20 73 65 74 20 6f 66 20 6e 6f 64 65  // A set of node
0960: 73 20 77 69 74 68 20 6e 61 6d 65 73 20 73 68 61  s with names sha
0970: 72 69 6e 67 20 61 20 63 6f 6d 6d 6f 6e 20 70 72  ring a common pr
0980: 65 66 69 78 20 2d 20 6d 61 79 20 73 70 61 6e 20  efix - may span 
0990: 6d 75 6c 74 69 70 6c 65 20 60 53 65 63 74 69 6f  multiple `Sectio
09a0: 6e 60 73 20 70 72 65 73 65 6e 74 20 69 6e 0a 20  n`s present in. 
09b0: 20 20 20 2f 2f 2f 20 74 68 65 20 72 6f 75 74 69     /// the routi
09c0: 6e 67 20 74 61 62 6c 65 20 6f 72 20 6f 6e 6c 79  ng table or only
09d0: 20 61 20 70 61 72 74 20 6f 66 20 61 20 60 53 65   a part of a `Se
09e0: 63 74 69 6f 6e 60 0a 20 20 20 20 50 72 65 66 69  ction`.    Prefi
09f0: 78 53 65 63 74 69 6f 6e 28 50 72 65 66 69 78 3c  xSection(Prefix<
0a00: 4e 3e 29 2c 0a 20 20 20 20 2f 2f 2f 20 41 20 6e  N>),.    /// A n
0a10: 6f 6e 2d 63 6c 69 65 6e 74 20 6e 6f 64 65 20 28  on-client node (
0a20: 69 2e 65 2e 20 61 20 76 61 75 6c 74 29 20 77 68  i.e. a vault) wh
0a30: 69 63 68 20 69 73 20 6d 61 6e 61 67 65 64 20 62  ich is managed b
0a40: 79 20 4e 6f 64 65 4d 61 6e 61 67 65 72 73 2e 20  y NodeManagers. 
0a50: 20 58 6f 72 4e 61 6d 65 20 69 73 20 70 72 6f 76   XorName is prov
0a60: 69 64 65 64 0a 20 20 20 20 2f 2f 2f 20 62 79 20  ided.    /// by 
0a70: 74 68 65 20 6e 65 74 77 6f 72 6b 20 72 65 6c 6f  the network relo
0a80: 63 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 69  cation process i
0a90: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
0aa0: 20 62 6f 6f 74 73 74 72 61 70 70 69 6e 67 2e 0a   bootstrapping..
0ab0: 20 20 20 20 4d 61 6e 61 67 65 64 4e 6f 64 65 28      ManagedNode(
0ac0: 4e 29 2c 0a 20 20 20 20 2f 2f 2f 20 41 20 43 6c  N),.    /// A Cl
0ad0: 69 65 6e 74 2e 0a 20 20 20 20 43 6c 69 65 6e 74  ient..    Client
0ae0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54   {.        /// T
0af0: 68 65 20 63 6c 69 65 6e 74 27 73 20 70 75 62 6c  he client's publ
0b00: 69 63 20 73 69 67 6e 69 6e 67 20 6b 65 79 2e 20  ic signing key. 
0b10: 20 54 68 65 20 68 61 73 68 20 6f 66 20 74 68 69   The hash of thi
0b20: 73 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  s specifies the 
0b30: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
0b40: 43 6c 69 65 6e 74 0a 20 20 20 20 20 20 20 20 2f  Client.        /
0b50: 2f 2f 20 69 6e 20 74 68 65 20 6e 65 74 77 6f 72  // in the networ
0b60: 6b 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  k address space.
0b70: 0a 20 20 20 20 20 20 20 20 63 6c 69 65 6e 74 5f  .        client_
0b80: 6b 65 79 3a 20 73 69 67 6e 3a 3a 50 75 62 6c 69  key: sign::Publi
0b90: 63 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 2f 2f  cKey,.        //
0ba0: 2f 20 54 68 65 20 43 72 75 73 74 20 70 65 65 72  / The Crust peer
0bb0: 20 49 44 20 6f 66 20 74 68 65 20 63 6c 69 65 6e   ID of the clien
0bc0: 74 2e 0a 20 20 20 20 20 20 20 20 70 65 65 72 5f  t..        peer_
0bd0: 69 64 3a 20 50 65 65 72 49 64 2c 0a 20 20 20 20  id: PeerId,.    
0be0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 6d 65      /// The name
0bf0: 20 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 20 4d   of the single M
0c00: 61 6e 61 67 65 64 4e 6f 64 65 20 77 68 69 63 68  anagedNode which
0c10: 20 74 68 65 20 43 6c 69 65 6e 74 20 63 6f 6e 6e   the Client conn
0c20: 65 63 74 73 20 74 6f 20 61 6e 64 20 70 72 6f 78  ects to and prox
0c30: 69 65 73 20 61 6c 6c 20 6d 65 73 73 61 67 65 73  ies all messages
0c40: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 72  .        /// thr
0c50: 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 70 72  ough..        pr
0c60: 6f 78 79 5f 6e 6f 64 65 5f 6e 61 6d 65 3a 20 4e  oxy_node_name: N
0c70: 2c 0a 20 20 20 20 7d 2c 0a 7d 0a 0a 69 6d 70 6c  ,.    },.}..impl
0c80: 3c 4e 3a 20 58 6f 72 61 62 6c 65 20 2b 20 43 6c  <N: Xorable + Cl
0c90: 6f 6e 65 20 2b 20 43 6f 70 79 20 2b 20 42 69 6e  one + Copy + Bin
0ca0: 61 72 79 20 2b 20 44 65 66 61 75 6c 74 3e 20 41  ary + Default> A
0cb0: 75 74 68 6f 72 69 74 79 3c 4e 3e 20 7b 0a 20 20  uthority<N> {.  
0cc0: 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 60 74    /// Returns `t
0cd0: 72 75 65 60 20 69 66 20 74 68 65 20 61 75 74 68  rue` if the auth
0ce0: 6f 72 69 74 79 20 63 6f 6e 73 69 73 74 73 20 6f  ority consists o
0cf0: 66 20 6d 75 6c 74 69 70 6c 65 20 6e 6f 64 65 73  f multiple nodes
0d00: 2c 20 6f 74 68 65 72 77 69 73 65 20 60 66 61 6c  , otherwise `fal
0d10: 73 65 60 2e 0a 20 20 20 20 70 75 62 20 66 6e 20  se`..    pub fn 
0d20: 69 73 5f 6d 75 6c 74 69 70 6c 65 28 26 73 65 6c  is_multiple(&sel
0d30: 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20  f) -> bool {.   
0d40: 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c 66       match *self
0d50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 41   {.            A
0d60: 75 74 68 6f 72 69 74 79 3a 3a 53 65 63 74 69 6f  uthority::Sectio
0d70: 6e 28 5f 29 20 7c 0a 20 20 20 20 20 20 20 20 20  n(_) |.         
0d80: 20 20 20 41 75 74 68 6f 72 69 74 79 3a 3a 50 72     Authority::Pr
0d90: 65 66 69 78 53 65 63 74 69 6f 6e 28 5f 29 20 7c  efixSection(_) |
0da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 75 74  .            Aut
0db0: 68 6f 72 69 74 79 3a 3a 43 6c 69 65 6e 74 4d 61  hority::ClientMa
0dc0: 6e 61 67 65 72 28 5f 29 20 7c 0a 20 20 20 20 20  nager(_) |.     
0dd0: 20 20 20 20 20 20 20 41 75 74 68 6f 72 69 74 79         Authority
0de0: 3a 3a 4e 61 65 4d 61 6e 61 67 65 72 28 5f 29 20  ::NaeManager(_) 
0df0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 75  |.            Au
0e00: 74 68 6f 72 69 74 79 3a 3a 4e 6f 64 65 4d 61 6e  thority::NodeMan
0e10: 61 67 65 72 28 5f 29 20 3d 3e 20 74 72 75 65 2c  ager(_) => true,
0e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 75 74  .            Aut
0e30: 68 6f 72 69 74 79 3a 3a 4d 61 6e 61 67 65 64 4e  hority::ManagedN
0e40: 6f 64 65 28 5f 29 20 7c 0a 20 20 20 20 20 20 20  ode(_) |.       
0e50: 20 20 20 20 20 41 75 74 68 6f 72 69 74 79 3a 3a       Authority::
0e60: 43 6c 69 65 6e 74 20 7b 20 2e 2e 20 7d 20 3d 3e  Client { .. } =>
0e70: 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20   false,.        
0e80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  }.    }..    ///
0e90: 20 52 65 74 75 72 6e 73 20 60 74 72 75 65 60 20   Returns `true` 
0ea0: 69 66 20 74 68 65 20 61 75 74 68 6f 72 69 74 79  if the authority
0eb0: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6e 6f 64   is a single nod
0ec0: 65 2c 20 61 6e 64 20 60 66 61 6c 73 65 60 20 6f  e, and `false` o
0ed0: 74 68 65 72 77 69 73 65 2e 0a 20 20 20 20 70 75  therwise..    pu
0ee0: 62 20 66 6e 20 69 73 5f 73 69 6e 67 6c 65 28 26  b fn is_single(&
0ef0: 73 65 6c 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a  self) -> bool {.
0f00: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73          match *s
0f10: 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20  elf {.          
0f20: 20 20 41 75 74 68 6f 72 69 74 79 3a 3a 43 6c 69    Authority::Cli
0f30: 65 6e 74 4d 61 6e 61 67 65 72 28 5f 29 20 7c 0a  entManager(_) |.
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 41 75 74 68              Auth
0f50: 6f 72 69 74 79 3a 3a 4e 61 65 4d 61 6e 61 67 65  ority::NaeManage
0f60: 72 28 5f 29 20 7c 0a 20 20 20 20 20 20 20 20 20  r(_) |.         
0f70: 20 20 20 41 75 74 68 6f 72 69 74 79 3a 3a 53 65     Authority::Se
0f80: 63 74 69 6f 6e 28 5f 29 20 7c 0a 20 20 20 20 20  ction(_) |.     
0f90: 20 20 20 20 20 20 20 41 75 74 68 6f 72 69 74 79         Authority
0fa0: 3a 3a 50 72 65 66 69 78 53 65 63 74 69 6f 6e 28  ::PrefixSection(
0fb0: 5f 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  _) |.           
0fc0: 20 41 75 74 68 6f 72 69 74 79 3a 3a 4e 6f 64 65   Authority::Node
0fd0: 4d 61 6e 61 67 65 72 28 5f 29 20 3d 3e 20 66 61  Manager(_) => fa
0fe0: 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lse,.           
0ff0: 20 41 75 74 68 6f 72 69 74 79 3a 3a 4d 61 6e 61   Authority::Mana
1000: 67 65 64 4e 6f 64 65 28 5f 29 20 7c 0a 20 20 20  gedNode(_) |.   
1010: 20 20 20 20 20 20 20 20 20 41 75 74 68 6f 72 69           Authori
1020: 74 79 3a 3a 43 6c 69 65 6e 74 20 7b 20 2e 2e 20  ty::Client { .. 
1030: 7d 20 3d 3e 20 74 72 75 65 2c 0a 20 20 20 20 20  } => true,.     
1040: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1050: 2f 2f 2f 20 52 65 74 75 72 6e 73 20 60 74 72 75  /// Returns `tru
1060: 65 60 20 69 66 20 61 20 63 6c 69 65 6e 74 2c 20  e` if a client, 
1070: 60 66 61 6c 73 65 60 20 69 66 20 61 20 6e 6f 64  `false` if a nod
1080: 65 20 6f 72 20 73 65 63 74 69 6f 6e 2e 0a 20 20  e or section..  
1090: 20 20 70 75 62 20 66 6e 20 69 73 5f 63 6c 69 65    pub fn is_clie
10a0: 6e 74 28 26 73 65 6c 66 29 20 2d 3e 20 62 6f 6f  nt(&self) -> boo
10b0: 6c 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 6c  l {.        if l
10c0: 65 74 20 41 75 74 68 6f 72 69 74 79 3a 3a 43 6c  et Authority::Cl
10d0: 69 65 6e 74 20 7b 20 2e 2e 20 7d 20 3d 20 2a 73  ient { .. } = *s
10e0: 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20  elf {.          
10f0: 20 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 7d    true.        }
1100: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1110: 20 20 20 20 66 61 6c 73 65 0a 20 20 20 20 20 20      false.      
1120: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1130: 2f 2f 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e  // Returns the n
1140: 61 6d 65 20 6f 66 20 61 75 74 68 6f 72 69 74 79  ame of authority
1150: 2e 0a 20 20 20 20 70 75 62 20 66 6e 20 6e 61 6d  ..    pub fn nam
1160: 65 28 26 73 65 6c 66 29 20 2d 3e 20 4e 20 7b 0a  e(&self) -> N {.
1170: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73          match *s
1180: 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20  elf {.          
1190: 20 20 41 75 74 68 6f 72 69 74 79 3a 3a 43 6c 69    Authority::Cli
11a0: 65 6e 74 4d 61 6e 61 67 65 72 28 72 65 66 20 6e  entManager(ref n
11b0: 61 6d 65 29 20 7c 0a 20 20 20 20 20 20 20 20 20  ame) |.         
11c0: 20 20 20 41 75 74 68 6f 72 69 74 79 3a 3a 4e 61     Authority::Na
11d0: 65 4d 61 6e 61 67 65 72 28 72 65 66 20 6e 61 6d  eManager(ref nam
11e0: 65 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  e) |.           
11f0: 20 41 75 74 68 6f 72 69 74 79 3a 3a 4e 6f 64 65   Authority::Node
1200: 4d 61 6e 61 67 65 72 28 72 65 66 20 6e 61 6d 65  Manager(ref name
1210: 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
1220: 41 75 74 68 6f 72 69 74 79 3a 3a 53 65 63 74 69  Authority::Secti
1230: 6f 6e 28 72 65 66 20 6e 61 6d 65 29 20 7c 0a 20  on(ref name) |. 
1240: 20 20 20 20 20 20 20 20 20 20 20 41 75 74 68 6f             Autho
1250: 72 69 74 79 3a 3a 4d 61 6e 61 67 65 64 4e 6f 64  rity::ManagedNod
1260: 65 28 72 65 66 20 6e 61 6d 65 29 20 3d 3e 20 2a  e(ref name) => *
1270: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
1280: 20 20 41 75 74 68 6f 72 69 74 79 3a 3a 50 72 65    Authority::Pre
1290: 66 69 78 53 65 63 74 69 6f 6e 28 72 65 66 20 70  fixSection(ref p
12a0: 72 65 66 69 78 29 20 3d 3e 20 70 72 65 66 69 78  refix) => prefix
12b0: 2e 6c 6f 77 65 72 5f 62 6f 75 6e 64 28 29 2c 0a  .lower_bound(),.
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 41 75 74 68              Auth
12d0: 6f 72 69 74 79 3a 3a 43 6c 69 65 6e 74 20 7b 20  ority::Client { 
12e0: 72 65 66 20 70 72 6f 78 79 5f 6e 6f 64 65 5f 6e  ref proxy_node_n
12f0: 61 6d 65 2c 20 2e 2e 20 7d 20 3d 3e 20 2a 70 72  ame, .. } => *pr
1300: 6f 78 79 5f 6e 6f 64 65 5f 6e 61 6d 65 2c 0a 20  oxy_node_name,. 
1310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
1320: 0a 0a 69 6d 70 6c 3c 4e 3a 20 58 6f 72 61 62 6c  ..impl<N: Xorabl
1330: 65 20 2b 20 43 6c 6f 6e 65 20 2b 20 43 6f 70 79  e + Clone + Copy
1340: 20 2b 20 42 69 6e 61 72 79 20 2b 20 44 65 66 61   + Binary + Defa
1350: 75 6c 74 20 2b 20 44 69 73 70 6c 61 79 3e 20 44  ult + Display> D
1360: 65 62 75 67 20 66 6f 72 20 41 75 74 68 6f 72 69  ebug for Authori
1370: 74 79 3c 4e 3e 20 7b 0a 20 20 20 20 66 6e 20 66  ty<N> {.    fn f
1380: 6d 74 28 26 73 65 6c 66 2c 20 66 6f 72 6d 61 74  mt(&self, format
1390: 74 65 72 3a 20 26 6d 75 74 20 46 6f 72 6d 61 74  ter: &mut Format
13a0: 74 65 72 29 20 2d 3e 20 66 6d 74 3a 3a 52 65 73  ter) -> fmt::Res
13b0: 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 6d 61  ult {.        ma
13c0: 74 63 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20  tch *self {.    
13d0: 20 20 20 20 20 20 20 20 41 75 74 68 6f 72 69 74          Authorit
13e0: 79 3a 3a 43 6c 69 65 6e 74 4d 61 6e 61 67 65 72  y::ClientManager
13f0: 28 72 65 66 20 6e 61 6d 65 29 20 3d 3e 20 7b 0a  (ref name) => {.
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 77 72 69 74 65 21 28 66 6f 72 6d 61 74 74 65 72  write!(formatter
1420: 2c 20 22 43 6c 69 65 6e 74 4d 61 6e 61 67 65 72  , "ClientManager
1430: 28 6e 61 6d 65 3a 20 7b 7d 29 22 2c 20 6e 61 6d  (name: {})", nam
1440: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e).            }
1450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 75 74  .            Aut
1460: 68 6f 72 69 74 79 3a 3a 4e 61 65 4d 61 6e 61 67  hority::NaeManag
1470: 65 72 28 72 65 66 20 6e 61 6d 65 29 20 3d 3e 20  er(ref name) => 
1480: 77 72 69 74 65 21 28 66 6f 72 6d 61 74 74 65 72  write!(formatter
1490: 2c 20 22 4e 61 65 4d 61 6e 61 67 65 72 28 6e 61  , "NaeManager(na
14a0: 6d 65 3a 20 7b 7d 29 22 2c 20 6e 61 6d 65 29 2c  me: {})", name),
14b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 75 74  .            Aut
14c0: 68 6f 72 69 74 79 3a 3a 4e 6f 64 65 4d 61 6e 61  hority::NodeMana
14d0: 67 65 72 28 72 65 66 20 6e 61 6d 65 29 20 3d 3e  ger(ref name) =>
14e0: 20 77 72 69 74 65 21 28 66 6f 72 6d 61 74 74 65   write!(formatte
14f0: 72 2c 20 22 4e 6f 64 65 4d 61 6e 61 67 65 72 28  r, "NodeManager(
1500: 6e 61 6d 65 3a 20 7b 7d 29 22 2c 20 6e 61 6d 65  name: {})", name
1510: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  ),.            A
1520: 75 74 68 6f 72 69 74 79 3a 3a 53 65 63 74 69 6f  uthority::Sectio
1530: 6e 28 72 65 66 20 6e 61 6d 65 29 20 3d 3e 20 77  n(ref name) => w
1540: 72 69 74 65 21 28 66 6f 72 6d 61 74 74 65 72 2c  rite!(formatter,
1550: 20 22 53 65 63 74 69 6f 6e 28 6e 61 6d 65 3a 20   "Section(name: 
1560: 7b 7d 29 22 2c 20 6e 61 6d 65 29 2c 0a 20 20 20  {})", name),.   
1570: 20 20 20 20 20 20 20 20 20 41 75 74 68 6f 72 69           Authori
1580: 74 79 3a 3a 50 72 65 66 69 78 53 65 63 74 69 6f  ty::PrefixSectio
1590: 6e 28 72 65 66 20 70 72 65 66 69 78 29 20 3d 3e  n(ref prefix) =>
15a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
15b0: 20 20 20 77 72 69 74 65 21 28 66 6f 72 6d 61 74     write!(format
15c0: 74 65 72 2c 20 22 50 72 65 66 69 78 53 65 63 74  ter, "PrefixSect
15d0: 69 6f 6e 28 70 72 65 66 69 78 3a 20 7b 3a 3f 7d  ion(prefix: {:?}
15e0: 29 22 2c 20 70 72 65 66 69 78 29 0a 20 20 20 20  )", prefix).    
15f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1600: 20 20 20 20 20 20 41 75 74 68 6f 72 69 74 79 3a        Authority:
1610: 3a 4d 61 6e 61 67 65 64 4e 6f 64 65 28 72 65 66  :ManagedNode(ref
1620: 20 6e 61 6d 65 29 20 3d 3e 20 77 72 69 74 65 21   name) => write!
1630: 28 66 6f 72 6d 61 74 74 65 72 2c 20 22 4d 61 6e  (formatter, "Man
1640: 61 67 65 64 4e 6f 64 65 28 6e 61 6d 65 3a 20 7b  agedNode(name: {
1650: 7d 29 22 2c 20 6e 61 6d 65 29 2c 0a 20 20 20 20  })", name),.    
1660: 20 20 20 20 20 20 20 20 41 75 74 68 6f 72 69 74          Authorit
1670: 79 3a 3a 43 6c 69 65 6e 74 20 7b 20 72 65 66 20  y::Client { ref 
1680: 63 6c 69 65 6e 74 5f 6b 65 79 2c 20 72 65 66 20  client_key, ref 
1690: 70 72 6f 78 79 5f 6e 6f 64 65 5f 6e 61 6d 65 2c  proxy_node_name,
16a0: 20 72 65 66 20 70 65 65 72 5f 69 64 20 7d 20 3d   ref peer_id } =
16b0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
16c0: 20 20 20 20 77 72 69 74 65 21 28 66 6f 72 6d 61      write!(forma
16d0: 74 74 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  tter,.          
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6c               "Cl
16f0: 69 65 6e 74 20 7b 7b 20 63 6c 69 65 6e 74 5f 6e  ient {{ client_n
1700: 61 6d 65 3a 20 7b 7d 2c 20 70 72 6f 78 79 5f 6e  ame: {}, proxy_n
1710: 6f 64 65 5f 6e 61 6d 65 3a 20 7b 7d 2c 20 70 65  ode_name: {}, pe
1720: 65 72 5f 69 64 3a 20 7b 3a 3f 7d 20 7d 7d 22 2c  er_id: {:?} }}",
1730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1740: 20 20 20 20 20 20 20 20 4e 3a 3a 66 72 6f 6d 5f          N::from_
1750: 68 61 73 68 28 68 61 73 68 3a 3a 73 68 61 32 35  hash(hash::sha25
1760: 36 3a 3a 68 61 73 68 28 26 63 6c 69 65 6e 74 5f  6::hash(&client_
1770: 6b 65 79 5b 2e 2e 5d 29 2e 30 29 2c 0a 20 20 20  key[..]).0),.   
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 20 20 20 20 70 72 6f 78 79 5f 6e 6f 64 65 5f 6e      proxy_node_n
17a0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 65 65 72              peer
17c0: 5f 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20  _id).           
17d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17e0: 20 7d 0a 7d 0a                                    }.}.