Merge branch 'master' of c:/ph/keepass2android
This commit is contained in:
@@ -322,20 +322,37 @@ namespace keepass2android.Io
|
||||
|
||||
private async Task<IGraphServiceClient> TryGetMsGraphClient(String path, bool tryConnect)
|
||||
{
|
||||
|
||||
String userId = OneDrive2ItemLocation<OneDrive2PrefixContainerType>.FromString(path).User.Id;
|
||||
|
||||
logDebug("TryGetMsGraphClient for " + userId);
|
||||
if (mClientByUser.ContainsKey(userId))
|
||||
{
|
||||
logDebug("TryGetMsGraphClient found user " + 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;
|
||||
}
|
||||
else
|
||||
{
|
||||
logDebug("not returning client because " + clientWithState.RequiresUserInteraction + " " +
|
||||
(clientWithState.TokenExpiryDate < DateTime.Now) + " " + (clientWithState.Client == null));
|
||||
}
|
||||
}
|
||||
if (tryConnect)
|
||||
{
|
||||
logDebug("trying to connect...");
|
||||
if (await TryLoginSilent(path) != null)
|
||||
{
|
||||
logDebug("trying to connect ok");
|
||||
return mClientByUser[userId].Client;
|
||||
}
|
||||
logDebug("trying to connect failed");
|
||||
}
|
||||
logDebug("TryGetMsGraphClient for " + userId + " returns null");
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -367,7 +384,7 @@ namespace keepass2android.Io
|
||||
if (authenticationResult.Account == null)
|
||||
throw new Exception("authenticationResult.Account == null!");
|
||||
mClientByUser[authenticationResult.Account.HomeAccountId.Identifier] = clientWithState;
|
||||
|
||||
logDebug("buildClient ok.");
|
||||
return clientWithState.Client;
|
||||
}
|
||||
|
||||
@@ -375,7 +392,9 @@ namespace keepass2android.Io
|
||||
|
||||
private void logDebug(string str)
|
||||
{
|
||||
Log.Debug("KP2A", str);
|
||||
#if DEBUG
|
||||
Log.Debug("KP2A", "OneDrive2: " + str);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -530,13 +549,50 @@ namespace keepass2android.Io
|
||||
{
|
||||
Task.Run(async () =>
|
||||
{
|
||||
PathItemBuilder pathItemBuilder = await GetPathItemBuilder(path);
|
||||
PathItemBuilder pathItemBuilder = await GetPathItemBuilder(path);
|
||||
//for small files <2MB use the direct upload:
|
||||
if (stream.Length < 2* 1024 * 1024)
|
||||
{
|
||||
return await
|
||||
pathItemBuilder
|
||||
.getPathItem()
|
||||
.Content
|
||||
.Request()
|
||||
.PutAsync<DriveItem>(stream);
|
||||
}
|
||||
|
||||
//for larger files use an upload session. This is required for 4MB and beyond, but as the docs are not very clear about this
|
||||
//limit, let's use it a bit more often to be safe.
|
||||
|
||||
var uploadProps = new DriveItemUploadableProperties
|
||||
{
|
||||
ODataType = null,
|
||||
AdditionalData = new Dictionary<string, object>
|
||||
{
|
||||
{ "@microsoft.graph.conflictBehavior", "replace" }
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var uploadSession = await pathItemBuilder
|
||||
.getPathItem()
|
||||
.CreateUploadSession(uploadProps)
|
||||
.Request()
|
||||
.PostAsync();
|
||||
|
||||
// Max slice size must be a multiple of 320 KiB
|
||||
int maxSliceSize = 320 * 1024;
|
||||
var fileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, stream, maxSliceSize);
|
||||
var uploadResult = await fileUploadTask.UploadAsync();
|
||||
|
||||
if (!uploadResult.UploadSucceeded)
|
||||
{
|
||||
throw new Exception("Failed to upload data!");
|
||||
}
|
||||
|
||||
return uploadResult.ItemResponse;
|
||||
|
||||
|
||||
|
||||
}).Wait();
|
||||
|
||||
@@ -821,14 +877,17 @@ namespace keepass2android.Io
|
||||
|
||||
public async void OnStart(IFileStorageSetupActivity activity)
|
||||
{
|
||||
|
||||
logDebug("OneDrive2.OnStart");
|
||||
if (activity.ProcessName.Equals(FileStorageSetupDefs.ProcessNameFileUsageSetup))
|
||||
activity.State.PutString(FileStorageSetupDefs.ExtraPath, activity.Ioc.Path);
|
||||
string rootPathForUser = await TryLoginSilent(activity.Ioc.Path);
|
||||
if (rootPathForUser != null)
|
||||
{
|
||||
logDebug("rootPathForUser not null");
|
||||
FinishActivityWithSuccess(activity, rootPathForUser);
|
||||
return;
|
||||
}
|
||||
logDebug("rootPathForUser null");
|
||||
|
||||
try
|
||||
{
|
||||
@@ -856,13 +915,14 @@ namespace keepass2android.Io
|
||||
|
||||
private async Task<string> TryLoginSilent(string iocPath)
|
||||
{
|
||||
|
||||
logDebug("Login Silent for " + iocPath);
|
||||
IAccount account = null;
|
||||
try
|
||||
{
|
||||
|
||||
if (IsConnected(iocPath))
|
||||
{
|
||||
logDebug("Login Silent ok, connected");
|
||||
return iocPath;
|
||||
}
|
||||
String userId = OneDrive2ItemLocation<OneDrive2PrefixContainerType>.FromString(iocPath).User?.Id;
|
||||
@@ -891,7 +951,9 @@ namespace keepass2android.Io
|
||||
/*User me = await graphClient.Me.Request().WithForceRefresh(true).GetAsync();
|
||||
logDebug("received name " + me.DisplayName);*/
|
||||
|
||||
return BuildRootPathForUser(authResult);
|
||||
var rootFolder = BuildRootPathForUser(authResult);
|
||||
logDebug("Found RootPath for user");
|
||||
return rootFolder;
|
||||
|
||||
}
|
||||
catch (MsalUiRequiredException ex)
|
||||
|
@@ -1,11 +1,10 @@
|
||||
#pragma warning disable 1591
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// Dieser Code wurde von einem Tool generiert.
|
||||
// Laufzeitversion:4.0.30319.42000
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
|
||||
// der Code erneut generiert wird.
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
@@ -15,7 +14,7 @@ namespace keepass2android
|
||||
{
|
||||
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
|
||||
public partial class Resource
|
||||
{
|
||||
|
||||
|
@@ -176,6 +176,7 @@ namespace keepass2android
|
||||
|
||||
public void StopListening()
|
||||
{
|
||||
Kp2aLog.Log("Fingerprint: StopListening " + (_biometricPrompt != null ? " having prompt " : " without prompt"));
|
||||
_biometricAuthCallbackAdapter?.IgnoreNextError();
|
||||
_biometricPrompt?.CancelAuthentication();
|
||||
}
|
||||
@@ -272,7 +273,24 @@ namespace keepass2android
|
||||
try
|
||||
{
|
||||
_keystore.Load(null);
|
||||
var aliases = _keystore.Aliases();
|
||||
if (aliases == null)
|
||||
{
|
||||
Kp2aLog.Log("KS: no aliases");
|
||||
}
|
||||
else
|
||||
{
|
||||
while (aliases.HasMoreElements)
|
||||
{
|
||||
var o = aliases.NextElement();
|
||||
Kp2aLog.Log("alias: " + o?.ToString());
|
||||
}
|
||||
Kp2aLog.Log("KS: end aliases");
|
||||
|
||||
}
|
||||
var key = _keystore.GetKey(GetAlias(_keyId), null);
|
||||
if (key == null)
|
||||
throw new Exception("Failed to init cipher for fingerprint Init: key is null");
|
||||
var ivParams = new IvParameterSpec(_iv);
|
||||
_cipher.Init(CipherMode.DecryptMode, key, ivParams);
|
||||
|
||||
@@ -286,27 +304,27 @@ namespace keepass2android
|
||||
}
|
||||
catch (KeyStoreException e)
|
||||
{
|
||||
throw new RuntimeException(FailedToInitCipher, e);
|
||||
throw new RuntimeException(FailedToInitCipher + " (keystore)", e);
|
||||
}
|
||||
catch (CertificateException e)
|
||||
{
|
||||
throw new RuntimeException(FailedToInitCipher, e);
|
||||
throw new RuntimeException(FailedToInitCipher + " (CertificateException)", e);
|
||||
}
|
||||
catch (UnrecoverableKeyException e)
|
||||
{
|
||||
throw new RuntimeException(FailedToInitCipher, e);
|
||||
throw new RuntimeException(FailedToInitCipher + " (UnrecoverableKeyException)", e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
throw new RuntimeException(FailedToInitCipher, e);
|
||||
throw new RuntimeException(FailedToInitCipher + " (IOException)", e);
|
||||
}
|
||||
catch (NoSuchAlgorithmException e)
|
||||
{
|
||||
throw new RuntimeException(FailedToInitCipher, e);
|
||||
throw new RuntimeException(FailedToInitCipher + " (NoSuchAlgorithmException)", e);
|
||||
}
|
||||
catch (InvalidKeyException e)
|
||||
{
|
||||
throw new RuntimeException(FailedToInitCipher, e);
|
||||
throw new RuntimeException(FailedToInitCipher + " (InvalidKeyException)" + e.ToString(), e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,14 +367,19 @@ namespace keepass2android
|
||||
try
|
||||
{
|
||||
_keystore.Load(null);
|
||||
_keyGen.Init(new KeyGenParameterSpec.Builder(GetAlias(_keyId),
|
||||
KeyStorePurpose.Encrypt | KeyStorePurpose.Decrypt)
|
||||
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(GetAlias(_keyId),
|
||||
KeyStorePurpose.Encrypt | KeyStorePurpose.Decrypt)
|
||||
.SetBlockModes(KeyProperties.BlockModeCbc)
|
||||
// Require the user to authenticate with biometry to authorize every use
|
||||
// of the key
|
||||
.SetEncryptionPaddings(KeyProperties.EncryptionPaddingPkcs7)
|
||||
.SetUserAuthenticationRequired(true)
|
||||
.SetUserAuthenticationRequired(true);
|
||||
|
||||
if ((int)Build.VERSION.SdkInt >= 24)
|
||||
builder.SetInvalidatedByBiometricEnrollment(false);
|
||||
|
||||
_keyGen.Init(
|
||||
builder
|
||||
.Build());
|
||||
_keyGen.GenerateKey();
|
||||
}
|
||||
|
@@ -429,7 +429,9 @@ namespace keepass2android
|
||||
// Update last access time.
|
||||
Entry.Touch(false);
|
||||
|
||||
if (PwDefs.IsTanEntry(Entry) && prefs.GetBoolean(GetString(Resource.String.TanExpiresOnUse_key), Resources.GetBoolean(Resource.Boolean.TanExpiresOnUse_default)) && ((Entry.Expires == false) || Entry.ExpiryTime > DateTime.Now))
|
||||
if (PwDefs.IsTanEntry(Entry)
|
||||
&& prefs.GetBoolean(GetString(Resource.String.TanExpiresOnUse_key), Resources.GetBoolean(Resource.Boolean.TanExpiresOnUse_default))
|
||||
&& ((Entry.Expires == false) || Entry.ExpiryTime > DateTime.Now))
|
||||
{
|
||||
PwEntry backupEntry = Entry.CloneDeep();
|
||||
Entry.ExpiryTime = DateTime.Now;
|
||||
|
@@ -35,7 +35,7 @@ namespace keepass2android
|
||||
|
||||
protected override bool FitSystemWindows(Rect insets)
|
||||
{
|
||||
if (Build.VERSION.SdkInt >= Build.VERSION_CODES.Kitkat)
|
||||
if (Util.IsKitKatOrLater)
|
||||
{
|
||||
// Intentionally do not modify the bottom inset. For some reason,
|
||||
// if the bottom inset is modified, window resizing stops working.
|
||||
|
@@ -236,6 +236,7 @@ namespace keepass2android
|
||||
{
|
||||
IOConnectionInfo ioc = new IOConnectionInfo();
|
||||
Util.SetIoConnectionFromIntent(ioc, data);
|
||||
Kp2aLog.Log("Set keyfile after returning from RequestCodeSelectKeyfile");
|
||||
_keyFile = IOConnectionInfo.SerializeToString(ioc);
|
||||
UpdateKeyfileIocView();
|
||||
}
|
||||
@@ -692,7 +693,8 @@ namespace keepass2android
|
||||
|
||||
String action = i.Action;
|
||||
if ((action != null) && (action.Equals(Intents.StartWithOtp)))
|
||||
{
|
||||
{
|
||||
Kp2aLog.Log("Launching with OTP");
|
||||
if (!GetIocFromOtpIntent(savedInstanceState, i)) return;
|
||||
_keepPasswordInOnResume = true;
|
||||
}
|
||||
@@ -772,7 +774,8 @@ namespace keepass2android
|
||||
|
||||
private void GetIocFromLaunchIntent(Intent i)
|
||||
{
|
||||
_makeCurrent = i.GetBooleanExtra("MakeCurrent", true);
|
||||
Kp2aLog.Log("GetIocFromLaunchIntent()");
|
||||
_makeCurrent = i.GetBooleanExtra("MakeCurrent", true);
|
||||
Util.SetIoConnectionFromIntent(_ioConnection, i);
|
||||
var keyFileFromIntent = i.GetStringExtra(KeyKeyfile);
|
||||
if (keyFileFromIntent != null)
|
||||
@@ -785,7 +788,9 @@ namespace keepass2android
|
||||
}
|
||||
else
|
||||
{
|
||||
_keyFile = null;
|
||||
Kp2aLog.Log("no keyprovider specified");
|
||||
|
||||
_keyFile = null;
|
||||
KeyProviderTypes.Clear();
|
||||
}
|
||||
|
||||
@@ -843,7 +848,8 @@ namespace keepass2android
|
||||
KeyProviderTypes.Clear();
|
||||
if (string.IsNullOrEmpty(keyProviderString))
|
||||
{
|
||||
_keyFile = null;
|
||||
Kp2aLog.Log("Reset keyfile");
|
||||
_keyFile = null;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -852,12 +858,15 @@ namespace keepass2android
|
||||
keyProviderString = keyProviderString.Substring(Kp2aKeyProviderStringPrefix.Length);
|
||||
foreach (string type in keyProviderString.Split(';'))
|
||||
{
|
||||
Kp2aLog.Log("PasswordActivity: key file type " + type);
|
||||
if (!type.Trim().Any())
|
||||
continue;
|
||||
if (type.StartsWith(KeyProviders.KeyFile.ToString()))
|
||||
{
|
||||
_keyFile = WebUtility.UrlDecode(type.Substring(KeyProviders.KeyFile.ToString().Length));
|
||||
KeyProviderTypes.Add(KeyProviders.KeyFile);
|
||||
Kp2aLog.Log("Added key file of length " + _keyFile.Length);
|
||||
|
||||
KeyProviderTypes.Add(KeyProviders.KeyFile);
|
||||
continue;
|
||||
}
|
||||
foreach (KeyProviders providerType in Enum.GetValues(typeof(KeyProviders)))
|
||||
@@ -872,9 +881,9 @@ namespace keepass2android
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
//legacy mode
|
||||
_keyFile = null;
|
||||
Kp2aLog.Log("PasswordActivity: legacy key file mode");
|
||||
//legacy mode
|
||||
_keyFile = null;
|
||||
|
||||
if (keyProviderString == KeyProviderIdOtp)
|
||||
KeyProviderTypes.Add(KeyProviders.Otp);
|
||||
@@ -1195,13 +1204,16 @@ namespace keepass2android
|
||||
{
|
||||
KeyProviderTypes.Clear();
|
||||
_keyFile = null;
|
||||
Kp2aLog.Log("PasswordModeSpinner item selected: " + args.Position);
|
||||
switch (args.Position)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
//don't set to "" to prevent losing the filename. (ItemSelected is also called during recreation!)
|
||||
_keyFile = (FindViewById(Resource.Id.label_keyfilename).Tag ?? "").ToString();
|
||||
//don't set to "" to prevent losing the filename. (ItemSelected is also called during recreation!)
|
||||
Kp2aLog.Log("key file length before: " + _keyFile?.Length);
|
||||
_keyFile = (FindViewById(Resource.Id.label_keyfilename).Tag ?? "").ToString();
|
||||
Kp2aLog.Log("key file length after: " + _keyFile?.Length);
|
||||
KeyProviderTypes.Add(KeyProviders.KeyFile);
|
||||
break;
|
||||
case 2:
|
||||
@@ -1242,11 +1254,16 @@ namespace keepass2android
|
||||
private void RestoreState(Bundle savedInstanceState)
|
||||
{
|
||||
if (savedInstanceState != null)
|
||||
{
|
||||
{
|
||||
Kp2aLog.Log("PasswordActivity: Restoring state from savedInstanceState");
|
||||
_showPassword = savedInstanceState.GetBoolean(ShowpasswordKey, false);
|
||||
MakePasswordMaskedOrVisible();
|
||||
|
||||
SetKeyProviderFromString(savedInstanceState.GetString(KeyFileOrProviderKey));
|
||||
if (!string.IsNullOrEmpty(savedInstanceState.GetString(KeyFileOrProviderKey)))
|
||||
Kp2aLog.Log("No key provider found");
|
||||
else
|
||||
Kp2aLog.Log("Key provider found");
|
||||
SetKeyProviderFromString(savedInstanceState.GetString(KeyFileOrProviderKey));
|
||||
_password = FindViewById<EditText>(Resource.Id.password_edit).Text = savedInstanceState.GetString(PasswordKey);
|
||||
|
||||
_pendingOtps = new List<string>(savedInstanceState.GetStringArrayList(PendingOtpsKey));
|
||||
|
@@ -40,7 +40,7 @@
|
||||
<string name="homepage">https://github.com/PhilippC/keepass2android</string>
|
||||
<string name="further_author_names">Alex Vallat, Ben Rush, Matthieu, Wiktor Ławski, gilbsgilbs, Chih-Hsuan Yen, DDoSolitary, marcoDallas</string>
|
||||
<string name="designer_names">Niki Hüttner (http://www.close-cut.de), Stefano Pignataro (http://www.spstudio.at)</string>
|
||||
<string name="supporter_names">Arno Welzel, Sebastián Ramírez</string>
|
||||
<string name="supporter_names">Arno Welzel, Sebastián Ramírez, A. Finkhäuser</string>
|
||||
<string name="issues">https://github.com/PhilippC/keepass2android/issues</string>
|
||||
<string name="oi_filemanager_market">market://details?id=org.openintents.filemanager</string>
|
||||
<string name="oi_filemanager_web">https://openintents.googlecode.com/files/FileManager-2.0.2.apk</string>
|
||||
|
@@ -45,12 +45,13 @@
|
||||
<BundleAssemblies>false</BundleAssemblies>
|
||||
<AndroidCreatePackagePerAbi>false</AndroidCreatePackagePerAbi>
|
||||
<AndroidEnableMultiDex>true</AndroidEnableMultiDex>
|
||||
<EnableProguard>true</EnableProguard>
|
||||
<AotAssemblies>false</AotAssemblies>
|
||||
<EnableLLVM>false</EnableLLVM>
|
||||
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize>
|
||||
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
|
||||
<MandroidI18n />
|
||||
<AndroidLinkTool>r8</AndroidLinkTool>
|
||||
<AndroidUseAapt2>false</AndroidUseAapt2>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>full</DebugType>
|
||||
|
@@ -136,13 +136,14 @@ namespace keepass2android.services.AutofillBase
|
||||
|
||||
if (query.IncompatiblePackageAndDomain == false)
|
||||
{
|
||||
Kp2aLog.Log("AF: (query.IncompatiblePackageAndDomain == false)");
|
||||
//domain and package are compatible. Use Domain if available and package otherwise. Can fill without warning.
|
||||
foreach (var entryDataset in BuildEntryDatasets(query.DomainOrPackage, query.WebDomain,
|
||||
query.PackageName,
|
||||
autofillIds, parser, DisplayWarning.None).Where(ds => ds != null)
|
||||
)
|
||||
{
|
||||
|
||||
Kp2aLog.Log("AF: Got EntryDataset " + (entryDataset == null));
|
||||
responseBuilder.AddDataset(entryDataset);
|
||||
hasEntryDataset = true;
|
||||
}
|
||||
@@ -196,7 +197,9 @@ namespace keepass2android.services.AutofillBase
|
||||
DisplayWarning warning)
|
||||
{
|
||||
List<Dataset> result = new List<Dataset>();
|
||||
Kp2aLog.Log("AF: BuildEntryDatasets");
|
||||
var suggestedEntries = GetSuggestedEntries(query).ToDictionary(e => e.DatasetName, e => e);
|
||||
Kp2aLog.Log("AF: BuildEntryDatasets found " + suggestedEntries.Count + " entries");
|
||||
foreach (var filledAutofillFieldCollection in suggestedEntries.Values)
|
||||
{
|
||||
|
||||
@@ -209,6 +212,8 @@ namespace keepass2android.services.AutofillBase
|
||||
FilledAutofillFieldCollection partitionData =
|
||||
AutofillHintsHelper.FilterForPartition(filledAutofillFieldCollection, parser.AutofillFields.FocusedAutofillCanonicalHints);
|
||||
|
||||
Kp2aLog.Log("AF: Add dataset");
|
||||
|
||||
result.Add(AutofillHelper.NewDataset(this, parser.AutofillFields, partitionData, IntentBuilder));
|
||||
}
|
||||
else
|
||||
@@ -218,7 +223,10 @@ namespace keepass2android.services.AutofillBase
|
||||
IntentBuilder.GetAuthIntentSenderForWarning(this, query, queryDomain, queryPackage, warning);
|
||||
var datasetName = filledAutofillFieldCollection.DatasetName;
|
||||
if (datasetName == null)
|
||||
return null;
|
||||
{
|
||||
Kp2aLog.Log("AF: dataset name is null");
|
||||
continue;
|
||||
}
|
||||
|
||||
RemoteViews presentation =
|
||||
AutofillHelper.NewRemoteViews(PackageName, datasetName, AppNames.LauncherIcon);
|
||||
@@ -230,7 +238,7 @@ namespace keepass2android.services.AutofillBase
|
||||
{
|
||||
datasetBuilder.SetValue(autofillId, AutofillValue.ForText("PLACEHOLDER"));
|
||||
}
|
||||
|
||||
Kp2aLog.Log("AF: Add auth dataset");
|
||||
result.Add(datasetBuilder.Build());
|
||||
}
|
||||
}
|
||||
|
@@ -267,8 +267,8 @@ namespace keepass2android.services.AutofillBase
|
||||
DomainName outDomain;
|
||||
if (DomainName.TryParse(webDomain, domainSuffixParserCache, out outDomain))
|
||||
{
|
||||
webDomain = outDomain.RegisterableDomainName;
|
||||
}
|
||||
webDomain = outDomain.RawDomainName;
|
||||
}
|
||||
|
||||
if (webDomain != null)
|
||||
{
|
||||
|
Reference in New Issue
Block a user