* improvements to Plugin handling and AccessibilityService based AutoFill:
* don't forget plugin scopes (fixes #136), improves workflow to setup AutoFill plugin * fix display issues with scopes * make sure credentials are not filled several times but always show notification * removed unnecessary permission
This commit is contained in:
@@ -8,7 +8,7 @@ Allows to switch input method automatically on non-rooted devices.
|
|||||||
|
|
||||||
# AutoFill Plug-in
|
# AutoFill Plug-in
|
||||||
Uses Android Accessibility Service to provide an option to AutoFill forms (e.g. on Chrome) or any Android app.
|
Uses Android Accessibility Service to provide an option to AutoFill forms (e.g. on Chrome) or any Android app.
|
||||||
[https://philippc.github.io/keepass2android/AccServiceAutoFill.md]
|
[https://philippc.github.io/keepass2android/AccServiceAutoFill.html]
|
||||||
|
|
||||||
# InputStick Plug-in
|
# InputStick Plug-in
|
||||||
Allows to send text from KP2A via InputStick to your PC.
|
Allows to send text from KP2A via InputStick to your PC.
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.content.pm.ApplicationInfo;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ import keepass2android.kbbridge.KeyboardData;
|
|||||||
public class AutoFillService extends AccessibilityService {
|
public class AutoFillService extends AccessibilityService {
|
||||||
|
|
||||||
|
|
||||||
private static boolean _hasUsedData = false;
|
private static boolean _hasUsedData = true;
|
||||||
private static String _lastSearchUrl;
|
private static String _lastSearchUrl;
|
||||||
private static final String _logTag = "KP2AAF";
|
private static final String _logTag = "KP2AAF";
|
||||||
private static boolean _isRunning;
|
private static boolean _isRunning;
|
||||||
@@ -193,6 +194,7 @@ public class AutoFillService extends AccessibilityService {
|
|||||||
if (ExistsNodeOrChildren(root, new PasswordFieldCondition()))
|
if (ExistsNodeOrChildren(root, new PasswordFieldCondition()))
|
||||||
{
|
{
|
||||||
if ((getLastReceivedCredentialsUser() != null) &&
|
if ((getLastReceivedCredentialsUser() != null) &&
|
||||||
|
(!_hasUsedData) &&
|
||||||
(Objects.equals(url, _lastSearchUrl)
|
(Objects.equals(url, _lastSearchUrl)
|
||||||
|| isSame(getCredentialsField("URL"), url)))
|
|| isSame(getCredentialsField("URL"), url)))
|
||||||
{
|
{
|
||||||
@@ -313,6 +315,7 @@ public class AutoFillService extends AccessibilityService {
|
|||||||
@TargetApi(21)
|
@TargetApi(21)
|
||||||
private void FillPassword(String url, AccessibilityNodeInfo usernameEdit, List<AccessibilityNodeInfo> passwordFields)
|
private void FillPassword(String url, AccessibilityNodeInfo usernameEdit, List<AccessibilityNodeInfo> passwordFields)
|
||||||
{
|
{
|
||||||
|
Log.d(_logTag, "_hasUsedData = " + _hasUsedData);
|
||||||
if ((keepass2android.kbbridge.KeyboardData.hasData()) && (_hasUsedData == false))
|
if ((keepass2android.kbbridge.KeyboardData.hasData()) && (_hasUsedData == false))
|
||||||
{
|
{
|
||||||
fillDataInTextField(usernameEdit, getLastReceivedCredentialsUser());
|
fillDataInTextField(usernameEdit, getLastReceivedCredentialsUser());
|
||||||
|
|||||||
@@ -55,18 +55,6 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<service android:name="keepass2android.autofill.AutoFillService"
|
|
||||||
android:enabled="true"
|
|
||||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.accessibilityservice.AccessibilityService" />
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data
|
|
||||||
android:name="android.accessibilityservice"
|
|
||||||
android:resource="@xml/accserviceconfig" />
|
|
||||||
|
|
||||||
</service>
|
|
||||||
|
|
||||||
<activity android:configChanges="orientation" android:label="@string/app_name" android:theme="@style/MyTheme_Blue" android:name="keepass2android.PasswordActivity" android:windowSoftInputMode="adjustResize">
|
<activity android:configChanges="orientation" android:label="@string/app_name" android:theme="@style/MyTheme_Blue" android:name="keepass2android.PasswordActivity" android:windowSoftInputMode="adjustResize">
|
||||||
<intent-filter android:label="@string/app_name">
|
<intent-filter android:label="@string/app_name">
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
@@ -129,6 +117,5 @@
|
|||||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||||
<!-- Samsung Pass permission -->
|
<!-- Samsung Pass permission -->
|
||||||
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
|
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
|
||||||
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
|
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -140,7 +140,6 @@
|
|||||||
<uses-permission android:name="keepass2android.keepass2android.permission.KP2aInternalFileBrowsing" />
|
<uses-permission android:name="keepass2android.keepass2android.permission.KP2aInternalFileBrowsing" />
|
||||||
<uses-permission android:name="keepass2android.keepass2android_debug.permission.KP2aInternalSearch" />
|
<uses-permission android:name="keepass2android.keepass2android_debug.permission.KP2aInternalSearch" />
|
||||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||||
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
|
|
||||||
|
|
||||||
<!-- Samsung Pass permission -->
|
<!-- Samsung Pass permission -->
|
||||||
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
|
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
|
||||||
|
|||||||
@@ -116,7 +116,7 @@
|
|||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||||
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
|
|
||||||
<uses-permission android:name="keepass2android.keepass2android.permission.KP2aInternalFileBrowsing" />
|
<uses-permission android:name="keepass2android.keepass2android.permission.KP2aInternalFileBrowsing" />
|
||||||
<uses-permission android:name="keepass2android.keepass2android_debug.permission.KP2aInternalSearch" />
|
<uses-permission android:name="keepass2android.keepass2android_debug.permission.KP2aInternalSearch" />
|
||||||
<!-- Samsung Pass permission -->
|
<!-- Samsung Pass permission -->
|
||||||
|
|||||||
@@ -102,6 +102,18 @@ namespace keepass2android
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnStart()
|
||||||
|
{
|
||||||
|
base.OnStart();
|
||||||
|
Kp2aLog.Log("Starting QueryCredentialsActivity");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnResume()
|
||||||
|
{
|
||||||
|
base.OnResume();
|
||||||
|
Kp2aLog.Log("Resuming QueryCredentialsActivity");
|
||||||
|
}
|
||||||
|
|
||||||
private void ShowToast()
|
private void ShowToast()
|
||||||
{
|
{
|
||||||
string pluginDisplayName = _pluginPackage;
|
string pluginDisplayName = _pluginPackage;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using Android.Content.PM;
|
using Android.Content.PM;
|
||||||
using Android.Content.Res;
|
using Android.Content.Res;
|
||||||
using Android.Graphics.Drawables;
|
using Android.Graphics.Drawables;
|
||||||
@@ -6,6 +7,7 @@ using Android.Content;
|
|||||||
using Android.Views;
|
using Android.Views;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Android.App;
|
using Android.App;
|
||||||
|
using Android.Runtime;
|
||||||
|
|
||||||
namespace keepass2android
|
namespace keepass2android
|
||||||
{
|
{
|
||||||
@@ -80,6 +82,11 @@ namespace keepass2android
|
|||||||
int layoutResourceId;
|
int layoutResourceId;
|
||||||
IList<PluginItem> data = null;
|
IList<PluginItem> data = null;
|
||||||
|
|
||||||
|
public PluginArrayAdapter(IntPtr javaReference, JniHandleOwnership transfer)
|
||||||
|
: base(javaReference, transfer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public PluginArrayAdapter(Context context, int layoutResourceId, IList<PluginItem> data) :
|
public PluginArrayAdapter(Context context, int layoutResourceId, IList<PluginItem> data) :
|
||||||
base(context, layoutResourceId, data)
|
base(context, layoutResourceId, data)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ namespace keepass2android
|
|||||||
i.PutExtra(Strings.ExtraSender, _ctx.PackageName);
|
i.PutExtra(Strings.ExtraSender, _ctx.PackageName);
|
||||||
i.PutExtra(Strings.ExtraRequestToken, GetPreferencesForPlugin(pluginPackage).GetString(_requesttoken, null));
|
i.PutExtra(Strings.ExtraRequestToken, GetPreferencesForPlugin(pluginPackage).GetString(_requesttoken, null));
|
||||||
_ctx.SendBroadcast(i);
|
_ctx.SendBroadcast(i);
|
||||||
StorePlugin(pluginPackage, null, new List<string>());
|
StorePlugin(pluginPackage, null, GetPluginScopes(pluginPackage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ namespace keepass2android
|
|||||||
private void UpdateView()
|
private void UpdateView()
|
||||||
{
|
{
|
||||||
var scopesContainer = FindViewById<LinearLayout>(Resource.Id.scopes_list);
|
var scopesContainer = FindViewById<LinearLayout>(Resource.Id.scopes_list);
|
||||||
//scopesContainer.RemoveAllViews();
|
scopesContainer.RemoveAllViews();
|
||||||
|
|
||||||
var pluginDb = new PluginDatabase(this);
|
var pluginDb = new PluginDatabase(this);
|
||||||
_checkbox.Checked = pluginDb.IsEnabled(_pluginPackageName);
|
_checkbox.Checked = pluginDb.IsEnabled(_pluginPackageName);
|
||||||
|
|||||||
@@ -72,13 +72,14 @@ namespace keepass2android
|
|||||||
PluginDatabase pluginDb = new PluginDatabase(context);
|
PluginDatabase pluginDb = new PluginDatabase(context);
|
||||||
if (intent.Action == Strings.ActionRequestAccess)
|
if (intent.Action == Strings.ActionRequestAccess)
|
||||||
{
|
{
|
||||||
var senderPackage = intent.GetStringExtra(Strings.ExtraSender);
|
string senderPackage = intent.GetStringExtra(Strings.ExtraSender);
|
||||||
var requestToken = intent.GetStringExtra(Strings.ExtraRequestToken);
|
string requestToken = intent.GetStringExtra(Strings.ExtraRequestToken);
|
||||||
|
|
||||||
var requestedScopes = intent.GetStringArrayListExtra(Strings.ExtraScopes);
|
IList<string> requestedScopes = intent.GetStringArrayListExtra(Strings.ExtraScopes);
|
||||||
|
|
||||||
if (!AreScopesValid(requestedScopes))
|
if (!AreScopesValid(requestedScopes))
|
||||||
{
|
{
|
||||||
|
Log.Debug(_tag, "requested scopes not valid");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace keepass2android
|
|||||||
}
|
}
|
||||||
protected override void OnResume()
|
protected override void OnResume()
|
||||||
{
|
{
|
||||||
base.OnResume();
|
|
||||||
PluginDatabase pluginDb = new PluginDatabase(this);
|
PluginDatabase pluginDb = new PluginDatabase(this);
|
||||||
|
|
||||||
_items = (from pluginPackage in pluginDb.GetAllPluginPackages()
|
_items = (from pluginPackage in pluginDb.GetAllPluginPackages()
|
||||||
@@ -59,6 +59,13 @@ namespace keepass2android
|
|||||||
* */
|
* */
|
||||||
_pluginArrayAdapter = new PluginArrayAdapter(this, Resource.Layout.ListViewPluginRow, _items);
|
_pluginArrayAdapter = new PluginArrayAdapter(this, Resource.Layout.ListViewPluginRow, _items);
|
||||||
ListAdapter = _pluginArrayAdapter;
|
ListAdapter = _pluginArrayAdapter;
|
||||||
|
base.OnResume();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnPause()
|
||||||
|
{
|
||||||
|
base.OnPause();
|
||||||
|
ListAdapter = _pluginArrayAdapter = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user