Compare commits

...

9 Commits

Author SHA1 Message Date
Philipp Crocoll
0c34625782 Merge remote-tracking branch 'remotes/origin/master' into feature/otpauth-uris 2025-03-25 10:56:42 +01:00
Philipp Crocoll
e86fa6f9fa add support for otpauth:// URIs 2025-03-25 10:56:24 +01:00
PhilippC
e2e975f357 Merge pull request #2805 from PhilippC/feature/debug-improvements
Improve debugging experience
2025-03-25 10:53:02 +01:00
Philipp Crocoll
8eaf6d3f88 add comment in Makefile 2025-03-25 10:52:33 +01:00
PhilippC
a9fed1c203 Merge pull request #2804 from PhilippC/bugfix/gdrive-class-def-not-found
Bugfix/gdrive class def not found
2025-03-18 17:07:33 +01:00
Philipp Crocoll
6d8407676d add a custom "Kp2a debug" icon for distinguishability. remove an Assert we don't use and which should fire during debugging. 2025-03-18 16:43:47 +01:00
Philipp Crocoll
1157716c9c manifest for 1.12-r3 2025-03-18 16:35:58 +01:00
Philipp Crocoll
861615b7a4 update AndroidX packages and add missing dependencies to Guava and PlayServices.Auth. 2025-03-18 16:34:31 +01:00
Philipp Crocoll
e12d11264e switch to testing Google Drive 2025-03-18 16:32:55 +01:00
12 changed files with 85 additions and 23 deletions

View File

@@ -20,6 +20,7 @@
# - nuget: restore NuGet packages # - nuget: restore NuGet packages
# - msbuild: build the project # - msbuild: build the project
# - apk: same as all # - apk: same as all
# - manifestlink: creates a symlink (to be used in building) to the AndroidManifest corresponding to the selected Flavor
# #
# - distclean: run a 'git clean -xdff'. Remove everyhing that is not in the git tree. # - distclean: run a 'git clean -xdff'. Remove everyhing that is not in the git tree.
# - clean: all clean_* targets below # - clean: all clean_* targets below

View File

@@ -35,8 +35,6 @@ namespace KeePassLib.Cryptography
{ {
get get
{ {
Debug.Assert(m_dicts.Count > 0); // Should be initialized
int iMaxLen = 0; int iMaxLen = 0;
foreach(int iLen in m_dicts.Keys) foreach(int iLen in m_dicts.Keys)
{ {

View File

@@ -113,4 +113,15 @@ extends Activity implements JavaFileStorage.FileStorageSetupActivity {
return state; return state;
} }
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivity.storageToTest.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
} }

View File

@@ -147,6 +147,7 @@ import java.util.List;
//import keepass2android.javafilestorage.DropboxCloudRailStorage; //import keepass2android.javafilestorage.DropboxCloudRailStorage;
import keepass2android.javafilestorage.DropboxV2Storage; import keepass2android.javafilestorage.DropboxV2Storage;
import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage; import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage;
import keepass2android.javafilestorage.GoogleDriveFullFileStorage;
import keepass2android.javafilestorage.ICertificateErrorHandler; import keepass2android.javafilestorage.ICertificateErrorHandler;
import keepass2android.javafilestorage.JavaFileStorage; import keepass2android.javafilestorage.JavaFileStorage;
import keepass2android.javafilestorage.JavaFileStorage.FileEntry; import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
@@ -547,7 +548,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
//storageToTest = new GoogleDriveAppDataFileStorage(); //storageToTest = new GoogleDriveAppDataFileStorage();
storageToTest = new WebDavStorage(new ICertificateErrorHandler() { /*storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
@Override @Override
public boolean onValidationError(String error) { public boolean onValidationError(String error) {
return false; return false;
@@ -558,10 +559,11 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
return false; return false;
} }
}); });
*/
//storageToTest = new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart); //storageToTest = new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
//storageToTest = new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart); //storageToTest = new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
//storageToTest = new DropboxAppFolderFileStorage(ctx,"ax0268uydp1ya57", "3s86datjhkihwyc", true); //storageToTest = new DropboxAppFolderFileStorage(ctx,"ax0268uydp1ya57", "3s86datjhkihwyc", true);
storageToTest = new GoogleDriveFullFileStorage();
return storageToTest; return storageToTest;
@@ -580,6 +582,8 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
getMenuInflater().inflate(R.menu.main, menu); getMenuInflater().inflate(R.menu.main, menu);
return true; return true;
} }
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {

View File

@@ -47,8 +47,8 @@
<permission android:description="@string/permission_desc2" android:icon="@drawable/ic_notify_locked" android:label="KP2A entry search" android:name="keepass2android.keepass2android_debug.permission.KP2aInternalSearch" android:protectionLevel="signature" /> <permission android:description="@string/permission_desc2" android:icon="@drawable/ic_notify_locked" android:label="KP2A entry search" android:name="keepass2android.keepass2android_debug.permission.KP2aInternalSearch" android:protectionLevel="signature" />
<permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android_debug.permission.Kp2aChooseAutofill" android:protectionLevel="signature" /> <permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android_debug.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
<application <application
android:icon="@mipmap/ic_launcher_online" android:icon="@mipmap/ic_launcher_debug"
android:roundIcon="@mipmap/ic_launcher_online_round" android:roundIcon="@mipmap/ic_launcher_debug_round"
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
> >
<meta-data <meta-data
@@ -243,6 +243,15 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
<action android:name="keepass2android.ACTION_START_WITH_TASK" /> <action android:name="keepass2android.ACTION_START_WITH_TASK" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="otpauth"/>
<data android:host="totp"/>
<data android:host="hotp"/>
</intent-filter>
</activity> </activity>
<uses-library android:required="false" android:name="com.sec.android.app.multiwindow" /> <uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
<meta-data android:name="com.sec.android.support.multiwindow" android:value="true" /> <meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="203" android:versionCode="204"
android:versionName="1.12-r2" android:versionName="1.12-r3"
package="keepass2android.keepass2android" package="keepass2android.keepass2android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto"> android:installLocation="auto">
@@ -255,7 +255,14 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
<action android:name="keepass2android.ACTION_START_WITH_TASK" /> <action android:name="keepass2android.ACTION_START_WITH_TASK" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
x <intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="otpauth"/>
<data android:host="totp"/>
<data android:host="hotp"/>
</intent-filter>
</activity> </activity>
<uses-library android:required="false" android:name="com.sec.android.app.multiwindow" /> <uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
<meta-data android:name="com.sec.android.support.multiwindow" android:value="true" /> <meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />

View File

@@ -236,6 +236,14 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
<action android:name="keepass2android.ACTION_START_WITH_TASK" /> <action android:name="keepass2android.ACTION_START_WITH_TASK" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="otpauth"/>
<data android:host="totp"/>
<data android:host="hotp"/>
</intent-filter>
</activity> </activity>
<uses-library android:required="false" android:name="com.sec.android.app.multiwindow" /> <uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
<meta-data android:name="com.sec.android.support.multiwindow" android:value="true" /> <meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -27,6 +27,7 @@ using KeePassLib.Serialization;
using Console = System.Console; using Console = System.Console;
using Object = Java.Lang.Object; using Object = Java.Lang.Object;
using AndroidX.Core.Content; using AndroidX.Core.Content;
using Uri = Android.Net.Uri;
namespace keepass2android namespace keepass2android
{ {
@@ -302,9 +303,23 @@ namespace keepass2android
} }
else else
{ {
if (Intent.Action == Intent.ActionView) if (Intent.Action == Intent.ActionView)
{ {
GetIocFromViewIntent(Intent); if (IsOtpUri(Intent.Data))
{
AppTask = new CreateEntryThenCloseTask()
{
AllFields = Newtonsoft.Json.JsonConvert.SerializeObject(new Dictionary<string, string>()
{
{ "otp", Intent.DataString }
})
};
}
else
{
GetIocFromViewIntent(Intent);
}
} }
else if (Intent.Action == Intent.ActionSend) else if (Intent.Action == Intent.ActionSend)
{ {
@@ -334,6 +349,11 @@ namespace keepass2android
} }
private bool IsOtpUri(Uri? uri)
{
return uri?.Scheme == "otpauth";
}
protected override void OnStart() protected override void OnStart()
{ {
base.OnStart(); base.OnStart();

View File

@@ -93,11 +93,13 @@ namespace keepass2android
#if DEBUG #if DEBUG
public const string PackagePart = "keepass2android_debug"; public const string PackagePart = "keepass2android_debug";
public const string Searchable = "@xml/searchable_debug"; public const string Searchable = "@xml/searchable_debug";
public const int LauncherIcon = Resource.Mipmap.ic_launcher_debug;
#else #else
public const string PackagePart = "keepass2android"; public const string PackagePart = "keepass2android";
public const string Searchable = "@xml/searchable"; public const string Searchable = "@xml/searchable";
public const int LauncherIcon = Resource.Mipmap.ic_launcher_online;
#endif #endif
public const int LauncherIcon = Resource.Mipmap.ic_launcher_online;
public const int NotificationLockedIcon = Resource.Drawable.ic_notify_loaded; public const int NotificationLockedIcon = Resource.Drawable.ic_notify_loaded;
public const int NotificationUnlockedIcon = Resource.Drawable.ic_notify_locked; public const int NotificationUnlockedIcon = Resource.Drawable.ic_notify_locked;

View File

@@ -733,18 +733,20 @@
<AndroidNativeLibrary Include="..\java\argon2\libs\armeabi-v7a\libargon2.so" Link="armeabi-v7a\libargon2.so" /> <AndroidNativeLibrary Include="..\java\argon2\libs\armeabi-v7a\libargon2.so" Link="armeabi-v7a\libargon2.so" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Xamarin.AndroidX.AppCompat" Version="1.7.0.3" /> <PackageReference Include="Xamarin.AndroidX.AppCompat" Version="1.7.0.5" />
<PackageReference Include="Xamarin.AndroidX.AppCompat.AppCompatResources" Version="1.7.0.3" /> <PackageReference Include="Xamarin.AndroidX.AppCompat.AppCompatResources" Version="1.7.0.5" />
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.28" /> <PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.30" />
<PackageReference Include="Xamarin.AndroidX.Biometric" Version="1.1.0.25" /> <PackageReference Include="Xamarin.AndroidX.Biometric" Version="1.1.0.27" />
<PackageReference Include="Xamarin.AndroidX.CoordinatorLayout" Version="1.2.0.17" /> <PackageReference Include="Xamarin.AndroidX.CoordinatorLayout" Version="1.3.0" />
<PackageReference Include="Xamarin.AndroidX.CursorAdapter" Version="1.0.0.29" /> <PackageReference Include="Xamarin.AndroidX.CursorAdapter" Version="1.0.0.31" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Common" Version="2.8.5.1" /> <PackageReference Include="Xamarin.AndroidX.Lifecycle.Common" Version="2.8.7.2" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Runtime" Version="2.8.5.1" /> <PackageReference Include="Xamarin.AndroidX.Lifecycle.Runtime" Version="2.8.7.2" />
<PackageReference Include="Xamarin.AndroidX.Preference" Version="1.2.1.10" /> <PackageReference Include="Xamarin.AndroidX.Preference" Version="1.2.1.12" />
<PackageReference Include="Xamarin.Google.Android.Material" Version="1.11.0.3" /> <PackageReference Include="Xamarin.Google.Android.Material" Version="1.12.0.2" />
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.5.0.2" /> <PackageReference Include="Xamarin.Google.Guava" Version="33.4.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Code.Scanner" Version="116.1.0.3" /> <PackageReference Include="Xamarin.GooglePlayServices.Auth" Version="121.3.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.5.0.4" />
<PackageReference Include="Xamarin.GooglePlayServices.Code.Scanner" Version="116.1.0.10" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AndroidFileChooserBinding\AndroidFileChooserBinding.csproj" /> <ProjectReference Include="..\AndroidFileChooserBinding\AndroidFileChooserBinding.csproj" />