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)); }