@keetanetwork/keetanet-client 0.18.0 → 0.18.1

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.
Files changed (123) hide show
  1. package/client/builder.d.ts +23 -10
  2. package/client/index-browser.d.ts +1 -1
  3. package/client/index-browser.js +89 -24
  4. package/client/index.d.ts +1 -1
  5. package/client/index.js +78 -25
  6. package/docs/assets/hierarchy.js +1 -1
  7. package/docs/assets/search.js +1 -1
  8. package/docs/classes/KeetaNetSDK.Referenced.BaseSet.html +1 -1
  9. package/docs/classes/KeetaNetSDK.Referenced.BaseVoteBuilder.html +1 -1
  10. package/docs/classes/KeetaNetSDK.Referenced.BlockOperation.html +1 -1
  11. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationCREATE_IDENTIFIER.html +1 -1
  12. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMANAGE_CERTIFICATE.html +1 -1
  13. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMODIFY_PERMISSIONS.html +1 -1
  14. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationRECEIVE.html +1 -1
  15. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSEND.html +1 -1
  16. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_INFO.html +1 -1
  17. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_REP.html +1 -1
  18. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  19. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  20. package/docs/classes/KeetaNetSDK.Referenced.Certificate.html +1 -4
  21. package/docs/classes/KeetaNetSDK.Referenced.ECDSAKeyPair.html +1 -1
  22. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1KeyPair.html +1 -1
  23. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PrivateKey.html +1 -1
  24. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PublicKey.html +1 -1
  25. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1Signature.html +1 -1
  26. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1KeyPair.html +1 -1
  27. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PrivateKey.html +1 -1
  28. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PublicKey.html +1 -1
  29. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1Signature.html +1 -1
  30. package/docs/classes/KeetaNetSDK.Referenced.ED25519KeyPair.html +1 -1
  31. package/docs/classes/KeetaNetSDK.Referenced.ED25519PrivateKey.html +1 -1
  32. package/docs/classes/KeetaNetSDK.Referenced.ED25519PublicKey.html +1 -1
  33. package/docs/classes/KeetaNetSDK.Referenced.ED25519Signature.html +1 -1
  34. package/docs/classes/KeetaNetSDK.Referenced.ExternalKeyPair.html +1 -1
  35. package/docs/classes/KeetaNetSDK.Referenced.ExternalSet.html +1 -1
  36. package/docs/classes/KeetaNetSDK.Referenced.IdempotentKey.html +1 -1
  37. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKey.html +1 -1
  38. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKeyPair.html +1 -1
  39. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetError.html +1 -1
  40. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetErrorBase.html +1 -1
  41. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerError.html +1 -1
  42. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerIdempotentKeyError.html +1 -1
  43. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerVoteError.html +1 -1
  44. package/docs/classes/KeetaNetSDK.Referenced.KeyInterface.html +1 -1
  45. package/docs/classes/KeetaNetSDK.Referenced.KeyStorage.html +1 -1
  46. package/docs/classes/KeetaNetSDK.Referenced.PermissionSetHolder.html +1 -1
  47. package/docs/classes/KeetaNetSDK.Referenced.PossiblyExpiredVote.html +1 -1
  48. package/docs/classes/KeetaNetSDK.Referenced.PossiblyUnsignedBlock.html +1 -1
  49. package/docs/classes/KeetaNetSDK.Referenced.SignatureStorage.html +1 -1
  50. package/docs/classes/KeetaNetSDK.Referenced.Stats.html +1 -1
  51. package/docs/classes/KeetaNetSDK.Referenced.StatsPending.html +1 -1
  52. package/docs/classes/KeetaNetSDK.Referenced.UnsignedBlock.html +1 -1
  53. package/docs/classes/KeetaNetSDK.Referenced.UserClientBuilder.html +1 -1
  54. package/docs/classes/KeetaNetSDK.Referenced.VoteBlockBundle.html +1 -1
  55. package/docs/classes/KeetaNetSDK.Referenced.VoteBuilder.html +1 -1
  56. package/docs/classes/KeetaNetSDK.Referenced.VoteHash.html +1 -1
  57. package/docs/classes/KeetaNetSDK.Referenced.VoteLikeBase.html +1 -1
  58. package/docs/classes/KeetaNetSDK.Referenced.VoteQuoteBuilder.html +1 -1
  59. package/docs/classes/KeetaNetSDK.Referenced.VoteStapleHash.html +1 -1
  60. package/docs/classes/KeetaNetSDK.Referenced.src_lib_utils_buffer.BufferStorage.html +1 -1
  61. package/docs/classes/KeetaNetSDK.UserClient.html +2 -2
  62. package/docs/hierarchy.html +1 -1
  63. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ExplicitContextTag.html +1 -1
  64. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ImplicitContextTag.html +1 -1
  65. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1Object.html +1 -1
  66. package/docs/interfaces/KeetaNetSDK.Referenced.AccountACLRow.html +1 -1
  67. package/docs/interfaces/KeetaNetSDK.Referenced.BaseACLRow.html +1 -1
  68. package/docs/interfaces/KeetaNetSDK.Referenced.BaseAccountInfo.html +1 -1
  69. package/docs/interfaces/KeetaNetSDK.Referenced.BaseExternalKeyPairFunctions.html +1 -1
  70. package/docs/interfaces/KeetaNetSDK.Referenced.BaseGenerationConfig.html +1 -1
  71. package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierAccountInfo.html +1 -1
  72. package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierCreateArguments.html +1 -1
  73. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperation.html +1 -1
  74. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationCREATE_IDENTIFIER.html +1 -1
  75. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATE.html +1 -1
  76. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMODIFY_PERMISSIONS.html +1 -1
  77. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationRECEIVE.html +1 -1
  78. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSEND.html +1 -1
  79. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_INFO.html +1 -1
  80. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_REP.html +1 -1
  81. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  82. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  83. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV1Canonical.html +1 -1
  84. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV2Canonical.html +1 -1
  85. package/docs/interfaces/KeetaNetSDK.Referenced.CertificateACLRow.html +1 -1
  86. package/docs/interfaces/KeetaNetSDK.Referenced.Constructor.html +1 -1
  87. package/docs/interfaces/KeetaNetSDK.Referenced.DisposableTimingHandle.html +1 -1
  88. package/docs/interfaces/KeetaNetSDK.Referenced.ECDSA_SECP256K1AccountInfo.html +1 -1
  89. package/docs/interfaces/KeetaNetSDK.Referenced.ECDSA_SECP256R1AccountInfo.html +1 -1
  90. package/docs/interfaces/KeetaNetSDK.Referenced.ED25519AccountInfo.html +1 -1
  91. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsNoEncryption.html +1 -1
  92. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsSupportsEncryption.html +1 -1
  93. package/docs/interfaces/KeetaNetSDK.Referenced.InitialConfigSupply.html +1 -1
  94. package/docs/interfaces/KeetaNetSDK.Referenced.InstanceSet.html +1 -1
  95. package/docs/interfaces/KeetaNetSDK.Referenced.KVGenericOptionsType.html +1 -1
  96. package/docs/interfaces/KeetaNetSDK.Referenced.KVSetOptionsType.html +1 -1
  97. package/docs/interfaces/KeetaNetSDK.Referenced.ModifyTokenBalanceEntry.html +1 -1
  98. package/docs/interfaces/KeetaNetSDK.Referenced.MultiSigIdentifierCreateArguments.html +1 -1
  99. package/docs/interfaces/KeetaNetSDK.Referenced.MultisigAccountInfo.html +1 -1
  100. package/docs/interfaces/KeetaNetSDK.Referenced.MultisigConfig.html +1 -1
  101. package/docs/interfaces/KeetaNetSDK.Referenced.NumericValueEntry.html +1 -1
  102. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerBase.html +1 -1
  103. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerListener.html +1 -1
  104. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerRepBase.html +1 -1
  105. package/docs/interfaces/KeetaNetSDK.Referenced.PendingOperations.html +2 -2
  106. package/docs/interfaces/KeetaNetSDK.Referenced.PendingOperationsJSON.html +2 -2
  107. package/docs/interfaces/KeetaNetSDK.Referenced.PublicKeyStorage.html +1 -1
  108. package/docs/interfaces/KeetaNetSDK.Referenced.RequestTokenReceiveEntry.html +1 -1
  109. package/docs/interfaces/KeetaNetSDK.Referenced.StorageAccountInfo.html +1 -1
  110. package/docs/interfaces/KeetaNetSDK.Referenced.TokenAccountInfo.html +1 -1
  111. package/docs/interfaces/KeetaNetSDK.Referenced.TokenNumericEntry.html +1 -1
  112. package/docs/interfaces/KeetaNetSDK.Referenced.WithIsInstance.html +1 -1
  113. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1BitString.html +1 -1
  114. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Date.html +1 -1
  115. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1OID.html +1 -1
  116. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Set.html +1 -1
  117. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1String.html +1 -1
  118. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Struct.html +1 -1
  119. package/lib/utils/certificate.d.ts +0 -1
  120. package/lib/utils/helper_testing.d.ts +10 -0
  121. package/npm-shrinkwrap.json +2 -2
  122. package/package.json +1 -1
  123. package/version.d.ts +1 -1
@@ -3,7 +3,7 @@ import { Account, AccountKeyAlgorithm } from '../lib/account';
3
3
  import type { AdjustMethod, BlockHash } from '../lib/block';
4
4
  import { Block } from '../lib/block';
5
5
  import type { IdentifierCreateArguments, BlockJSONOperations } from '../lib/block/operations';
6
- import type { AccountInfo, AccountInfoWithoutAccount } from '../lib/ledger/types';
6
+ import type { AccountInfo, AccountInfoWithoutAccount, ACLRow } from '../lib/ledger/types';
7
7
  import type { AcceptedPermissionTypes } from '../lib/permissions';
8
8
  import type { UserClient, Client } from '.';
9
9
  import { Permissions } from '../lib/permissions';
@@ -87,10 +87,15 @@ export interface PendingOperations {
87
87
  certificate: Certificate;
88
88
  intermediateCertificates: CertificateBundle | null;
89
89
  }[];
90
- permissionsChanges?: PerAccount<PerAccount<{
91
- method: AdjustMethod;
92
- permissions: Permissions;
93
- }[]>>;
90
+ permissionsChanges?: {
91
+ [principalOrCertificate: string]: {
92
+ principal: ACLRow['principal'];
93
+ targets: PerAccount<{
94
+ method: AdjustMethod;
95
+ permissions: Permissions;
96
+ }[]>;
97
+ };
98
+ };
94
99
  info?: AccountInfoWithoutAccount;
95
100
  setRep?: Account;
96
101
  }
@@ -123,10 +128,18 @@ export interface PendingOperationsJSON {
123
128
  certificate: string;
124
129
  intermediateCertificates: string | null;
125
130
  }[];
126
- permissionsChanges?: PerAccount<PerAccount<{
127
- method: AdjustMethod;
128
- permissions: [string, string];
129
- }[]>>;
131
+ permissionsChanges?: {
132
+ [principalOrCertificate: string]: {
133
+ principal: string | {
134
+ certificate: string;
135
+ certificateAccount: string;
136
+ };
137
+ targets: PerAccount<{
138
+ method: AdjustMethod;
139
+ permissions: [string, string];
140
+ }[]>;
141
+ };
142
+ };
130
143
  info?: Pick<AccountInfo, 'name' | 'description' | 'metadata'> & {
131
144
  defaultPermission?: [string, string];
132
145
  };
@@ -183,7 +196,7 @@ export declare class UserClientBuilder {
183
196
  computeBlocks(renderOptions: RenderOptions): Promise<ComputeBlocksResponse>;
184
197
  send(recipient: AccountOrPending, amount: bigint, token: TokenOrPending, external?: string, options?: BuilderBlockOptions): void;
185
198
  receive(from: AccountOrPending, amount: bigint, token: TokenOrPending, exact?: boolean, forward?: GenericAccount, options?: BuilderBlockOptions): void;
186
- updatePermissions(principal: GenericAccount, permissions: AcceptedPermissionTypes, target?: GenericAccount, method?: AdjustMethod, options?: BuilderBlockOptions): void;
199
+ updatePermissions(principal: ACLRow['principal'], permissions: AcceptedPermissionTypes, target?: GenericAccount, method?: AdjustMethod, options?: BuilderBlockOptions): void;
187
200
  modifyCertificate(method: ManageCertificateMethod, certificate: Certificate, intermediateCertificates?: CertificateBundle | null, options?: BuilderBlockOptions): void;
188
201
  modifyTokenSupply(amount: bigint, options?: BuilderBlockOptions): void;
189
202
  modifyTokenBalance(token: TokenOrPending, amount: bigint, isSet?: boolean, options?: BuilderBlockOptions): void;
@@ -1204,7 +1204,7 @@ export declare class UserClient {
1204
1204
  * @param options The options to use for the request
1205
1205
  * @return The vote staple that was generated and whether it was able to be published
1206
1206
  */
1207
- updatePermissions(principal: GenericAccount | string, permissions: AcceptedPermissionTypes, target?: GenericAccount | string, method?: AdjustMethod, options?: UserClientOptions): Promise<{
1207
+ updatePermissions(principal: GenericAccount | string | ACLRow['principal'], permissions: AcceptedPermissionTypes, target?: GenericAccount | string, method?: AdjustMethod, options?: UserClientOptions): Promise<{
1208
1208
  voteStaple: VoteStaple;
1209
1209
  publish: boolean;
1210
1210
  from: "direct";
@@ -117365,7 +117365,22 @@ class src_client_Certificate {
117365
117365
  * Verify against a given certificate store
117366
117366
  */
117367
117367
 
117368
- verifyChain(store, _ignore_seenCerts) {
117368
+ /** @internal */
117369
+
117370
+ verifyChain(store) {
117371
+ let seenHashes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new src_client_CertificateHash.Set();
117372
+ /**
117373
+ * Loop detection: reject any certificate already on the current
117374
+ * verification path, per RFC 4158 Section 2.4.1 (no certificate may
117375
+ * repeat in a path) and Section 5.2 (detection guidance).
117376
+ *
117377
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc4158#section-5.2 RFC 4158 Section 5.2}
117378
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc4158#section-2.4.1 RFC 4158 Section 2.4.1}
117379
+ */
117380
+ if (seenHashes.has(client_certificate_assertClassBrand(client_Certificate_brand, this, client_computeHash).call(this))) {
117381
+ return null;
117382
+ }
117383
+
117369
117384
  /*
117370
117385
  * Check to see if the certificate is signed by any of the Root CAs
117371
117386
  */
@@ -117397,6 +117412,8 @@ class src_client_Certificate {
117397
117412
  * Check to see if the certificate is signed by any of the specified intermediates
117398
117413
  */
117399
117414
  if (store.intermediate !== undefined) {
117415
+ const nextSeen = new src_client_CertificateHash.Set(seenHashes);
117416
+ nextSeen.add(client_certificate_assertClassBrand(client_Certificate_brand, this, client_computeHash).call(this));
117400
117417
  store.intermediate.forEach(intermediateCertificate => {
117401
117418
  if (retval !== null) {
117402
117419
  return;
@@ -117404,7 +117421,7 @@ class src_client_Certificate {
117404
117421
  const checkIssued = client_certificate_assertClassBrand(client_Certificate_brand, this, client_checkIssued).call(this, intermediateCertificate);
117405
117422
  if (checkIssued.issued) {
117406
117423
  if (intermediateCertificate.checkValid(this.moment)) {
117407
- const moreChain = intermediateCertificate.verifyChain(store, undefined /* seenCerts XXX:TODO */);
117424
+ const moreChain = intermediateCertificate.verifyChain(store, nextSeen);
117408
117425
  if (moreChain !== null) {
117409
117426
  const checkRetval = [...moreChain, intermediateCertificate];
117410
117427
  const validChain = src_client_Certificate.verifyChainDepth([...checkRetval, this]);
@@ -117581,12 +117598,13 @@ class src_client_Certificate {
117581
117598
  */
117582
117599
  hash() {
117583
117600
  this.assertConstructed();
117584
- if (!client_certificate_classPrivateFieldGet(client_hash, this)) {
117585
- client_certificate_classPrivateFieldSet(client_hash, this, src_client_CertificateHash.fromData(client_certificate_Buffer.from(client_certificate_classPrivateFieldGet(client_raw2, this))));
117586
- }
117587
- return client_certificate_classPrivateFieldGet(client_hash, this);
117601
+ return client_certificate_assertClassBrand(client_Certificate_brand, this, client_computeHash).call(this);
117588
117602
  }
117589
117603
 
117604
+ /*
117605
+ * Compute the hash without asserting full construction.
117606
+ */
117607
+
117590
117608
  /**
117591
117609
  * Get a JSON representation of the certificate
117592
117610
  */
@@ -117890,6 +117908,12 @@ function client_checkIssued(issuer) {
117890
117908
  issued: true
117891
117909
  };
117892
117910
  }
117911
+ function client_computeHash() {
117912
+ if (!client_certificate_classPrivateFieldGet(client_hash, this)) {
117913
+ client_certificate_classPrivateFieldSet(client_hash, this, src_client_CertificateHash.fromData(client_certificate_Buffer.from(client_certificate_classPrivateFieldGet(client_raw2, this))));
117914
+ }
117915
+ return client_certificate_classPrivateFieldGet(client_hash, this);
117916
+ }
117893
117917
  /**
117894
117918
  * The Certificate Builder
117895
117919
  */
@@ -130232,7 +130256,7 @@ client_lib_ledger_defineProperty(src_client_Ledger, "isInstance", client_checkab
130232
130256
  // EXTERNAL MODULE: ws (ignored)
130233
130257
  var client_ws_ignored_ = __webpack_require__(4708);
130234
130258
  ;// ./src/version.ts
130235
- const client_version = '0.18.0+g5417d9af948be899fcebb75694edb492ff971891';
130259
+ const client_version = '0.18.1+gae2caf00c1e19c6d232ff1a37b9fd8e7ea8a1ddc';
130236
130260
  /* harmony default export */ const client_src_version = ((/* unused pure expression or super */ null && (client_version)));
130237
130261
  ;// ./src/lib/p2p.ts
130238
130262
  /* provided dependency */ var client_p2p_Buffer = __webpack_require__(8287)["Buffer"];
@@ -133131,20 +133155,33 @@ class src_client_UserClientBuilder {
133131
133155
  }
133132
133156
  if (operations.permissionsChanges !== undefined) {
133133
133157
  pendingOperations.permissionsChanges = {};
133134
- for (const accountPubKey in operations.permissionsChanges) {
133135
- pendingOperations.permissionsChanges[accountPubKey] = {};
133136
- for (const targetPubKey in operations.permissionsChanges[accountPubKey]) {
133158
+ for (const [certificateOrAccountKey, changes] of Object.entries(operations.permissionsChanges)) {
133159
+ pendingOperations.permissionsChanges[certificateOrAccountKey] = {
133160
+ principal: (() => {
133161
+ if (typeof changes.principal === 'string') {
133162
+ return src_client_Account.toAccount(changes.principal);
133163
+ } else {
133164
+ return {
133165
+ usingCertificate: true,
133166
+ certificate: new src_client_Certificate.Hash(changes.principal.certificate),
133167
+ certificateAccount: src_client_Account.toAccount(changes.principal.certificateAccount)
133168
+ };
133169
+ }
133170
+ })(),
133171
+ targets: {}
133172
+ };
133173
+ for (const targetPubKey in changes.targets) {
133137
133174
  const updateArray = [];
133138
133175
  for (const {
133139
133176
  method,
133140
133177
  permissions
133141
- } of operations.permissionsChanges[accountPubKey][targetPubKey]) {
133178
+ } of changes.targets[targetPubKey]) {
133142
133179
  updateArray.push({
133143
133180
  method,
133144
133181
  permissions: client_permissions_Permissions.FromAcceptedTypes(permissions)
133145
133182
  });
133146
133183
  }
133147
- pendingOperations.permissionsChanges[accountPubKey][targetPubKey] = updateArray;
133184
+ pendingOperations.permissionsChanges[certificateOrAccountKey].targets[targetPubKey] = updateArray;
133148
133185
  }
133149
133186
  }
133150
133187
  }
@@ -133594,9 +133631,13 @@ class src_client_UserClientBuilder {
133594
133631
  amount: amount
133595
133632
  });
133596
133633
  }
133597
- for (const principalPubKey in pending.permissionsChanges) {
133598
- for (const targetPubKey in pending.permissionsChanges[principalPubKey]) {
133599
- for (const change of pending.permissionsChanges[principalPubKey][targetPubKey]) {
133634
+ for (const {
133635
+ targets,
133636
+ principal
133637
+ } of Object.values((_pending$permissionsC = pending.permissionsChanges) !== null && _pending$permissionsC !== void 0 ? _pending$permissionsC : {})) {
133638
+ var _pending$permissionsC;
133639
+ for (const targetPubKey in targets) {
133640
+ for (const change of targets[targetPubKey]) {
133600
133641
  const {
133601
133642
  method,
133602
133643
  permissions
@@ -133607,7 +133648,17 @@ class src_client_UserClientBuilder {
133607
133648
  }
133608
133649
  operations.push({
133609
133650
  type: src_client_Block.OperationType.MODIFY_PERMISSIONS,
133610
- principal: src_client_Account.fromPublicKeyString(principalPubKey),
133651
+ principal: (() => {
133652
+ if (src_client_Account.isInstance(principal)) {
133653
+ return principal;
133654
+ } else {
133655
+ return {
133656
+ usingCertificate: true,
133657
+ certificateHash: principal.certificate,
133658
+ certificateAccount: principal.certificateAccount
133659
+ };
133660
+ }
133661
+ })(),
133611
133662
  target: target,
133612
133663
  method: method,
133613
133664
  permissions: permissions
@@ -133673,18 +133724,26 @@ class src_client_UserClientBuilder {
133673
133724
  let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
133674
133725
  client_builder_assertClassBrand(client_UserClientBuilder_brand, this, client_useOptions).call(this, options);
133675
133726
  method = method !== null && method !== void 0 ? method : src_client_Block.AdjustMethod.SET;
133676
- const principalPubKey = principal.publicKeyString.get();
133677
- const targetPubKey = (target !== null && target !== void 0 ? target : client_builder_classPrivateFieldGet(client_pendingOptions, this).account).publicKeyString.get();
133727
+ let principalKey;
133728
+ if (typeof principal === 'string' || src_client_Account.isInstance(principal)) {
133729
+ principalKey = src_client_Account.toAccount(principal).publicKeyString.get();
133730
+ } else {
133731
+ principalKey = principal.certificate.toString();
133732
+ }
133678
133733
  if (!client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges) {
133679
133734
  client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges = {};
133680
133735
  }
133681
- if (!client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalPubKey]) {
133682
- client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalPubKey] = {};
133736
+ if (!client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalKey]) {
133737
+ client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalKey] = {
133738
+ principal,
133739
+ targets: {}
133740
+ };
133683
133741
  }
133684
- if (!client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalPubKey][targetPubKey]) {
133685
- client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalPubKey][targetPubKey] = [];
133742
+ const targetPubKey = (target !== null && target !== void 0 ? target : client_builder_classPrivateFieldGet(client_pendingOptions, this).account).publicKeyString.get();
133743
+ if (!client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalKey].targets[targetPubKey]) {
133744
+ client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalKey].targets[targetPubKey] = [];
133686
133745
  }
133687
- client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalPubKey][targetPubKey].push({
133746
+ client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[principalKey].targets[targetPubKey].push({
133688
133747
  method: method,
133689
133748
  permissions: client_permissions_Permissions.FromAcceptedTypes(permissions)
133690
133749
  });
@@ -136710,7 +136769,13 @@ class src_client_UserClient {
136710
136769
  async updatePermissions(principal, permissions, target, method) {
136711
136770
  let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
136712
136771
  const builder = this.initBuilder(options);
136713
- builder.updatePermissions(client_lib_account.toAccount(principal), permissions, client_lib_account.toAccount(target), method, options);
136772
+ let principalValue;
136773
+ if (typeof principal === 'string' || client_lib_account.isInstance(principal)) {
136774
+ principalValue = client_lib_account.toAccount(principal);
136775
+ } else {
136776
+ principalValue = principal;
136777
+ }
136778
+ builder.updatePermissions(principalValue, permissions, client_lib_account.toAccount(target), method, options);
136714
136779
  return await this.publishBuilder(builder);
136715
136780
  }
136716
136781
 
package/client/index.d.ts CHANGED
@@ -1204,7 +1204,7 @@ export declare class UserClient {
1204
1204
  * @param options The options to use for the request
1205
1205
  * @return The vote staple that was generated and whether it was able to be published
1206
1206
  */
1207
- updatePermissions(principal: GenericAccount | string, permissions: AcceptedPermissionTypes, target?: GenericAccount | string, method?: AdjustMethod, options?: UserClientOptions): Promise<{
1207
+ updatePermissions(principal: GenericAccount | string | ACLRow['principal'], permissions: AcceptedPermissionTypes, target?: GenericAccount | string, method?: AdjustMethod, options?: UserClientOptions): Promise<{
1208
1208
  voteStaple: VoteStaple;
1209
1209
  publish: boolean;
1210
1210
  from: "direct";
package/client/index.js CHANGED
@@ -57418,14 +57418,28 @@ class UserClientBuilder {
57418
57418
  }
57419
57419
  if (operations.permissionsChanges !== undefined) {
57420
57420
  pendingOperations.permissionsChanges = {};
57421
- for (const accountPubKey in operations.permissionsChanges) {
57422
- pendingOperations.permissionsChanges[accountPubKey] = {};
57423
- for (const targetPubKey in operations.permissionsChanges[accountPubKey]) {
57421
+ for (const [certificateOrAccountKey, changes] of Object.entries(operations.permissionsChanges)) {
57422
+ pendingOperations.permissionsChanges[certificateOrAccountKey] = {
57423
+ principal: (() => {
57424
+ if (typeof changes.principal === 'string') {
57425
+ return (account_1.Account.toAccount(changes.principal));
57426
+ }
57427
+ else {
57428
+ return ({
57429
+ usingCertificate: true,
57430
+ certificate: new certificate_1.Certificate.Hash(changes.principal.certificate),
57431
+ certificateAccount: account_1.Account.toAccount(changes.principal.certificateAccount)
57432
+ });
57433
+ }
57434
+ })(),
57435
+ targets: {}
57436
+ };
57437
+ for (const targetPubKey in changes.targets) {
57424
57438
  const updateArray = [];
57425
- for (const { method, permissions } of operations.permissionsChanges[accountPubKey][targetPubKey]) {
57439
+ for (const { method, permissions } of changes.targets[targetPubKey]) {
57426
57440
  updateArray.push({ method, permissions: permissions_1.Permissions.FromAcceptedTypes(permissions) });
57427
57441
  }
57428
- pendingOperations.permissionsChanges[accountPubKey][targetPubKey] = updateArray;
57442
+ pendingOperations.permissionsChanges[certificateOrAccountKey].targets[targetPubKey] = updateArray;
57429
57443
  }
57430
57444
  }
57431
57445
  }
@@ -57802,9 +57816,9 @@ class UserClientBuilder {
57802
57816
  amount: amount
57803
57817
  });
57804
57818
  }
57805
- for (const principalPubKey in pending.permissionsChanges) {
57806
- for (const targetPubKey in pending.permissionsChanges[principalPubKey]) {
57807
- for (const change of pending.permissionsChanges[principalPubKey][targetPubKey]) {
57819
+ for (const { targets, principal } of Object.values(pending.permissionsChanges ?? {})) {
57820
+ for (const targetPubKey in targets) {
57821
+ for (const change of targets[targetPubKey]) {
57808
57822
  const { method, permissions } = change;
57809
57823
  let target;
57810
57824
  if (!account.comparePublicKey(targetPubKey)) {
@@ -57812,7 +57826,18 @@ class UserClientBuilder {
57812
57826
  }
57813
57827
  operations.push({
57814
57828
  type: block_1.Block.OperationType.MODIFY_PERMISSIONS,
57815
- principal: account_1.Account.fromPublicKeyString(principalPubKey),
57829
+ principal: (() => {
57830
+ if (account_1.Account.isInstance(principal)) {
57831
+ return (principal);
57832
+ }
57833
+ else {
57834
+ return ({
57835
+ usingCertificate: true,
57836
+ certificateHash: principal.certificate,
57837
+ certificateAccount: principal.certificateAccount
57838
+ });
57839
+ }
57840
+ })(),
57816
57841
  target: target,
57817
57842
  method: method,
57818
57843
  permissions: permissions
@@ -57860,18 +57885,24 @@ class UserClientBuilder {
57860
57885
  updatePermissions(principal, permissions, target, method, options = {}) {
57861
57886
  __classPrivateFieldGet(this, _UserClientBuilder_instances, "m", _UserClientBuilder_useOptions).call(this, options);
57862
57887
  method = method ?? block_1.Block.AdjustMethod.SET;
57863
- const principalPubKey = principal.publicKeyString.get();
57864
- const targetPubKey = (target ?? __classPrivateFieldGet(this, _UserClientBuilder_pendingOptions, "f").account).publicKeyString.get();
57888
+ let principalKey;
57889
+ if (typeof principal === 'string' || account_1.Account.isInstance(principal)) {
57890
+ principalKey = account_1.Account.toAccount(principal).publicKeyString.get();
57891
+ }
57892
+ else {
57893
+ principalKey = principal.certificate.toString();
57894
+ }
57865
57895
  if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges) {
57866
57896
  __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges = {};
57867
57897
  }
57868
- if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey]) {
57869
- __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey] = {};
57898
+ if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey]) {
57899
+ __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey] = { principal, targets: {} };
57870
57900
  }
57871
- if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey][targetPubKey]) {
57872
- __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey][targetPubKey] = [];
57901
+ const targetPubKey = (target ?? __classPrivateFieldGet(this, _UserClientBuilder_pendingOptions, "f").account).publicKeyString.get();
57902
+ if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey].targets[targetPubKey]) {
57903
+ __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey].targets[targetPubKey] = [];
57873
57904
  }
57874
- __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey][targetPubKey].push({
57905
+ __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey].targets[targetPubKey].push({
57875
57906
  method: method,
57876
57907
  permissions: permissions_1.Permissions.FromAcceptedTypes(permissions)
57877
57908
  });
@@ -60563,7 +60594,14 @@ class UserClient {
60563
60594
  */
60564
60595
  async updatePermissions(principal, permissions, target, method, options = {}) {
60565
60596
  const builder = this.initBuilder(options);
60566
- builder.updatePermissions(account_1.default.toAccount(principal), permissions, account_1.default.toAccount(target), method, options);
60597
+ let principalValue;
60598
+ if (typeof principal === 'string' || account_1.default.isInstance(principal)) {
60599
+ principalValue = account_1.default.toAccount(principal);
60600
+ }
60601
+ else {
60602
+ principalValue = principal;
60603
+ }
60604
+ builder.updatePermissions(principalValue, permissions, account_1.default.toAccount(target), method, options);
60567
60605
  return (await this.publishBuilder(builder));
60568
60606
  }
60569
60607
  /**
@@ -76618,7 +76656,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
76618
76656
  var __importDefault = (this && this.__importDefault) || function (mod) {
76619
76657
  return (mod && mod.__esModule) ? mod : { "default": mod };
76620
76658
  };
76621
- var _CertificateBuilder_params, _CertificateBuilder_caPathLen, _CertificateBundle_raw, _CertificateBundle_contents, _Certificate_instances, _Certificate_raw, _Certificate_hash, _Certificate_extensionsRaw, _Certificate_extensionsProcessed, _Certificate_finalizeConstructionCalled, _Certificate_isSelfSigned, _Certificate_processExtensionsInternal, _Certificate_processBaseExtensions, _Certificate_parseKeyUsage, _Certificate_processBaseExtension, _Certificate_assertAllCriticalExtensionsProcessed, _Certificate_checkValid, _Certificate_checkIssued;
76659
+ var _CertificateBuilder_params, _CertificateBuilder_caPathLen, _CertificateBundle_raw, _CertificateBundle_contents, _Certificate_instances, _Certificate_raw, _Certificate_hash, _Certificate_extensionsRaw, _Certificate_extensionsProcessed, _Certificate_finalizeConstructionCalled, _Certificate_isSelfSigned, _Certificate_processExtensionsInternal, _Certificate_processBaseExtensions, _Certificate_parseKeyUsage, _Certificate_processBaseExtension, _Certificate_assertAllCriticalExtensionsProcessed, _Certificate_checkValid, _Certificate_checkIssued, _Certificate_computeHash;
76622
76660
  Object.defineProperty(exports, "__esModule", ({ value: true }));
76623
76661
  exports.Certificate = exports.CertificateBundle = exports.CertificateHash = exports.CertificateBuilder = void 0;
76624
76662
  const ASN1 = __importStar(__webpack_require__(6045));
@@ -77598,7 +77636,18 @@ class Certificate {
77598
77636
  }
77599
77637
  }
77600
77638
  }
77601
- verifyChain(store, _ignore_seenCerts /* XXX:TODO */) {
77639
+ verifyChain(store, seenHashes = new CertificateHash.Set()) {
77640
+ /**
77641
+ * Loop detection: reject any certificate already on the current
77642
+ * verification path, per RFC 4158 Section 2.4.1 (no certificate may
77643
+ * repeat in a path) and Section 5.2 (detection guidance).
77644
+ *
77645
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc4158#section-5.2 RFC 4158 Section 5.2}
77646
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc4158#section-2.4.1 RFC 4158 Section 2.4.1}
77647
+ */
77648
+ if (seenHashes.has(__classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_computeHash).call(this))) {
77649
+ return (null);
77650
+ }
77602
77651
  /*
77603
77652
  * Check to see if the certificate is signed by any of the Root CAs
77604
77653
  */
@@ -77629,6 +77678,8 @@ class Certificate {
77629
77678
  * Check to see if the certificate is signed by any of the specified intermediates
77630
77679
  */
77631
77680
  if (store.intermediate !== undefined) {
77681
+ const nextSeen = new CertificateHash.Set(seenHashes);
77682
+ nextSeen.add(__classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_computeHash).call(this));
77632
77683
  store.intermediate.forEach((intermediateCertificate) => {
77633
77684
  if (retval !== null) {
77634
77685
  return;
@@ -77636,7 +77687,7 @@ class Certificate {
77636
77687
  const checkIssued = __classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_checkIssued).call(this, intermediateCertificate);
77637
77688
  if (checkIssued.issued) {
77638
77689
  if (intermediateCertificate.checkValid(this.moment)) {
77639
- const moreChain = intermediateCertificate.verifyChain(store, undefined /* seenCerts XXX:TODO */);
77690
+ const moreChain = intermediateCertificate.verifyChain(store, nextSeen);
77640
77691
  if (moreChain !== null) {
77641
77692
  const checkRetval = [...moreChain, intermediateCertificate];
77642
77693
  const validChain = Certificate.verifyChainDepth([...checkRetval, this]);
@@ -77792,10 +77843,7 @@ class Certificate {
77792
77843
  */
77793
77844
  hash() {
77794
77845
  this.assertConstructed();
77795
- if (!__classPrivateFieldGet(this, _Certificate_hash, "f")) {
77796
- __classPrivateFieldSet(this, _Certificate_hash, CertificateHash.fromData(Buffer.from(__classPrivateFieldGet(this, _Certificate_raw, "f"))), "f");
77797
- }
77798
- return (__classPrivateFieldGet(this, _Certificate_hash, "f"));
77846
+ return (__classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_computeHash).call(this));
77799
77847
  }
77800
77848
  /**
77801
77849
  * Get a JSON representation of the certificate
@@ -78033,6 +78081,11 @@ _Certificate_raw = new WeakMap(), _Certificate_hash = new WeakMap(), _Certificat
78033
78081
  return ({ issued: false, reason: 'Signature verification failed' });
78034
78082
  }
78035
78083
  return ({ issued: true });
78084
+ }, _Certificate_computeHash = function _Certificate_computeHash() {
78085
+ if (!__classPrivateFieldGet(this, _Certificate_hash, "f")) {
78086
+ __classPrivateFieldSet(this, _Certificate_hash, CertificateHash.fromData(Buffer.from(__classPrivateFieldGet(this, _Certificate_raw, "f"))), "f");
78087
+ }
78088
+ return (__classPrivateFieldGet(this, _Certificate_hash, "f"));
78036
78089
  };
78037
78090
  /**
78038
78091
  * The Certificate Builder
@@ -81230,7 +81283,7 @@ exports.Testing = { findRDN, blockHashesFromVote, feeFromVote, hashDataSchema, f
81230
81283
 
81231
81284
  Object.defineProperty(exports, "__esModule", ({ value: true }));
81232
81285
  exports.version = void 0;
81233
- exports.version = '0.18.0+g5417d9af948be899fcebb75694edb492ff971891';
81286
+ exports.version = '0.18.1+gae2caf00c1e19c6d232ff1a37b9fd8e7ea8a1ddc';
81234
81287
  exports["default"] = exports.version;
81235
81288
 
81236
81289
 
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "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"