Example #1
0
        void DisableAutosave(IAzureSession session, bool writeAutoSaveFile, out ContextAutosaveSettings result)
        {
            string tokenPath = Path.Combine(session.TokenCacheDirectory, session.TokenCacheFile);

            result = new ContextAutosaveSettings
            {
                Mode = ContextSaveMode.Process
            };

            FileUtilities.DataStore    = session.DataStore;
            session.ARMContextSaveMode = ContextSaveMode.Process;

            PowerShellTokenCacheProvider cacheProvider;
            MemoryStream memoryStream = null;

            if (AzureSession.Instance.TryGetComponent(
                    PowerShellTokenCacheProvider.PowerShellTokenCacheProviderKey,
                    out PowerShellTokenCacheProvider originalTokenCacheProvider))
            {
                if (originalTokenCacheProvider is SharedTokenCacheProvider)
                {
                    cacheProvider = new InMemoryTokenCacheProvider();
                    var token = originalTokenCacheProvider.ReadTokenData();
                    if (token != null && token.Length > 0)
                    {
                        memoryStream = new MemoryStream(token);
                    }
                    cacheProvider.UpdateTokenDataWithoutFlush(token);
                    cacheProvider.FlushTokenData();
                    AzureSession.Instance.RegisterComponent(PowerShellTokenCacheProvider.PowerShellTokenCacheProviderKey, () => cacheProvider, true);
                }
                else
                {
                    cacheProvider = originalTokenCacheProvider;
                }
            }
            else
            {
                cacheProvider = new InMemoryTokenCacheProvider();
            }

            PowerShellTokenCache newTokenCache = null;

            if (AzureSession.Instance.TryGetComponent(nameof(PowerShellTokenCache), out PowerShellTokenCache tokenCache))
            {
                if (!tokenCache.IsPersistentCache)
                {
                    newTokenCache = tokenCache;
                }
                else
                {
                    newTokenCache = memoryStream == null ? null : PowerShellTokenCache.Deserialize(memoryStream);
                }
            }

            if (newTokenCache == null)
            {
                newTokenCache = cacheProvider.GetTokenCache();
            }
            AzureSession.Instance.RegisterComponent(nameof(PowerShellTokenCache), () => newTokenCache, true);
            if (AzureSession.Instance.TryGetComponent(AuthenticatorBuilder.AuthenticatorBuilderKey, out IAuthenticatorBuilder builder))
            {
                builder.Reset();
            }

            if (writeAutoSaveFile)
            {
                FileUtilities.EnsureDirectoryExists(session.ProfileDirectory);
                string autoSavePath = Path.Combine(session.ProfileDirectory, ContextAutosaveSettings.AutoSaveSettingsFile);
                session.DataStore.WriteFile(autoSavePath, JsonConvert.SerializeObject(result));
            }
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (objectType == typeof(IAzureContextContainer))
            {
                return(serializer.Deserialize <AzureRmProfile>(reader));
            }
            if (objectType == typeof(IAzureContext))
            {
                return(serializer.Deserialize <AzureContext>(reader));
            }
            else if (objectType == typeof(IAzureAccount))
            {
                return(serializer.Deserialize <AzureAccount>(reader));
            }
            else if (objectType == typeof(IAzureSubscription))
            {
                return(serializer.Deserialize <AzureSubscription>(reader));
            }
            else if (objectType == typeof(IAzureTenant))
            {
                return(serializer.Deserialize <AzureTenant>(reader));
            }
            else if (objectType == typeof(IAzureEnvironment))
            {
                return(serializer.Deserialize <AzureEnvironment>(reader));
            }
            else if (objectType == typeof(IAzureTokenCache) || objectType == typeof(AzureTokenCache))
            {
                var tempResult = serializer.Deserialize <CacheBuffer>(reader);
                if (_serializeCache && tempResult != null && tempResult.CacheData != null && tempResult.CacheData.Length > 0)
                {
                    if (AzureSession.Instance.TryGetComponent(nameof(PowerShellTokenCache), out PowerShellTokenCache oldTokenCache))
                    {
                        if (!oldTokenCache.IsPersistentCache)
                        {
                            var stream     = new MemoryStream(tempResult.CacheData);
                            var tokenCache = new PowerShellTokenCache(stream);
                            AzureSession.Instance.RegisterComponent(nameof(PowerShellTokenCache), () => tokenCache, true);
                        }
                        else
                        {
                            if (AzureSession.Instance.TryGetComponent(
                                    PowerShellTokenCacheProvider.PowerShellTokenCacheProviderKey,
                                    out PowerShellTokenCacheProvider tokenCacheProvider))
                            {
                                tokenCacheProvider.UpdateTokenDataWithoutFlush(tempResult.CacheData);
                            }
                        }
                    }
                }
                // cache data is not for direct use, so we do not return anything
                return(new AzureTokenCache());
            }
            else if (objectType == typeof(Dictionary <string, IAzureEnvironment>))
            {
                var tempResult = serializer.Deserialize <Dictionary <string, AzureEnvironment> >(reader);
                var result     = new Dictionary <string, IAzureEnvironment>(StringComparer.OrdinalIgnoreCase);
                foreach (var key in tempResult.Keys)
                {
                    result[key] = tempResult[key];
                }

                return(result);
            }
            else if (objectType == typeof(Dictionary <string, IAzureContext>))
            {
                var tempResult = serializer.Deserialize <Dictionary <string, AzureContext> >(reader);
                var result     = new Dictionary <string, IAzureContext>(StringComparer.OrdinalIgnoreCase);
                foreach (var key in tempResult.Keys)
                {
                    result[key] = tempResult[key];
                }

                return(result);
            }

            return(serializer.Deserialize(reader));
        }