public Task Validate(ParsedMutation mutation, IReadOnlyList<SignatureEvidence> authentication, IReadOnlyDictionary<AccountKey, AccountStatus> accounts) { if (this.alwaysValid) return Task.FromResult(0); else throw new TransactionInvalidException("Disabled"); }
public async Task Validate_Inheritance() { TestPermissionsProvider firstValidator = new TestPermissionsProvider( new string[0], new Dictionary <string, PermissionSet>() { ["/"] = PermissionSet.AllowAll, ["/a/"] = PermissionSet.AllowAll }); TestPermissionsProvider secondValidator = new TestPermissionsProvider( new string[0], new Dictionary <string, PermissionSet>() { ["/"] = PermissionSet.DenyAll, ["/a/"] = PermissionSet.Unset }); // Level 1: / // Allow + Deny = Deny // Level 2: /a/ // Allow + Unset = Allow // Result: Allow PermissionBasedValidator validator = new PermissionBasedValidator(new[] { firstValidator, secondValidator }); ParsedMutation mutation = new ParsedMutation( new AccountStatus[0], new[] { new KeyValuePair <RecordKey, ByteString>(new RecordKey(RecordType.Data, LedgerPath.Parse("/a/"), "a"), ByteString.Parse("aabb")) }); await validator.Validate(mutation, new SignatureEvidence[0], new Dictionary <AccountKey, AccountStatus>()); }
public async Task <IList <Mutation> > Validate(ParsedMutation mutation, IReadOnlyList <SignatureEvidence> authentication, IReadOnlyDictionary <AccountKey, AccountStatus> accounts) { await ValidateAccountMutations(mutation.AccountMutations, accounts, authentication); await ValidateDataMutations(mutation.DataRecords, authentication); return(new Mutation[0]); }
private ParsedMutation Parse(params Record[] records) { Mutation mutation = new Mutation( binaryData[1], records, binaryData[2]); return(ParsedMutation.Parse(mutation)); }
public void Parse_OptimisticConcurrency() { ParsedMutation result = Parse(new Record( SerializeString("/the/account/:ACC:/the/asset/"), null, binaryData[3])); Assert.Equal(0, result.AccountMutations.Count); Assert.Equal(0, result.DataRecords.Count); }
public Task <IList <Mutation> > Validate(ParsedMutation mutation, IReadOnlyList <SignatureEvidence> authentication, IReadOnlyDictionary <AccountKey, AccountStatus> accounts) { if (exception) { throw new TransactionInvalidException("Test"); } else { return(Task.FromResult <IList <Mutation> >(mutations)); } }
public void Parse_Data() { ParsedMutation result = Parse(new Record( SerializeString("/aka/alias/:DATA:name"), ByteString.Parse("aabbccdd"), binaryData[3])); Assert.Equal(0, result.AccountMutations.Count); Assert.Equal(1, result.DataRecords.Count); Assert.Equal("/aka/alias/", result.DataRecords[0].Key.Path.FullPath); Assert.Equal(RecordType.Data, result.DataRecords[0].Key.RecordType); Assert.Equal("name", result.DataRecords[0].Key.Name); Assert.Equal(ByteString.Parse("aabbccdd"), result.DataRecords[0].Value); }
public void Parse_AccountMutations() { ParsedMutation result = Parse(new Record( SerializeString("/the/account/:ACC:/the/asset/"), SerializeInt(100), binaryData[3])); Assert.Equal(1, result.AccountMutations.Count); Assert.Equal(0, result.DataRecords.Count); Assert.Equal("/the/account/", result.AccountMutations[0].AccountKey.Account.FullPath); Assert.Equal("/the/asset/", result.AccountMutations[0].AccountKey.Asset.FullPath); Assert.Equal(100, result.AccountMutations[0].Balance); Assert.Equal(binaryData[3], result.AccountMutations[0].Version); }
public async Task Validate_DataMutationSuccess() { PermissionBasedValidator validator = CreateValidator( new string[0], new Dictionary <string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = new PermissionSet(Access.Deny, Access.Deny, Access.Deny, Access.Deny, Access.Permit) }); Dictionary <AccountKey, AccountStatus> accounts = new Dictionary <AccountKey, AccountStatus>(); ParsedMutation mutation = new ParsedMutation( new AccountStatus[0], new[] { new KeyValuePair <RecordKey, ByteString>(new RecordKey(RecordType.Data, LedgerPath.Parse("/a/"), "a"), ByteString.Parse("aabb")) }); await validator.Validate(mutation, new SignatureEvidence[0], accounts); }
public async Task Validate_DataMutationError() { PermissionBasedValidator validator = CreateValidator( new string[0], new Dictionary <string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = new PermissionSet(Access.Permit, Access.Permit, Access.Permit, Access.Deny) }); ParsedMutation mutation = new ParsedMutation( new AccountStatus[0], new[] { new KeyValuePair <RecordKey, ByteString>(new RecordKey(RecordType.Data, LedgerPath.Parse("/a/"), "a"), ByteString.Parse("aabb")) }); TransactionInvalidException exception = await Assert.ThrowsAsync <TransactionInvalidException>(() => validator.Validate(mutation, new SignatureEvidence[0], new Dictionary <AccountKey, AccountStatus>())); Assert.Equal("CannotModifyData", exception.Reason); }
private static async Task TestAccountChange(PermissionSet accountPermissions, long previousBalance, long newBalance) { PermissionBasedValidator validator = CreateValidator( new string[0], new Dictionary <string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = accountPermissions }); Dictionary <AccountKey, AccountStatus> accounts = new Dictionary <AccountKey, AccountStatus>() { [AccountKey.Parse("/a/", "/b/")] = new AccountStatus(AccountKey.Parse("/a/", "/b/"), previousBalance, ByteString.Empty) }; ParsedMutation mutation = new ParsedMutation( new[] { new AccountStatus(AccountKey.Parse("/a/", "/b/"), newBalance, ByteString.Empty) }, new KeyValuePair <RecordKey, ByteString> [0]); await validator.Validate(mutation, new SignatureEvidence[0], accounts); }
public async Task Validate_ComputeAddress() { PermissionBasedValidator validator = CreateValidator( new string[] { "0123456789abcdef11223344" }, new Dictionary<string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = PermissionSet.AllowAll }); Dictionary<AccountKey, AccountStatus> accounts = new Dictionary<AccountKey, AccountStatus>() { [AccountKey.Parse("/a/", "/b/")] = new AccountStatus(AccountKey.Parse("/a/", "/b/"), 150, ByteString.Empty) }; ParsedMutation mutation = new ParsedMutation( new[] { new AccountStatus(AccountKey.Parse("/a/", "/b/"), 100, ByteString.Empty) }, new KeyValuePair<RecordKey, ByteString>[] { }); await validator.Validate( mutation, new[] { new SignatureEvidence(ByteString.Parse("0123456789abcdef"), ByteString.Parse("11223344")) }, accounts); }
public async Task Validate_ComputeAddress() { PermissionBasedValidator validator = CreateValidator( new string[] { "0123456789abcdef11223344" }, new Dictionary <string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = PermissionSet.AllowAll }); Dictionary <AccountKey, AccountStatus> accounts = new Dictionary <AccountKey, AccountStatus>() { [AccountKey.Parse("/a/", "/b/")] = new AccountStatus(AccountKey.Parse("/a/", "/b/"), 150, ByteString.Empty) }; ParsedMutation mutation = new ParsedMutation( new[] { new AccountStatus(AccountKey.Parse("/a/", "/b/"), 100, ByteString.Empty) }, new KeyValuePair <RecordKey, ByteString>[] { }); await validator.Validate( mutation, new[] { new SignatureEvidence(ByteString.Parse("0123456789abcdef"), ByteString.Parse("11223344")) }, accounts); }
public async Task Validate(ParsedMutation mutation, IReadOnlyList<SignatureEvidence> authentication, IReadOnlyDictionary<AccountKey, AccountStatus> accounts) { await ValidateAccountMutations(mutation.AccountMutations, accounts, authentication); await ValidateDataMutations(mutation.DataRecords, authentication); }
public async Task Validate_DataMutationSuccess() { PermissionBasedValidator validator = CreateValidator( new string[0], new Dictionary<string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = new PermissionSet(Access.Deny, Access.Deny, Access.Deny, Access.Permit) }); Dictionary<AccountKey, AccountStatus> accounts = new Dictionary<AccountKey, AccountStatus>(); ParsedMutation mutation = new ParsedMutation( new AccountStatus[0], new[] { new KeyValuePair<RecordKey, ByteString>(new RecordKey(RecordType.Data, LedgerPath.Parse("/a/"), "a"), ByteString.Parse("aabb")) }); await validator.Validate(mutation, new SignatureEvidence[0], accounts); }
private static async Task TestAccountChange(PermissionSet accountPermissions, long previousBalance, long newBalance) { PermissionBasedValidator validator = CreateValidator( new string[0], new Dictionary<string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = accountPermissions }); Dictionary<AccountKey, AccountStatus> accounts = new Dictionary<AccountKey, AccountStatus>() { [AccountKey.Parse("/a/", "/b/")] = new AccountStatus(AccountKey.Parse("/a/", "/b/"), previousBalance, ByteString.Empty) }; ParsedMutation mutation = new ParsedMutation( new[] { new AccountStatus(AccountKey.Parse("/a/", "/b/"), newBalance, ByteString.Empty) }, new KeyValuePair<RecordKey, ByteString>[0]); await validator.Validate(mutation, new SignatureEvidence[0], accounts); }
public async Task Validate_Inheritance() { TestPermissionsProvider firstValidator = new TestPermissionsProvider( new string[0], new Dictionary<string, PermissionSet>() { ["/"] = PermissionSet.AllowAll, ["/a/"] = PermissionSet.AllowAll }); TestPermissionsProvider secondValidator = new TestPermissionsProvider( new string[0], new Dictionary<string, PermissionSet>() { ["/"] = PermissionSet.DenyAll, ["/a/"] = PermissionSet.Unset }); // Level 1: / // Allow + Deny = Deny // Level 2: /a/ // Allow + Unset = Allow // Result: Allow PermissionBasedValidator validator = new PermissionBasedValidator(new[] { firstValidator, secondValidator }); ParsedMutation mutation = new ParsedMutation( new AccountStatus[0], new[] { new KeyValuePair<RecordKey, ByteString>(new RecordKey(RecordType.Data, LedgerPath.Parse("/a/"), "a"), ByteString.Parse("aabb")) }); await validator.Validate(mutation, new SignatureEvidence[0], new Dictionary<AccountKey, AccountStatus>()); }
public async Task Validate_DataMutationError() { PermissionBasedValidator validator = CreateValidator( new string[0], new Dictionary<string, PermissionSet>() { ["/"] = PermissionSet.Unset, ["/a/"] = new PermissionSet(Access.Permit, Access.Permit, Access.Permit, Access.Deny) }); ParsedMutation mutation = new ParsedMutation( new AccountStatus[0], new[] { new KeyValuePair<RecordKey, ByteString>(new RecordKey(RecordType.Data, LedgerPath.Parse("/a/"), "a"), ByteString.Parse("aabb")) }); await Assert.ThrowsAsync<TransactionInvalidException>(() => validator.Validate(mutation, new SignatureEvidence[0], new Dictionary<AccountKey, AccountStatus>())); }
public Task Validate(ParsedMutation mutation, IReadOnlyList<SignatureEvidence> authentication, IReadOnlyDictionary<AccountKey, AccountStatus> accounts) { if (exception) throw new TransactionInvalidException("Test"); else return Task.FromResult(true); }