using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TINK.Model.Connector; namespace TINK.Model.User.Account { public class StoreLegacy : IStore { /// /// Holds the name of the application. /// private const string M_STR_APPNAME = "TINKApp"; /// Holds the id of the session. private const string KEY_SESSIONID = "SessionId"; /// Holds the id of the session. private const string KEY_GROUP = "Group"; /// Holds the id of the session. private const string KEY_DEBUGLEVEL = "DebugLevel"; public StoreLegacy(string copriHostHash) { m_strCopriHostHash = copriHostHash ?? throw new ArgumentException("Can not construct account object. Copri hash must not be null."); } private string m_strCopriHostHash; /// /// Reads mail address and password from account store. /// /// public async Task Load() { #if !WINDOWS_UWP #if !__IOS__ var xamAccountStore = Xamarin.Auth.AccountStore.Create("System.Char[]").FindAccountsForService($"{M_STR_APPNAME}_{m_strCopriHostHash}").FirstOrDefault(); #else var xamAccountStore = Xamarin.Auth.AccountStore.Create().FindAccountsForService($"{M_STR_APPNAME}_{m_strCopriHostHash}").FirstOrDefault(); #endif if (xamAccountStore == null) { // Nothing t do if account cannot be accessed. return new EmptyAccount(); } return new Account( xamAccountStore.Username, string.Empty, xamAccountStore.Properties.ContainsKey(KEY_SESSIONID) ? xamAccountStore.Properties[KEY_SESSIONID] : null, xamAccountStore.Properties.ContainsKey(KEY_GROUP) && !string.IsNullOrEmpty(xamAccountStore.Properties[KEY_GROUP]) ? JsonConvert.DeserializeObject>(xamAccountStore.Properties[KEY_GROUP]) : new string[0], xamAccountStore.Properties.ContainsKey(KEY_DEBUGLEVEL) && !string.IsNullOrEmpty(xamAccountStore.Properties[KEY_DEBUGLEVEL]) ? Permissions.Parse(xamAccountStore.Properties[KEY_DEBUGLEVEL]) : Permissions.None); #else return new Account( string.Empty, string.Empty, string.Empty, new List(), null); #endif } /// /// Writes mail address and password to account store. /// /// public async Task Save(IAccount account) { #if !WINDOWS_UWP Xamarin.Auth.Account xamAccount = new Xamarin.Auth.Account { Username = account.Mail }; xamAccount.Properties.Add(KEY_SESSIONID, account?.SessionCookie); xamAccount.Properties.Add(KEY_GROUP, JsonConvert.SerializeObject(account?.Group ?? new string[0])); xamAccount.Properties.Add(KEY_DEBUGLEVEL, account.DebugLevel.ToString()); #if !__IOS__ Xamarin.Auth.AccountStore.Create("System.Char[]").Save(xamAccount, $"{M_STR_APPNAME}_{m_strCopriHostHash}"); #else Xamarin.Auth.AccountStore.Create().Save(xamAccount, $"{M_STR_APPNAME}_{m_strCopriHostHash}"); #endif #endif } /// /// Deletes mail address and password from account store. /// public IAccount Delete(IAccount account) { #if !WINDOWS_UWP #if !__IOS__ var xamAccountStore = Xamarin.Auth.AccountStore.Create("System.Char[]").FindAccountsForService($"{M_STR_APPNAME}_{m_strCopriHostHash}").FirstOrDefault(); #else var xamAccountStore = Xamarin.Auth.AccountStore.Create().FindAccountsForService($"{M_STR_APPNAME}_{m_strCopriHostHash}").FirstOrDefault(); #endif if (xamAccountStore == null) { return new EmptyAccount(); } #if !__IOS__ Xamarin.Auth.AccountStore.Create("System.Char[]").Delete(xamAccountStore, $"{M_STR_APPNAME}_{m_strCopriHostHash}"); #else Xamarin.Auth.AccountStore.Create().Delete(xamAccountStore, $"{M_STR_APPNAME}_{m_strCopriHostHash}"); #endif #endif return new EmptyAccount(); } } }