keepass2android/src/keepass2android/QuickUnlock.cs

217 lines
5.7 KiB
C#
Raw Normal View History

2013-02-23 11:43:42 -05:00
/*
This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll.
Keepass2Android is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
2013-02-23 11:43:42 -05:00
(at your option) any later version.
Keepass2Android is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Keepass2Android. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Views;
using Android.Widget;
using Android.Content.PM;
using KeePassLib.Keys;
using Android.Preferences;
using Android.Views.InputMethods;
using KeePassLib.Serialization;
namespace keepass2android
{
[Activity(Label = "@string/app_name", ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
Theme = "@style/MyTheme")]
2013-02-23 11:43:42 -05:00
public class QuickUnlock : LifecycleDebugActivity
{
private IOConnectionInfo _ioc;
private QuickUnlockBroadcastReceiver _intentReceiver;
2013-02-23 11:43:42 -05:00
private ActivityDesign _design;
public QuickUnlock()
{
_design = new ActivityDesign(this);
}
2013-02-23 11:43:42 -05:00
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
_design.ApplyTheme();
2013-02-23 11:43:42 -05:00
//use FlagSecure to make sure the last (revealed) character of the password is not visible in recent apps
if (PreferenceManager.GetDefaultSharedPreferences(this).GetBoolean(
GetString(Resource.String.ViewDatabaseSecure_key), true))
{
Window.SetFlags(WindowManagerFlags.Secure, WindowManagerFlags.Secure);
}
_ioc = App.Kp2a.GetDb().Ioc;
2013-02-23 11:43:42 -05:00
if (_ioc == null)
2013-02-23 11:43:42 -05:00
{
Finish();
return;
}
SetContentView(Resource.Layout.QuickUnlock);
if (App.Kp2a.GetDb().KpDatabase.Name != "")
{
FindViewById(Resource.Id.filename_label).Visibility = ViewStates.Visible;
((TextView) FindViewById(Resource.Id.filename_label)).Text = App.Kp2a.GetDb().KpDatabase.Name;
}
else
{
if (
PreferenceManager.GetDefaultSharedPreferences(this)
.GetBoolean(GetString(Resource.String.RememberRecentFiles_key),
Resources.GetBoolean(Resource.Boolean.RememberRecentFiles_default)))
{
((TextView) FindViewById(Resource.Id.filename_label)).Text = App.Kp2a.GetFileStorage(_ioc).GetDisplayName(_ioc);
}
else
{
((TextView) FindViewById(Resource.Id.filename_label)).Text = "*****";
}
}
2013-02-23 11:43:42 -05:00
TextView txtLabel = (TextView) FindViewById(Resource.Id.QuickUnlock_label);
2013-02-23 11:43:42 -05:00
2013-07-25 08:47:05 -04:00
int quickUnlockLength = App.Kp2a.QuickUnlockKeyLength;
2013-02-23 11:43:42 -05:00
txtLabel.Text = GetString(Resource.String.QuickUnlock_label, new Java.Lang.Object[] {quickUnlockLength});
2013-02-23 11:43:42 -05:00
EditText pwd = (EditText) FindViewById(Resource.Id.QuickUnlock_password);
2013-02-23 11:43:42 -05:00
pwd.SetEms(quickUnlockLength);
Button btnUnlock = (Button) FindViewById(Resource.Id.QuickUnlock_button);
btnUnlock.Click += (object sender, EventArgs e) =>
2013-02-23 11:43:42 -05:00
{
OnUnlock(quickUnlockLength, pwd);
};
Button btnLock = (Button) FindViewById(Resource.Id.QuickUnlock_buttonLock);
btnLock.Click += (object sender, EventArgs e) =>
2013-02-23 11:43:42 -05:00
{
App.Kp2a.LockDatabase(false);
Finish();
};
pwd.EditorAction += (sender, args) =>
{
if ((args.ActionId == ImeAction.Done) || ((args.ActionId == ImeAction.ImeNull) && (args.Event.Action == KeyEventActions.Down)))
OnUnlock(quickUnlockLength, pwd);
};
2013-02-23 11:43:42 -05:00
_intentReceiver = new QuickUnlockBroadcastReceiver(this);
IntentFilter filter = new IntentFilter();
filter.AddAction(Intents.DatabaseLocked);
RegisterReceiver(_intentReceiver, filter);
}
private void OnUnlock(int quickUnlockLength, EditText pwd)
{
KcpPassword kcpPassword = (KcpPassword) App.Kp2a.GetDb().KpDatabase.MasterKey.GetUserKey(typeof (KcpPassword));
String password = kcpPassword.Password.ReadString();
String expectedPasswordPart = password.Substring(Math.Max(0, password.Length - quickUnlockLength),
Math.Min(password.Length, quickUnlockLength));
if (pwd.Text == expectedPasswordPart)
{
App.Kp2a.UnlockDatabase();
}
else
{
App.Kp2a.LockDatabase(false);
Toast.MakeText(this, GetString(Resource.String.QuickUnlock_fail), ToastLength.Long).Show();
}
Finish();
}
private void OnLockDatabase()
{
CheckIfUnloaded();
2013-02-23 11:43:42 -05:00
}
protected override void OnResume()
{
base.OnResume();
_design.ReapplyTheme();
CheckIfUnloaded();
EditText pwd = (EditText) FindViewById(Resource.Id.QuickUnlock_password);
pwd.PostDelayed(() =>
{
InputMethodManager keyboard = (InputMethodManager) GetSystemService(Context.InputMethodService);
keyboard.ShowSoftInput(pwd, 0);
}, 50);
}
protected override void OnDestroy()
{
base.OnDestroy();
try
{
UnregisterReceiver(_intentReceiver);
}
catch (Exception e)
{
Kp2aLog.Log(e.ToString());
}
}
private void CheckIfUnloaded()
{
if ((App.Kp2a.GetDb() == null) || (App.Kp2a.GetDb().Loaded == false))
{
Finish();
}
2013-02-23 11:43:42 -05:00
}
public override void OnBackPressed()
{
SetResult(KeePass.ExitClose);
base.OnBackPressed();
}
private class QuickUnlockBroadcastReceiver : BroadcastReceiver
{
readonly QuickUnlock _activity;
public QuickUnlockBroadcastReceiver(QuickUnlock activity)
{
_activity = activity;
}
public override void OnReceive(Context context, Intent intent)
{
switch (intent.Action)
{
case Intents.DatabaseLocked:
_activity.OnLockDatabase();
break;
}
}
}
2013-02-23 11:43:42 -05:00
}
}