using System;
using System.Collections.Generic;
using System.Linq;
using Android.App;
using keepass2android;
using KeePassLib;
using KeePassLib.Security;
using KeePassLib.Serialization;
using Object = Java.Lang.Object;
namespace keepass2android
{
///
/// Edit mode implementation for AutoOpen entries
///
public class AutoOpenEdit : EditModeBase
{
private const string strVisible = "Visible";
private const string strEnabled = "Enabled";
private const string strUiKeyFile = "_ui_KeyFile";
private const string strUiDatabaseFile = "_ui_DatabaseFile";
private const string strUiIfDevice = "_ui_IfDevice_";
public AutoOpenEdit(PwEntry entry)
{
}
public override bool IsVisible(string fieldKey)
{
if (fieldKey == PwDefs.TitleField
|| fieldKey == PwDefs.PasswordField
|| fieldKey == strVisible
|| fieldKey == strEnabled
|| fieldKey.StartsWith("_ui_"))
{
return true;
}
return false;
}
public override IEnumerable SortExtraFieldKeys(IEnumerable keys)
{
return keys.OrderBy(s =>
{
if (s == strUiDatabaseFile) return 1;
if (s == strEnabled) return 2;
if (s == strUiKeyFile) return 10000;
if (s == strVisible) return 10001;
return 10;
}).ThenBy(s => s);
}
public override bool ShowAddAttachments
{
get { return false; }
}
public override bool ShowAddExtras
{
get { return false; }
}
public override string GetTitle(string key)
{
if (key == strVisible)
return LocaleManager.LocalizedAppContext.GetString(Resource.String.Visible_title);
if (key == strEnabled)
return LocaleManager.LocalizedAppContext.GetString(Resource.String.child_db_Enabled_title);
if (key == strUiKeyFile)
return LocaleManager.LocalizedAppContext.GetString(Resource.String.keyfile_heading);
if (key == strUiDatabaseFile)
return LocaleManager.LocalizedAppContext.GetString(Resource.String.database_file_heading);
if (key.StartsWith(strUiIfDevice))
{
return LocaleManager.LocalizedAppContext.GetString(Resource.String.if_device_text,new Object[]{key.Substring(strUiIfDevice.Length)});
}
return key;
}
public override string GetFieldType(string key)
{
if ((key == strEnabled)
|| key == strVisible
|| key.StartsWith(strUiIfDevice))
return "bool";
if ((key == strUiDatabaseFile)
|| (key == strUiKeyFile))
return "file";
return "";
}
public override void InitializeEntry(PwEntry entry)
{
base.InitializeEntry(entry);
if (!entry.Strings.Exists(strVisible))
{
entry.Strings.Set(strVisible, new ProtectedString(false, "true"));
}
if (!entry.Strings.Exists(strEnabled))
{
entry.Strings.Set(strEnabled, new ProtectedString(false, "true"));
}
var autoExecItem = KeeAutoExecExt.MakeAutoExecItem(App.Kp2a.CurrentDb.KpDatabase, entry, 0);
IOConnectionInfo ioc;
if (!KeeAutoExecExt.TryGetDatabaseIoc(autoExecItem, out ioc))
ioc = IOConnectionInfo.FromPath(entry.Strings.ReadSafe(PwDefs.UrlField));
string path = ioc.Path;
try
{
var filestorage = App.Kp2a.GetFileStorage(ioc);
if (filestorage != null)
{
path = filestorage.IocToPath(ioc);
}
}
catch (NoFileStorageFoundException)
{
}
entry.Strings.Set(strUiDatabaseFile, new ProtectedString(false, path));
entry.Strings.Set(strUiKeyFile,new ProtectedString(false,entry.Strings.ReadSafe(PwDefs.UserNameField)));
var devices =
KeeAutoExecExt.GetIfDevice(KeeAutoExecExt.MakeAutoExecItem(App.Kp2a.CurrentDb.KpDatabase, entry, 0));
//make sure user can enable/disable on this device explicitly:
if (!devices.ContainsKey(KeeAutoExecExt.ThisDeviceId))
devices[KeeAutoExecExt.ThisDeviceId] = false;
foreach (var ifDevice in devices)
{
entry.Strings.Set(strUiIfDevice + ifDevice.Key, new ProtectedString(false, ifDevice.Value.ToString()));
}
}
public override void PrepareForSaving(PwEntry entry)
{
entry.Strings.Set(PwDefs.UrlField, new ProtectedString(false, entry.Strings.ReadSafe(strUiDatabaseFile)));
entry.Strings.Set(PwDefs.UserNameField, new ProtectedString(false, entry.Strings.ReadSafe(strUiKeyFile)));
entry.Strings.Remove(strUiDatabaseFile);
entry.Strings.Remove(strUiKeyFile);
Dictionary devices = new Dictionary();
foreach (string key in entry.Strings.GetKeys())
{
if (key.StartsWith(strUiIfDevice))
{
string device = key.Substring(strUiIfDevice.Length);
devices[device] = entry.Strings.ReadSafe(key).Equals("true", StringComparison.OrdinalIgnoreCase);
}
}
entry.Strings.Set(KeeAutoExecExt._ifDevice,new ProtectedString(false,KeeAutoExecExt.BuildIfDevice(devices)));
foreach (string device in devices.Keys)
{
entry.Strings.Remove(strUiIfDevice + device);
}
base.PrepareForSaving(entry);
}
}
}