mirror of
https://github.com/bitwarden/mobile.git
synced 2025-02-17 01:21:25 +01:00
Reactor rename Sites => Logins
This commit is contained in:
parent
a176542114
commit
991afb7722
@ -33,7 +33,7 @@ namespace Bit.Android
|
||||
|
||||
try
|
||||
{
|
||||
// TODO: lookup site
|
||||
// TODO: lookup login
|
||||
LastReceivedCredentials = new Credentials { User = "username", Password = "12345678", Url = _lastQueriedUrl };
|
||||
}
|
||||
catch(Exception e)
|
||||
|
@ -196,7 +196,7 @@ namespace Bit.Android
|
||||
.RegisterType<IKeyDerivationService, BouncyCastleKeyDerivationService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginService, LoginService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
||||
@ -213,8 +213,8 @@ namespace Bit.Android
|
||||
// Repositories
|
||||
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginRepository, LoginRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginApiRepository, LoginApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
||||
|
@ -8,6 +8,6 @@ namespace Bit.App.Abstractions
|
||||
public interface IFolderRepository : IRepository<FolderData, string>
|
||||
{
|
||||
Task<IEnumerable<FolderData>> GetAllByUserIdAsync(string userId);
|
||||
Task DeleteWithSiteUpdateAsync(string id, DateTime revisionDate);
|
||||
Task DeleteWithLoginUpdateAsync(string id, DateTime revisionDate);
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ using Bit.App.Models.Api;
|
||||
|
||||
namespace Bit.App.Abstractions
|
||||
{
|
||||
public interface ISiteApiRepository : IApiRepository<SiteRequest, SiteResponse, string>
|
||||
public interface ILoginApiRepository : IApiRepository<LoginRequest, LoginResponse, string>
|
||||
{
|
||||
}
|
||||
}
|
@ -5,9 +5,9 @@ using Bit.App.Models.Data;
|
||||
|
||||
namespace Bit.App.Abstractions
|
||||
{
|
||||
public interface ISiteRepository : IRepository<SiteData, string>
|
||||
public interface ILoginRepository : IRepository<LoginData, string>
|
||||
{
|
||||
Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId);
|
||||
Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId, bool favorite);
|
||||
Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId);
|
||||
Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId, bool favorite);
|
||||
}
|
||||
}
|
||||
|
@ -5,12 +5,12 @@ using Bit.App.Models.Api;
|
||||
|
||||
namespace Bit.App.Abstractions
|
||||
{
|
||||
public interface ISiteService
|
||||
public interface ILoginService
|
||||
{
|
||||
Task<Site> GetByIdAsync(string id);
|
||||
Task<IEnumerable<Site>> GetAllAsync();
|
||||
Task<IEnumerable<Site>> GetAllAsync(bool favorites);
|
||||
Task<ApiResult<SiteResponse>> SaveAsync(Site site);
|
||||
Task<Login> GetByIdAsync(string id);
|
||||
Task<IEnumerable<Login>> GetAllAsync();
|
||||
Task<IEnumerable<Login>> GetAllAsync(bool favorites);
|
||||
Task<ApiResult<LoginResponse>> SaveAsync(Login login);
|
||||
Task<ApiResult> DeleteAsync(string id);
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ namespace Bit.App.Abstractions
|
||||
bool SyncInProgress { get; }
|
||||
Task<bool> SyncAsync(string id);
|
||||
Task<bool> SyncDeleteFolderAsync(string id, DateTime revisionDate);
|
||||
Task<bool> SyncDeleteSiteAsync(string id);
|
||||
Task<bool> SyncDeleteLoginAsync(string id);
|
||||
Task<bool> FullSyncAsync();
|
||||
Task<bool> IncrementalSyncAsync(TimeSpan syncThreshold);
|
||||
Task<bool> IncrementalSyncAsync();
|
||||
|
@ -3,6 +3,6 @@
|
||||
public enum CipherType : short
|
||||
{
|
||||
Folder = 0,
|
||||
Site = 1
|
||||
Login = 1
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
{
|
||||
SyncCipherUpdate = 0,
|
||||
SyncCipherCreate = 1,
|
||||
SyncSiteDelete = 2,
|
||||
SyncLoginDelete = 2,
|
||||
SyncFolderDelete = 3,
|
||||
SyncCiphers = 4
|
||||
}
|
||||
|
@ -1,16 +1,16 @@
|
||||
namespace Bit.App.Models.Api
|
||||
{
|
||||
public class SiteRequest
|
||||
public class LoginRequest
|
||||
{
|
||||
public SiteRequest(Site site)
|
||||
public LoginRequest(Login login)
|
||||
{
|
||||
FolderId = site.FolderId;
|
||||
Name = site.Name?.EncryptedString;
|
||||
Uri = site.Uri?.EncryptedString;
|
||||
Username = site.Username?.EncryptedString;
|
||||
Password = site.Password?.EncryptedString;
|
||||
Notes = site.Notes?.EncryptedString;
|
||||
Favorite = site.Favorite;
|
||||
FolderId = login.FolderId;
|
||||
Name = login.Name?.EncryptedString;
|
||||
Uri = login.Uri?.EncryptedString;
|
||||
Username = login.Username?.EncryptedString;
|
||||
Password = login.Password?.EncryptedString;
|
||||
Notes = login.Notes?.EncryptedString;
|
||||
Favorite = login.Favorite;
|
||||
}
|
||||
|
||||
public string FolderId { get; set; }
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
namespace Bit.App.Models.Api
|
||||
{
|
||||
public class SiteResponse
|
||||
public class LoginResponse
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string FolderId { get; set; }
|
||||
|
@ -1,6 +1,6 @@
|
||||
namespace Bit.App.Models.Api
|
||||
{
|
||||
public class SiteDataModel
|
||||
public class LoginDataModel
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Uri { get; set; }
|
||||
|
@ -33,7 +33,7 @@ namespace Bit.App.Models.Data
|
||||
throw new ArgumentException(nameof(cipher.Type));
|
||||
}
|
||||
|
||||
var data = cipher.Data.ToObject<SiteDataModel>();
|
||||
var data = cipher.Data.ToObject<LoginDataModel>();
|
||||
|
||||
Id = cipher.Id;
|
||||
UserId = userId;
|
||||
|
@ -6,46 +6,46 @@ using Bit.App.Models.Api;
|
||||
namespace Bit.App.Models.Data
|
||||
{
|
||||
[Table("Site")]
|
||||
public class SiteData : IDataObject<string>
|
||||
public class LoginData : IDataObject<string>
|
||||
{
|
||||
public SiteData()
|
||||
public LoginData()
|
||||
{ }
|
||||
|
||||
public SiteData(Site site, string userId)
|
||||
public LoginData(Login login, string userId)
|
||||
{
|
||||
Id = site.Id;
|
||||
FolderId = site.FolderId;
|
||||
Id = login.Id;
|
||||
FolderId = login.FolderId;
|
||||
UserId = userId;
|
||||
Name = site.Name?.EncryptedString;
|
||||
Uri = site.Uri?.EncryptedString;
|
||||
Username = site.Username?.EncryptedString;
|
||||
Password = site.Password?.EncryptedString;
|
||||
Notes = site.Notes?.EncryptedString;
|
||||
Favorite = site.Favorite;
|
||||
Name = login.Name?.EncryptedString;
|
||||
Uri = login.Uri?.EncryptedString;
|
||||
Username = login.Username?.EncryptedString;
|
||||
Password = login.Password?.EncryptedString;
|
||||
Notes = login.Notes?.EncryptedString;
|
||||
Favorite = login.Favorite;
|
||||
}
|
||||
|
||||
public SiteData(SiteResponse site, string userId)
|
||||
public LoginData(LoginResponse login, string userId)
|
||||
{
|
||||
Id = site.Id;
|
||||
FolderId = site.FolderId;
|
||||
Id = login.Id;
|
||||
FolderId = login.FolderId;
|
||||
UserId = userId;
|
||||
Name = site.Name;
|
||||
Uri = site.Uri;
|
||||
Username = site.Username;
|
||||
Password = site.Password;
|
||||
Notes = site.Notes;
|
||||
Favorite = site.Favorite;
|
||||
RevisionDateTime = site.RevisionDate;
|
||||
Name = login.Name;
|
||||
Uri = login.Uri;
|
||||
Username = login.Username;
|
||||
Password = login.Password;
|
||||
Notes = login.Notes;
|
||||
Favorite = login.Favorite;
|
||||
RevisionDateTime = login.RevisionDate;
|
||||
}
|
||||
|
||||
public SiteData(CipherResponse cipher, string userId)
|
||||
public LoginData(CipherResponse cipher, string userId)
|
||||
{
|
||||
if(cipher.Type != Enums.CipherType.Site)
|
||||
if(cipher.Type != Enums.CipherType.Login)
|
||||
{
|
||||
throw new ArgumentException(nameof(cipher.Type));
|
||||
}
|
||||
|
||||
var data = cipher.Data.ToObject<SiteDataModel>();
|
||||
var data = cipher.Data.ToObject<LoginDataModel>();
|
||||
|
||||
Id = cipher.Id;
|
||||
FolderId = cipher.FolderId;
|
||||
@ -72,9 +72,9 @@ namespace Bit.App.Models.Data
|
||||
public bool Favorite { get; set; }
|
||||
public DateTime RevisionDateTime { get; set; } = DateTime.UtcNow;
|
||||
|
||||
public Site ToSite()
|
||||
public Login ToLogin()
|
||||
{
|
||||
return new Site(this);
|
||||
return new Login(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,16 +6,16 @@ namespace Bit.App.Models.Page
|
||||
{
|
||||
public class VaultListPageModel
|
||||
{
|
||||
public class Site
|
||||
public class Login
|
||||
{
|
||||
public Site(Models.Site site)
|
||||
public Login(Models.Login login)
|
||||
{
|
||||
Id = site.Id;
|
||||
FolderId = site.FolderId;
|
||||
Name = site.Name?.Decrypt();
|
||||
Username = site.Username?.Decrypt() ?? " ";
|
||||
Password = new Lazy<string>(() => site.Password?.Decrypt());
|
||||
Uri = new Lazy<string>(() => site.Uri?.Decrypt());
|
||||
Id = login.Id;
|
||||
FolderId = login.FolderId;
|
||||
Name = login.Name?.Decrypt();
|
||||
Username = login.Username?.Decrypt() ?? " ";
|
||||
Password = new Lazy<string>(() => login.Password?.Decrypt());
|
||||
Uri = new Lazy<string>(() => login.Uri?.Decrypt());
|
||||
}
|
||||
|
||||
public string Id { get; set; }
|
||||
@ -26,7 +26,7 @@ namespace Bit.App.Models.Page
|
||||
public Lazy<string> Uri { get; set; }
|
||||
}
|
||||
|
||||
public class Folder : List<Site>
|
||||
public class Folder : List<Login>
|
||||
{
|
||||
public Folder(Models.Folder folder)
|
||||
{
|
||||
@ -34,9 +34,9 @@ namespace Bit.App.Models.Page
|
||||
Name = folder.Name?.Decrypt();
|
||||
}
|
||||
|
||||
public Folder(List<Site> sites)
|
||||
public Folder(List<Login> logins)
|
||||
{
|
||||
AddRange(sites);
|
||||
AddRange(logins);
|
||||
}
|
||||
|
||||
public string Id { get; set; }
|
||||
|
@ -5,7 +5,7 @@ using Xamarin.Forms;
|
||||
|
||||
namespace Bit.App.Models.Page
|
||||
{
|
||||
public class VaultViewSitePageModel : INotifyPropertyChanged
|
||||
public class VaultViewLoginPageModel : INotifyPropertyChanged
|
||||
{
|
||||
private string _name;
|
||||
private string _username;
|
||||
@ -15,7 +15,7 @@ namespace Bit.App.Models.Page
|
||||
private bool _revealPassword;
|
||||
private string _uriHost;
|
||||
|
||||
public VaultViewSitePageModel() { }
|
||||
public VaultViewLoginPageModel() { }
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
@ -176,13 +176,13 @@ namespace Bit.App.Models.Page
|
||||
public string ShowHideText => RevealPassword ? AppResources.Hide : AppResources.Show;
|
||||
public ImageSource ShowHideImage => RevealPassword ? ImageSource.FromFile("eye_slash") : ImageSource.FromFile("eye");
|
||||
|
||||
public void Update(Site site)
|
||||
public void Update(Login login)
|
||||
{
|
||||
Name = site.Name?.Decrypt();
|
||||
Username = site.Username?.Decrypt();
|
||||
Password = site.Password?.Decrypt();
|
||||
Uri = site.Uri?.Decrypt();
|
||||
Notes = site.Notes?.Decrypt();
|
||||
Name = login.Name?.Decrypt();
|
||||
Username = login.Username?.Decrypt();
|
||||
Password = login.Password?.Decrypt();
|
||||
Uri = login.Uri?.Decrypt();
|
||||
Notes = login.Notes?.Decrypt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,12 +3,12 @@ using Bit.App.Models.Data;
|
||||
|
||||
namespace Bit.App.Models
|
||||
{
|
||||
public class Site : Cipher
|
||||
public class Login : Cipher
|
||||
{
|
||||
public Site()
|
||||
public Login()
|
||||
{ }
|
||||
|
||||
public Site(SiteData data)
|
||||
public Login(LoginData data)
|
||||
{
|
||||
Id = data.Id;
|
||||
FolderId = data.FolderId;
|
||||
@ -20,7 +20,7 @@ namespace Bit.App.Models
|
||||
Favorite = data.Favorite;
|
||||
}
|
||||
|
||||
public Site(SiteResponse response)
|
||||
public Login(LoginResponse response)
|
||||
{
|
||||
Id = response.Id;
|
||||
FolderId = response.FolderId;
|
||||
@ -39,14 +39,14 @@ namespace Bit.App.Models
|
||||
public CipherString Notes { get; set; }
|
||||
public bool Favorite { get; set; }
|
||||
|
||||
public SiteRequest ToSiteRequest()
|
||||
public LoginRequest ToLoginRequest()
|
||||
{
|
||||
return new SiteRequest(this);
|
||||
return new LoginRequest(this);
|
||||
}
|
||||
|
||||
public SiteData ToSiteData(string userId)
|
||||
public LoginData ToLoginData(string userId)
|
||||
{
|
||||
return new SiteData(this, userId);
|
||||
return new LoginData(this, userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,8 +12,8 @@ namespace Bit.App.Pages
|
||||
TintColor = Color.FromHex("3c8dbc");
|
||||
|
||||
var settingsNavigation = new ExtendedNavigationPage(new SettingsPage());
|
||||
var favoritesNavigation = new ExtendedNavigationPage(new VaultListSitesPage(true));
|
||||
var vaultNavigation = new ExtendedNavigationPage(new VaultListSitesPage(false));
|
||||
var favoritesNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(true));
|
||||
var vaultNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(false));
|
||||
var toolsNavigation = new ExtendedNavigationPage(new ToolsPage());
|
||||
|
||||
favoritesNavigation.Title = AppResources.Favorites;
|
||||
|
@ -133,7 +133,7 @@ namespace Bit.App.Pages
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Validate the delete operation. ex. Cannot delete a folder that has sites in it?
|
||||
// TODO: Validate the delete operation. ex. Cannot delete a folder that has logins in it?
|
||||
|
||||
if(!await _userDialogs.ConfirmAsync(AppResources.DoYouReallyWantToDelete, null, AppResources.Yes, AppResources.No))
|
||||
{
|
||||
|
@ -13,20 +13,20 @@ using Plugin.Settings.Abstractions;
|
||||
|
||||
namespace Bit.App.Pages
|
||||
{
|
||||
public class VaultAddSitePage : ExtendedContentPage
|
||||
public class VaultAddLoginPage : ExtendedContentPage
|
||||
{
|
||||
private const string AddedSiteAlertKey = "addedSiteAlert";
|
||||
private const string AddedLoginAlertKey = "addedSiteAlert";
|
||||
|
||||
private readonly ISiteService _siteService;
|
||||
private readonly ILoginService _loginService;
|
||||
private readonly IFolderService _folderService;
|
||||
private readonly IUserDialogs _userDialogs;
|
||||
private readonly IConnectivity _connectivity;
|
||||
private readonly IGoogleAnalyticsService _googleAnalyticsService;
|
||||
private readonly ISettings _settings;
|
||||
|
||||
public VaultAddSitePage()
|
||||
public VaultAddLoginPage()
|
||||
{
|
||||
_siteService = Resolver.Resolve<ISiteService>();
|
||||
_loginService = Resolver.Resolve<ILoginService>();
|
||||
_folderService = Resolver.Resolve<IFolderService>();
|
||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||
@ -81,7 +81,7 @@ namespace Bit.App.Pages
|
||||
HasUnevenRows = true,
|
||||
Root = new TableRoot
|
||||
{
|
||||
new TableSection(AppResources.SiteInformation)
|
||||
new TableSection(AppResources.LoginInformation)
|
||||
{
|
||||
nameCell,
|
||||
uriCell,
|
||||
@ -126,7 +126,7 @@ namespace Bit.App.Pages
|
||||
return;
|
||||
}
|
||||
|
||||
var site = new Site
|
||||
var login = new Login
|
||||
{
|
||||
Uri = uriCell.Entry.Text?.Encrypt(),
|
||||
Name = nameCell.Entry.Text?.Encrypt(),
|
||||
@ -138,18 +138,18 @@ namespace Bit.App.Pages
|
||||
|
||||
if(folderCell.Picker.SelectedIndex > 0)
|
||||
{
|
||||
site.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
||||
login.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
||||
}
|
||||
|
||||
_userDialogs.ShowLoading(AppResources.Saving, MaskType.Black);
|
||||
var saveTask = await _siteService.SaveAsync(site);
|
||||
var saveTask = await _loginService.SaveAsync(login);
|
||||
|
||||
_userDialogs.HideLoading();
|
||||
if(saveTask.Succeeded)
|
||||
{
|
||||
await Navigation.PopForDeviceAsync();
|
||||
_userDialogs.Toast(AppResources.NewSiteCreated);
|
||||
_googleAnalyticsService.TrackAppEvent("CreatedSite");
|
||||
_userDialogs.Toast(AppResources.NewLoginCreated);
|
||||
_googleAnalyticsService.TrackAppEvent("CreatedLogin");
|
||||
}
|
||||
else if(saveTask.Errors.Count() > 0)
|
||||
{
|
||||
@ -161,7 +161,7 @@ namespace Bit.App.Pages
|
||||
}
|
||||
}, ToolbarItemOrder.Default, 0);
|
||||
|
||||
Title = AppResources.AddSite;
|
||||
Title = AppResources.AddLogin;
|
||||
Content = table;
|
||||
ToolbarItems.Add(saveToolBarItem);
|
||||
if(Device.OS == TargetPlatform.iOS)
|
||||
@ -178,9 +178,9 @@ namespace Bit.App.Pages
|
||||
AlertNoConnection();
|
||||
}
|
||||
|
||||
if(Device.OS == TargetPlatform.iOS && !_settings.GetValueOrDefault(AddedSiteAlertKey, false))
|
||||
if(Device.OS == TargetPlatform.iOS && !_settings.GetValueOrDefault(AddedLoginAlertKey, false))
|
||||
{
|
||||
_settings.AddOrUpdateValue(AddedSiteAlertKey, true);
|
||||
_settings.AddOrUpdateValue(AddedLoginAlertKey, true);
|
||||
DisplayAlert(AppResources.BitwardenAppExtension, AppResources.BitwardenAppExtensionAlert, AppResources.Ok);
|
||||
}
|
||||
}
|
||||
|
@ -11,19 +11,19 @@ using XLabs.Ioc;
|
||||
|
||||
namespace Bit.App.Pages
|
||||
{
|
||||
public class VaultEditSitePage : ExtendedContentPage
|
||||
public class VaultEditLoginPage : ExtendedContentPage
|
||||
{
|
||||
private readonly string _siteId;
|
||||
private readonly ISiteService _siteService;
|
||||
private readonly string _loginId;
|
||||
private readonly ILoginService _loginService;
|
||||
private readonly IFolderService _folderService;
|
||||
private readonly IUserDialogs _userDialogs;
|
||||
private readonly IConnectivity _connectivity;
|
||||
private readonly IGoogleAnalyticsService _googleAnalyticsService;
|
||||
|
||||
public VaultEditSitePage(string siteId)
|
||||
public VaultEditLoginPage(string loginId)
|
||||
{
|
||||
_siteId = siteId;
|
||||
_siteService = Resolver.Resolve<ISiteService>();
|
||||
_loginId = loginId;
|
||||
_loginService = Resolver.Resolve<ILoginService>();
|
||||
_folderService = Resolver.Resolve<IFolderService>();
|
||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||
@ -36,19 +36,19 @@ namespace Bit.App.Pages
|
||||
|
||||
private void Init()
|
||||
{
|
||||
var site = _siteService.GetByIdAsync(_siteId).GetAwaiter().GetResult();
|
||||
if(site == null)
|
||||
var login = _loginService.GetByIdAsync(_loginId).GetAwaiter().GetResult();
|
||||
if(login == null)
|
||||
{
|
||||
// TODO: handle error. navigate back? should never happen...
|
||||
return;
|
||||
}
|
||||
|
||||
var notesCell = new FormEditorCell(height: 90);
|
||||
notesCell.Editor.Text = site.Notes?.Decrypt();
|
||||
notesCell.Editor.Text = login.Notes?.Decrypt();
|
||||
|
||||
PasswordCell = new FormEntryCell(AppResources.Password, isPassword: true, nextElement: notesCell.Editor,
|
||||
useButton: true);
|
||||
PasswordCell.Entry.Text = site.Password?.Decrypt();
|
||||
PasswordCell.Entry.Text = login.Password?.Decrypt();
|
||||
PasswordCell.Button.Image = "eye";
|
||||
PasswordCell.Button.Clicked += PasswordButton_Clicked;
|
||||
PasswordCell.Entry.DisableAutocapitalize = true;
|
||||
@ -56,14 +56,14 @@ namespace Bit.App.Pages
|
||||
PasswordCell.Entry.FontFamily = Device.OnPlatform(iOS: "Courier", Android: "monospace", WinPhone: "Courier");
|
||||
|
||||
var usernameCell = new FormEntryCell(AppResources.Username, nextElement: PasswordCell.Entry);
|
||||
usernameCell.Entry.Text = site.Username?.Decrypt();
|
||||
usernameCell.Entry.Text = login.Username?.Decrypt();
|
||||
usernameCell.Entry.DisableAutocapitalize = true;
|
||||
usernameCell.Entry.Autocorrect = false;
|
||||
|
||||
var uriCell = new FormEntryCell(AppResources.URI, Keyboard.Url, nextElement: usernameCell.Entry);
|
||||
uriCell.Entry.Text = site.Uri?.Decrypt();
|
||||
uriCell.Entry.Text = login.Uri?.Decrypt();
|
||||
var nameCell = new FormEntryCell(AppResources.Name, nextElement: uriCell.Entry);
|
||||
nameCell.Entry.Text = site.Name?.Decrypt();
|
||||
nameCell.Entry.Text = login.Name?.Decrypt();
|
||||
|
||||
var generateCell = new ExtendedTextCell
|
||||
{
|
||||
@ -80,7 +80,7 @@ namespace Bit.App.Pages
|
||||
foreach(var folder in folders)
|
||||
{
|
||||
i++;
|
||||
if(folder.Id == site.FolderId)
|
||||
if(folder.Id == login.FolderId)
|
||||
{
|
||||
selectedIndex = i;
|
||||
}
|
||||
@ -93,7 +93,7 @@ namespace Bit.App.Pages
|
||||
var favoriteCell = new ExtendedSwitchCell
|
||||
{
|
||||
Text = AppResources.Favorite,
|
||||
On = site.Favorite
|
||||
On = login.Favorite
|
||||
};
|
||||
|
||||
var deleteCell = new ExtendedTextCell { Text = AppResources.Delete, TextColor = Color.Red };
|
||||
@ -106,7 +106,7 @@ namespace Bit.App.Pages
|
||||
HasUnevenRows = true,
|
||||
Root = new TableRoot
|
||||
{
|
||||
new TableSection(AppResources.SiteInformation)
|
||||
new TableSection(AppResources.LoginInformation)
|
||||
{
|
||||
nameCell,
|
||||
uriCell,
|
||||
@ -155,32 +155,32 @@ namespace Bit.App.Pages
|
||||
return;
|
||||
}
|
||||
|
||||
site.Uri = uriCell.Entry.Text?.Encrypt();
|
||||
site.Name = nameCell.Entry.Text?.Encrypt();
|
||||
site.Username = usernameCell.Entry.Text?.Encrypt();
|
||||
site.Password = PasswordCell.Entry.Text?.Encrypt();
|
||||
site.Notes = notesCell.Editor.Text?.Encrypt();
|
||||
site.Favorite = favoriteCell.On;
|
||||
login.Uri = uriCell.Entry.Text?.Encrypt();
|
||||
login.Name = nameCell.Entry.Text?.Encrypt();
|
||||
login.Username = usernameCell.Entry.Text?.Encrypt();
|
||||
login.Password = PasswordCell.Entry.Text?.Encrypt();
|
||||
login.Notes = notesCell.Editor.Text?.Encrypt();
|
||||
login.Favorite = favoriteCell.On;
|
||||
|
||||
if(folderCell.Picker.SelectedIndex > 0)
|
||||
{
|
||||
site.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
||||
login.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
site.FolderId = null;
|
||||
login.FolderId = null;
|
||||
}
|
||||
|
||||
_userDialogs.ShowLoading(AppResources.Saving, MaskType.Black);
|
||||
var saveTask = await _siteService.SaveAsync(site);
|
||||
var saveTask = await _loginService.SaveAsync(login);
|
||||
|
||||
_userDialogs.HideLoading();
|
||||
|
||||
if(saveTask.Succeeded)
|
||||
{
|
||||
await Navigation.PopForDeviceAsync();
|
||||
_userDialogs.Toast(AppResources.SiteUpdated);
|
||||
_googleAnalyticsService.TrackAppEvent("EditedSite");
|
||||
_userDialogs.Toast(AppResources.LoginUpdated);
|
||||
_googleAnalyticsService.TrackAppEvent("EditeLogin");
|
||||
}
|
||||
else if(saveTask.Errors.Count() > 0)
|
||||
{
|
||||
@ -192,7 +192,7 @@ namespace Bit.App.Pages
|
||||
}
|
||||
}, ToolbarItemOrder.Default, 0);
|
||||
|
||||
Title = AppResources.EditSite;
|
||||
Title = AppResources.EditLogin;
|
||||
Content = table;
|
||||
ToolbarItems.Add(saveToolBarItem);
|
||||
if(Device.OS == TargetPlatform.iOS)
|
||||
@ -246,14 +246,14 @@ namespace Bit.App.Pages
|
||||
}
|
||||
|
||||
_userDialogs.ShowLoading(AppResources.Deleting, MaskType.Black);
|
||||
var deleteTask = await _siteService.DeleteAsync(_siteId);
|
||||
var deleteTask = await _loginService.DeleteAsync(_loginId);
|
||||
_userDialogs.HideLoading();
|
||||
|
||||
if(deleteTask.Succeeded)
|
||||
{
|
||||
await Navigation.PopForDeviceAsync();
|
||||
_userDialogs.Toast(AppResources.SiteDeleted);
|
||||
_googleAnalyticsService.TrackAppEvent("DeletedSite");
|
||||
_userDialogs.Toast(AppResources.LoginDeleted);
|
||||
_googleAnalyticsService.TrackAppEvent("DeletedLogin");
|
||||
}
|
||||
else if(deleteTask.Errors.Count() > 0)
|
||||
{
|
||||
|
@ -17,10 +17,10 @@ using System.Threading;
|
||||
|
||||
namespace Bit.App.Pages
|
||||
{
|
||||
public class VaultListSitesPage : ExtendedContentPage
|
||||
public class VaultListLoginsPage : ExtendedContentPage
|
||||
{
|
||||
private readonly IFolderService _folderService;
|
||||
private readonly ISiteService _siteService;
|
||||
private readonly ILoginService _loginService;
|
||||
private readonly IUserDialogs _userDialogs;
|
||||
private readonly IConnectivity _connectivity;
|
||||
private readonly IClipboardService _clipboardService;
|
||||
@ -32,12 +32,12 @@ namespace Bit.App.Pages
|
||||
private bool _loadExistingData;
|
||||
private CancellationTokenSource _filterResultsCancellationTokenSource;
|
||||
|
||||
public VaultListSitesPage(bool favorites)
|
||||
public VaultListLoginsPage(bool favorites)
|
||||
: base(true)
|
||||
{
|
||||
_favorites = favorites;
|
||||
_folderService = Resolver.Resolve<IFolderService>();
|
||||
_siteService = Resolver.Resolve<ISiteService>();
|
||||
_loginService = Resolver.Resolve<ILoginService>();
|
||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||
_clipboardService = Resolver.Resolve<IClipboardService>();
|
||||
@ -55,7 +55,7 @@ namespace Bit.App.Pages
|
||||
public ExtendedObservableCollection<VaultListPageModel.Folder> PresentationFolders { get; private set; }
|
||||
= new ExtendedObservableCollection<VaultListPageModel.Folder>();
|
||||
public ListView ListView { get; set; }
|
||||
public VaultListPageModel.Site[] Sites { get; set; } = new VaultListPageModel.Site[] { };
|
||||
public VaultListPageModel.Login[] Logins { get; set; } = new VaultListPageModel.Login[] { };
|
||||
public VaultListPageModel.Folder[] Folders { get; set; } = new VaultListPageModel.Folder[] { };
|
||||
public SearchBar Search { get; set; }
|
||||
public StackLayout NoDataStackLayout { get; set; }
|
||||
@ -74,7 +74,7 @@ namespace Bit.App.Pages
|
||||
|
||||
if(!_favorites)
|
||||
{
|
||||
ToolbarItems.Add(new AddSiteToolBarItem(this));
|
||||
ToolbarItems.Add(new AddLoginToolBarItem(this));
|
||||
}
|
||||
|
||||
ListView = new ListView(ListViewCachingStrategy.RecycleElement)
|
||||
@ -91,7 +91,7 @@ namespace Bit.App.Pages
|
||||
ListView.RowHeight = -1;
|
||||
}
|
||||
|
||||
ListView.ItemSelected += SiteSelected;
|
||||
ListView.ItemSelected += LoginSelected;
|
||||
|
||||
Search = new SearchBar
|
||||
{
|
||||
@ -117,7 +117,7 @@ namespace Bit.App.Pages
|
||||
|
||||
var noDataLabel = new Label
|
||||
{
|
||||
Text = _favorites ? AppResources.NoFavorites : AppResources.NoSites,
|
||||
Text = _favorites ? AppResources.NoFavorites : AppResources.NoLogins,
|
||||
HorizontalTextAlignment = TextAlignment.Center,
|
||||
FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
|
||||
Style = (Style)Application.Current.Resources["text-muted"]
|
||||
@ -133,14 +133,14 @@ namespace Bit.App.Pages
|
||||
|
||||
if(!_favorites)
|
||||
{
|
||||
var addSiteButton = new ExtendedButton
|
||||
var addLoginButton = new ExtendedButton
|
||||
{
|
||||
Text = AppResources.AddASite,
|
||||
Command = new Command(() => AddSite()),
|
||||
Text = AppResources.AddALogin,
|
||||
Command = new Command(() => AddLogin()),
|
||||
Style = (Style)Application.Current.Resources["btn-primaryAccent"]
|
||||
};
|
||||
|
||||
NoDataStackLayout.Children.Add(addSiteButton);
|
||||
NoDataStackLayout.Children.Add(addLoginButton);
|
||||
}
|
||||
|
||||
LoadingIndicator = new ActivityIndicator
|
||||
@ -206,18 +206,18 @@ namespace Bit.App.Pages
|
||||
|
||||
if(string.IsNullOrWhiteSpace(searchFilter))
|
||||
{
|
||||
LoadFolders(Sites, ct);
|
||||
LoadFolders(Logins, ct);
|
||||
}
|
||||
else
|
||||
{
|
||||
searchFilter = searchFilter.ToLower();
|
||||
var filteredSites = Sites
|
||||
var filteredLogins = Logins
|
||||
.Where(s => s.Name.ToLower().Contains(searchFilter) || s.Username.ToLower().Contains(searchFilter))
|
||||
.TakeWhile(s => !ct.IsCancellationRequested)
|
||||
.ToArray();
|
||||
|
||||
ct.ThrowIfCancellationRequested();
|
||||
LoadFolders(filteredSites, ct);
|
||||
LoadFolders(filteredLogins, ct);
|
||||
}
|
||||
}
|
||||
|
||||
@ -289,19 +289,19 @@ namespace Bit.App.Pages
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var foldersTask = _folderService.GetAllAsync();
|
||||
var sitesTask = _favorites ? _siteService.GetAllAsync(true) : _siteService.GetAllAsync();
|
||||
await Task.WhenAll(foldersTask, sitesTask);
|
||||
var loginsTask = _favorites ? _loginService.GetAllAsync(true) : _loginService.GetAllAsync();
|
||||
await Task.WhenAll(foldersTask, loginsTask);
|
||||
|
||||
var folders = await foldersTask;
|
||||
var sites = await sitesTask;
|
||||
var logins = await loginsTask;
|
||||
|
||||
Folders = folders
|
||||
.Select(f => new VaultListPageModel.Folder(f))
|
||||
.OrderBy(s => s.Name)
|
||||
.ToArray();
|
||||
|
||||
Sites = sites
|
||||
.Select(s => new VaultListPageModel.Site(s))
|
||||
Logins = logins
|
||||
.Select(s => new VaultListPageModel.Login(s))
|
||||
.OrderBy(s => s.Name)
|
||||
.ThenBy(s => s.Username)
|
||||
.ToArray();
|
||||
@ -316,7 +316,7 @@ namespace Bit.App.Pages
|
||||
return cts;
|
||||
}
|
||||
|
||||
private void LoadFolders(VaultListPageModel.Site[] sites, CancellationToken ct)
|
||||
private void LoadFolders(VaultListPageModel.Login[] logins, CancellationToken ct)
|
||||
{
|
||||
var folders = new List<VaultListPageModel.Folder>(Folders);
|
||||
|
||||
@ -327,16 +327,16 @@ namespace Bit.App.Pages
|
||||
folder.Clear();
|
||||
}
|
||||
|
||||
var sitesToAdd = sites
|
||||
var loginsToAdd = logins
|
||||
.Where(s => s.FolderId == folder.Id)
|
||||
.TakeWhile(s => !ct.IsCancellationRequested)
|
||||
.ToList();
|
||||
|
||||
ct.ThrowIfCancellationRequested();
|
||||
folder.AddRange(sitesToAdd);
|
||||
folder.AddRange(loginsToAdd);
|
||||
}
|
||||
|
||||
var noneToAdd = sites
|
||||
var noneToAdd = logins
|
||||
.Where(s => s.FolderId == null)
|
||||
.TakeWhile(s => !ct.IsCancellationRequested)
|
||||
.ToList();
|
||||
@ -359,53 +359,53 @@ namespace Bit.App.Pages
|
||||
});
|
||||
}
|
||||
|
||||
private async void SiteSelected(object sender, SelectedItemChangedEventArgs e)
|
||||
private async void LoginSelected(object sender, SelectedItemChangedEventArgs e)
|
||||
{
|
||||
var site = e.SelectedItem as VaultListPageModel.Site;
|
||||
var page = new VaultViewSitePage(site.Id);
|
||||
var login = e.SelectedItem as VaultListPageModel.Login;
|
||||
var page = new VaultViewLoginPage(login.Id);
|
||||
await Navigation.PushForDeviceAsync(page);
|
||||
}
|
||||
|
||||
private async void MoreClickedAsync(VaultListPageModel.Site site)
|
||||
private async void MoreClickedAsync(VaultListPageModel.Login login)
|
||||
{
|
||||
var buttons = new List<string> { AppResources.View, AppResources.Edit };
|
||||
if(!string.IsNullOrWhiteSpace(site.Password.Value))
|
||||
if(!string.IsNullOrWhiteSpace(login.Password.Value))
|
||||
{
|
||||
buttons.Add(AppResources.CopyPassword);
|
||||
}
|
||||
if(!string.IsNullOrWhiteSpace(site.Username))
|
||||
if(!string.IsNullOrWhiteSpace(login.Username))
|
||||
{
|
||||
buttons.Add(AppResources.CopyUsername);
|
||||
}
|
||||
if(!string.IsNullOrWhiteSpace(site.Uri.Value) && (site.Uri.Value.StartsWith("http://")
|
||||
|| site.Uri.Value.StartsWith("https://")))
|
||||
if(!string.IsNullOrWhiteSpace(login.Uri.Value) && (login.Uri.Value.StartsWith("http://")
|
||||
|| login.Uri.Value.StartsWith("https://")))
|
||||
{
|
||||
buttons.Add(AppResources.GoToWebsite);
|
||||
}
|
||||
|
||||
var selection = await DisplayActionSheet(site.Name, AppResources.Cancel, null, buttons.ToArray());
|
||||
var selection = await DisplayActionSheet(login.Name, AppResources.Cancel, null, buttons.ToArray());
|
||||
|
||||
if(selection == AppResources.View)
|
||||
{
|
||||
var page = new VaultViewSitePage(site.Id);
|
||||
var page = new VaultViewLoginPage(login.Id);
|
||||
await Navigation.PushForDeviceAsync(page);
|
||||
}
|
||||
else if(selection == AppResources.Edit)
|
||||
{
|
||||
var page = new VaultEditSitePage(site.Id);
|
||||
var page = new VaultEditLoginPage(login.Id);
|
||||
await Navigation.PushForDeviceAsync(page);
|
||||
}
|
||||
else if(selection == AppResources.CopyPassword)
|
||||
{
|
||||
Copy(site.Password.Value, AppResources.Password);
|
||||
Copy(login.Password.Value, AppResources.Password);
|
||||
}
|
||||
else if(selection == AppResources.CopyUsername)
|
||||
{
|
||||
Copy(site.Username, AppResources.Username);
|
||||
Copy(login.Username, AppResources.Username);
|
||||
}
|
||||
else if(selection == AppResources.GoToWebsite)
|
||||
{
|
||||
Device.OpenUri(new Uri(site.Uri.Value));
|
||||
Device.OpenUri(new Uri(login.Uri.Value));
|
||||
}
|
||||
}
|
||||
|
||||
@ -415,17 +415,17 @@ namespace Bit.App.Pages
|
||||
_userDialogs.Toast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
|
||||
}
|
||||
|
||||
private async void AddSite()
|
||||
private async void AddLogin()
|
||||
{
|
||||
var page = new VaultAddSitePage();
|
||||
var page = new VaultAddLoginPage();
|
||||
await Navigation.PushForDeviceAsync(page);
|
||||
}
|
||||
|
||||
private class AddSiteToolBarItem : ToolbarItem
|
||||
private class AddLoginToolBarItem : ToolbarItem
|
||||
{
|
||||
private readonly VaultListSitesPage _page;
|
||||
private readonly VaultListLoginsPage _page;
|
||||
|
||||
public AddSiteToolBarItem(VaultListSitesPage page)
|
||||
public AddLoginToolBarItem(VaultListLoginsPage page)
|
||||
{
|
||||
_page = page;
|
||||
Text = AppResources.Add;
|
||||
@ -435,24 +435,24 @@ namespace Bit.App.Pages
|
||||
|
||||
private void ClickedItem(object sender, EventArgs e)
|
||||
{
|
||||
_page.AddSite();
|
||||
_page.AddLogin();
|
||||
}
|
||||
}
|
||||
|
||||
private class VaultListViewCell : LabeledDetailCell
|
||||
{
|
||||
private VaultListSitesPage _page;
|
||||
private VaultListLoginsPage _page;
|
||||
|
||||
public static readonly BindableProperty SiteParameterProperty = BindableProperty.Create(nameof(SiteParameter),
|
||||
typeof(VaultListPageModel.Site), typeof(VaultListViewCell), null);
|
||||
public static readonly BindableProperty LoginParameterProperty = BindableProperty.Create(nameof(LoginParameter),
|
||||
typeof(VaultListPageModel.Login), typeof(VaultListViewCell), null);
|
||||
|
||||
public VaultListViewCell(VaultListSitesPage page)
|
||||
public VaultListViewCell(VaultListLoginsPage page)
|
||||
{
|
||||
_page = page;
|
||||
|
||||
SetBinding(SiteParameterProperty, new Binding("."));
|
||||
Label.SetBinding<VaultListPageModel.Site>(Label.TextProperty, s => s.Name);
|
||||
Detail.SetBinding<VaultListPageModel.Site>(Label.TextProperty, s => s.Username);
|
||||
SetBinding(LoginParameterProperty, new Binding("."));
|
||||
Label.SetBinding<VaultListPageModel.Login>(Label.TextProperty, s => s.Name);
|
||||
Detail.SetBinding<VaultListPageModel.Login>(Label.TextProperty, s => s.Username);
|
||||
|
||||
Button.Image = "more";
|
||||
Button.Command = new Command(() => ShowMore());
|
||||
@ -461,21 +461,21 @@ namespace Bit.App.Pages
|
||||
BackgroundColor = Color.White;
|
||||
}
|
||||
|
||||
public VaultListPageModel.Site SiteParameter
|
||||
public VaultListPageModel.Login LoginParameter
|
||||
{
|
||||
get { return GetValue(SiteParameterProperty) as VaultListPageModel.Site; }
|
||||
set { SetValue(SiteParameterProperty, value); }
|
||||
get { return GetValue(LoginParameterProperty) as VaultListPageModel.Login; }
|
||||
set { SetValue(LoginParameterProperty, value); }
|
||||
}
|
||||
|
||||
private void ShowMore()
|
||||
{
|
||||
_page.MoreClickedAsync(SiteParameter);
|
||||
_page.MoreClickedAsync(LoginParameter);
|
||||
}
|
||||
}
|
||||
|
||||
private class VaultListHeaderViewCell : ExtendedViewCell
|
||||
{
|
||||
public VaultListHeaderViewCell(VaultListSitesPage page)
|
||||
public VaultListHeaderViewCell(VaultListLoginsPage page)
|
||||
{
|
||||
var image = new Image
|
||||
{
|
||||
|
@ -9,26 +9,26 @@ using XLabs.Ioc;
|
||||
|
||||
namespace Bit.App.Pages
|
||||
{
|
||||
public class VaultViewSitePage : ExtendedContentPage
|
||||
public class VaultViewLoginPage : ExtendedContentPage
|
||||
{
|
||||
private readonly string _siteId;
|
||||
private readonly ISiteService _siteService;
|
||||
private readonly string _loginId;
|
||||
private readonly ILoginService _loginService;
|
||||
private readonly IUserDialogs _userDialogs;
|
||||
private readonly IClipboardService _clipboardService;
|
||||
|
||||
public VaultViewSitePage(string siteId)
|
||||
public VaultViewLoginPage(string loginId)
|
||||
{
|
||||
_siteId = siteId;
|
||||
_siteService = Resolver.Resolve<ISiteService>();
|
||||
_loginId = loginId;
|
||||
_loginService = Resolver.Resolve<ILoginService>();
|
||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||
_clipboardService = Resolver.Resolve<IClipboardService>();
|
||||
|
||||
Init();
|
||||
}
|
||||
|
||||
private VaultViewSitePageModel Model { get; set; } = new VaultViewSitePageModel();
|
||||
private VaultViewLoginPageModel Model { get; set; } = new VaultViewLoginPageModel();
|
||||
private ExtendedTableView Table { get; set; }
|
||||
private TableSection SiteInformationSection { get; set; }
|
||||
private TableSection LoginInformationSection { get; set; }
|
||||
private TableSection NotesSection { get; set; }
|
||||
public LabeledValueCell UsernameCell { get; set; }
|
||||
public LabeledValueCell PasswordCell { get; set; }
|
||||
@ -36,7 +36,7 @@ namespace Bit.App.Pages
|
||||
|
||||
private void Init()
|
||||
{
|
||||
ToolbarItems.Add(new EditSiteToolBarItem(this, _siteId));
|
||||
ToolbarItems.Add(new EditLoginToolBarItem(this, _loginId));
|
||||
if(Device.OS == TargetPlatform.iOS)
|
||||
{
|
||||
ToolbarItems.Add(new DismissModalToolBarItem(this));
|
||||
@ -44,20 +44,20 @@ namespace Bit.App.Pages
|
||||
|
||||
// Name
|
||||
var nameCell = new LabeledValueCell(AppResources.Name);
|
||||
nameCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.Name);
|
||||
nameCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.Name);
|
||||
|
||||
// Username
|
||||
UsernameCell = new LabeledValueCell(AppResources.Username, button1Text: AppResources.Copy);
|
||||
UsernameCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.Username);
|
||||
UsernameCell.Value.SetBinding<VaultViewSitePageModel>(Label.FontSizeProperty, s => s.UsernameFontSize);
|
||||
UsernameCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.Username);
|
||||
UsernameCell.Value.SetBinding<VaultViewLoginPageModel>(Label.FontSizeProperty, s => s.UsernameFontSize);
|
||||
UsernameCell.Button1.Command = new Command(() => Copy(Model.Username, AppResources.Username));
|
||||
|
||||
// Password
|
||||
PasswordCell = new LabeledValueCell(AppResources.Password, button1Text: string.Empty,
|
||||
button2Text: AppResources.Copy);
|
||||
PasswordCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.MaskedPassword);
|
||||
PasswordCell.Value.SetBinding<VaultViewSitePageModel>(Label.FontSizeProperty, s => s.PasswordFontSize);
|
||||
PasswordCell.Button1.SetBinding<VaultViewSitePageModel>(Button.ImageProperty, s => s.ShowHideImage);
|
||||
PasswordCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.MaskedPassword);
|
||||
PasswordCell.Value.SetBinding<VaultViewLoginPageModel>(Label.FontSizeProperty, s => s.PasswordFontSize);
|
||||
PasswordCell.Button1.SetBinding<VaultViewLoginPageModel>(Button.ImageProperty, s => s.ShowHideImage);
|
||||
if(Device.OS == TargetPlatform.iOS)
|
||||
{
|
||||
PasswordCell.Button1.Margin = new Thickness(10, 0);
|
||||
@ -68,16 +68,16 @@ namespace Bit.App.Pages
|
||||
|
||||
// URI
|
||||
UriCell = new LabeledValueCell(AppResources.Website, button1Text: AppResources.Launch);
|
||||
UriCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.UriHost);
|
||||
UriCell.Button1.SetBinding<VaultViewSitePageModel>(IsVisibleProperty, s => s.ShowLaunch);
|
||||
UriCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.UriHost);
|
||||
UriCell.Button1.SetBinding<VaultViewLoginPageModel>(IsVisibleProperty, s => s.ShowLaunch);
|
||||
UriCell.Button1.Command = new Command(() => Device.OpenUri(new Uri(Model.Uri)));
|
||||
|
||||
// Notes
|
||||
var notesCell = new LabeledValueCell();
|
||||
notesCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.Notes);
|
||||
notesCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.Notes);
|
||||
notesCell.Value.LineBreakMode = LineBreakMode.WordWrap;
|
||||
|
||||
SiteInformationSection = new TableSection(AppResources.SiteInformation)
|
||||
LoginInformationSection = new TableSection(AppResources.LoginInformation)
|
||||
{
|
||||
nameCell
|
||||
};
|
||||
@ -95,7 +95,7 @@ namespace Bit.App.Pages
|
||||
EnableSelection = false,
|
||||
Root = new TableRoot
|
||||
{
|
||||
SiteInformationSection,
|
||||
LoginInformationSection,
|
||||
NotesSection
|
||||
}
|
||||
};
|
||||
@ -114,47 +114,47 @@ namespace Bit.App.Pages
|
||||
UriCell.Button1.WidthRequest = 75;
|
||||
}
|
||||
|
||||
Title = AppResources.ViewSite;
|
||||
Title = AppResources.ViewLogin;
|
||||
Content = Table;
|
||||
BindingContext = Model;
|
||||
}
|
||||
|
||||
protected async override void OnAppearing()
|
||||
{
|
||||
var site = await _siteService.GetByIdAsync(_siteId);
|
||||
if(site == null)
|
||||
var login = await _loginService.GetByIdAsync(_loginId);
|
||||
if(login == null)
|
||||
{
|
||||
await Navigation.PopForDeviceAsync();
|
||||
return;
|
||||
}
|
||||
|
||||
Model.Update(site);
|
||||
Model.Update(login);
|
||||
|
||||
if(!Model.ShowUri)
|
||||
{
|
||||
SiteInformationSection.Remove(UriCell);
|
||||
LoginInformationSection.Remove(UriCell);
|
||||
}
|
||||
else if(!SiteInformationSection.Contains(UriCell))
|
||||
else if(!LoginInformationSection.Contains(UriCell))
|
||||
{
|
||||
SiteInformationSection.Add(UriCell);
|
||||
LoginInformationSection.Add(UriCell);
|
||||
}
|
||||
|
||||
if(!Model.ShowUsername)
|
||||
{
|
||||
SiteInformationSection.Remove(UsernameCell);
|
||||
LoginInformationSection.Remove(UsernameCell);
|
||||
}
|
||||
else if(!SiteInformationSection.Contains(UsernameCell))
|
||||
else if(!LoginInformationSection.Contains(UsernameCell))
|
||||
{
|
||||
SiteInformationSection.Add(UsernameCell);
|
||||
LoginInformationSection.Add(UsernameCell);
|
||||
}
|
||||
|
||||
if(!Model.ShowPassword)
|
||||
{
|
||||
SiteInformationSection.Remove(PasswordCell);
|
||||
LoginInformationSection.Remove(PasswordCell);
|
||||
}
|
||||
else if(!SiteInformationSection.Contains(PasswordCell))
|
||||
else if(!LoginInformationSection.Contains(PasswordCell))
|
||||
{
|
||||
SiteInformationSection.Add(PasswordCell);
|
||||
LoginInformationSection.Add(PasswordCell);
|
||||
}
|
||||
|
||||
if(!Model.ShowNotes)
|
||||
@ -175,22 +175,22 @@ namespace Bit.App.Pages
|
||||
_userDialogs.Toast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
|
||||
}
|
||||
|
||||
private class EditSiteToolBarItem : ToolbarItem
|
||||
private class EditLoginToolBarItem : ToolbarItem
|
||||
{
|
||||
private readonly VaultViewSitePage _page;
|
||||
private readonly string _siteId;
|
||||
private readonly VaultViewLoginPage _page;
|
||||
private readonly string _loginId;
|
||||
|
||||
public EditSiteToolBarItem(VaultViewSitePage page, string siteId)
|
||||
public EditLoginToolBarItem(VaultViewLoginPage page, string loginId)
|
||||
{
|
||||
_page = page;
|
||||
_siteId = siteId;
|
||||
_loginId = loginId;
|
||||
Text = AppResources.Edit;
|
||||
Clicked += ClickedItem;
|
||||
}
|
||||
|
||||
private async void ClickedItem(object sender, EventArgs e)
|
||||
{
|
||||
var page = new VaultEditSitePage(_siteId);
|
||||
var page = new VaultEditLoginPage(_loginId);
|
||||
await _page.Navigation.PushForDeviceAsync(page);
|
||||
}
|
||||
}
|
||||
|
@ -22,11 +22,11 @@ namespace Bit.App.Repositories
|
||||
public override Task DeleteAsync(string id)
|
||||
{
|
||||
var now = DateTime.UtcNow;
|
||||
DeleteWithSiteUpdateAsync(id, now);
|
||||
DeleteWithLoginUpdateAsync(id, now);
|
||||
return Task.FromResult(0);
|
||||
}
|
||||
|
||||
public Task DeleteWithSiteUpdateAsync(string id, DateTime revisionDate)
|
||||
public Task DeleteWithLoginUpdateAsync(string id, DateTime revisionDate)
|
||||
{
|
||||
Connection.RunInTransaction(() =>
|
||||
{
|
||||
|
@ -9,9 +9,9 @@ using Plugin.Connectivity.Abstractions;
|
||||
|
||||
namespace Bit.App.Repositories
|
||||
{
|
||||
public class SiteApiRepository : ApiRepository<SiteRequest, SiteResponse, string>, ISiteApiRepository
|
||||
public class LoginApiRepository : ApiRepository<LoginRequest, LoginResponse, string>, ILoginApiRepository
|
||||
{
|
||||
public SiteApiRepository(
|
||||
public LoginApiRepository(
|
||||
IConnectivity connectivity,
|
||||
IHttpService httpService)
|
||||
: base(connectivity, httpService)
|
||||
|
@ -7,22 +7,23 @@ using Bit.App.Models.Data;
|
||||
|
||||
namespace Bit.App.Repositories
|
||||
{
|
||||
public class SiteRepository : Repository<SiteData, string>, ISiteRepository
|
||||
public class LoginRepository : Repository<LoginData, string>, ILoginRepository
|
||||
{
|
||||
public SiteRepository(ISqlService sqlService)
|
||||
public LoginRepository(ISqlService sqlService)
|
||||
: base(sqlService)
|
||||
{ }
|
||||
|
||||
public Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId)
|
||||
public Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId)
|
||||
{
|
||||
var sites = Connection.Table<SiteData>().Where(f => f.UserId == userId).Cast<SiteData>();
|
||||
return Task.FromResult(sites);
|
||||
var logins = Connection.Table<LoginData>().Where(f => f.UserId == userId).Cast<LoginData>();
|
||||
return Task.FromResult(logins);
|
||||
}
|
||||
|
||||
public Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId, bool favorite)
|
||||
public Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId, bool favorite)
|
||||
{
|
||||
var sites = Connection.Table<SiteData>().Where(f => f.UserId == userId && f.Favorite == favorite).Cast<SiteData>();
|
||||
return Task.FromResult(sites);
|
||||
var logins = Connection.Table<LoginData>().Where(f => f.UserId == userId && f.Favorite == favorite)
|
||||
.Cast<LoginData>();
|
||||
return Task.FromResult(logins);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
136
src/App/Resources/AppResources.Designer.cs
generated
136
src/App/Resources/AppResources.Designer.cs
generated
@ -98,11 +98,11 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Add a Site.
|
||||
/// Looks up a localized string similar to Add a Login.
|
||||
/// </summary>
|
||||
public static string AddASite {
|
||||
public static string AddALogin {
|
||||
get {
|
||||
return ResourceManager.GetString("AddASite", resourceCulture);
|
||||
return ResourceManager.GetString("AddALogin", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
@ -116,11 +116,11 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Add Site.
|
||||
/// Looks up a localized string similar to Add Login.
|
||||
/// </summary>
|
||||
public static string AddSite {
|
||||
public static string AddLogin {
|
||||
get {
|
||||
return ResourceManager.GetString("AddSite", resourceCulture);
|
||||
return ResourceManager.GetString("AddLogin", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
@ -197,7 +197,7 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to The easiest way to add new sites to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen..
|
||||
/// Looks up a localized string similar to The easiest way to add new logins to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen..
|
||||
/// </summary>
|
||||
public static string BitwardenAppExtensionAlert {
|
||||
get {
|
||||
@ -440,11 +440,11 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Edit Site.
|
||||
/// Looks up a localized string similar to Edit Login.
|
||||
/// </summary>
|
||||
public static string EditSite {
|
||||
public static string EditLogin {
|
||||
get {
|
||||
return ResourceManager.GetString("EditSite", resourceCulture);
|
||||
return ResourceManager.GetString("EditLogin", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
@ -961,6 +961,33 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login has been deleted..
|
||||
/// </summary>
|
||||
public static string LoginDeleted {
|
||||
get {
|
||||
return ResourceManager.GetString("LoginDeleted", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login Information.
|
||||
/// </summary>
|
||||
public static string LoginInformation {
|
||||
get {
|
||||
return ResourceManager.GetString("LoginInformation", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to No Name.
|
||||
/// </summary>
|
||||
public static string LoginNoName {
|
||||
get {
|
||||
return ResourceManager.GetString("LoginNoName", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login.
|
||||
/// </summary>
|
||||
@ -979,6 +1006,24 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Logins.
|
||||
/// </summary>
|
||||
public static string Logins {
|
||||
get {
|
||||
return ResourceManager.GetString("Logins", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login updated..
|
||||
/// </summary>
|
||||
public static string LoginUpdated {
|
||||
get {
|
||||
return ResourceManager.GetString("LoginUpdated", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Log Out.
|
||||
/// </summary>
|
||||
@ -1142,11 +1187,11 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to New site created..
|
||||
/// Looks up a localized string similar to New login created..
|
||||
/// </summary>
|
||||
public static string NewSiteCreated {
|
||||
public static string NewLoginCreated {
|
||||
get {
|
||||
return ResourceManager.GetString("NewSiteCreated", resourceCulture);
|
||||
return ResourceManager.GetString("NewLoginCreated", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1169,20 +1214,20 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to There are no sites in your vault..
|
||||
/// Looks up a localized string similar to There are no logins in your vault..
|
||||
/// </summary>
|
||||
public static string NoSites {
|
||||
public static string NoLogins {
|
||||
get {
|
||||
return ResourceManager.GetString("NoSites", resourceCulture);
|
||||
return ResourceManager.GetString("NoLogins", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to There are no sites in your vault for this website. Tap to add one..
|
||||
/// Looks up a localized string similar to There are no logins in your vault for this website. Tap to add one..
|
||||
/// </summary>
|
||||
public static string NoSitesTap {
|
||||
public static string NoLoginsTap {
|
||||
get {
|
||||
return ResourceManager.GetString("NoSitesTap", resourceCulture);
|
||||
return ResourceManager.GetString("NoLoginsTap", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1196,7 +1241,7 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to This site does not have a username or password configured..
|
||||
/// Looks up a localized string similar to This login does not have a username or password configured..
|
||||
/// </summary>
|
||||
public static string NoUsernamePasswordConfigured {
|
||||
get {
|
||||
@ -1456,51 +1501,6 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Site has been deleted..
|
||||
/// </summary>
|
||||
public static string SiteDeleted {
|
||||
get {
|
||||
return ResourceManager.GetString("SiteDeleted", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Site Information.
|
||||
/// </summary>
|
||||
public static string SiteInformation {
|
||||
get {
|
||||
return ResourceManager.GetString("SiteInformation", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to No Name.
|
||||
/// </summary>
|
||||
public static string SiteNoName {
|
||||
get {
|
||||
return ResourceManager.GetString("SiteNoName", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Sites.
|
||||
/// </summary>
|
||||
public static string Sites {
|
||||
get {
|
||||
return ResourceManager.GetString("Sites", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Site updated..
|
||||
/// </summary>
|
||||
public static string SiteUpdated {
|
||||
get {
|
||||
return ResourceManager.GetString("SiteUpdated", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Submit.
|
||||
/// </summary>
|
||||
@ -1745,11 +1745,11 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to View Site.
|
||||
/// Looks up a localized string similar to View Login.
|
||||
/// </summary>
|
||||
public static string ViewSite {
|
||||
public static string ViewLogin {
|
||||
get {
|
||||
return ResourceManager.GetString("ViewSite", resourceCulture);
|
||||
return ResourceManager.GetString("ViewLogin", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -127,9 +127,9 @@
|
||||
<data name="AddFolder" xml:space="preserve">
|
||||
<value>Ajouter dossier</value>
|
||||
</data>
|
||||
<data name="AddSite" xml:space="preserve">
|
||||
<data name="AddLogin" xml:space="preserve">
|
||||
<value>Ajouter site</value>
|
||||
<comment>The title for the add site page.</comment>
|
||||
<comment>The title for the add login page.</comment>
|
||||
</data>
|
||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||
<value>Une erreur est survenue.</value>
|
||||
@ -153,11 +153,11 @@
|
||||
</data>
|
||||
<data name="CopyPassword" xml:space="preserve">
|
||||
<value>Copier mot de passe</value>
|
||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="CopyUsername" xml:space="preserve">
|
||||
<value>Copier nom d'utilisateur</value>
|
||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="Credits" xml:space="preserve">
|
||||
<value>Remerciements</value>
|
||||
@ -223,7 +223,7 @@
|
||||
</data>
|
||||
<data name="FolderNone" xml:space="preserve">
|
||||
<value>(aucun)</value>
|
||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
</data>
|
||||
<data name="Folders" xml:space="preserve">
|
||||
<value>Dossiers</value>
|
||||
@ -322,13 +322,13 @@
|
||||
<value>Afficher</value>
|
||||
<comment>Reveal a hidden value (password).</comment>
|
||||
</data>
|
||||
<data name="SiteDeleted" xml:space="preserve">
|
||||
<data name="LoginDeleted" xml:space="preserve">
|
||||
<value>Le site a été supprimé.</value>
|
||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
||||
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||
</data>
|
||||
<data name="SiteNoName" xml:space="preserve">
|
||||
<data name="LoginNoName" xml:space="preserve">
|
||||
<value>Aucun nom</value>
|
||||
<comment>Title text to display when there is no name given for a site.</comment>
|
||||
<comment>Title text to display when there is no name given for a login.</comment>
|
||||
</data>
|
||||
<data name="Submit" xml:space="preserve">
|
||||
<value>Soumettre</value>
|
||||
@ -397,7 +397,7 @@
|
||||
<data name="AccountCreated" xml:space="preserve">
|
||||
<value>Votre nouveau compte a été créé ! Vous pouvez maintenant vous identifier.</value>
|
||||
</data>
|
||||
<data name="AddASite" xml:space="preserve">
|
||||
<data name="AddALogin" xml:space="preserve">
|
||||
<value>Ajouter un site</value>
|
||||
</data>
|
||||
<data name="AppExtension" xml:space="preserve">
|
||||
@ -467,7 +467,7 @@
|
||||
<data name="CurrentSession" xml:space="preserve">
|
||||
<value>Session actuelle</value>
|
||||
</data>
|
||||
<data name="EditSite" xml:space="preserve">
|
||||
<data name="EditLogin" xml:space="preserve">
|
||||
<value>Modifier Site</value>
|
||||
</data>
|
||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||
@ -603,16 +603,16 @@
|
||||
<data name="Never" xml:space="preserve">
|
||||
<value>Jamais</value>
|
||||
</data>
|
||||
<data name="NewSiteCreated" xml:space="preserve">
|
||||
<data name="NewLoginCreated" xml:space="preserve">
|
||||
<value>Nouveau site créé.</value>
|
||||
</data>
|
||||
<data name="NoFavorites" xml:space="preserve">
|
||||
<value>Aucun favori dans votre coffre.</value>
|
||||
</data>
|
||||
<data name="NoSites" xml:space="preserve">
|
||||
<data name="NoLogins" xml:space="preserve">
|
||||
<value>Aucun site dans votre coffre.</value>
|
||||
</data>
|
||||
<data name="NoSitesTap" xml:space="preserve">
|
||||
<data name="NoLoginsTap" xml:space="preserve">
|
||||
<value>Aucun site dans votre coffre pour ce site web. Appuyez pour en ajouter un.</value>
|
||||
</data>
|
||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||
@ -686,10 +686,10 @@
|
||||
<data name="SetPINDirection" xml:space="preserve">
|
||||
<value>Saisissez un code PIN à 4 chiffres pour déverrouiller l'application.</value>
|
||||
</data>
|
||||
<data name="SiteInformation" xml:space="preserve">
|
||||
<data name="LoginInformation" xml:space="preserve">
|
||||
<value>Informations sur le site</value>
|
||||
</data>
|
||||
<data name="SiteUpdated" xml:space="preserve">
|
||||
<data name="LoginUpdated" xml:space="preserve">
|
||||
<value>Site mis à jour.</value>
|
||||
</data>
|
||||
<data name="Submitting" xml:space="preserve">
|
||||
@ -732,7 +732,7 @@
|
||||
<data name="VerificationCode" xml:space="preserve">
|
||||
<value>Code de vérification</value>
|
||||
</data>
|
||||
<data name="ViewSite" xml:space="preserve">
|
||||
<data name="ViewLogin" xml:space="preserve">
|
||||
<value>Voir le site</value>
|
||||
</data>
|
||||
<data name="WebVault" xml:space="preserve">
|
||||
@ -744,7 +744,7 @@
|
||||
<data name="Lost2FAApp" xml:space="preserve">
|
||||
<value>Application d'authentification perdue ?</value>
|
||||
</data>
|
||||
<data name="Sites" xml:space="preserve">
|
||||
<data name="Logins" xml:space="preserve">
|
||||
<value>Sites</value>
|
||||
<comment>Screen title</comment>
|
||||
</data>
|
||||
|
@ -127,9 +127,9 @@
|
||||
<data name="AddFolder" xml:space="preserve">
|
||||
<value>Add Folder</value>
|
||||
</data>
|
||||
<data name="AddSite" xml:space="preserve">
|
||||
<value>Add Site</value>
|
||||
<comment>The title for the add site page.</comment>
|
||||
<data name="AddLogin" xml:space="preserve">
|
||||
<value>Add Login</value>
|
||||
<comment>The title for the add login page.</comment>
|
||||
</data>
|
||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||
<value>An error has occurred.</value>
|
||||
@ -153,11 +153,11 @@
|
||||
</data>
|
||||
<data name="CopyPassword" xml:space="preserve">
|
||||
<value>Copy Password</value>
|
||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="CopyUsername" xml:space="preserve">
|
||||
<value>Copy Username</value>
|
||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="Credits" xml:space="preserve">
|
||||
<value>Credits</value>
|
||||
@ -223,7 +223,7 @@
|
||||
</data>
|
||||
<data name="FolderNone" xml:space="preserve">
|
||||
<value>(none)</value>
|
||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
</data>
|
||||
<data name="Folders" xml:space="preserve">
|
||||
<value>Folders</value>
|
||||
@ -322,13 +322,13 @@
|
||||
<value>Show</value>
|
||||
<comment>Reveal a hidden value (password).</comment>
|
||||
</data>
|
||||
<data name="SiteDeleted" xml:space="preserve">
|
||||
<value>Site has been deleted.</value>
|
||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
||||
<data name="LoginDeleted" xml:space="preserve">
|
||||
<value>Login has been deleted.</value>
|
||||
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||
</data>
|
||||
<data name="SiteNoName" xml:space="preserve">
|
||||
<data name="LoginNoName" xml:space="preserve">
|
||||
<value>No Name</value>
|
||||
<comment>Title text to display when there is no name given for a site.</comment>
|
||||
<comment>Title text to display when there is no name given for a login.</comment>
|
||||
</data>
|
||||
<data name="Submit" xml:space="preserve">
|
||||
<value>Submit</value>
|
||||
@ -397,8 +397,8 @@
|
||||
<data name="AccountCreated" xml:space="preserve">
|
||||
<value>Your new account has been created! You may now log in.</value>
|
||||
</data>
|
||||
<data name="AddASite" xml:space="preserve">
|
||||
<value>Add a Site</value>
|
||||
<data name="AddALogin" xml:space="preserve">
|
||||
<value>Add a Login</value>
|
||||
</data>
|
||||
<data name="AppExtension" xml:space="preserve">
|
||||
<value>App Extension</value>
|
||||
@ -416,7 +416,7 @@
|
||||
<value>bitwarden App Extension</value>
|
||||
</data>
|
||||
<data name="BitwardenAppExtensionAlert" xml:space="preserve">
|
||||
<value>The easiest way to add new sites to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen.</value>
|
||||
<value>The easiest way to add new logins to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen.</value>
|
||||
</data>
|
||||
<data name="BitwardenAppExtensionDescription" xml:space="preserve">
|
||||
<value>Use bitwarden in Safari and other apps to auto-fill your logins.</value>
|
||||
@ -467,8 +467,8 @@
|
||||
<data name="CurrentSession" xml:space="preserve">
|
||||
<value>Current Session</value>
|
||||
</data>
|
||||
<data name="EditSite" xml:space="preserve">
|
||||
<value>Edit Site</value>
|
||||
<data name="EditLogin" xml:space="preserve">
|
||||
<value>Edit Login</value>
|
||||
</data>
|
||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||
<value>Enable Automatic Syncing</value>
|
||||
@ -603,20 +603,20 @@
|
||||
<data name="Never" xml:space="preserve">
|
||||
<value>Never</value>
|
||||
</data>
|
||||
<data name="NewSiteCreated" xml:space="preserve">
|
||||
<value>New site created.</value>
|
||||
<data name="NewLoginCreated" xml:space="preserve">
|
||||
<value>New login created.</value>
|
||||
</data>
|
||||
<data name="NoFavorites" xml:space="preserve">
|
||||
<value>There are no favorites in your vault.</value>
|
||||
</data>
|
||||
<data name="NoSites" xml:space="preserve">
|
||||
<value>There are no sites in your vault.</value>
|
||||
<data name="NoLogins" xml:space="preserve">
|
||||
<value>There are no logins in your vault.</value>
|
||||
</data>
|
||||
<data name="NoSitesTap" xml:space="preserve">
|
||||
<value>There are no sites in your vault for this website. Tap to add one.</value>
|
||||
<data name="NoLoginsTap" xml:space="preserve">
|
||||
<value>There are no logins in your vault for this website. Tap to add one.</value>
|
||||
</data>
|
||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||
<value>This site does not have a username or password configured.</value>
|
||||
<value>This login does not have a username or password configured.</value>
|
||||
</data>
|
||||
<data name="OkGotIt" xml:space="preserve">
|
||||
<value>Ok, got it!</value>
|
||||
@ -686,11 +686,11 @@
|
||||
<data name="SetPINDirection" xml:space="preserve">
|
||||
<value>Enter a 4 digit PIN code to unlock the app with.</value>
|
||||
</data>
|
||||
<data name="SiteInformation" xml:space="preserve">
|
||||
<value>Site Information</value>
|
||||
<data name="LoginInformation" xml:space="preserve">
|
||||
<value>Login Information</value>
|
||||
</data>
|
||||
<data name="SiteUpdated" xml:space="preserve">
|
||||
<value>Site updated.</value>
|
||||
<data name="LoginUpdated" xml:space="preserve">
|
||||
<value>Login updated.</value>
|
||||
</data>
|
||||
<data name="Submitting" xml:space="preserve">
|
||||
<value>Submitting...</value>
|
||||
@ -732,8 +732,8 @@
|
||||
<data name="VerificationCode" xml:space="preserve">
|
||||
<value>Verification Code</value>
|
||||
</data>
|
||||
<data name="ViewSite" xml:space="preserve">
|
||||
<value>View Site</value>
|
||||
<data name="ViewLogin" xml:space="preserve">
|
||||
<value>View Login</value>
|
||||
</data>
|
||||
<data name="WebVault" xml:space="preserve">
|
||||
<value>bitwarden Web Vault</value>
|
||||
@ -744,8 +744,8 @@
|
||||
<data name="Lost2FAApp" xml:space="preserve">
|
||||
<value>Lost authenticator app?</value>
|
||||
</data>
|
||||
<data name="Sites" xml:space="preserve">
|
||||
<value>Sites</value>
|
||||
<data name="Logins" xml:space="preserve">
|
||||
<value>Logins</value>
|
||||
<comment>Screen title</comment>
|
||||
</data>
|
||||
<data name="ExtensionActivated" xml:space="preserve">
|
||||
|
@ -127,9 +127,9 @@
|
||||
<data name="AddFolder" xml:space="preserve">
|
||||
<value>Skapa mapp</value>
|
||||
</data>
|
||||
<data name="AddSite" xml:space="preserve">
|
||||
<data name="AddLogin" xml:space="preserve">
|
||||
<value>Lägg till inloggning</value>
|
||||
<comment>The title for the add site page.</comment>
|
||||
<comment>The title for the add login page.</comment>
|
||||
</data>
|
||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||
<value>Ett fel har inträffat.</value>
|
||||
@ -153,11 +153,11 @@
|
||||
</data>
|
||||
<data name="CopyPassword" xml:space="preserve">
|
||||
<value>Kopiera lösenord</value>
|
||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="CopyUsername" xml:space="preserve">
|
||||
<value>Kopiera användarnamn</value>
|
||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="Credits" xml:space="preserve">
|
||||
<value>Tillskrivningar</value>
|
||||
@ -229,7 +229,7 @@
|
||||
</data>
|
||||
<data name="FolderNone" xml:space="preserve">
|
||||
<value>(ingen)</value>
|
||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
</data>
|
||||
<data name="Folders" xml:space="preserve">
|
||||
<value>Mappar</value>
|
||||
@ -334,13 +334,13 @@
|
||||
<value>Visa</value>
|
||||
<comment>Reveal a hidden value (password).</comment>
|
||||
</data>
|
||||
<data name="SiteDeleted" xml:space="preserve">
|
||||
<data name="LoginDeleted" xml:space="preserve">
|
||||
<value>Tog bort inloggning.</value>
|
||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
||||
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||
</data>
|
||||
<data name="SiteNoName" xml:space="preserve">
|
||||
<data name="LoginNoName" xml:space="preserve">
|
||||
<value>Inget namn</value>
|
||||
<comment>Title text to display when there is no name given for a site.</comment>
|
||||
<comment>Title text to display when there is no name given for a login.</comment>
|
||||
</data>
|
||||
<data name="Submit" xml:space="preserve">
|
||||
<value>Skicka</value>
|
||||
@ -414,7 +414,7 @@
|
||||
<data name="AccountCreated" xml:space="preserve">
|
||||
<value>Ditt nya konto har blivit skapat! Du kan nu logga in.</value>
|
||||
</data>
|
||||
<data name="AddASite" xml:space="preserve">
|
||||
<data name="AddALogin" xml:space="preserve">
|
||||
<value>Lägg till en inloggning</value>
|
||||
</data>
|
||||
<data name="AppExtension" xml:space="preserve">
|
||||
@ -489,7 +489,7 @@
|
||||
<value>Nuvarande session</value>
|
||||
<comment>Current Session</comment>
|
||||
</data>
|
||||
<data name="EditSite" xml:space="preserve">
|
||||
<data name="EditLogin" xml:space="preserve">
|
||||
<value>Ändra inloggning</value>
|
||||
</data>
|
||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||
@ -651,25 +651,25 @@
|
||||
<data name="Never" xml:space="preserve">
|
||||
<value>Aldrig</value>
|
||||
</data>
|
||||
<data name="NewSiteCreated" xml:space="preserve">
|
||||
<data name="NewLoginCreated" xml:space="preserve">
|
||||
<value>Ny inlogging skapad.</value>
|
||||
<comment>New site created.</comment>
|
||||
<comment>New login created.</comment>
|
||||
</data>
|
||||
<data name="NoFavorites" xml:space="preserve">
|
||||
<value>Det finns inga favoriter i ditt valv.</value>
|
||||
<comment>There are no favorites in your vault.</comment>
|
||||
</data>
|
||||
<data name="NoSites" xml:space="preserve">
|
||||
<data name="NoLogins" xml:space="preserve">
|
||||
<value>Det finns inga inloggningar i ditt valv.</value>
|
||||
<comment>There are no sites in your vault.</comment>
|
||||
<comment>There are no logins in your vault.</comment>
|
||||
</data>
|
||||
<data name="NoSitesTap" xml:space="preserve">
|
||||
<data name="NoLoginsTap" xml:space="preserve">
|
||||
<value>Det finns inga inloggningar i ditt valv för den här webbplatsen. Tryck för att skapa en.</value>
|
||||
<comment>There are no sites in your vault for this website. Tap to add one.</comment>
|
||||
<comment>There are no logins in your vault for this website. Tap to add one.</comment>
|
||||
</data>
|
||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||
<value>Den här inloggningen har inte ett användarnamn eller lösenord inskrivet.</value>
|
||||
<comment>This site does not have a username or password configured.</comment>
|
||||
<comment>This login does not have a username or password configured.</comment>
|
||||
</data>
|
||||
<data name="OkGotIt" xml:space="preserve">
|
||||
<value>Ok, fattar!</value>
|
||||
@ -753,11 +753,11 @@
|
||||
<value>Skriv in en fyrsiffrig PIN-kod som du låser upp appen med.</value>
|
||||
<comment>Enter a 4 digit PIN code to unlock the app with.</comment>
|
||||
</data>
|
||||
<data name="SiteInformation" xml:space="preserve">
|
||||
<data name="LoginInformation" xml:space="preserve">
|
||||
<value>Inloggningsinformation</value>
|
||||
<comment>Site Information</comment>
|
||||
<comment>Login Information</comment>
|
||||
</data>
|
||||
<data name="SiteUpdated" xml:space="preserve">
|
||||
<data name="LoginUpdated" xml:space="preserve">
|
||||
<value>Inloggning uppdaterad.</value>
|
||||
</data>
|
||||
<data name="Submitting" xml:space="preserve">
|
||||
@ -804,7 +804,7 @@
|
||||
<value>Verifieringskod</value>
|
||||
<comment>Verification Code</comment>
|
||||
</data>
|
||||
<data name="ViewSite" xml:space="preserve">
|
||||
<data name="ViewLogin" xml:space="preserve">
|
||||
<value>Visa inloggning</value>
|
||||
</data>
|
||||
<data name="WebVault" xml:space="preserve">
|
||||
@ -817,7 +817,7 @@
|
||||
<data name="Lost2FAApp" xml:space="preserve">
|
||||
<value>Förlorat autentiseringsapp?</value>
|
||||
</data>
|
||||
<data name="Sites" xml:space="preserve">
|
||||
<data name="Logins" xml:space="preserve">
|
||||
<value>Inloggningar</value>
|
||||
<comment>Screen title</comment>
|
||||
</data>
|
||||
|
@ -127,9 +127,9 @@
|
||||
<data name="AddFolder" xml:space="preserve">
|
||||
<value>添加文件夹</value>
|
||||
</data>
|
||||
<data name="AddSite" xml:space="preserve">
|
||||
<data name="AddLogin" xml:space="preserve">
|
||||
<value>添加网站</value>
|
||||
<comment>The title for the add site page.</comment>
|
||||
<comment>The title for the add login page.</comment>
|
||||
</data>
|
||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||
<value>发生错误。</value>
|
||||
@ -153,11 +153,11 @@
|
||||
</data>
|
||||
<data name="CopyPassword" xml:space="preserve">
|
||||
<value>复制密码</value>
|
||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="CopyUsername" xml:space="preserve">
|
||||
<value>复制用户名</value>
|
||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||
</data>
|
||||
<data name="Credits" xml:space="preserve">
|
||||
<value>Credits</value>
|
||||
@ -223,7 +223,7 @@
|
||||
</data>
|
||||
<data name="FolderNone" xml:space="preserve">
|
||||
<value>(无)</value>
|
||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||
</data>
|
||||
<data name="Folders" xml:space="preserve">
|
||||
<value>文件夹</value>
|
||||
@ -322,13 +322,13 @@
|
||||
<value>显示</value>
|
||||
<comment>Reveal a hidden value (password).</comment>
|
||||
</data>
|
||||
<data name="SiteDeleted" xml:space="preserve">
|
||||
<data name="LoginDeleted" xml:space="preserve">
|
||||
<value>网站已被删除。</value>
|
||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
||||
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||
</data>
|
||||
<data name="SiteNoName" xml:space="preserve">
|
||||
<data name="LoginNoName" xml:space="preserve">
|
||||
<value>无名</value>
|
||||
<comment>Title text to display when there is no name given for a site.</comment>
|
||||
<comment>Title text to display when there is no name given for a login.</comment>
|
||||
</data>
|
||||
<data name="Submit" xml:space="preserve">
|
||||
<value>提交</value>
|
||||
@ -397,7 +397,7 @@
|
||||
<data name="AccountCreated" xml:space="preserve">
|
||||
<value>已经为您创建账号!您可以登录了。</value>
|
||||
</data>
|
||||
<data name="AddASite" xml:space="preserve">
|
||||
<data name="AddALogin" xml:space="preserve">
|
||||
<value>添加网站</value>
|
||||
</data>
|
||||
<data name="AppExtension" xml:space="preserve">
|
||||
@ -467,7 +467,7 @@
|
||||
<data name="CurrentSession" xml:space="preserve">
|
||||
<value>当前会话</value>
|
||||
</data>
|
||||
<data name="EditSite" xml:space="preserve">
|
||||
<data name="EditLogin" xml:space="preserve">
|
||||
<value>编辑网站</value>
|
||||
</data>
|
||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||
@ -603,16 +603,16 @@
|
||||
<data name="Never" xml:space="preserve">
|
||||
<value>从不</value>
|
||||
</data>
|
||||
<data name="NewSiteCreated" xml:space="preserve">
|
||||
<data name="NewLoginCreated" xml:space="preserve">
|
||||
<value>以创建新网站。</value>
|
||||
</data>
|
||||
<data name="NoFavorites" xml:space="preserve">
|
||||
<value>你没有收藏任何网站。</value>
|
||||
</data>
|
||||
<data name="NoSites" xml:space="preserve">
|
||||
<data name="NoLogins" xml:space="preserve">
|
||||
<value>您的密码库里没有网站。</value>
|
||||
</data>
|
||||
<data name="NoSitesTap" xml:space="preserve">
|
||||
<data name="NoLoginsTap" xml:space="preserve">
|
||||
<value>您的密码库里没有此网站的登录信息。请添加一个。</value>
|
||||
</data>
|
||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||
@ -686,10 +686,10 @@
|
||||
<data name="SetPINDirection" xml:space="preserve">
|
||||
<value>输入一个 4 位的 PIN 码来解锁应用。</value>
|
||||
</data>
|
||||
<data name="SiteInformation" xml:space="preserve">
|
||||
<data name="LoginInformation" xml:space="preserve">
|
||||
<value>网站信息</value>
|
||||
</data>
|
||||
<data name="SiteUpdated" xml:space="preserve">
|
||||
<data name="LoginUpdated" xml:space="preserve">
|
||||
<value>网站已更新。</value>
|
||||
</data>
|
||||
<data name="Submitting" xml:space="preserve">
|
||||
@ -732,7 +732,7 @@
|
||||
<data name="VerificationCode" xml:space="preserve">
|
||||
<value>验证码</value>
|
||||
</data>
|
||||
<data name="ViewSite" xml:space="preserve">
|
||||
<data name="ViewLogin" xml:space="preserve">
|
||||
<value>查看网站</value>
|
||||
</data>
|
||||
<data name="WebVault" xml:space="preserve">
|
||||
|
@ -17,7 +17,7 @@ namespace Bit.App.Services
|
||||
public void CreateTables()
|
||||
{
|
||||
_connection.CreateTable<FolderData>();
|
||||
_connection.CreateTable<SiteData>();
|
||||
_connection.CreateTable<LoginData>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,13 +74,13 @@ namespace Bit.App.Services
|
||||
}
|
||||
_syncService.SyncDeleteFolderAsync(folderDeleteMessage.Id, folderDeleteMessage.RevisionDate);
|
||||
break;
|
||||
case Enums.PushType.SyncSiteDelete:
|
||||
var siteDeleteMessage = values.ToObject<SyncCipherPushNotification>();
|
||||
if(siteDeleteMessage.UserId != _authService.UserId)
|
||||
case Enums.PushType.SyncLoginDelete:
|
||||
var loginDeleteMessage = values.ToObject<SyncCipherPushNotification>();
|
||||
if(loginDeleteMessage.UserId != _authService.UserId)
|
||||
{
|
||||
break;
|
||||
}
|
||||
_syncService.SyncDeleteSiteAsync(siteDeleteMessage.Id);
|
||||
_syncService.SyncDeleteLoginAsync(loginDeleteMessage.Id);
|
||||
break;
|
||||
case Enums.PushType.SyncCiphers:
|
||||
var cipherMessage = values.ToObject<SyncCiphersPushNotification>();
|
||||
|
@ -10,73 +10,73 @@ using Xamarin.Forms;
|
||||
|
||||
namespace Bit.App.Services
|
||||
{
|
||||
public class SiteService : ISiteService
|
||||
public class LoginService : ILoginService
|
||||
{
|
||||
private readonly ISiteRepository _siteRepository;
|
||||
private readonly ILoginRepository _loginRepository;
|
||||
private readonly IAuthService _authService;
|
||||
private readonly ISiteApiRepository _siteApiRepository;
|
||||
private readonly ILoginApiRepository _loginApiRepository;
|
||||
|
||||
public SiteService(
|
||||
ISiteRepository siteRepository,
|
||||
public LoginService(
|
||||
ILoginRepository loginRepository,
|
||||
IAuthService authService,
|
||||
ISiteApiRepository siteApiRepository)
|
||||
ILoginApiRepository loginApiRepository)
|
||||
{
|
||||
_siteRepository = siteRepository;
|
||||
_loginRepository = loginRepository;
|
||||
_authService = authService;
|
||||
_siteApiRepository = siteApiRepository;
|
||||
_loginApiRepository = loginApiRepository;
|
||||
}
|
||||
|
||||
public async Task<Site> GetByIdAsync(string id)
|
||||
public async Task<Login> GetByIdAsync(string id)
|
||||
{
|
||||
var data = await _siteRepository.GetByIdAsync(id);
|
||||
var data = await _loginRepository.GetByIdAsync(id);
|
||||
if(data == null || data.UserId != _authService.UserId)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var site = new Site(data);
|
||||
return site;
|
||||
var login = new Login(data);
|
||||
return login;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Site>> GetAllAsync()
|
||||
public async Task<IEnumerable<Login>> GetAllAsync()
|
||||
{
|
||||
var data = await _siteRepository.GetAllByUserIdAsync(_authService.UserId);
|
||||
var sites = data.Select(f => new Site(f));
|
||||
return sites;
|
||||
var data = await _loginRepository.GetAllByUserIdAsync(_authService.UserId);
|
||||
var logins = data.Select(f => new Login(f));
|
||||
return logins;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Site>> GetAllAsync(bool favorites)
|
||||
public async Task<IEnumerable<Login>> GetAllAsync(bool favorites)
|
||||
{
|
||||
var data = await _siteRepository.GetAllByUserIdAsync(_authService.UserId, favorites);
|
||||
var sites = data.Select(f => new Site(f));
|
||||
return sites;
|
||||
var data = await _loginRepository.GetAllByUserIdAsync(_authService.UserId, favorites);
|
||||
var logins = data.Select(f => new Login(f));
|
||||
return logins;
|
||||
}
|
||||
|
||||
public async Task<ApiResult<SiteResponse>> SaveAsync(Site site)
|
||||
public async Task<ApiResult<LoginResponse>> SaveAsync(Login login)
|
||||
{
|
||||
ApiResult<SiteResponse> response = null;
|
||||
var request = new SiteRequest(site);
|
||||
ApiResult<LoginResponse> response = null;
|
||||
var request = new LoginRequest(login);
|
||||
|
||||
if(site.Id == null)
|
||||
if(login.Id == null)
|
||||
{
|
||||
response = await _siteApiRepository.PostAsync(request);
|
||||
response = await _loginApiRepository.PostAsync(request);
|
||||
}
|
||||
else
|
||||
{
|
||||
response = await _siteApiRepository.PutAsync(site.Id, request);
|
||||
response = await _loginApiRepository.PutAsync(login.Id, request);
|
||||
}
|
||||
|
||||
if(response.Succeeded)
|
||||
{
|
||||
var data = new SiteData(response.Result, _authService.UserId);
|
||||
if(site.Id == null)
|
||||
var data = new LoginData(response.Result, _authService.UserId);
|
||||
if(login.Id == null)
|
||||
{
|
||||
await _siteRepository.InsertAsync(data);
|
||||
site.Id = data.Id;
|
||||
await _loginRepository.InsertAsync(data);
|
||||
login.Id = data.Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
await _siteRepository.UpdateAsync(data);
|
||||
await _loginRepository.UpdateAsync(data);
|
||||
}
|
||||
}
|
||||
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
||||
@ -90,10 +90,10 @@ namespace Bit.App.Services
|
||||
|
||||
public async Task<ApiResult> DeleteAsync(string id)
|
||||
{
|
||||
var response = await _siteApiRepository.DeleteAsync(id);
|
||||
var response = await _loginApiRepository.DeleteAsync(id);
|
||||
if(response.Succeeded)
|
||||
{
|
||||
await _siteRepository.DeleteAsync(id);
|
||||
await _loginRepository.DeleteAsync(id);
|
||||
}
|
||||
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
||||
|| response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
|
||||
|
@ -14,26 +14,26 @@ namespace Bit.App.Services
|
||||
{
|
||||
private readonly ICipherApiRepository _cipherApiRepository;
|
||||
private readonly IFolderApiRepository _folderApiRepository;
|
||||
private readonly ISiteApiRepository _siteApiRepository;
|
||||
private readonly ILoginApiRepository _loginApiRepository;
|
||||
private readonly IFolderRepository _folderRepository;
|
||||
private readonly ISiteRepository _siteRepository;
|
||||
private readonly ILoginRepository _loginRepository;
|
||||
private readonly IAuthService _authService;
|
||||
private readonly ISettings _settings;
|
||||
|
||||
public SyncService(
|
||||
ICipherApiRepository cipherApiRepository,
|
||||
IFolderApiRepository folderApiRepository,
|
||||
ISiteApiRepository siteApiRepository,
|
||||
ILoginApiRepository loginApiRepository,
|
||||
IFolderRepository folderRepository,
|
||||
ISiteRepository siteRepository,
|
||||
ILoginRepository loginRepository,
|
||||
IAuthService authService,
|
||||
ISettings settings)
|
||||
{
|
||||
_cipherApiRepository = cipherApiRepository;
|
||||
_folderApiRepository = folderApiRepository;
|
||||
_siteApiRepository = siteApiRepository;
|
||||
_loginApiRepository = loginApiRepository;
|
||||
_folderRepository = folderRepository;
|
||||
_siteRepository = siteRepository;
|
||||
_loginRepository = loginRepository;
|
||||
_authService = authService;
|
||||
_settings = settings;
|
||||
}
|
||||
@ -77,16 +77,16 @@ namespace Bit.App.Services
|
||||
await _folderRepository.UpdateAsync(folderData).ConfigureAwait(false);
|
||||
}
|
||||
break;
|
||||
case Enums.CipherType.Site:
|
||||
var siteData = new SiteData(cipher.Result, _authService.UserId);
|
||||
var existingLocalSite = _siteRepository.GetByIdAsync(id);
|
||||
if(existingLocalSite == null)
|
||||
case Enums.CipherType.Login:
|
||||
var loginData = new LoginData(cipher.Result, _authService.UserId);
|
||||
var existingLocalLogin = _loginRepository.GetByIdAsync(id);
|
||||
if(existingLocalLogin == null)
|
||||
{
|
||||
await _siteRepository.InsertAsync(siteData).ConfigureAwait(false);
|
||||
await _loginRepository.InsertAsync(loginData).ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
await _siteRepository.UpdateAsync(siteData).ConfigureAwait(false);
|
||||
await _loginRepository.UpdateAsync(loginData).ConfigureAwait(false);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -107,12 +107,12 @@ namespace Bit.App.Services
|
||||
|
||||
SyncStarted();
|
||||
|
||||
await _folderRepository.DeleteWithSiteUpdateAsync(id, revisionDate).ConfigureAwait(false);
|
||||
await _folderRepository.DeleteWithLoginUpdateAsync(id, revisionDate).ConfigureAwait(false);
|
||||
SyncCompleted(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<bool> SyncDeleteSiteAsync(string id)
|
||||
public async Task<bool> SyncDeleteLoginAsync(string id)
|
||||
{
|
||||
if(!_authService.IsAuthenticated)
|
||||
{
|
||||
@ -121,7 +121,7 @@ namespace Bit.App.Services
|
||||
|
||||
SyncStarted();
|
||||
|
||||
await _siteRepository.DeleteAsync(id).ConfigureAwait(false);
|
||||
await _loginRepository.DeleteAsync(id).ConfigureAwait(false);
|
||||
SyncCompleted(true);
|
||||
return true;
|
||||
}
|
||||
@ -150,14 +150,14 @@ namespace Bit.App.Services
|
||||
return false;
|
||||
}
|
||||
|
||||
var sites = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Site).ToDictionary(s => s.Id);
|
||||
var logins = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
|
||||
var folders = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
||||
|
||||
var siteTask = SyncSitesAsync(sites, true);
|
||||
var loginTask = SyncLoginsAsync(logins, true);
|
||||
var folderTask = SyncFoldersAsync(folders, true);
|
||||
await Task.WhenAll(siteTask, folderTask).ConfigureAwait(false);
|
||||
await Task.WhenAll(loginTask, folderTask).ConfigureAwait(false);
|
||||
|
||||
if(folderTask.Exception != null || siteTask.Exception != null)
|
||||
if(folderTask.Exception != null || loginTask.Exception != null)
|
||||
{
|
||||
SyncCompleted(false);
|
||||
return false;
|
||||
@ -209,15 +209,15 @@ namespace Bit.App.Services
|
||||
return false;
|
||||
}
|
||||
|
||||
var sites = ciphers.Result.Revised.Where(c => c.Type == Enums.CipherType.Site).ToDictionary(s => s.Id);
|
||||
var logins = ciphers.Result.Revised.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
|
||||
var folders = ciphers.Result.Revised.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
||||
|
||||
var siteTask = SyncSitesAsync(sites, false);
|
||||
var loginTask = SyncLoginsAsync(logins, false);
|
||||
var folderTask = SyncFoldersAsync(folders, false);
|
||||
var deleteTask = DeleteCiphersAsync(ciphers.Result.Deleted);
|
||||
|
||||
await Task.WhenAll(siteTask, folderTask, deleteTask).ConfigureAwait(false);
|
||||
if(folderTask.Exception != null || siteTask.Exception != null || deleteTask.Exception != null)
|
||||
await Task.WhenAll(loginTask, folderTask, deleteTask).ConfigureAwait(false);
|
||||
if(folderTask.Exception != null || loginTask.Exception != null || deleteTask.Exception != null)
|
||||
{
|
||||
SyncCompleted(false);
|
||||
return false;
|
||||
@ -269,33 +269,33 @@ namespace Bit.App.Services
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SyncSitesAsync(IDictionary<string, CipherResponse> serverSites, bool deleteMissing)
|
||||
private async Task SyncLoginsAsync(IDictionary<string, CipherResponse> serverLogins, bool deleteMissing)
|
||||
{
|
||||
if(!_authService.IsAuthenticated)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var localSites = (await _siteRepository.GetAllByUserIdAsync(_authService.UserId).ConfigureAwait(false))
|
||||
var localLogins = (await _loginRepository.GetAllByUserIdAsync(_authService.UserId).ConfigureAwait(false))
|
||||
.ToDictionary(s => s.Id);
|
||||
|
||||
foreach(var serverSite in serverSites)
|
||||
foreach(var serverLogin in serverLogins)
|
||||
{
|
||||
if(!_authService.IsAuthenticated)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var existingLocalSite = localSites.ContainsKey(serverSite.Key) ? localSites[serverSite.Key] : null;
|
||||
if(existingLocalSite == null)
|
||||
var existingLocalLogin = localLogins.ContainsKey(serverLogin.Key) ? localLogins[serverLogin.Key] : null;
|
||||
if(existingLocalLogin == null)
|
||||
{
|
||||
var data = new SiteData(serverSite.Value, _authService.UserId);
|
||||
await _siteRepository.InsertAsync(data).ConfigureAwait(false);
|
||||
var data = new LoginData(serverLogin.Value, _authService.UserId);
|
||||
await _loginRepository.InsertAsync(data).ConfigureAwait(false);
|
||||
}
|
||||
else if(existingLocalSite.RevisionDateTime != serverSite.Value.RevisionDate)
|
||||
else if(existingLocalLogin.RevisionDateTime != serverLogin.Value.RevisionDate)
|
||||
{
|
||||
var data = new SiteData(serverSite.Value, _authService.UserId);
|
||||
await _siteRepository.UpdateAsync(data).ConfigureAwait(false);
|
||||
var data = new LoginData(serverLogin.Value, _authService.UserId);
|
||||
await _loginRepository.UpdateAsync(data).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -304,9 +304,9 @@ namespace Bit.App.Services
|
||||
return;
|
||||
}
|
||||
|
||||
foreach(var site in localSites.Where(localSite => !serverSites.ContainsKey(localSite.Key)))
|
||||
foreach(var login in localLogins.Where(localLogin => !serverLogins.ContainsKey(localLogin.Key)))
|
||||
{
|
||||
await _siteRepository.DeleteAsync(site.Value.Id).ConfigureAwait(false);
|
||||
await _loginRepository.DeleteAsync(login.Value.Id).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -320,7 +320,7 @@ namespace Bit.App.Services
|
||||
return;
|
||||
}
|
||||
|
||||
tasks.Add(_siteRepository.DeleteAsync(cipherId));
|
||||
tasks.Add(_loginRepository.DeleteAsync(cipherId));
|
||||
tasks.Add(_folderRepository.DeleteAsync(cipherId));
|
||||
}
|
||||
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
|
@ -123,22 +123,22 @@ namespace Bit.iOS.Extension
|
||||
var navController = segue.DestinationViewController as UINavigationController;
|
||||
if(navController != null)
|
||||
{
|
||||
var listSiteController = navController.TopViewController as SiteListViewController;
|
||||
var addSiteController = navController.TopViewController as SiteAddViewController;
|
||||
var listLoginController = navController.TopViewController as LoginListViewController;
|
||||
var addLoginController = navController.TopViewController as LoginAddViewController;
|
||||
var fingerprintViewController = navController.TopViewController as LockFingerprintViewController;
|
||||
var pinViewController = navController.TopViewController as LockPinViewController;
|
||||
var passwordViewController = navController.TopViewController as LockPasswordViewController;
|
||||
var setupViewController = navController.TopViewController as SetupViewController;
|
||||
|
||||
if(listSiteController != null)
|
||||
if(listLoginController != null)
|
||||
{
|
||||
listSiteController.Context = _context;
|
||||
listSiteController.LoadingController = this;
|
||||
listLoginController.Context = _context;
|
||||
listLoginController.LoadingController = this;
|
||||
}
|
||||
else if(addSiteController != null)
|
||||
else if(addLoginController != null)
|
||||
{
|
||||
addSiteController.Context = _context;
|
||||
addSiteController.LoadingController = this;
|
||||
addLoginController.Context = _context;
|
||||
addLoginController.LoadingController = this;
|
||||
}
|
||||
else if(fingerprintViewController != null)
|
||||
{
|
||||
@ -174,12 +174,12 @@ namespace Bit.iOS.Extension
|
||||
|
||||
private void ContinueOn()
|
||||
{
|
||||
Debug.WriteLine("BW Log, Segue to setup, site add or list.");
|
||||
Debug.WriteLine("BW Log, Segue to setup, login add or list.");
|
||||
_settings.AddOrUpdateValue(App.Constants.LastActivityDate, DateTime.UtcNow);
|
||||
|
||||
if(_context.ProviderType == Constants.UTTypeAppExtensionSaveLoginAction)
|
||||
{
|
||||
PerformSegue("newSiteSegue", this);
|
||||
PerformSegue("newLoginSegue", this);
|
||||
}
|
||||
else if(_context.ProviderType == Constants.UTTypeAppExtensionSetup)
|
||||
{
|
||||
@ -187,7 +187,7 @@ namespace Bit.iOS.Extension
|
||||
}
|
||||
else
|
||||
{
|
||||
PerformSegue("siteListSegue", this);
|
||||
PerformSegue("loginListSegue", this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -271,7 +271,7 @@ namespace Bit.iOS.Extension
|
||||
.RegisterType<IKeyDerivationService, CommonCryptoKeyDerivationService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginService, LoginService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
|
||||
@ -283,8 +283,8 @@ namespace Bit.iOS.Extension
|
||||
// Repositories
|
||||
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginRepository, LoginRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginApiRepository, LoginApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
||||
// Other
|
||||
.RegisterInstance(CrossConnectivity.Current, new ContainerControlledLifetimeManager())
|
||||
@ -326,7 +326,7 @@ namespace Bit.iOS.Extension
|
||||
|
||||
Debug.WriteLine("BW LOG, ProviderType: " + _context.ProviderType);
|
||||
Debug.WriteLine("BW LOG, Url: " + _context.Url);
|
||||
Debug.WriteLine("BW LOG, Title: " + _context.SiteTitle);
|
||||
Debug.WriteLine("BW LOG, Title: " + _context.LoginTitle);
|
||||
Debug.WriteLine("BW LOG, Username: " + _context.Username);
|
||||
Debug.WriteLine("BW LOG, Password: " + _context.Password);
|
||||
Debug.WriteLine("BW LOG, Old Password: " + _context.OldPassword);
|
||||
@ -409,7 +409,7 @@ namespace Bit.iOS.Extension
|
||||
_context.Url = new Uri(url);
|
||||
}
|
||||
|
||||
_context.SiteTitle = title;
|
||||
_context.LoginTitle = title;
|
||||
_context.Username = username;
|
||||
_context.Password = password;
|
||||
_context.Notes = notes;
|
||||
@ -436,7 +436,7 @@ namespace Bit.iOS.Extension
|
||||
_context.Url = new Uri(url);
|
||||
}
|
||||
|
||||
_context.SiteTitle = title;
|
||||
_context.LoginTitle = title;
|
||||
_context.Username = username;
|
||||
_context.Password = password;
|
||||
_context.OldPassword = oldPassword;
|
||||
|
@ -28,11 +28,11 @@
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<segue destination="oCZ-GQ-aOK" kind="show" identifier="siteListSegue" id="1679"/>
|
||||
<segue destination="oCZ-GQ-aOK" kind="show" identifier="loginListSegue" id="1679"/>
|
||||
<segue id="8446" destination="6512" kind="presentation" identifier="lockFingerprintSegue"/>
|
||||
<segue id="8924" destination="6815" kind="presentation" identifier="lockPinSegue"/>
|
||||
<segue id="9874" destination="6855" kind="presentation" identifier="lockPasswordSegue"/>
|
||||
<segue id="10498" destination="1845" kind="presentation" identifier="newSiteSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
||||
<segue id="10498" destination="1845" kind="presentation" identifier="newLoginSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
||||
<segue id="11089" destination="10580" kind="presentation" modalTransitionStyle="coverVertical" identifier="setupSegue"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
@ -100,7 +100,7 @@
|
||||
</scene>
|
||||
<scene sceneID="2086">
|
||||
<objects>
|
||||
<tableViewController id="2087" sceneMemberID="viewController" customClass="SiteAddViewController">
|
||||
<tableViewController id="2087" sceneMemberID="viewController" customClass="LoginAddViewController">
|
||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" rowHeight="50" sectionHeaderHeight="22" sectionFooterHeight="22" id="2088" opaque="NO" allowsSelection="NO">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
@ -112,7 +112,7 @@
|
||||
<sections/>
|
||||
<color key="sectionIndexBackgroundColor" colorSpace="calibratedWhite" white="0" alpha="0"/>
|
||||
</tableView>
|
||||
<navigationItem title="Add Site" id="2252" key="navigationItem">
|
||||
<navigationItem title="Add Login" id="2252" key="navigationItem">
|
||||
<barButtonItem title="Cancel" id="3747" translatesAutoresizingMaskIntoConstraints="NO" key="leftBarButtonItem">
|
||||
<color key="tintColor" colorSpace="calibratedWhite" white="1" alpha="1"/>
|
||||
<connections>
|
||||
@ -139,7 +139,7 @@
|
||||
</scene>
|
||||
<scene sceneID="2303">
|
||||
<objects>
|
||||
<tableViewController id="2304" sceneMemberID="viewController" customClass="SiteListViewController">
|
||||
<tableViewController id="2304" sceneMemberID="viewController" customClass="LoginListViewController">
|
||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="2305">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
@ -176,14 +176,14 @@
|
||||
</connections>
|
||||
</tableView>
|
||||
<connections>
|
||||
<segue id="3731" destination="1845" kind="presentation" identifier="siteAddSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
||||
<segue id="3731" destination="1845" kind="presentation" identifier="loginAddSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
||||
<outlet property="AddBarButton" destination="3736" id="name-outlet-3736"/>
|
||||
<outlet property="CancelBarButton" destination="3735" id="name-outlet-3735"/>
|
||||
<outlet property="NavItem" destination="3734" id="name-outlet-3734"/>
|
||||
</connections>
|
||||
<toolbarItems/>
|
||||
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
|
||||
<navigationItem title="Sites" id="3734" translatesAutoresizingMaskIntoConstraints="NO" key="navigationItem">
|
||||
<navigationItem title="Logins" id="3734" translatesAutoresizingMaskIntoConstraints="NO" key="navigationItem">
|
||||
<barButtonItem title="Cancel" id="3735" translatesAutoresizingMaskIntoConstraints="NO" key="leftBarButtonItem">
|
||||
<color key="tintColor" colorSpace="calibratedWhite" white="1" alpha="1"/>
|
||||
<connections>
|
||||
|
@ -29,7 +29,7 @@ namespace Bit.iOS.Extension.Models
|
||||
return _domainName;
|
||||
}
|
||||
}
|
||||
public string SiteTitle { get; set; }
|
||||
public string LoginTitle { get; set; }
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
public string OldPassword { get; set; }
|
||||
|
@ -5,19 +5,19 @@ using Bit.App.Models;
|
||||
|
||||
namespace Bit.iOS.Extension.Models
|
||||
{
|
||||
public class SiteViewModel
|
||||
public class LoginViewModel
|
||||
{
|
||||
private string _uri;
|
||||
private DomainName _domain = null;
|
||||
private bool _domainParsed = false;
|
||||
|
||||
public SiteViewModel(Site site)
|
||||
public LoginViewModel(Login login)
|
||||
{
|
||||
Id = site.Id;
|
||||
Name = site.Name?.Decrypt();
|
||||
Username = site.Username?.Decrypt();
|
||||
Password = site.Password?.Decrypt();
|
||||
Uri = site.Uri?.Decrypt();
|
||||
Id = login.Id;
|
||||
Name = login.Name?.Decrypt();
|
||||
Username = login.Username?.Decrypt();
|
||||
Password = login.Password?.Decrypt();
|
||||
Uri = login.Uri?.Decrypt();
|
||||
}
|
||||
|
||||
public string Id { get; set; }
|
||||
|
@ -25,7 +25,7 @@ namespace Bit.iOS.Extension
|
||||
{ }
|
||||
|
||||
public Context Context { get; set; }
|
||||
public SiteAddViewController Parent { get; set; }
|
||||
public LoginAddViewController Parent { get; set; }
|
||||
public UITableViewController OptionsTableViewController { get; set; }
|
||||
public SwitchTableViewCell UppercaseCell { get; set; } = new SwitchTableViewCell("A-Z");
|
||||
public SwitchTableViewCell LowercaseCell { get; set; } = new SwitchTableViewCell("a-z");
|
||||
|
@ -17,19 +17,19 @@ using Bit.iOS.Core.Controllers;
|
||||
|
||||
namespace Bit.iOS.Extension
|
||||
{
|
||||
public partial class SiteAddViewController : ExtendedUITableViewController
|
||||
public partial class LoginAddViewController : ExtendedUITableViewController
|
||||
{
|
||||
private ISiteService _siteService;
|
||||
private ILoginService _loginService;
|
||||
private IFolderService _folderService;
|
||||
private IConnectivity _connectivity;
|
||||
private IEnumerable<Folder> _folders;
|
||||
private IGoogleAnalyticsService _googleAnalyticsService;
|
||||
|
||||
public SiteAddViewController(IntPtr handle) : base(handle)
|
||||
public LoginAddViewController(IntPtr handle) : base(handle)
|
||||
{ }
|
||||
|
||||
public Context Context { get; set; }
|
||||
public SiteListViewController SiteListController { get; set; }
|
||||
public LoginListViewController LoginListController { get; set; }
|
||||
public LoadingViewController LoadingController { get; set; }
|
||||
public FormEntryTableViewCell NameCell { get; set; } = new FormEntryTableViewCell(AppResources.Name);
|
||||
public FormEntryTableViewCell UriCell { get; set; } = new FormEntryTableViewCell(AppResources.URI);
|
||||
@ -49,12 +49,12 @@ namespace Bit.iOS.Extension
|
||||
|
||||
public override void ViewDidLoad()
|
||||
{
|
||||
_siteService = Resolver.Resolve<ISiteService>();
|
||||
_loginService = Resolver.Resolve<ILoginService>();
|
||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||
_folderService = Resolver.Resolve<IFolderService>();
|
||||
_googleAnalyticsService = Resolver.Resolve<IGoogleAnalyticsService>();
|
||||
|
||||
NavItem.Title = AppResources.AddSite;
|
||||
NavItem.Title = AppResources.AddLogin;
|
||||
CancelBarButton.Title = AppResources.Cancel;
|
||||
SaveBarButton.Title = AppResources.Save;
|
||||
View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f);
|
||||
@ -121,7 +121,7 @@ namespace Bit.iOS.Extension
|
||||
|
||||
partial void CancelBarButton_Activated(UIBarButtonItem sender)
|
||||
{
|
||||
if(SiteListController != null)
|
||||
if(LoginListController != null)
|
||||
{
|
||||
DismissViewController(true, null);
|
||||
}
|
||||
@ -151,7 +151,7 @@ namespace Bit.iOS.Extension
|
||||
return;
|
||||
}
|
||||
|
||||
var site = new Site
|
||||
var login = new Login
|
||||
{
|
||||
Uri = string.IsNullOrWhiteSpace(UriCell.TextField.Text) ? null : UriCell.TextField.Text.Encrypt(),
|
||||
Name = string.IsNullOrWhiteSpace(NameCell.TextField.Text) ? null : NameCell.TextField.Text.Encrypt(),
|
||||
@ -162,17 +162,17 @@ namespace Bit.iOS.Extension
|
||||
FolderId = FolderCell.SelectedIndex == 0 ? null : _folders.ElementAtOrDefault(FolderCell.SelectedIndex - 1)?.Id
|
||||
};
|
||||
|
||||
var saveTask = _siteService.SaveAsync(site);
|
||||
var saveTask = _loginService.SaveAsync(login);
|
||||
var loadingAlert = Dialogs.CreateLoadingAlert(AppResources.Saving);
|
||||
PresentViewController(loadingAlert, true, null);
|
||||
await saveTask;
|
||||
|
||||
if(saveTask.Result.Succeeded)
|
||||
{
|
||||
_googleAnalyticsService.TrackExtensionEvent("CreatedSite");
|
||||
if(SiteListController != null)
|
||||
_googleAnalyticsService.TrackExtensionEvent("CreatedLogin");
|
||||
if(LoginListController != null)
|
||||
{
|
||||
SiteListController.DismissModal();
|
||||
LoginListController.DismissModal();
|
||||
}
|
||||
else if(LoadingController != null)
|
||||
{
|
||||
@ -216,9 +216,9 @@ namespace Bit.iOS.Extension
|
||||
|
||||
public class TableSource : UITableViewSource
|
||||
{
|
||||
private SiteAddViewController _controller;
|
||||
private LoginAddViewController _controller;
|
||||
|
||||
public TableSource(SiteAddViewController controller)
|
||||
public TableSource(LoginAddViewController controller)
|
||||
{
|
||||
_controller = controller;
|
||||
}
|
||||
@ -302,7 +302,7 @@ namespace Bit.iOS.Extension
|
||||
{
|
||||
if(section == 0)
|
||||
{
|
||||
return AppResources.SiteInformation;
|
||||
return AppResources.LoginInformation;
|
||||
}
|
||||
else if(section == 2)
|
||||
{
|
||||
|
@ -11,8 +11,8 @@ using UIKit;
|
||||
|
||||
namespace Bit.iOS.Extension
|
||||
{
|
||||
[Register ("SiteAddViewController")]
|
||||
partial class SiteAddViewController
|
||||
[Register ("LoginAddViewController")]
|
||||
partial class LoginAddViewController
|
||||
{
|
||||
[Outlet]
|
||||
[GeneratedCode ("iOS Designer", "1.0")]
|
||||
|
@ -17,9 +17,9 @@ using Bit.App.Resources;
|
||||
|
||||
namespace Bit.iOS.Extension
|
||||
{
|
||||
public partial class SiteListViewController : ExtendedUITableViewController
|
||||
public partial class LoginListViewController : ExtendedUITableViewController
|
||||
{
|
||||
public SiteListViewController(IntPtr handle) : base(handle)
|
||||
public LoginListViewController(IntPtr handle) : base(handle)
|
||||
{ }
|
||||
|
||||
public Context Context { get; set; }
|
||||
@ -35,7 +35,7 @@ namespace Bit.iOS.Extension
|
||||
public async override void ViewDidLoad()
|
||||
{
|
||||
base.ViewDidLoad();
|
||||
NavItem.Title = AppResources.Sites;
|
||||
NavItem.Title = AppResources.Logins;
|
||||
if(!CanAutoFill())
|
||||
{
|
||||
CancelBarButton.Title = AppResources.Close;
|
||||
@ -71,7 +71,7 @@ namespace Bit.iOS.Extension
|
||||
|
||||
partial void AddBarButton_Activated(UIBarButtonItem sender)
|
||||
{
|
||||
PerformSegue("siteAddSegue", this);
|
||||
PerformSegue("loginAddSegue", this);
|
||||
}
|
||||
|
||||
public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
|
||||
@ -79,11 +79,11 @@ namespace Bit.iOS.Extension
|
||||
var navController = segue.DestinationViewController as UINavigationController;
|
||||
if(navController != null)
|
||||
{
|
||||
var addSiteController = navController.TopViewController as SiteAddViewController;
|
||||
if(addSiteController != null)
|
||||
var addLoginController = navController.TopViewController as LoginAddViewController;
|
||||
if(addLoginController != null)
|
||||
{
|
||||
addSiteController.Context = Context;
|
||||
addSiteController.SiteListController = this;
|
||||
addLoginController.Context = Context;
|
||||
addLoginController.LoginListController = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -101,11 +101,11 @@ namespace Bit.iOS.Extension
|
||||
{
|
||||
private const string CellIdentifier = "TableCell";
|
||||
|
||||
private IEnumerable<SiteViewModel> _tableItems;
|
||||
private IEnumerable<LoginViewModel> _tableItems;
|
||||
private Context _context;
|
||||
private SiteListViewController _controller;
|
||||
private LoginListViewController _controller;
|
||||
|
||||
public TableSource(SiteListViewController controller)
|
||||
public TableSource(LoginListViewController controller)
|
||||
{
|
||||
_context = controller.Context;
|
||||
_controller = controller;
|
||||
@ -113,20 +113,20 @@ namespace Bit.iOS.Extension
|
||||
|
||||
public async Task LoadItemsAsync()
|
||||
{
|
||||
_tableItems = new List<SiteViewModel>();
|
||||
_tableItems = new List<LoginViewModel>();
|
||||
if(_context.DomainName != null)
|
||||
{
|
||||
var siteService = Resolver.Resolve<ISiteService>();
|
||||
var sites = await siteService.GetAllAsync();
|
||||
var siteModels = sites.Select(s => new SiteViewModel(s));
|
||||
_tableItems = siteModels
|
||||
var loginService = Resolver.Resolve<ILoginService>();
|
||||
var logins = await loginService.GetAllAsync();
|
||||
var loginModels = logins.Select(s => new LoginViewModel(s));
|
||||
_tableItems = loginModels
|
||||
.Where(s => s.Domain != null && s.Domain.BaseDomain == _context.DomainName.BaseDomain)
|
||||
.OrderBy(s => s.Name).ThenBy(s => s.Username)
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<SiteViewModel> TableItems { get; set; }
|
||||
public IEnumerable<LoginViewModel> TableItems { get; set; }
|
||||
|
||||
public override nint RowsInSection(UITableView tableview, nint section)
|
||||
{
|
||||
@ -138,7 +138,7 @@ namespace Bit.iOS.Extension
|
||||
if(_tableItems.Count() == 0)
|
||||
{
|
||||
var noDataCell = new UITableViewCell(UITableViewCellStyle.Default, "NoDataCell");
|
||||
noDataCell.TextLabel.Text = AppResources.NoSitesTap;
|
||||
noDataCell.TextLabel.Text = AppResources.NoLoginsTap;
|
||||
noDataCell.TextLabel.TextAlignment = UITextAlignment.Center;
|
||||
noDataCell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap;
|
||||
noDataCell.TextLabel.Lines = 0;
|
||||
@ -176,7 +176,7 @@ namespace Bit.iOS.Extension
|
||||
|
||||
if(_tableItems.Count() == 0)
|
||||
{
|
||||
_controller.PerformSegue("siteAddSegue", this);
|
||||
_controller.PerformSegue("loginAddSegue", this);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -11,8 +11,8 @@ using UIKit;
|
||||
|
||||
namespace Bit.iOS.Extension
|
||||
{
|
||||
[Register ("SiteListViewController")]
|
||||
partial class SiteListViewController
|
||||
[Register ("LoginListViewController")]
|
||||
partial class LoginListViewController
|
||||
{
|
||||
[Outlet]
|
||||
[GeneratedCode ("iOS Designer", "1.0")]
|
||||
|
@ -249,7 +249,7 @@ namespace Bit.iOS
|
||||
.RegisterType<IKeyDerivationService, CommonCryptoKeyDerivationService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginService, LoginService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
||||
@ -267,8 +267,8 @@ namespace Bit.iOS
|
||||
// Repositories
|
||||
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginRepository, LoginRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<ILoginApiRepository, LoginApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
||||
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
||||
|
Loading…
Reference in New Issue
Block a user