Exemple #1
0
 public Task Validate(ParsedMutation mutation, IReadOnlyList<SignatureEvidence> authentication, IReadOnlyDictionary<AccountKey, AccountStatus> accounts)
 {
     if (this.alwaysValid)
         return Task.FromResult(0);
     else
         throw new TransactionInvalidException("Disabled");
 }
Exemple #2
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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);
        }
Exemple #13
0
        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);
 }