@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.
- package/client/builder.d.ts +23 -10
- package/client/index-browser.d.ts +1 -1
- package/client/index-browser.js +89 -24
- package/client/index.d.ts +1 -1
- package/client/index.js +78 -25
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BaseSet.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BaseVoteBuilder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperation.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationCREATE_IDENTIFIER.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMANAGE_CERTIFICATE.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMODIFY_PERMISSIONS.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationRECEIVE.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSEND.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_INFO.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_REP.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_SUPPLY.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.Certificate.html +1 -4
- package/docs/classes/KeetaNetSDK.Referenced.ECDSAKeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1KeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PrivateKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PublicKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1Signature.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1KeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PrivateKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PublicKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1Signature.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519KeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519PrivateKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519PublicKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519Signature.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ExternalKeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ExternalSet.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.IdempotentKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.IdentifierKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.IdentifierKeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetError.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetErrorBase.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerError.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerIdempotentKeyError.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerVoteError.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeyInterface.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeyStorage.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.PermissionSetHolder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.PossiblyExpiredVote.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.PossiblyUnsignedBlock.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.SignatureStorage.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.Stats.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.StatsPending.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.UnsignedBlock.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.UserClientBuilder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteBlockBundle.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteBuilder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteHash.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteLikeBase.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteQuoteBuilder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteStapleHash.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.src_lib_utils_buffer.BufferStorage.html +1 -1
- package/docs/classes/KeetaNetSDK.UserClient.html +2 -2
- package/docs/hierarchy.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ExplicitContextTag.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ImplicitContextTag.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ASN1Object.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.AccountACLRow.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseACLRow.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseAccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseExternalKeyPairFunctions.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseGenerationConfig.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierAccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierCreateArguments.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperation.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationCREATE_IDENTIFIER.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATE.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMODIFY_PERMISSIONS.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationRECEIVE.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSEND.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_INFO.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_REP.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_SUPPLY.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockV1Canonical.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockV2Canonical.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.CertificateACLRow.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.Constructor.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.DisposableTimingHandle.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ECDSA_SECP256K1AccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ECDSA_SECP256R1AccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ED25519AccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsNoEncryption.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsSupportsEncryption.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.InitialConfigSupply.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.InstanceSet.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.KVGenericOptionsType.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.KVSetOptionsType.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ModifyTokenBalanceEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.MultiSigIdentifierCreateArguments.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.MultisigAccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.MultisigConfig.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.NumericValueEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerBase.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerListener.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerRepBase.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.PendingOperations.html +2 -2
- package/docs/interfaces/KeetaNetSDK.Referenced.PendingOperationsJSON.html +2 -2
- package/docs/interfaces/KeetaNetSDK.Referenced.PublicKeyStorage.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.RequestTokenReceiveEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.StorageAccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.TokenAccountInfo.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.TokenNumericEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.WithIsInstance.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1BitString.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Date.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1OID.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Set.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1String.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Struct.html +1 -1
- package/lib/utils/certificate.d.ts +0 -1
- package/lib/utils/helper_testing.d.ts +10 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/version.d.ts +1 -1
package/client/builder.d.ts
CHANGED
|
@@ -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?:
|
|
91
|
-
|
|
92
|
-
|
|
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?:
|
|
127
|
-
|
|
128
|
-
|
|
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:
|
|
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";
|
package/client/index-browser.js
CHANGED
|
@@ -117365,7 +117365,22 @@ class src_client_Certificate {
|
|
|
117365
117365
|
* Verify against a given certificate store
|
|
117366
117366
|
*/
|
|
117367
117367
|
|
|
117368
|
-
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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
|
|
133135
|
-
pendingOperations.permissionsChanges[
|
|
133136
|
-
|
|
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
|
|
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[
|
|
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
|
|
133598
|
-
|
|
133599
|
-
|
|
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:
|
|
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
|
-
|
|
133677
|
-
|
|
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[
|
|
133682
|
-
client_builder_classPrivateFieldGet(client_pendingOperations, this).permissionsChanges[
|
|
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
|
-
|
|
133685
|
-
|
|
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[
|
|
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
|
-
|
|
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
|
|
57422
|
-
pendingOperations.permissionsChanges[
|
|
57423
|
-
|
|
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
|
|
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[
|
|
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
|
|
57806
|
-
for (const targetPubKey in
|
|
57807
|
-
for (const change of
|
|
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:
|
|
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
|
-
|
|
57864
|
-
|
|
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[
|
|
57869
|
-
__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[
|
|
57898
|
+
if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey]) {
|
|
57899
|
+
__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey] = { principal, targets: {} };
|
|
57870
57900
|
}
|
|
57871
|
-
|
|
57872
|
-
|
|
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[
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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.
|
|
81286
|
+
exports.version = '0.18.1+gae2caf00c1e19c6d232ff1a37b9fd8e7ea8a1ddc';
|
|
81234
81287
|
exports["default"] = exports.version;
|
|
81235
81288
|
|
|
81236
81289
|
|
package/docs/assets/hierarchy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "
|
|
1
|
+
window.hierarchyData = "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"
|