private bool ValidRoute(TerminalRouteResponse route, bool includeExpired)
        {
            if (route == null || !route.Success)
            {
                return(false);
            }

            return(includeExpired ||
                   route.Timestamp.GetValueOrDefault(new DateTime(0)).Add(TimeToLive) > DateTime.UtcNow);
        }
        /// <summary>
        /// Stores a terminal route for later use.
        /// </summary>
        /// <param name="route">The <see cref="TerminalRouteResponse"/> to cache.</param>
        /// <param name="rootCredentials">The root credentials used to establish the route.</param>
        public void Put(TerminalRouteResponse route, ApiCredentials rootCredentials)
        {
            var cacheKey = ToTerminalRouteKey(route.TerminalName, rootCredentials);

            routeCache[cacheKey] = route;

            if (OfflineEnabled)
            {
                var offlineRoute = (TerminalRouteResponse)route.Clone();
                offlineRoute.TransientCredentials = Encrypt(offlineRoute.TransientCredentials, rootCredentials);

                var offlineData = JsonConvert.SerializeObject(offlineRoute);
                var offlineFile = ResolveOfflineRouteCacheLocation(cacheKey);

                WriteFile(offlineFile, offlineData);
            }
        }
 private bool ValidRoute(TerminalRouteResponse route)
 {
     return(ValidRoute(route, false));
 }
Пример #4
0
        public void TerminalRouteCacheTest_RoundTrip(bool offlineEnabled, bool expired, bool successfulRoute)
        {
            using (var tmpdir = new TempDir())
            {
                var cache = GetTestRouteCache(offlineEnabled, tmpdir.Name);

                var rootCredentials = new ApiCredentials(
                    "ZDSMMZLGRPBPRTJUBTAFBYZ33Q",
                    "ZLBW5NR4U5PKD5PNP3ZP3OZS5U",
                    "9c6a5e8e763df1c9256e3d72bd7f53dfbd07312938131c75b3bfd254da787947");

                var route = new TerminalRouteResponse
                {
                    Success              = successfulRoute,
                    TerminalName         = "Test Terminal",
                    TransientCredentials = rootCredentials,
                    Timestamp            = DateTime.UtcNow,
                };

                if (expired)
                {
                    route.Timestamp = new DateTime(0);
                }

                cache.Put(route, rootCredentials);

                if (offlineEnabled)
                {
                    // Wipe out the online cache to validate that the value is read from the offline cache.
                    cache = GetTestRouteCache(offlineEnabled, tmpdir.Name);
                }

                var result = cache.Get("Test Terminal", rootCredentials);

                string[] generatedFiles = Directory.GetFiles(tmpdir.Name, "*", SearchOption.AllDirectories);

                if (offlineEnabled && successfulRoute)
                {
                    Assert.NotEmpty(generatedFiles);

                    foreach (string filePath in generatedFiles)
                    {
                        using (var file = new StreamReader(filePath))
                        {
                            var raw          = file.ReadToEnd();
                            var offlineRoute = JsonConvert.DeserializeObject <TerminalRouteResponse>(raw);

                            // Make sure the credentials exist.
                            Assert.False(String.IsNullOrEmpty(offlineRoute.TransientCredentials.ApiKey));
                            Assert.False(String.IsNullOrEmpty(offlineRoute.TransientCredentials.BearerToken));
                            Assert.False(String.IsNullOrEmpty(offlineRoute.TransientCredentials.SigningKey));

                            // Make sure the credentials are encrypted for offline storage.
                            Assert.NotEqual(rootCredentials.ApiKey, offlineRoute.TransientCredentials.ApiKey);
                            Assert.NotEqual(rootCredentials.BearerToken, offlineRoute.TransientCredentials.BearerToken);
                            Assert.NotEqual(rootCredentials.SigningKey, offlineRoute.TransientCredentials.SigningKey);
                        }
                    }
                }

                if (!offlineEnabled)
                {
                    Assert.Empty(generatedFiles);
                }

                if (expired || !successfulRoute)
                {
                    Assert.Null(result);
                }
                else
                {
                    Assert.NotNull(result);
                    Assert.Equal(route.Success, result.Success);
                    Assert.Equal(route.TransientCredentials.ApiKey, result.TransientCredentials.ApiKey);
                    Assert.Equal(route.TransientCredentials.BearerToken, result.TransientCredentials.BearerToken);
                    Assert.Equal(route.TransientCredentials.SigningKey, result.TransientCredentials.SigningKey);
                }
            }
        }