public async Task TestIndexHasBeenWrittenFromAnotherSourceShouldSkipIndex()
        {
            var seed = Seed.Random();

            // Publish a message as if it was published from another app
            var tempProvider = new InMemoryDeterministicSeedManager(
                new InMemoryResourceTracker(),
                new IssSigningHelper(new Curl(), new Curl(), new Curl()),
                new AddressGenerator(),
                IotaResourceProvider.Repository);

            var credentials = await tempProvider.CreateChannelCredentialsAsync(seed);

            var channel = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, IotaResourceProvider.Repository).Create(
                Mode.Restricted,
                credentials.Seed,
                IotaFhirRepository.SecurityLevel,
                credentials.ChannelKey);

            var message = channel.CreateMessage(TryteString.FromAsciiString("Test"));
            await channel.PublishAsync(message, 14, 1);

            // Create credentials that should skip the first index
            var provider = new InMemoryDeterministicSeedManager(
                new InMemoryResourceTracker(),
                new IssSigningHelper(new Curl(), new Curl(), new Curl()),
                new AddressGenerator(),
                IotaResourceProvider.Repository);

            await provider.CreateChannelCredentialsAsync(seed);

            Assert.AreEqual(1, provider.CurrentIndex);
        }
        public async Task TestResourceUpdateAddsAndUpdatesInformation()
        {
            var iotaRepository      = IotaResourceProvider.Repository;
            var channelFactory      = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default);

            var tracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, new RijndaelEncryption(Seed.Random().Value, Seed.Random().Value));

            // fhir id will only be 64 chars long
            var resourceId = Seed.Random().Value.Substring(0, 64);
            await tracker.AddEntryAsync(
                new ResourceEntry
            {
                Channel       = channelFactory.Create(Mode.Restricted, Seed.Random(), SecurityLevel.Medium, Seed.Random().Value, true),
                Subscription  = subscriptionFactory.Create(new Hash(Seed.Random().Value), Mode.Restricted, Seed.Random().Value, true),
                ResourceRoots = new List <string> {
                    resourceId
                }
            });

            var resource = await tracker.GetEntryAsync(resourceId);

            resource.ResourceRoots.Add(Seed.Random().Value.Substring(0, 64));

            await tracker.UpdateEntryAsync(resource);

            Assert.AreEqual(2, (await tracker.GetEntryAsync(resourceId)).ResourceRoots.Count);
        }
Пример #3
0
        public void TestRestrictedMessageCreation32Bit()
        {
            var expectedPayload = new Bundle();

            expectedPayload.AddTransfer(new Transfer
            {
                Address   = new Address(),
                Message   = new TryteString("AQRAQLYEXHTXQUVYAXBDJZFWM9QPHXNQRVVGEODVNZAQMPXIHVYDFLHKDBFLSEUDGHVGNYFLEBQTJORJ9BDWXYUBYQDBKYHXGCIRVRJLLRQCBFSYYFTRVRPYJTHIIOOFDISBILGHQCWXSNLRXRKPTBSBO9ENPHHCSTPGFEVK9GVOWCBTJKVRANFBPHEOQNTJJQNYWQSYYRXZMFHADWUQJVBOLP9BUV9PXUIAKDUGRICOLQXXSXNGNMUMBWJRJDBSUJWSPGLXMHBLUUSSWSQUTSWKRRPWURYJYHRHSRCLBEBMHKVFJMLYDDEIHHBCAZYLLNGMFTUSUZA9VAWSSFSKLDIFYDDZJXJZ9VRIADVEAPMRBBUAOJCWCWMBUEVGBFMXPHQEE9JNPLLSDBDJSLXZXISGDOAMGQSVMOMKOWTWJPYCDKXRRBBKLPJRJMN9LJZQZADQQYXNBNFQDBITXBXPSMWDNNJAODPSEJRQZCKTLSOLUIMOWXZHYXJOXAGRJC9NNGWLYY9VQYW9IYFCQWDZQJDNWHVIXEIYSHTSOGRHMPQZ9YUTWDCRUEZGJTKVDRFNZVRBVAJBBNHILDFSBPNJKBUVXW9CDOEGVFPAWUZROYEBYT9NHI9DNGLHWPSKMJELJSMVTRNGEJNAMNEWUQ9GSRANMRIEB9GWXJD9GX9EHTRNYEYZJFKALYJVPUITHKGMM9QJDOKHWXQ9YN9ZBBCRNESWWBPWZIQVGWDQSRVROIRTPK9STFWRDDUFDKSLQQOXRWSSQCOHIJUJLPOBUVNWLOGGXDMEFOQHXSGQOZVQGYLUABLBJHXZRRIB9ZTLAXHHSRHAODYTSDTJUGRWVDJAJNRNDL9YVEPKLVAQFPAONMKOHHCLAZWFTAZTMEQKGNMNBYHBGNNOV99HCMQDRZEGGPAWA9FFO9SESTP9TSFXLCYPJJ9JKROY99VVHENCHSSSXKDAFRGOKAKIWCOHXYNFPKKWCBSGENRBX9FQFBITIO9999USHGAMQMBYPYPQANDGZXIPYVFZCTRGALNR9XGZBYAKQYIJDSBTWHIJQMOVOVBVCRUXZD9IGMODZPXLGTKYOWRVQC9YYVVBVMDRSUUPJDJUMLNCPGZJLTGQPQOXKGKUWASQQ9AER9JLWMQA9GLPATMVRDFIWLC9GBIKRXGJSZLPZVKGTWIIDCGXIDKMLQTCWTPICN9UZZXEOFFCQSJPOXFSCEHJNGIGOYIFZFMPWHJOFZGIYRFWOZCSSHKPWHDEELMN9ZWULHRMRHVNGTNUEZEMRINSVYEGBOJMNYFWNLFSIHHRIFXZRLEGFIEOT9WYZQXFTKXRAYRRKDV9VYUBSZAKARAIZYDWBEDLLOCAXQZIXSIRFGCGZWVRRCME9TXPTDUYLYUGLIBENQ99SDQLYFBJZHGQYQBLJMLFZLQLPHYMCFMTOSDA99DXAMCEAMBGNFFDJIKTUCBHSYKH9KLRVBYXOJJYKZYXJLIKIZFQHNFWWNCQACXZIXDLJXNU9UNZQJMFLJJXGSEPXIFRDKSUENGGELMFPVQKHAYPHMIPHVKZTNFTWMERRTVFHJLKILHRX9XSVYJZQKQXIMIMPDGCNXZKXUBNZOVXMCZXGXZTVBTIQUZ9GDQJGIHFKFXYZHDNGPIUXLIKSDBQQNMJCVRJUKQVJWGOFOBTXDSFLM9BGYZJREIBUBEVCOME9NNKHFEKWGJRTMZFDHFZY9YHTFJNCNZBGMVEEKUYPZBYQQFVVZEFSQDXOWTNUSU9GUTS9ITJAYYELPZYITWELVOAKMPTUIL9UJD9TN9HVLIYWAHMQBIHLUSBRSAGXQRAOOKGIBYMM9AOLC9DQVMNFMPGDSQUTWMRKVKE9FRZNCQJDVDKBINILRFKBEEDZTWI9UUCNLIMT9MLQRMBRJQLKHJXEKWJDEK9WAKXUJVWMUNLBUSVYSUZDOIEJAKZZOWPQFNKDLPDICGTQKOSBPWKHGPBUWYXWYVPIOIELDLIBPI9FJRSHVEKRNMQ9VPOCCCASWKL99TZCFNHLHVMOOFNBGSRXYKCKJOLNEBYAFCRMDHOVWUZ9MIFDSRRFSHSIWIN9WLLXMOKCXYTTESFZUNMQAHYVOVQQH9YZVOQATUPEPGCCGTPBAAOSPJ9ALPYXONR9OCODZDJPNPMQIREEXICFQIWRZ99OPS9ALP9GLPTTWGRJHATSJJTEKFZDJYEUKBIAACLOALTSXWCCL9GBUTWIXVEW9HYLVKRRRAATNYMGSAKLUN9HJQPIMXJOYIDXNONMHXZUGXOFIQIFBTPYDXXMKOAUUNOJU9IIXFLSSWKOCRJKXNWKKAMJRMFYSMAOWSCI9NTRQKT99CIDHJMZWSDKAIKOYWHSCJZRQWWDZOC9TKXHXCDN9GTMMGXXHXIJFMTCQFTDAKPEPQLNVCIE9UMIYXHDQUGPJSHPMRFCHMPGOYHVATXBIGOCZAFDNTVMJRJIVQDLNQYNSASMLXPSFUMYBGHXTCFYDLOGOCDTWPZMVPKMP9EEXEKNMSTEQKFZIVU9DKHSEQA9XQNOKUK9ABSTZ9XRPDMDECMYRRGSYHEZDAWEDGTQSMRC9DQ9FUWS9QELTDYZCRFYABZKVLCFGVKYGYIWJGNQKI9ONMXWFJNFIEPZRSSLNUUQOXK9YXQYMWR9B9UAUXYYONKYUG9JAJOUMLKQOXBD9JBLAQHXBJINNLBXKYGYLPRLASOFISEFXG9KENN9YFFP9J9NVVYKAEFAUTIQRDTVKVHQYEWJOGQEUPSWEIMYWYYEZRGJUEDAHDYPQEGX9KTUODLORTCJZGJCKFGEJTWRGEACRRINEQBUWS9NUPP9BMONGQQABVGBLRQXZJYXDHS9DFWAWLOZVKSDZD9UGBPKDCHLYEAUOABXKMNWTSUZTHTZBYOALUHQHSEK9WPGWGVNQEGVDDFZJXLAYINRUQYQBROPB9RGAFWMPOBOANCGW9DJJ9NUIHLQE9RNZOHLPYAIACONJXYFRBAOVJEWOTO9HZCZOVJGHQOGGJAB9QUWDRI9KLX9EGOHGTJIYQHTTMAAETKGBLDQXGRTJOEHRIAPXACPFTVGIXUJFZXUCX9EHUESMGQN9EHXEQTSKJHWDIR9OJYP9USDPWECONYRTFZREIZHOBAOXK9FCEOWCLUNKEWKE9JPQGDZ9PWAVQUMNBLVMESODMGJAIVNVJSFTQFL9RTTCJAFIMIGXASIREOXLNVEHMHPQZIKIPRQWFGYLQHVPMBNIWTWINSKW9WIWVDKHAIHNMBOCETYLNTJMA9XMEVQBPUFPKXJHXHPQCFKF9UYQQFKBBPPZMNAKPMMHPLBPDAOACLZ9HKVFGGMQHHHQLWYWYYGNXPEITKTVNURENFBAOBXITZDYCUSASIYEVJBYDLBIMUF9HILXKYH9IDYOFEQMBHJJBFDTNPDXSNSXCPUFGRIOXNYOSKHBILRWEFWZELL9GLNQOMPLMAPTOIJXSQXNPIW9XLMYEYVTNM9BVLVAIPZSYTCHHXGBQXHCBOQAUHZXKDWUREOOGKK9S9ZTKHGIQWHZOOFCGXBBCSYPGOGNRJLGVNWAGJZWKKLTHCJG9FJVRXMHQARRAHGUTITDDIMTIZAYARKJMQFCEAAOTHSHXDQKSNGMN99YGWRNLNMJXXFIQD9THOIHINYIEJMWRCZTAHJC9QIAKDIHIELNIMDKHFFWVCAHGMITJYNZ9XZSLFCGFFEQLONULNTQAJLOJTWO9BJQEBGTY9OCJBXKXNDEJWCDRYCNFDKYODHPAHQBGDXHMLVETVNRLRIJDHKAHZBAOFGMQFSTHPHBXKRAJFVIUDCKGNCDD9XTFDVNW9RLRNN9QRRUGOTMRRSVISCWE9ALTXCOCYHIQGXLGDB9RGICVSTUHJFWMWQCUICLJZCACGYCUHMGTGEJGAACGEXKJNJWKUGXRNBTEKIYUNXZZHXASCBPRDJAVXWESHU9DW9UVPJLWBKUXPDAIQ9JQPAHPMGVRUY9RLAMRTOKDVVUAZAPMNBSHRNNYDGC9BKAKKBPGHFDOHXCFWNSH9FZUMQHXMIUYKQLKHAYXPNEDYDUXTZXUKTBRJGBSZFMCNRZIQQLOLPRZPZBCX9EZBRUFGHGHBLYBLYYWZACGWGYRGV9IGZLTXOIMSCOTBNIGUXMOPVOFKIEUZASTZAHKXLYECJFLVZCORRFYDNVCYSKFCREQXXMDEHPSQFDERBICWFMOJS9PPSQYTVEXYSYGHWIWITZHRBZLHJWUYWQCAPLSBYJTJGCUXQPITAUJX9WEUVJDNUNKSDLHWDWKDQARSRKSLGLUCDNCERMKOJXCRXWCCYIAQZVGJLYTYQNGUDYYMXXL9XDBLEWPRMAY9DMMUHYUPMNBRRXJDIFDWEFJBRPYMPDPIPGXGXBMZ9JHAOISUMCNGUNCCPWKFJNBR9ZATRMDTOFDKMBQEZSCDSBNNEIUUCDHPHFBOBXLNGPOVZCATQRKVYSQHSHIVFZTW9BHPTPXUJGNNUBHWLZF9TBA9JONTWZRWHGHFIQGHAKSWBAHB99"),
                Tag       = new Tag("ASDF"),
                Timestamp = Timestamp.UnixSecondsTimestamp
            });

            expectedPayload.Finalize();
            expectedPayload.Sign();

            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");

            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository());
            var channelKey     = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC");
            var channel        = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey);

            var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN"));

            Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value);
            Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value);
            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value);

            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value);

            for (var i = 0; i < expectedPayload.Transactions.Count; i++)
            {
                Assert.AreEqual(expectedPayload.Transactions[i].Fragment.Value, message.Payload.Transactions[i].Fragment.Value);
            }
        }
        static DependencyResolver()
        {
            var iotaRepository = new CachedIotaRestRepository(
                new FallbackIotaClient(new List <string> {
                "https://nodes.devnet.thetangle.org:443"
            }, 5000),
                new PoWSrvService());

            var channelFactory      = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default);

            var encryption      = new RijndaelEncryption("somenicekey", "somenicesalt");
            var resourceTracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, encryption);

            var fhirRepository = new IotaFhirRepository(
                iotaRepository,
                new FhirJsonTryteSerializer(),
                resourceTracker,
                new SqlLiteDeterministicSeedManager(
                    resourceTracker,
                    new IssSigningHelper(new Curl(), new Curl(), new Curl()),
                    new AddressGenerator(),
                    iotaRepository,
                    encryption));

            var fhirParser       = new FhirJsonParser();
            var searchRepository = new SqlLiteSearchRepository(fhirParser);

            CreateResourceInteractor   = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository);
            ReadResourceInteractor     = new ReadResourceInteractor(fhirRepository, searchRepository);
            ValidateResourceInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser);
            SearchResourcesInteractor  = new SearchResourcesInteractor(fhirRepository, searchRepository);
            ResourceTracker            = resourceTracker;
        }
Пример #5
0
        public void TestPublicChannelCreation()
        {
            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");

            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository());
            var channel        = channelFactory.Create(Mode.Public, seed);

            Assert.AreEqual(seed.Value, channel.Seed.Value);
            Assert.AreEqual(Mode.Public, channel.Mode);
            Assert.AreEqual(SecurityLevel.Medium, channel.SecurityLevel);
        }
Пример #6
0
        public ClaimsService(ILogger <ClaimsService> logger)
        {
            m_logger = logger;
            // Connect to a node on one of the main networks.
            var iotaRepositoryUrl = Environment.GetEnvironmentVariable("IOTA_REPOSITORY");

            m_logger.LogInformation($"Using IOTA_REPOSITORY={iotaRepositoryUrl}");
            m_restIotaRepository            = new RestIotaRepository(new RestClient(iotaRepositoryUrl));
            m_mamChannelFactory             = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, m_restIotaRepository);
            m_mamChannelSubscriptionFactory = new MamChannelSubscriptionFactory(m_restIotaRepository, CurlMamParser.Default, CurlMask.Default);
        }
        public ResourceEntry ToResourceEntry(IEncryption encryption, MamChannelFactory channelFactory, MamChannelSubscriptionFactory subscriptionFactory)
        {
            var decryptedChannel      = encryption.Decrypt(this.Channel);
            var decryptedSubscription = encryption.Decrypt(this.Subscription);

            return(new ResourceEntry
            {
                ResourceRoots = this.Roots.Split(';').ToList(),
                Channel = string.IsNullOrEmpty(decryptedChannel) ? null : channelFactory.CreateFromJson(decryptedChannel),
                Subscription = subscriptionFactory.CreateFromJson(decryptedSubscription)
            });
        }
Пример #8
0
        public ResourceTracker(
            MamChannelFactory channelFactory,
            MamChannelSubscriptionFactory subscriptionFactory,
            IEncryption encryption,
            string databaseFilename = "iotafhir.sqlite")
        {
            this.ChannelFactory      = channelFactory;
            this.SubscriptionFactory = subscriptionFactory;
            this.Encryption          = encryption;
            this.ConnectionString    = databaseFilename;

            this.Init(databaseFilename);
        }
        /// <inheritdoc />
        protected override void Load(ContainerBuilder builder)
        {
            var connectionSupplier = new DefaultDbConnectionSupplier();
            var iotaRepository     = new CachedIotaRestRepository(
                new FallbackIotaClient(new List <string> {
                "https://nodes.devnet.thetangle.org:443"
            }, 5000),
                new PoWSrvService(),
                null,
                connectionSupplier,
                $"{DependencyResolver.LocalStoragePath}\\iotacache.sqlite");

            var channelFactory      = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default);

            var encryption      = new RijndaelEncryption("somenicekey", "somenicesalt");
            var resourceTracker = new SqlLiteResourceTracker(
                channelFactory,
                subscriptionFactory,
                encryption,
                connectionSupplier,
                $"{DependencyResolver.LocalStoragePath}\\iotafhir.sqlite");

            var seedManager = new SqlLiteDeterministicSeedManager(
                resourceTracker,
                new IssSigningHelper(new Curl(), new Curl(), new Curl()),
                new AddressGenerator(),
                iotaRepository,
                encryption,
                connectionSupplier,
                $"{DependencyResolver.LocalStoragePath}\\iotafhir.sqlite");

            var fhirRepository   = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager);
            var fhirParser       = new FhirJsonParser();
            var searchRepository = new SqlLiteSearchRepository(fhirParser, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\resources.sqlite");

            var createInteractor     = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository);
            var readInteractor       = new ReadResourceInteractor(fhirRepository, searchRepository);
            var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser);
            var searchInteractor     = new SearchResourcesInteractor(fhirRepository, searchRepository);

            var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager);

            builder.RegisterInstance(createInteractor);
            builder.RegisterInstance(readInteractor);
            builder.RegisterInstance(validationInteractor);
            builder.RegisterInstance(searchInteractor);
            builder.RegisterInstance(resourceImporter);
            builder.RegisterInstance(seedManager).As <ISeedManager>();
            builder.RegisterInstance(subscriptionFactory);
        }
Пример #10
0
        private void InjectDependencies(IServiceCollection services)
        {
            var iotaRepository = new CachedIotaRestRepository(
                new FallbackIotaClient(new List <string> {
                "https://nodes.devnet.thetangle.org:443"
            }, 5000),
                new PoWService(new CpuPearlDiver()));

            var channelFactory      = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default);

            var encryption      = new RijndaelEncryption("somenicekey", "somenicesalt");
            var resourceTracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, encryption);

            var seedManager = new SqlLiteDeterministicSeedManager(
                resourceTracker,
                new IssSigningHelper(new Curl(), new Curl(), new Curl()),
                new AddressGenerator(),
                iotaRepository,
                encryption);

            var fhirRepository   = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager);
            var fhirParser       = new FhirJsonParser();
            var searchRepository = new SqlLiteSearchRepository(fhirParser);

            var createInteractor       = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository);
            var readInteractor         = new ReadResourceInteractor(fhirRepository, searchRepository);
            var readVersionInteractor  = new ReadResourceVersionInteractor(fhirRepository);
            var readHistoryInteractor  = new ReadResourceHistoryInteractor(fhirRepository);
            var capabilitiesInteractor = new GetCapabilitiesInteractor(fhirRepository, new AppConfigSystemInformation(this.Configuration));
            var validationInteractor   = new ValidateResourceInteractor(fhirRepository, fhirParser);
            var searchInteractor       = new SearchResourcesInteractor(fhirRepository, searchRepository);
            var deleteInteractor       = new DeleteResourceInteractor(fhirRepository, searchRepository);

            var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager);

            services.AddScoped(provider => createInteractor);
            services.AddScoped(provider => readInteractor);
            services.AddScoped(provider => capabilitiesInteractor);
            services.AddScoped(provider => validationInteractor);
            services.AddScoped(provider => searchInteractor);
            services.AddScoped(provider => resourceImporter);
            services.AddScoped(provider => readVersionInteractor);
            services.AddScoped(provider => readHistoryInteractor);
            services.AddScoped(provider => deleteInteractor);

            services.AddScoped <ISeedManager>(provider => seedManager);
            services.AddSingleton <IMemoryCache>(new Microsoft.Extensions.Caching.Memory.MemoryCache(new MemoryCacheOptions()));
        }
        public SqlLiteResourceTracker(
            MamChannelFactory channelFactory,
            MamChannelSubscriptionFactory subscriptionFactory,
            IEncryption encryption,
            IDbConnectionSupplier connectionSupplier = null,
            string databaseFilename = "iotafhir.sqlite")
        {
            this.ChannelFactory      = channelFactory;
            this.SubscriptionFactory = subscriptionFactory;
            this.Encryption          = encryption;
            this.ConnectionSupplier  = connectionSupplier ?? new DefaultDbConnectionSupplier();
            this.ConnectionString    = $"Data Source={databaseFilename};Version=3;";

            DatabaseInitializer.InitFhirDatabase(this.ConnectionSupplier, databaseFilename);
        }
Пример #12
0
        public void TestRestrictedMessageCreation32Bit()
        {
            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");

            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository());
            var channelKey     = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC");
            var channel        = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey.Value);

            var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN"));

            Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value);
            Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value);
            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value);

            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value);
        }
Пример #13
0
        public void TestPublicMessageCreation()
        {
            var seed     = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");
            var curlMask = new CurlMask();

            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository());
            var channel        = channelFactory.Create(Mode.Private, seed);

            var message         = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN"));
            var expectedAddress = curlMask.Hash(message.Root);

            Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value);
            Assert.AreEqual(expectedAddress.Value, message.Address.Value);
            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value);

            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value);
        }
Пример #14
0
        public async Task TestRestrictedMamCreationAndDecryption()
        {
            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");
            var mask = new CurlMask();

            var iotaRepository = new InMemoryIotaRepository();
            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var channelKey     = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC");
            var channel        = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey);

            var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!"));
            await channel.PublishAsync(message);

            var messageTwo = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the second!"));
            await channel.PublishAsync(messageTwo);

            var messageThree = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the third!"));
            await channel.PublishAsync(messageThree);

            var subcriptionFactory = new MamChannelSubscriptionFactory(
                iotaRepository,
                CurlMamParser.Default,
                mask);

            var subscription = subcriptionFactory.Create(message.Root, Mode.Restricted, channelKey);

            var unmaskedMessages = await subscription.FetchAsync();

            Assert.AreEqual("Hello everyone!", unmaskedMessages[0].Message.ToUtf8String());
            Assert.AreEqual(message.NextRoot.Value, unmaskedMessages[0].NextRoot.Value);
            Assert.AreEqual(message.Root.Value, unmaskedMessages[0].Root.Value);
            Assert.AreEqual("Hello everyone the second!", unmaskedMessages[1].Message.ToUtf8String());
            Assert.AreEqual("Hello everyone the third!", unmaskedMessages[2].Message.ToUtf8String());

            var messageFour = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the fourth!"));
            await channel.PublishAsync(messageFour);

            unmaskedMessages = await subscription.FetchNext();

            Assert.AreEqual(1, unmaskedMessages.Count);
            Assert.AreEqual("Hello everyone the fourth!", unmaskedMessages[0].Message.ToUtf8String());

            var unmaskedSingleMessage = await subscription.FetchSingle(messageTwo.Root);

            Assert.AreEqual("Hello everyone the second!", unmaskedSingleMessage.Message.ToUtf8String());
        }
Пример #15
0
        public void TestRestrictedChannelCreation()
        {
            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");

            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository());
            var channelKey     = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC");
            var channel        = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey);

            Assert.AreEqual(seed.Value, channel.Seed.Value);
            Assert.AreEqual(Mode.Restricted, channel.Mode);
            Assert.AreEqual(SecurityLevel.Medium, channel.SecurityLevel);
            Assert.AreEqual(channelKey.Value, channel.Key.Value);
            Assert.AreEqual(Hash.Empty.Value, channel.NextRoot.Value);
            Assert.AreEqual(0, channel.Index);
            Assert.AreEqual(0, channel.Start);
            Assert.AreEqual(1, channel.Count);
            Assert.AreEqual(1, channel.NextCount);
        }
Пример #16
0
        public void TestRestrictedMessageCreation64Bit()
        {
            var expectedPayload = new Bundle();

            expectedPayload.AddTransfer(new Transfer
            {
                Address   = new Address(),
                Message   = new TryteString("AQRAQLYEXHTXQUVYAXBDJZFWM9QPHXNQRVVGEODVNZAQMPXIHVYDFLHKDBFLSEUDGHVGNYFLEBQTJORJ9BDWXYUBYQDBKYHXGCIRVRJLLRQCBFSYYFTRVRPYJTHIIOOFDISBILGHQCEWSNLRXRKPTBSBO9ENPHHCSTPGFEMQEWXEZ9BZIX9ICPGKLXKRGBFGUVVAUEJLXIXMDUOTZREGMSDVULQDHGQSLIHOAXHHXOZZDJUKDA9PBIXS9VAQVWVBYYMOGTCRXWSGIPAWRVVMDFLC9ZWARUVVGAHOTV9CBKAWZOLABYTYWRHPGYRIEOVCASDPBNXPVEQ9EASXF9IACICBBDBGGBQ9TXMMRGU9FFFWJEREBQTVXRRYTXG9HTKVNQPCJGEWIPKKPUETECNQFVDJOXNAHVGQKRWJLTQMHGZRWMCIIXVEPQGKYUINQB9ZVBORKPIVV9NXLFZVSBPDDYRCISBASVZJBBNXYARAOANTKCQNEZBAATBWSVBVVISHCYBBLJLYQUCRZVKASMHWTEFRKSQNUZ9YOFNWMZUJ9ZWGZYLVDBIOIUQKHLPEQHIF9FISNHLR9TDCBPQNUHM9RTGMVARZKKHISYKXTV9BSHDJNGUJY9OLMSKBFWPCOXJHAFAMRBIN9UXRKRLNODKIDLXRWFMQF9OWRYADJLEUQTAYYOLHQFFOWIYNMAG9NI9MKDMTDCKUGKJDPLWDWDRWWGCHYTKMTBPWYVBYYJXEHHLDZXOCGWSAFCAJDDIG9CLVRYGBQTBWXDFUJIXHODHT9INSECIDTNFXFLIZTFCYKAMMJGQPHNHYNBESVPSHXNYAVICPWEWGMT9RC9DXXALHMBPVKRPOXHOZVPKXPOKTPZLBWSUNXOHIKTICJDZVGLREREL9TDGAOMHRBZTZXKTIUFRPVY9SGQZZKPAHPZJEQJ9VF9EVOJHIXEPANATJVJVONHQK9XF9PDZSILBRXIYWVBGBMROQGI9AOCW9RVFXCOQCKJBMUWPOYAXDRC9G9XWRVJTMO9ZHDJTYKRQUJGMOTSUTVXOPYZK9KOZZNWNCNSWOSF9DLHPLSALNLZIU9KLXABKIQXNHHEOLRJN9HVTEXWPH9C9OTOCETMHJVQKHBFQEFJRBSYIZEUTRXHQJJYMCCURTSWAMDEASTTFVRYCDYDDUVKVHUVZPYSNEOXVXUEGENTIDFITOYTZEHLAARKPZBDXMUAWGOLRERABFSNFUHWIHQSBNKCFPCVRRIFOCYYSRVGEXYT9DKLWDMICVPQLZGFELCGKQLLBNRIXGUQBSLAKKWJUQKZNTPPQPHNSDHEYMWPIOSWTYWPSCAAQAYYIQ9LXXEBN9FSYFJTLHGZTDOSXFXAQLUNVS9IAJZOMXFRLWRLACPHXCUGARGBACABDUUXFHPURNAKQDDYUCQMQLGOEYDUEULPFVP9WBWFZYSXQOSHZQTEGBMTXBNFDOSMSNUQ9MHCPMINTTBWZKHUTSTDAXMJJNJZABAHLZVVLNIOAZQLUA9NQGGFBKO9GECCVFFLCUCOBIRMBXWWRWMPOVHNDFN9LG9BQJMWLVYFPCMO9HQTU9ZVXGKVVHQHDWYLAIRVUBCSFBGOGLP9DMNYKHLBSF9ZRICQSN9EBDCPUVYWSKZBNJYZECKC9GCRTZAL9NPWOFJUADDBGSKJIIDTLDJLQSGQDGA9QZGLABGXYVHLYVFATWOQHAVS9UWAMEU9VZTNFMDUZPMYRYPECPY9NTSS9QMSAJCLWCXOQZCHQFJOMW9FHUWKEPTZV9KCTWZTBGOWFFHOBSEIIQZ9FXEFPPVQRZLASCEAVVJWCZNUQMJEZCFO9UVOLPAPNJPOEEXYBAGGGUXOB9QUTCVAGDSYIKLDOAFNXSLHJST9QLOITR9RDWIBYNZVH9P9GGH9EJGUUAITTNCJCAPRLSFLUVEHVGNEF9QILNTUMYAFCZMMNLDTHKPJZAYUXNLIRSRIPELTXVBDNKTAEIETHHAMWLDORDRGQTRTBXKRYESYOWCID9NPUKCHXYORUIDMPUDVUWZVLYSIIAPTTTHYRWLGJIYHMKAU9PXGMXT9PFEWXXNXEXYRGUPVQ9ZVREQHHQMFJWJSFLVORIVDAVDRENFMZHYHDJSYCOLWB9RTAFXVKBWMSRGVLMHVHQJDNHPIVRDUSRKSYBZWBULB9QPFDEXQNLX9INXGLDQIJCAVSLNNRJSHOLQASBZTQF9QXV9QLHIPXLACEEEDEXTBJF9HNRWDLNQUIONKWXFST9NNXOAPNYHFOJWFTLFJEPTABUVUMVSGFQFANEKMVTGGFINNJSSWDXNJEVYBAPRLQQKOOJBDWSEMSUHXRCFBJTFFAKIYAMGAXCGAXWPFPUGCTWOPOMWJFGPKKYRYLWLVENOWPPNUQZEBLXEYAFQXTANUDHXYPZMXMMICYEZ9VONFTMYHMBWCJWW9HFSKZMPLOIHMTAXZGBNPEMDHYZHYLGYCJFYBYFGZILZPQ9UETUKNVPLISIALLJSRJNOAKFTL9DYDWNFBYSOBOCTCAVJGXTTLGLQ9SCMCHSFTDJXSKGHHZAEGGJUMYGB9IIELEGDSBLZKMTJJSYJWZCJWEKNGDX9PAQAOPHWRUIOTELQGTFEOQBZOYWMJHAQZMCEPQRKZGPVDVKPD9HMJWVJVQRJK9JKKB9OP9IQBRSAIFVGAIWQJYPXMYGIXAYXQTLDW9OTRPKRJAPFPPNPWQKSPUZORGCLJA9YJZJ9GTGP99DCSSGN9WT9WQAVTJBAZZASKTSFZSDLKXEJDSXTMGQMLWWZSDDWSPBZEZOERBQZFDYFKFQLWOOXDSKTVJALTYRMFAHVZFGVNHR9JQUNXYCC9ZBHGBVQLEQQFYXIFMGZRHKZM9XYFNU9JFHOZPHZPITFOLQZOVEJWQVP9JBIVQJKGUVSGADFYGSIZNAWWGZMDDGNS9FVROUFLLLOFFSRQIFMIHWOSCSDGDVA9XKBYMHIPPHHTNJBSZJYHNVWMBOUW9RYNNSJERIRCEAZGFREYUMZXGYCCWVGPUWQLZUVVZEUJG9KBYILXFRZRTCIUJMOMEEZHCNOYRVYQVCMGMWOHRDERKZETUNHZNEQWNUJNLBNXDVPYHNIZWOTXU9ASXOOSXUDYGG9BOORBKMTXBRRLKKOZSU9JTNXAFIU9IRRXEMQYQVFJISEXPTTCUBM9NJBDXARCHEWDQTGUVIGVKEHHHAZWVIVKPUWUGFW9KHXDGIKLOCLEATBNHYOCZXEFQKQUOVRNVHMGXJIBLNFETCYPZMRBBMLMKWBOWWLYXVEUYSNKSWTLPBDVWJDLKCUJVTORYLGRZZXDBQHBFLOAXVVRCSNCDGPDLQMNMWWJSXEHSVINRKCBBENJHJRIMXVGMQJDUROBI9YMIQDTLSUHETANLIALPSDTTAJWQKNLWKUOCUEKYRCUODUMABILWL9YP9KZEONKRHBLJFAVEVWTZDFICLLFMUFZVPWKYLCLFQKS9JFOCJC9LRJESEPMWYHDC9ELBQLPDKVEFMGEL9TBDAAYUMGRZ9YCGXALWJZX9MNHBSRJYNP9IARGKIZCCYKLNSMUB9AZWHSINIMPFCTSMMPKVHYHRRENSZZXVBIKMVPMTKSOBPQ9PMALTOV9GDPKTWAE9KTDYOA9NNANSQQOJECKEQ9ZBRDISIUZCAWSJGYCOPEIGMJBVBVQGWTGPAHADULEPFM9ALNCIXWVSCBVQRHQANTLDVEXMAOXFQDDUQYNZOHHFBIAEENWZWJXVQICBNZTCQUNW9AQRGAQXINGXBXOYVE9JNXYGUHSUFLPADVPJUFMECKHQSIRRDNBYSOOZK9GKCK9HTDLANJUAJZQVLNVGZRLXBIYLGUVGCZDY9OCBIOPPTBZMGV9OUCKGREHCVXDCZBSU9IXKONSZFKDQBWUFDEEZVBPMFKOTPFLBGPMSMZVGBRHOQHNMGUN9I9GQEBAPXBFLPNBBSP9MCVEDSOCVIDEZCNQUEHZVJTDMEOVFUFYRGCPBOOVQGUYQYCBMRJBTLVXRSVIKJQRPOPNOOGUFGHGYW9QDLPVRYRDTEDICCLR9WEZXFLVUNMAEMFLHHNHDSXVHPLBLGOQTVKDAHUCMDTFYTJATAEZRYEDIBJPOFTFCIAEUL9XAUUIBQCRBDTMEPWVGTSBODMHBYRWLBJIRVIDDXAKDHSQFIXYBHMHNLQLNYPDQFCMETQZNJCJZZYAJCBDUYXMXBPVQJZCXNGFXOSLDHJSZY9CHNXVDEJHRCIAPJRZUQ9FJHJBPYFDDGMJRQMNZY9YTAEOHRFOFKNTPWSPWPIAGWZZBM9OVRYQ9PDMSFFNWVX9ONILLWBDFXKGOBMHLWNDCXXUGFDJRMNRRHBNPKIVP9NKNBEKLIOFCNGVBTWVQ9GMPEUATEAGWMITUAZCMOGFFVTDWCFTVONROHASJHYFSXMDYDOCVRXZBUMKDZICCQFYBVDPYSABNKTUPADTWJZGKLBQWUPSEOJIITYTNYXMGBQSSUPYMTSCYLSLIZCVJTJPHBETOROBNA99"),
                Tag       = new Tag("ASDF"),
                Timestamp = Timestamp.UnixSecondsTimestamp
            });

            expectedPayload.Finalize();
            expectedPayload.Sign();

            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");

            var mamFactory = new CurlMamFactory(
                new Curl(CurlMode.CurlP27),
                new CurlMask(),
                new IssSigningHelper(new Curl(CurlMode.CurlP27), new Curl(CurlMode.CurlP27), new Curl(CurlMode.CurlP27)),
                new HammingNonceDiver(CurlMode.CurlP27, ProofOfWork.HammingNonce.Mode._64bit));
            var channelFactory = new MamChannelFactory(mamFactory, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository());
            var channelKey     = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC");
            var channel        = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey);

            var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN"));

            Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value);
            Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value);
            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value);

            Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value);

            for (var i = 0; i < expectedPayload.Transactions.Count; i++)
            {
                Assert.AreEqual(expectedPayload.Transactions[i].Fragment.Value, message.Payload.Transactions[i].Fragment.Value);
            }
        }
Пример #17
0
        public async Task TestPrivateMamCreationAndDecryption()
        {
            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");
            var mask = new CurlMask();

            var iotaRepository = new InMemoryIotaRepository();
            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var channel        = channelFactory.Create(Mode.Private, seed);

            var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!"));
            await channel.PublishAsync(message);

            var messageTwo = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the second!"));
            await channel.PublishAsync(messageTwo);

            var messageThree = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the third!"));
            await channel.PublishAsync(messageThree);

            var subcriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, mask);
            var subscription       = subcriptionFactory.Create(message.Root, Mode.Private);

            var unmaskedMessages = await subscription.FetchAsync();

            Assert.AreEqual("Hello everyone!", unmaskedMessages[0].Message.ToUtf8String());
            Assert.AreEqual(message.NextRoot.Value, unmaskedMessages[0].NextRoot.Value);
            Assert.AreEqual(message.Root.Value, unmaskedMessages[0].Root.Value);
            Assert.AreEqual("Hello everyone the second!", unmaskedMessages[1].Message.ToUtf8String());
            Assert.AreEqual("Hello everyone the third!", unmaskedMessages[2].Message.ToUtf8String());

            var messageFour = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the fourth!"));
            await channel.PublishAsync(messageFour);

            unmaskedMessages = await subscription.FetchNext();

            Assert.AreEqual(1, unmaskedMessages.Count);
            Assert.AreEqual("Hello everyone the fourth!", unmaskedMessages[0].Message.ToUtf8String());
        }
        public async Task TestNoMessagesAreOnMamStreamShouldThrowException()
        {
            var iotaRepository      = IotaResourceProvider.Repository;
            var channelFactory      = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default);

            var resourceTracker = new InMemoryResourceTracker();
            await resourceTracker.AddEntryAsync(
                new ResourceEntry
            {
                Channel       = channelFactory.Create(Mode.Restricted, Seed.Random(), SecurityLevel.Medium, Seed.Random().Value, true),
                Subscription  = subscriptionFactory.Create(new Hash(Seed.Random().Value), Mode.Restricted, Seed.Random().Value, true),
                ResourceRoots = new List <string> {
                    "SOMEID"
                }
            });

            var repository = new IotaFhirRepository(
                iotaRepository,
                new FhirJsonTryteSerializer(),
                resourceTracker,
                new RandomSeedManager());
            await repository.ReadResourceAsync("SOMEID");
        }
        public async Task TestEntryCanBeWrittenAndRead()
        {
            var iotaRepository      = IotaResourceProvider.Repository;
            var channelFactory      = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default);

            var tracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, new RijndaelEncryption(Seed.Random().Value, Seed.Random().Value));

            // fhir id will only be 64 chars long
            var resourceId = Seed.Random().Value.Substring(0, 64);
            await tracker.AddEntryAsync(
                new ResourceEntry
            {
                Channel       = channelFactory.Create(Mode.Restricted, Seed.Random(), SecurityLevel.Medium, Seed.Random().Value, true),
                Subscription  = subscriptionFactory.Create(new Hash(Seed.Random().Value), Mode.Restricted, Seed.Random().Value, true),
                ResourceRoots = new List <string> {
                    resourceId
                }
            });

            var resource = await tracker.GetEntryAsync(resourceId);

            Assert.IsTrue(resource.ResourceRoots.FirstOrDefault(h => h == resourceId) != null);
        }
Пример #20
0
        public async Task TestMamChannelRecreation()
        {
            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");

            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository());
            var channelKey     = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC");
            var channel        = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey);

            var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!"));
            await channel.PublishAsync(message);

            var serializedChannel   = channel.ToJson();
            var unserializedChannel = channelFactory.CreateFromJson(serializedChannel);

            Assert.AreEqual(channel.Index, unserializedChannel.Index);
            Assert.AreEqual(channel.Start, unserializedChannel.Start);
            Assert.AreEqual(channel.NextCount, unserializedChannel.NextCount);
            Assert.AreEqual(channel.Count, unserializedChannel.Count);
            Assert.AreEqual(channel.NextRoot.Value, unserializedChannel.NextRoot.Value);
            Assert.AreEqual(channel.Seed.Value, unserializedChannel.Seed.Value);
            Assert.AreEqual(channel.SecurityLevel, unserializedChannel.SecurityLevel);
            Assert.AreEqual(channel.Key.Value, unserializedChannel.Key.Value);
            Assert.AreEqual(channel.Mode, unserializedChannel.Mode);
        }
Пример #21
0
        public async Task TestInvalidMessageOnMamStreamShouldBeIgnored()
        {
            var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI");
            var mask = new CurlMask();

            var iotaRepository = new InMemoryIotaRepository();
            var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var channelKey     = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC");
            var channel        = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey);

            var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!"));
            await channel.PublishAsync(message);

            var bundle = new Bundle();

            bundle.AddTransfer(new Transfer
            {
                Address   = message.Address,
                Message   = TryteString.FromUtf8String("I do not belong here and should be ignored!"),
                Tag       = Tag.Empty,
                Timestamp = Timestamp.UnixSecondsTimestamp
            });

            bundle.Finalize();
            bundle.Sign();

            await iotaRepository.SendTrytesAsync(bundle.Transactions, 27, 14);

            var subcriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, mask);
            var subscription       = subcriptionFactory.Create(message.Root, Mode.Restricted, channelKey);

            var unmaskedMessages = await subscription.FetchAsync();

            Assert.AreEqual(1, unmaskedMessages.Count);
            Assert.AreEqual("Hello everyone!", unmaskedMessages[0].Message.ToUtf8String());
        }
Пример #22
0
        /// <inheritdoc />
        protected override void Load(ContainerBuilder builder)
        {
            var iotaRepository = new RestIotaRepository(
                new FallbackIotaClient(new List <string> {
                "https://nodes.devnet.thetangle.org:443"
            }, 5000),
                new PoWService(new CpuPearlDiver()));

            var channelFactory      = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository);
            var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default);

            var encryption      = new RijndaelEncryption("somenicekey", "somenicesalt");
            var resourceTracker = new ResourceTracker(
                channelFactory,
                subscriptionFactory,
                encryption,
                $"{DependencyResolver.LocalStoragePath}\\resources.sqlite");

            var seedManager = new SeedManager(
                resourceTracker,
                new IssSigningHelper(new Curl(), new Curl(), new Curl()),
                new AddressGenerator(),
                iotaRepository,
                encryption,
                $"{DependencyResolver.LocalStoragePath}\\seedmanager.sqlite");

            var fhirRepository   = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager);
            var fhirParser       = new FhirJsonParser();
            var searchRepository = new SearchRepository($"{DependencyResolver.LocalStoragePath}\\search.sqlite");

            var createInteractor     = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository);
            var readInteractor       = new ReadResourceInteractor(fhirRepository, searchRepository);
            var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser);
            var searchInteractor     = new SearchResourcesInteractor(fhirRepository, searchRepository);

            var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager);

            builder.RegisterInstance(searchRepository).As <ISearchRepository>();
            builder.RegisterInstance(resourceTracker).As <IResourceTracker>();

            builder.RegisterInstance(createInteractor);
            builder.RegisterInstance(readInteractor);
            builder.RegisterInstance(validationInteractor);
            builder.RegisterInstance(searchInteractor);
            builder.RegisterInstance(resourceImporter);
            builder.RegisterInstance(seedManager).As <ISeedManager>();
            builder.RegisterInstance(subscriptionFactory);
            builder.RegisterInstance(fhirRepository).As <IFhirRepository>();
            builder.RegisterInstance(new AndroidLogout()).As <ILogout>();

            var backgroundWorker = new BackgroundWorkerService();

            var glucoseService = new FhirGlucoseService(
                new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository),
                new UpdateResourceInteractor(fhirRepository, fhirParser),
                new ReadResourceInteractor(fhirRepository, searchRepository),
                searchRepository);
            var glucoseRepository = new DexcomGlucoseManagementRepository(new RestClient("https://sandbox-api.dexcom.com"));

            //backgoundWorker.RegisterTaskWorker(new ContinuousGlucoseTaskWorker(glucoseService, glucoseRepository));
            backgroundWorker.RegisterTaskWorker(new AggregateGlucoseTaskWorker(glucoseService, glucoseRepository));
        }