Skip to content

Commit eb722a1

Browse files
authored
Fix CacheDirectory and CacheFile in AzureRmContextSettings.json (#24056)
* Fix CacheDirectory and CacheFile in AzureRmContextSettings.json * Fix issues for ContextAutoSaving cmdlets
1 parent 4fe5525 commit eb722a1

File tree

7 files changed

+56
-60
lines changed

7 files changed

+56
-60
lines changed

src/Accounts/Accounts/AutoSave/DisableAzureRmContextAutosave.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,7 @@ public override void ExecuteCmdlet()
6565

6666
void DisableAutosave(IAzureSession session, bool writeAutoSaveFile, out ContextAutosaveSettings result)
6767
{
68-
string tokenPath = Path.Combine(session.TokenCacheDirectory, session.TokenCacheFile);
69-
result = new ContextAutosaveSettings
70-
{
71-
Mode = ContextSaveMode.Process
72-
};
68+
result = ContextAutosaveSettings.FromAzureSession(session, ContextSaveMode.Process);
7369

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

src/Accounts/Accounts/AutoSave/EnableAzureRmContextAutosave.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,7 @@ void EnableAutosave(IAzureSession session, bool writeAutoSaveFile, out ContextAu
7676
throw new PSInvalidOperationException(string.Format("'{0}' is not a valid path. You cannot enable context autosave without a valid token cache path", tokenPath));
7777
}
7878

79-
result = new ContextAutosaveSettings
80-
{
81-
CacheDirectory = session.TokenCacheDirectory,
82-
CacheFile = session.TokenCacheFile,
83-
ContextDirectory = session.ARMProfileDirectory,
84-
ContextFile = session.ARMProfileFile,
85-
Mode = ContextSaveMode.CurrentUser
86-
};
79+
result = ContextAutosaveSettings.FromAzureSession(session, ContextSaveMode.CurrentUser);
8780

8881
FileUtilities.DataStore = session.DataStore;
8982
session.ARMContextSaveMode = ContextSaveMode.CurrentUser;

src/Accounts/Accounts/AutoSave/GetAzureRmContextAutosaveSetting.cs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,12 @@ ContextAutosaveSettings GetAutoSaveSettings(IAzureSession session, ContextModifi
5757
switch(scope)
5858
{
5959
case ContextModificationScope.CurrentUser:
60-
settings = new ContextAutosaveSettings
61-
{
62-
CacheDirectory = session.TokenCacheDirectory,
63-
CacheFile = session.TokenCacheFile,
64-
ContextDirectory = session.ARMProfileDirectory,
65-
ContextFile = session.ARMProfileFile,
66-
Mode = ContextSaveMode.CurrentUser
67-
};
60+
settings = ContextAutosaveSettings.FromAzureSession(session, ContextSaveMode.CurrentUser);
6861
break;
6962
default:
70-
settings = new ContextAutosaveSettings
71-
{
72-
CacheDirectory = NoDirectory,
73-
CacheFile = NoDirectory,
74-
ContextDirectory = NoDirectory,
75-
ContextFile = NoDirectory,
76-
Mode = ContextSaveMode.Process
77-
};
63+
settings = ContextAutosaveSettings.FromAzureSession(session, ContextSaveMode.Process);
7864
break;
7965
}
80-
8166
return settings;
8267
}
8368

src/Accounts/Accounts/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
-->
2020

2121
## Upcoming Release
22+
* Fixed `CacheDirectory` and `CacheFile` out-of-sync issue in AzureRmContextSettings.json and the customers are not allowed to change these 2 properties.
2223
* Redirected device code login messages from warning stream to information stream if use device authentication in `Connect-AzAccount`.
2324

2425
## Version 2.15.1

src/Accounts/Authentication.Test/LoginTests.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,7 @@ private void EnableAutosave(IAzureSession session, bool writeAutoSaveFile, out C
117117
throw new PSInvalidOperationException(string.Format("'{0}' is not a valid path. You cannot enable context autosave without a valid token cache path", tokenPath));
118118
}
119119

120-
result = new ContextAutosaveSettings
121-
{
122-
CacheDirectory = session.TokenCacheDirectory,
123-
CacheFile = session.TokenCacheFile,
124-
ContextDirectory = session.ARMProfileDirectory,
125-
ContextFile = session.ARMProfileFile,
126-
Mode = ContextSaveMode.CurrentUser
127-
};
120+
result = ContextAutosaveSettings.FromAzureSession(session, ContextSaveMode.CurrentUser);
128121

129122
FileUtilities.DataStore = session.DataStore;
130123
session.ARMContextSaveMode = ContextSaveMode.CurrentUser;

src/Accounts/Authentication/AzureSessionInitializer.cs

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ public static void MigrateMsalCacheWithoutSuffix(IAzureSession session, Action<s
158158
{
159159
if (session.ARMContextSaveMode == ContextSaveMode.CurrentUser)
160160
{
161-
var oldMsalCachePath = Path.Combine(MsalCacheHelperProvider.MsalTokenCachePath, MsalCacheHelperProvider.LegacyTokenCacheName);
162-
var newMsalCachePath = Path.Combine(MsalCacheHelperProvider.MsalTokenCachePath, session.TokenCacheFile);
161+
var oldMsalCachePath = Path.Combine(session.TokenCacheDirectory, MsalCacheHelperProvider.LegacyTokenCacheName);
162+
var newMsalCachePath = Path.Combine(session.TokenCacheDirectory, session.TokenCacheFile);
163163
var store = session.DataStore;
164164
if (store.FileExists(oldMsalCachePath) && !store.FileExists(newMsalCachePath))
165165
{
@@ -181,20 +181,16 @@ public static void MigrateMsalCacheWithoutSuffix(IAzureSession session, Action<s
181181
}
182182
}
183183

184-
static ContextAutosaveSettings InitializeSessionSettings(IDataStore store, string profileDirectory, string settingsFile, bool migrated = false)
185-
{
186-
return InitializeSessionSettings(store, profileDirectory, profileDirectory, settingsFile, migrated);
187-
}
188-
189-
static ContextAutosaveSettings InitializeSessionSettings(IDataStore store, string cacheDirectory, string profileDirectory, string settingsFile, bool migrated = false)
184+
static ContextAutosaveSettings InitializeSessionSettings(IDataStore store, string cacheDirectory, string cacheFile, string profileDirectory, string settingsFile, bool migrated = false)
190185
{
191186
var result = new ContextAutosaveSettings
192187
{
193188
CacheDirectory = cacheDirectory,
194189
ContextDirectory = profileDirectory,
195190
Mode = ContextSaveMode.Process,
196-
CacheFile = MsalCacheHelperProvider.LegacyTokenCacheName,
197-
ContextFile = "AzureRmContext.json"
191+
CacheFile = cacheFile,
192+
ContextFile = "AzureRmContext.json",
193+
KeyStoreFile = "keystore.cache"
198194
};
199195

200196
var settingsPath = Path.Combine(profileDirectory, settingsFile);
@@ -204,20 +200,21 @@ static ContextAutosaveSettings InitializeSessionSettings(IDataStore store, strin
204200
if (store.FileExists(settingsPath))
205201
{
206202
var settingsText = store.ReadFileAsText(settingsPath);
207-
ContextAutosaveSettings settings = JsonConvert.DeserializeObject<ContextAutosaveSettings>(settingsText);
208-
result.CacheDirectory = migrated ? cacheDirectory : settings.CacheDirectory == null ? cacheDirectory : string.Equals(settings.CacheDirectory, profileDirectory) ? cacheDirectory : settings.CacheDirectory;
209-
result.CacheFile = settings.CacheFile == null ? result.CacheFile : string.Equals(settings.CacheFile, "TokenCache.dat") ? result.CacheFile : settings.CacheFile;
203+
ContextAutosaveSettings settings = JsonConvert.DeserializeObject<ContextAutosaveSettings>(settingsText);
210204
result.ContextDirectory = migrated ? profileDirectory : settings.ContextDirectory ?? result.ContextDirectory;
211205
result.Mode = settings.Mode;
212206
result.ContextFile = settings.ContextFile ?? result.ContextFile;
213207
result.Settings = settings.Settings;
214-
result.KeyStoreFile = settings.KeyStoreFile;
208+
result.KeyStoreFile = settings.KeyStoreFile ?? result.KeyStoreFile;
215209
bool updateSettings = false;
216210
if (!settings.Settings.ContainsKey("InstallationId"))
217211
{
218212
result.Settings.Add("InstallationId", GetAzureCLIInstallationId(store) ?? Guid.NewGuid().ToString());
219213
updateSettings = true;
220214
}
215+
//The customer cannot change the values of CacheFile and CacheDirectory
216+
updateSettings = updateSettings || 0 != string.Compare(settings.CacheFile, cacheFile)
217+
|| 0 != string.Compare(settings.CacheDirectory, cacheDirectory);
221218
if (migrated || updateSettings)
222219
{
223220
string autoSavePath = Path.Combine(profileDirectory, settingsFile);
@@ -280,10 +277,6 @@ static IAzureSession CreateInstance(IDataStore dataStore = null, Action<string>
280277
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
281278
Resources.OldAzureDirectoryName);
282279
dataStore = dataStore ?? new DiskDataStore();
283-
284-
285-
string oldCachePath = Path.Combine(profilePath, "TokenCache.dat");
286-
string cachePath = Path.Combine(SharedUtilities.GetUserRootDirectory(), ".IdentityService");
287280
var session = new AdalSession
288281
{
289282
ClientFactory = new ClientFactory(),
@@ -293,17 +286,17 @@ static IAzureSession CreateInstance(IDataStore dataStore = null, Action<string>
293286
OldProfileFileBackup = "WindowsAzureProfile.xml.bak",
294287
ProfileDirectory = profilePath,
295288
ProfileFile = "AzureProfile.json",
289+
TokenCacheDirectory = MsalCacheHelperProvider.MsalTokenCachePath,
290+
TokenCacheFile = MsalCacheHelperProvider.GetTokenCacheName(MsalCacheHelperProvider.LegacyTokenCacheName, caeEnabled:true)
296291
};
297292

298293
var migrated =
299294
MigrateSettings(dataStore, oldProfilePath, profilePath);
300-
var autoSave = InitializeSessionSettings(dataStore, cachePath, profilePath, ContextAutosaveSettings.AutoSaveSettingsFile, migrated);
295+
var autoSave = InitializeSessionSettings(dataStore, session.TokenCacheDirectory, session.TokenCacheFile, profilePath, ContextAutosaveSettings.AutoSaveSettingsFile, migrated);
301296
session.ARMContextSaveMode = autoSave.Mode;
302297
session.ARMProfileDirectory = autoSave.ContextDirectory;
303298
session.ARMProfileFile = autoSave.ContextFile;
304-
session.TokenCacheDirectory = autoSave.CacheDirectory;
305-
session.TokenCacheFile = MsalCacheHelperProvider.GetTokenCacheName(autoSave.CacheFile, true);
306-
session.KeyStoreFile = autoSave.KeyStoreFile ?? "keystore.cache";
299+
session.KeyStoreFile = autoSave.KeyStoreFile;
307300
autoSave.Settings.TryGetValue("InstallationId", out string installationId);
308301
session.ExtendedProperties.Add("InstallationId", installationId);
309302
InitializeConfigs(session, profilePath, writeWarning);

src/Accounts/Authentication/ContextAutosaveSettings.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,40 @@ public IDictionary<string, string> Settings
7070
_extendedSettings = value;
7171
}
7272
}
73+
74+
public static ContextAutosaveSettings FromAzureSession(IAzureSession session, string mode)
75+
{
76+
if (mode == ContextSaveMode.CurrentUser)
77+
{
78+
return new ContextAutosaveSettings()
79+
{
80+
Mode = ContextSaveMode.CurrentUser,
81+
CacheDirectory = session.TokenCacheDirectory,
82+
CacheFile = session.TokenCacheFile,
83+
ContextDirectory = session.ARMProfileDirectory,
84+
ContextFile = session.ARMProfileFile,
85+
KeyStoreFile = session.KeyStoreFile,
86+
Settings = new Dictionary<string, string>() {
87+
{ "InstallationId", session.GetProperty("InstallationId") }
88+
},
89+
};
90+
}
91+
else
92+
{
93+
const string NoDirectory = "None";
94+
return new ContextAutosaveSettings()
95+
{
96+
Mode = ContextSaveMode.Process,
97+
CacheDirectory = NoDirectory,
98+
CacheFile = NoDirectory,
99+
ContextDirectory = NoDirectory,
100+
ContextFile = NoDirectory,
101+
KeyStoreFile = NoDirectory,
102+
Settings = new Dictionary<string, string>() {
103+
{ "InstallationId", session.GetProperty("InstallationId") }
104+
},
105+
};
106+
}
107+
}
73108
}
74109
}

0 commit comments

Comments
 (0)