fix for OneDrive file storage unnecessarily prompting for login, closes https://github.com/PhilippC/keepass2android/issues/1038

This commit is contained in:
Philipp Crocoll
2021-02-18 16:20:03 +01:00
parent 7a731da44f
commit 15d3492ae3

View File

@@ -322,20 +322,37 @@ namespace keepass2android.Io
private async Task<IGraphServiceClient> TryGetMsGraphClient(String path, bool tryConnect) private async Task<IGraphServiceClient> TryGetMsGraphClient(String path, bool tryConnect)
{ {
String userId = OneDrive2ItemLocation<OneDrive2PrefixContainerType>.FromString(path).User.Id; String userId = OneDrive2ItemLocation<OneDrive2PrefixContainerType>.FromString(path).User.Id;
logDebug("TryGetMsGraphClient for " + userId);
if (mClientByUser.ContainsKey(userId)) if (mClientByUser.ContainsKey(userId))
{ {
logDebug("TryGetMsGraphClient found user " + userId);
GraphServiceClientWithState clientWithState = mClientByUser[userId]; GraphServiceClientWithState clientWithState = mClientByUser[userId];
if (!(clientWithState.RequiresUserInteraction || (clientWithState.TokenExpiryDate < DateTime.Now) || (clientWithState.Client == null))) if (!(clientWithState.RequiresUserInteraction || (clientWithState.TokenExpiryDate < DateTime.Now) ||
(clientWithState.Client == null)))
{
logDebug("TryGetMsGraphClient returning client");
return clientWithState.Client; return clientWithState.Client;
}
else
{
logDebug("not returning client because " + clientWithState.RequiresUserInteraction + " " +
(clientWithState.TokenExpiryDate < DateTime.Now) + " " + (clientWithState.Client == null));
}
} }
if (tryConnect) if (tryConnect)
{ {
logDebug("trying to connect...");
if (await TryLoginSilent(path) != null) if (await TryLoginSilent(path) != null)
{ {
logDebug("trying to connect ok");
return mClientByUser[userId].Client; return mClientByUser[userId].Client;
} }
logDebug("trying to connect failed");
} }
logDebug("TryGetMsGraphClient for " + userId + " returns null");
return null; return null;
} }
@@ -367,7 +384,7 @@ namespace keepass2android.Io
if (authenticationResult.Account == null) if (authenticationResult.Account == null)
throw new Exception("authenticationResult.Account == null!"); throw new Exception("authenticationResult.Account == null!");
mClientByUser[authenticationResult.Account.HomeAccountId.Identifier] = clientWithState; mClientByUser[authenticationResult.Account.HomeAccountId.Identifier] = clientWithState;
logDebug("buildClient ok.");
return clientWithState.Client; return clientWithState.Client;
} }
@@ -375,7 +392,9 @@ namespace keepass2android.Io
private void logDebug(string str) private void logDebug(string str)
{ {
Log.Debug("KP2A", str); #if DEBUG
Log.Debug("KP2A", "OneDrive2: " + str);
#endif
} }
@@ -858,14 +877,17 @@ namespace keepass2android.Io
public async void OnStart(IFileStorageSetupActivity activity) public async void OnStart(IFileStorageSetupActivity activity)
{ {
logDebug("OneDrive2.OnStart");
if (activity.ProcessName.Equals(FileStorageSetupDefs.ProcessNameFileUsageSetup)) if (activity.ProcessName.Equals(FileStorageSetupDefs.ProcessNameFileUsageSetup))
activity.State.PutString(FileStorageSetupDefs.ExtraPath, activity.Ioc.Path); activity.State.PutString(FileStorageSetupDefs.ExtraPath, activity.Ioc.Path);
string rootPathForUser = await TryLoginSilent(activity.Ioc.Path); string rootPathForUser = await TryLoginSilent(activity.Ioc.Path);
if (rootPathForUser != null) if (rootPathForUser != null)
{ {
logDebug("rootPathForUser not null");
FinishActivityWithSuccess(activity, rootPathForUser); FinishActivityWithSuccess(activity, rootPathForUser);
return;
} }
logDebug("rootPathForUser null");
try try
{ {
@@ -893,13 +915,14 @@ namespace keepass2android.Io
private async Task<string> TryLoginSilent(string iocPath) private async Task<string> TryLoginSilent(string iocPath)
{ {
logDebug("Login Silent for " + iocPath);
IAccount account = null; IAccount account = null;
try try
{ {
if (IsConnected(iocPath)) if (IsConnected(iocPath))
{ {
logDebug("Login Silent ok, connected");
return iocPath; return iocPath;
} }
String userId = OneDrive2ItemLocation<OneDrive2PrefixContainerType>.FromString(iocPath).User?.Id; String userId = OneDrive2ItemLocation<OneDrive2PrefixContainerType>.FromString(iocPath).User?.Id;
@@ -928,7 +951,9 @@ namespace keepass2android.Io
/*User me = await graphClient.Me.Request().WithForceRefresh(true).GetAsync(); /*User me = await graphClient.Me.Request().WithForceRefresh(true).GetAsync();
logDebug("received name " + me.DisplayName);*/ logDebug("received name " + me.DisplayName);*/
return BuildRootPathForUser(authResult); var rootFolder = BuildRootPathForUser(authResult);
logDebug("Found RootPath for user");
return rootFolder;
} }
catch (MsalUiRequiredException ex) catch (MsalUiRequiredException ex)