mirror of
https://github.com/bitwarden/mobile
synced 2026-01-27 14:53:23 +00:00
Compare commits
1 Commits
PM-2456-fi
...
localize-w
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a4280b6db |
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.5.0" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.4.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
|
||||
@@ -123,7 +123,7 @@ namespace Bit.App.Pages
|
||||
{
|
||||
await _deviceActionService.ShowLoadingAsync(AppResources.Saving);
|
||||
_cipherDomain = await _cipherService.SaveAttachmentRawWithServerAsync(
|
||||
_cipherDomain, Cipher, FileName, FileData);
|
||||
_cipherDomain, FileName, FileData);
|
||||
Cipher = await _cipherDomain.DecryptAsync();
|
||||
await _deviceActionService.HideLoadingAsync();
|
||||
_platformUtilsService.ShowToast("success", null, AppResources.AttachementAdded);
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace Bit.Core.Abstractions
|
||||
Task<Cipher> GetAsync(string id);
|
||||
Task<CipherView> GetLastUsedForUrlAsync(string url);
|
||||
Task ReplaceAsync(Dictionary<string, CipherData> ciphers);
|
||||
Task<Cipher> SaveAttachmentRawWithServerAsync(Cipher cipher, CipherView cipherView, string filename, byte[] data);
|
||||
Task<Cipher> SaveAttachmentRawWithServerAsync(Cipher cipher, string filename, byte[] data);
|
||||
Task SaveCollectionsWithServerAsync(Cipher cipher);
|
||||
Task SaveNeverDomainAsync(string domain);
|
||||
Task SaveWithServerAsync(Cipher cipher);
|
||||
|
||||
@@ -63,8 +63,6 @@
|
||||
public const int Argon2MemoryInMB = 64;
|
||||
public const int Argon2Parallelism = 4;
|
||||
public const int MasterPasswordMinimumChars = 12;
|
||||
public const int CipherKeyRandomBytesLength = 64;
|
||||
public const string CipherKeyEncryptionMinServerVersion = "2023.3.0";
|
||||
|
||||
public static readonly string[] AndroidAllClearCipherCacheKeys =
|
||||
{
|
||||
|
||||
@@ -26,7 +26,6 @@ namespace Bit.Core.Models.Data
|
||||
Notes = response.Notes;
|
||||
CollectionIds = collectionIds?.ToList() ?? response.CollectionIds;
|
||||
Reprompt = response.Reprompt;
|
||||
Key = response.Key;
|
||||
|
||||
try // Added to address Issue (https://github.com/bitwarden/mobile/issues/1006)
|
||||
{
|
||||
@@ -87,6 +86,5 @@ namespace Bit.Core.Models.Data
|
||||
public List<string> CollectionIds { get; set; }
|
||||
public DateTime? DeletedDate { get; set; }
|
||||
public Enums.CipherRepromptType Reprompt { get; set; }
|
||||
public string Key { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Bit.Core.Abstractions;
|
||||
using Bit.Core.Models.Data;
|
||||
using Bit.Core.Models.View;
|
||||
using Bit.Core.Services;
|
||||
using Bit.Core.Utilities;
|
||||
|
||||
namespace Bit.Core.Models.Domain
|
||||
@@ -13,11 +11,11 @@ namespace Bit.Core.Models.Domain
|
||||
{
|
||||
private HashSet<string> _map = new HashSet<string>
|
||||
{
|
||||
nameof(Id),
|
||||
nameof(Url),
|
||||
nameof(SizeName),
|
||||
nameof(FileName),
|
||||
nameof(Key)
|
||||
"Id",
|
||||
"Url",
|
||||
"SizeName",
|
||||
"FileName",
|
||||
"Key"
|
||||
};
|
||||
|
||||
public Attachment() { }
|
||||
@@ -25,7 +23,7 @@ namespace Bit.Core.Models.Domain
|
||||
public Attachment(AttachmentData obj, bool alreadyEncrypted = false)
|
||||
{
|
||||
Size = obj.Size;
|
||||
BuildDomainModel(this, obj, _map, alreadyEncrypted, new HashSet<string> { nameof(Id), nameof(Url), nameof(SizeName) });
|
||||
BuildDomainModel(this, obj, _map, alreadyEncrypted, new HashSet<string> { "Id", "Url", "SizeName" });
|
||||
}
|
||||
|
||||
public string Id { get; set; }
|
||||
@@ -35,26 +33,25 @@ namespace Bit.Core.Models.Domain
|
||||
public EncString Key { get; set; }
|
||||
public EncString FileName { get; set; }
|
||||
|
||||
public async Task<AttachmentView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public async Task<AttachmentView> DecryptAsync(string orgId)
|
||||
{
|
||||
var view = await DecryptObjAsync(new AttachmentView(this), this, new HashSet<string>
|
||||
{
|
||||
nameof(FileName)
|
||||
}, orgId, key);
|
||||
"FileName"
|
||||
}, orgId);
|
||||
|
||||
if (Key != null)
|
||||
{
|
||||
var cryptoService = ServiceContainer.Resolve<ICryptoService>("cryptoService");
|
||||
try
|
||||
{
|
||||
var cryptoService = ServiceContainer.Resolve<ICryptoService>();
|
||||
|
||||
var decryptKey = key ?? await cryptoService.GetOrgKeyAsync(orgId);
|
||||
var decValue = await cryptoService.DecryptToBytesAsync(Key, decryptKey);
|
||||
var orgKey = await cryptoService.GetOrgKeyAsync(orgId);
|
||||
var decValue = await cryptoService.DecryptToBytesAsync(Key, orgKey);
|
||||
view.Key = new SymmetricCryptoKey(decValue);
|
||||
}
|
||||
catch (Exception ex)
|
||||
catch
|
||||
{
|
||||
LoggerHelper.LogEvenIfCantBeResolved(ex);
|
||||
// TODO: error?
|
||||
}
|
||||
}
|
||||
return view;
|
||||
@@ -64,7 +61,7 @@ namespace Bit.Core.Models.Domain
|
||||
{
|
||||
var a = new AttachmentData();
|
||||
a.Size = Size;
|
||||
BuildDataModel(this, a, _map, new HashSet<string> { nameof(Id), nameof(Url), nameof(SizeName) });
|
||||
BuildDataModel(this, a, _map, new HashSet<string> { "Id", "Url", "SizeName" });
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,9 +31,9 @@ namespace Bit.Core.Models.Domain
|
||||
public EncString ExpYear { get; set; }
|
||||
public EncString Code { get; set; }
|
||||
|
||||
public Task<CardView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public Task<CardView> DecryptAsync(string orgId)
|
||||
{
|
||||
return DecryptObjAsync(new CardView(this), this, _map, orgId, key);
|
||||
return DecryptObjAsync(new CardView(this), this, _map, orgId);
|
||||
}
|
||||
|
||||
public CardData ToCardData()
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading.Tasks;
|
||||
using Bit.Core.Abstractions;
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Models.Data;
|
||||
using Bit.Core.Models.View;
|
||||
using Bit.Core.Utilities;
|
||||
|
||||
namespace Bit.Core.Models.Domain
|
||||
{
|
||||
@@ -19,12 +16,12 @@ namespace Bit.Core.Models.Domain
|
||||
{
|
||||
BuildDomainModel(this, obj, new HashSet<string>
|
||||
{
|
||||
nameof(Id),
|
||||
nameof(OrganizationId),
|
||||
nameof(FolderId),
|
||||
nameof(Name),
|
||||
nameof(Notes)
|
||||
}, alreadyEncrypted, new HashSet<string> { nameof(Id), nameof(OrganizationId), nameof(FolderId) });
|
||||
"Id",
|
||||
"OrganizationId",
|
||||
"FolderId",
|
||||
"Name",
|
||||
"Notes"
|
||||
}, alreadyEncrypted, new HashSet<string> { "Id", "OrganizationId", "FolderId" });
|
||||
|
||||
Type = obj.Type;
|
||||
Favorite = obj.Favorite;
|
||||
@@ -36,11 +33,6 @@ namespace Bit.Core.Models.Domain
|
||||
LocalData = localData;
|
||||
Reprompt = obj.Reprompt;
|
||||
|
||||
if (obj.Key != null)
|
||||
{
|
||||
Key = new EncString(obj.Key);
|
||||
}
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
case Enums.CipherType.Login:
|
||||
@@ -87,43 +79,29 @@ namespace Bit.Core.Models.Domain
|
||||
public HashSet<string> CollectionIds { get; set; }
|
||||
public DateTime? DeletedDate { get; set; }
|
||||
public CipherRepromptType Reprompt { get; set; }
|
||||
public EncString Key { get; set; }
|
||||
|
||||
public async Task<CipherView> DecryptAsync()
|
||||
{
|
||||
var model = new CipherView(this);
|
||||
|
||||
if (Key != null)
|
||||
{
|
||||
// HACK: I don't like resolving this here but I can't see a better way without
|
||||
// refactoring a lot of things.
|
||||
var cryptoService = ServiceContainer.Resolve<ICryptoService>();
|
||||
|
||||
var orgKey = await cryptoService.GetOrgKeyAsync(OrganizationId);
|
||||
|
||||
var key = await cryptoService.DecryptToBytesAsync(Key, orgKey);
|
||||
model.Key = new SymmetricCryptoKey(key);
|
||||
}
|
||||
|
||||
await DecryptObjAsync(model, this, new HashSet<string>
|
||||
{
|
||||
nameof(Name),
|
||||
nameof(Notes)
|
||||
}, OrganizationId, model.Key);
|
||||
"Name",
|
||||
"Notes"
|
||||
}, OrganizationId);
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
case Enums.CipherType.Login:
|
||||
model.Login = await Login.DecryptAsync(OrganizationId, model.Key);
|
||||
model.Login = await Login.DecryptAsync(OrganizationId);
|
||||
break;
|
||||
case Enums.CipherType.SecureNote:
|
||||
model.SecureNote = await SecureNote.DecryptAsync(OrganizationId, model.Key);
|
||||
model.SecureNote = await SecureNote.DecryptAsync(OrganizationId);
|
||||
break;
|
||||
case Enums.CipherType.Card:
|
||||
model.Card = await Card.DecryptAsync(OrganizationId, model.Key);
|
||||
model.Card = await Card.DecryptAsync(OrganizationId);
|
||||
break;
|
||||
case Enums.CipherType.Identity:
|
||||
model.Identity = await Identity.DecryptAsync(OrganizationId, model.Key);
|
||||
model.Identity = await Identity.DecryptAsync(OrganizationId);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -135,7 +113,7 @@ namespace Bit.Core.Models.Domain
|
||||
var tasks = new List<Task>();
|
||||
async Task decryptAndAddAttachmentAsync(Attachment attachment)
|
||||
{
|
||||
var decAttachment = await attachment.DecryptAsync(OrganizationId, model.Key);
|
||||
var decAttachment = await attachment.DecryptAsync(OrganizationId);
|
||||
model.Attachments.Add(decAttachment);
|
||||
}
|
||||
foreach (var attachment in Attachments)
|
||||
@@ -150,7 +128,7 @@ namespace Bit.Core.Models.Domain
|
||||
var tasks = new List<Task>();
|
||||
async Task decryptAndAddFieldAsync(Field field)
|
||||
{
|
||||
var decField = await field.DecryptAsync(OrganizationId, model.Key);
|
||||
var decField = await field.DecryptAsync(OrganizationId);
|
||||
model.Fields.Add(decField);
|
||||
}
|
||||
foreach (var field in Fields)
|
||||
@@ -165,7 +143,7 @@ namespace Bit.Core.Models.Domain
|
||||
var tasks = new List<Task>();
|
||||
async Task decryptAndAddHistoryAsync(PasswordHistory ph)
|
||||
{
|
||||
var decPh = await ph.DecryptAsync(OrganizationId, model.Key);
|
||||
var decPh = await ph.DecryptAsync(OrganizationId);
|
||||
model.PasswordHistory.Add(decPh);
|
||||
}
|
||||
foreach (var ph in PasswordHistory)
|
||||
@@ -193,12 +171,11 @@ namespace Bit.Core.Models.Domain
|
||||
CollectionIds = CollectionIds.ToList(),
|
||||
DeletedDate = DeletedDate,
|
||||
Reprompt = Reprompt,
|
||||
Key = Key?.EncryptedString
|
||||
};
|
||||
BuildDataModel(this, c, new HashSet<string>
|
||||
{
|
||||
nameof(Name),
|
||||
nameof(Notes)
|
||||
"Name",
|
||||
"Notes"
|
||||
});
|
||||
switch (c.Type)
|
||||
{
|
||||
|
||||
@@ -28,9 +28,9 @@ namespace Bit.Core.Models.Domain
|
||||
public FieldType Type { get; set; }
|
||||
public LinkedIdType? LinkedId { get; set; }
|
||||
|
||||
public Task<FieldView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public Task<FieldView> DecryptAsync(string orgId)
|
||||
{
|
||||
return DecryptObjAsync(new FieldView(this), this, _map, orgId, key);
|
||||
return DecryptObjAsync(new FieldView(this), this, _map, orgId);
|
||||
}
|
||||
|
||||
public FieldData ToFieldData()
|
||||
|
||||
@@ -55,9 +55,9 @@ namespace Bit.Core.Models.Domain
|
||||
public EncString PassportNumber { get; set; }
|
||||
public EncString LicenseNumber { get; set; }
|
||||
|
||||
public Task<IdentityView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public Task<IdentityView> DecryptAsync(string orgId)
|
||||
{
|
||||
return DecryptObjAsync(new IdentityView(this), this, _map, orgId, key);
|
||||
return DecryptObjAsync(new IdentityView(this), this, _map, orgId);
|
||||
}
|
||||
|
||||
public IdentityData ToIdentityData()
|
||||
|
||||
@@ -29,20 +29,20 @@ namespace Bit.Core.Models.Domain
|
||||
public DateTime? PasswordRevisionDate { get; set; }
|
||||
public EncString Totp { get; set; }
|
||||
|
||||
public async Task<LoginView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public async Task<LoginView> DecryptAsync(string orgId)
|
||||
{
|
||||
var view = await DecryptObjAsync(new LoginView(this), this, new HashSet<string>
|
||||
{
|
||||
"Username",
|
||||
"Password",
|
||||
"Totp"
|
||||
}, orgId, key);
|
||||
}, orgId);
|
||||
if (Uris != null)
|
||||
{
|
||||
view.Uris = new List<LoginUriView>();
|
||||
foreach (var uri in Uris)
|
||||
{
|
||||
view.Uris.Add(await uri.DecryptAsync(orgId, key));
|
||||
view.Uris.Add(await uri.DecryptAsync(orgId));
|
||||
}
|
||||
}
|
||||
return view;
|
||||
|
||||
@@ -24,9 +24,9 @@ namespace Bit.Core.Models.Domain
|
||||
public EncString Uri { get; set; }
|
||||
public UriMatchType? Match { get; set; }
|
||||
|
||||
public Task<LoginUriView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public Task<LoginUriView> DecryptAsync(string orgId)
|
||||
{
|
||||
return DecryptObjAsync(new LoginUriView(this), this, _map, orgId, key);
|
||||
return DecryptObjAsync(new LoginUriView(this), this, _map, orgId);
|
||||
}
|
||||
|
||||
public LoginUriData ToLoginUriData()
|
||||
|
||||
@@ -24,9 +24,9 @@ namespace Bit.Core.Models.Domain
|
||||
public EncString Password { get; set; }
|
||||
public DateTime LastUsedDate { get; set; }
|
||||
|
||||
public Task<PasswordHistoryView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public Task<PasswordHistoryView> DecryptAsync(string orgId)
|
||||
{
|
||||
return DecryptObjAsync(new PasswordHistoryView(this), this, _map, orgId, key);
|
||||
return DecryptObjAsync(new PasswordHistoryView(this), this, _map, orgId);
|
||||
}
|
||||
|
||||
public PasswordHistoryData ToPasswordHistoryData()
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Bit.Core.Models.Domain
|
||||
|
||||
public SecureNoteType Type { get; set; }
|
||||
|
||||
public Task<SecureNoteView> DecryptAsync(string orgId, SymmetricCryptoKey key = null)
|
||||
public Task<SecureNoteView> DecryptAsync(string orgId)
|
||||
{
|
||||
return Task.FromResult(new SecureNoteView(this));
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ namespace Bit.Core.Models.Request
|
||||
Favorite = cipher.Favorite;
|
||||
LastKnownRevisionDate = cipher.RevisionDate;
|
||||
Reprompt = cipher.Reprompt;
|
||||
Key = cipher.Key?.EncryptedString;
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
@@ -125,6 +124,5 @@ namespace Bit.Core.Models.Request
|
||||
public Dictionary<string, AttachmentRequest> Attachments2 { get; set; }
|
||||
public DateTime LastKnownRevisionDate { get; set; }
|
||||
public CipherRepromptType Reprompt { get; set; }
|
||||
public string Key { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,5 @@ namespace Bit.Core.Models.Response
|
||||
public List<string> CollectionIds { get; set; }
|
||||
public DateTime? DeletedDate { get; set; }
|
||||
public CipherRepromptType Reprompt { get; set; }
|
||||
public string Key { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,6 @@ namespace Bit.Core.Models.View
|
||||
public DateTime RevisionDate { get; set; }
|
||||
public DateTime? DeletedDate { get; set; }
|
||||
public CipherRepromptType Reprompt { get; set; }
|
||||
public SymmetricCryptoKey Key { get; set; }
|
||||
|
||||
public ItemView Item
|
||||
{
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
@@ -976,19 +975,7 @@ namespace Bit.Core.Services
|
||||
|
||||
private bool IsJsonResponse(HttpResponseMessage response)
|
||||
{
|
||||
if (response.Content?.Headers is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (response.Content.Headers.ContentType?.MediaType == "application/json")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return response.Content.Headers.TryGetValues("Content-Type", out var vals)
|
||||
&&
|
||||
vals?.Any(v => v.Contains("application/json")) is true;
|
||||
return (response.Content?.Headers?.ContentType?.MediaType ?? string.Empty) == "application/json";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#define ENABLE_NEW_CIPHER_KEY_ENCRYPTION_ON_CREATION
|
||||
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -32,7 +30,6 @@ namespace Bit.Core.Services
|
||||
private readonly IStorageService _storageService;
|
||||
private readonly II18nService _i18nService;
|
||||
private readonly Func<ISearchService> _searchService;
|
||||
private readonly IConfigService _configService;
|
||||
private readonly string _clearCipherCacheKey;
|
||||
private readonly string[] _allClearCipherCacheKeys;
|
||||
private Dictionary<string, HashSet<string>> _domainMatchBlacklist = new Dictionary<string, HashSet<string>>
|
||||
@@ -51,7 +48,6 @@ namespace Bit.Core.Services
|
||||
IStorageService storageService,
|
||||
II18nService i18nService,
|
||||
Func<ISearchService> searchService,
|
||||
IConfigService configService,
|
||||
string clearCipherCacheKey,
|
||||
string[] allClearCipherCacheKeys)
|
||||
{
|
||||
@@ -63,7 +59,6 @@ namespace Bit.Core.Services
|
||||
_storageService = storageService;
|
||||
_i18nService = i18nService;
|
||||
_searchService = searchService;
|
||||
_configService = configService;
|
||||
_clearCipherCacheKey = clearCipherCacheKey;
|
||||
_allClearCipherCacheKeys = allClearCipherCacheKeys;
|
||||
}
|
||||
@@ -185,26 +180,6 @@ namespace Bit.Core.Services
|
||||
Reprompt = model.Reprompt
|
||||
};
|
||||
|
||||
key = await UpdateCipherAndGetCipherKeyAsync(cipher, model, key);
|
||||
|
||||
var tasks = new List<Task>
|
||||
{
|
||||
EncryptObjPropertyAsync(model, cipher, new HashSet<string>
|
||||
{
|
||||
nameof(CipherView.Name),
|
||||
nameof(CipherView.Notes)
|
||||
}, key),
|
||||
EncryptCipherDataAsync(cipher, model, key),
|
||||
EncryptFieldsAsync(model.Fields, key, cipher),
|
||||
EncryptPasswordHistoriesAsync(model.PasswordHistory, key, cipher),
|
||||
EncryptAttachmentsAsync(model.Attachments, key, cipher)
|
||||
};
|
||||
await Task.WhenAll(tasks);
|
||||
return cipher;
|
||||
}
|
||||
|
||||
private async Task<SymmetricCryptoKey> UpdateCipherAndGetCipherKeyAsync(Cipher cipher, CipherView cipherView, SymmetricCryptoKey key = null)
|
||||
{
|
||||
if (key == null && cipher.OrganizationId != null)
|
||||
{
|
||||
key = await _cryptoService.GetOrgKeyAsync(cipher.OrganizationId);
|
||||
@@ -214,36 +189,20 @@ namespace Bit.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
if (!await ShouldUseCipherKeyEncryptionAsync())
|
||||
var tasks = new List<Task>
|
||||
{
|
||||
return key;
|
||||
}
|
||||
|
||||
if (cipherView.Key != null)
|
||||
{
|
||||
cipher.Key = await _cryptoService.EncryptAsync(cipherView.Key.Key, key);
|
||||
return cipherView.Key;
|
||||
}
|
||||
#if ENABLE_NEW_CIPHER_KEY_ENCRYPTION_ON_CREATION
|
||||
// turned on, only on debug to check that the enc/decryption is working fine at the cipher level.
|
||||
// this will be allowed on production on a later release.
|
||||
var cfs = ServiceContainer.Resolve<ICryptoFunctionService>();
|
||||
var newKey = new SymmetricCryptoKey(await cfs.RandomBytesAsync(Core.Constants.CipherKeyRandomBytesLength));
|
||||
cipher.Key = await _cryptoService.EncryptAsync(newKey.Key, key);
|
||||
|
||||
return newKey;
|
||||
#else
|
||||
return key;
|
||||
#endif
|
||||
}
|
||||
|
||||
private async Task<bool> ShouldUseCipherKeyEncryptionAsync()
|
||||
{
|
||||
var config = await _configService.GetAsync();
|
||||
|
||||
return config != null
|
||||
&&
|
||||
VersionHelpers.IsServerVersionGreaterThanOrEqualTo(config.Version, Constants.CipherKeyEncryptionMinServerVersion);
|
||||
EncryptObjPropertyAsync(model, cipher, new HashSet<string>
|
||||
{
|
||||
"Name",
|
||||
"Notes"
|
||||
}, key),
|
||||
EncryptCipherDataAsync(cipher, model, key),
|
||||
EncryptFieldsAsync(model.Fields, key, cipher),
|
||||
EncryptPasswordHistoriesAsync(model.PasswordHistory, key, cipher),
|
||||
EncryptAttachmentsAsync(model.Attachments, key, cipher)
|
||||
};
|
||||
await Task.WhenAll(tasks);
|
||||
return cipher;
|
||||
}
|
||||
|
||||
public async Task<Cipher> GetAsync(string id)
|
||||
@@ -567,7 +526,6 @@ namespace Bit.Core.Services
|
||||
var request = new CipherRequest(cipher);
|
||||
response = await _apiService.PutCipherAsync(cipher.Id, request);
|
||||
}
|
||||
|
||||
var userId = await _stateService.GetActiveUserIdAsync();
|
||||
var data = new CipherData(response, userId, cipher.CollectionIds);
|
||||
await UpsertAsync(data);
|
||||
@@ -597,12 +555,11 @@ namespace Bit.Core.Services
|
||||
await UpsertAsync(data);
|
||||
}
|
||||
|
||||
public async Task<Cipher> SaveAttachmentRawWithServerAsync(Cipher cipher, CipherView cipherView, string filename, byte[] data)
|
||||
public async Task<Cipher> SaveAttachmentRawWithServerAsync(Cipher cipher, string filename, byte[] data)
|
||||
{
|
||||
var orgKey = await _cryptoService.GetOrgKeyAsync(cipher.OrganizationId);
|
||||
var key = await UpdateCipherAndGetCipherKeyAsync(cipher, cipherView, orgKey);
|
||||
var encFileName = await _cryptoService.EncryptAsync(filename, key);
|
||||
var (attachmentKey, encAttachmentKey) = await _cryptoService.MakeEncKeyAsync(key);
|
||||
var encFileName = await _cryptoService.EncryptAsync(filename, orgKey);
|
||||
var (attachmentKey, orgEncAttachmentKey) = await _cryptoService.MakeEncKeyAsync(orgKey);
|
||||
var encFileData = await _cryptoService.EncryptToBytesAsync(data, attachmentKey);
|
||||
|
||||
CipherResponse response;
|
||||
@@ -610,19 +567,18 @@ namespace Bit.Core.Services
|
||||
{
|
||||
var request = new AttachmentRequest
|
||||
{
|
||||
Key = encAttachmentKey.EncryptedString,
|
||||
Key = orgEncAttachmentKey.EncryptedString,
|
||||
FileName = encFileName.EncryptedString,
|
||||
FileSize = encFileData.Buffer.Length,
|
||||
};
|
||||
|
||||
var uploadDataResponse = await _apiService.PostCipherAttachmentAsync(cipher.Id, request);
|
||||
response = uploadDataResponse.CipherResponse;
|
||||
|
||||
await _fileUploadService.UploadCipherAttachmentFileAsync(uploadDataResponse, encFileName, encFileData);
|
||||
}
|
||||
catch (ApiException e) when (e.Error.StatusCode == System.Net.HttpStatusCode.NotFound || e.Error.StatusCode == System.Net.HttpStatusCode.MethodNotAllowed)
|
||||
{
|
||||
response = await LegacyServerAttachmentFileUploadAsync(cipher.Id, encFileName, encFileData, encAttachmentKey);
|
||||
response = await LegacyServerAttachmentFileUploadAsync(cipher.Id, encFileName, encFileData, orgEncAttachmentKey);
|
||||
}
|
||||
|
||||
var userId = await _stateService.GetActiveUserIdAsync();
|
||||
@@ -1098,7 +1054,7 @@ namespace Bit.Core.Services
|
||||
{
|
||||
await EncryptObjPropertyAsync(model, attachment, new HashSet<string>
|
||||
{
|
||||
nameof(AttachmentView.FileName)
|
||||
"FileName"
|
||||
}, key);
|
||||
if (model.Key != null)
|
||||
{
|
||||
|
||||
@@ -44,9 +44,8 @@ namespace Bit.Core.Utilities
|
||||
var organizationService = new OrganizationService(stateService, apiService);
|
||||
var settingsService = new SettingsService(stateService);
|
||||
var fileUploadService = new FileUploadService(apiService);
|
||||
var configService = new ConfigService(apiService, stateService, logger);
|
||||
var cipherService = new CipherService(cryptoService, stateService, settingsService, apiService,
|
||||
fileUploadService, storageService, i18nService, () => searchService, configService, clearCipherCacheKey,
|
||||
fileUploadService, storageService, i18nService, () => searchService, clearCipherCacheKey,
|
||||
allClearCipherCacheKeys);
|
||||
var folderService = new FolderService(cryptoService, stateService, apiService, i18nService, cipherService);
|
||||
var collectionService = new CollectionService(cryptoService, stateService, i18nService);
|
||||
@@ -88,6 +87,7 @@ namespace Bit.Core.Utilities
|
||||
var userVerificationService = new UserVerificationService(apiService, platformUtilsService, i18nService,
|
||||
cryptoService);
|
||||
var usernameGenerationService = new UsernameGenerationService(cryptoService, apiService, stateService);
|
||||
var configService = new ConfigService(apiService, stateService, logger);
|
||||
|
||||
Register<IConditionedAwaiterManager>(conditionedRunner);
|
||||
Register<ITokenService>("tokenService", tokenService);
|
||||
@@ -95,7 +95,6 @@ namespace Bit.Core.Utilities
|
||||
Register<IAppIdService>("appIdService", appIdService);
|
||||
Register<IOrganizationService>("organizationService", organizationService);
|
||||
Register<ISettingsService>("settingsService", settingsService);
|
||||
Register<IConfigService>(configService);
|
||||
Register<ICipherService>("cipherService", cipherService);
|
||||
Register<IFolderService>("folderService", folderService);
|
||||
Register<ICollectionService>("collectionService", collectionService);
|
||||
@@ -114,6 +113,7 @@ namespace Bit.Core.Utilities
|
||||
Register<IKeyConnectorService>("keyConnectorService", keyConnectorService);
|
||||
Register<IUserVerificationService>("userVerificationService", userVerificationService);
|
||||
Register<IUsernameGenerationService>(usernameGenerationService);
|
||||
Register<IConfigService>(configService);
|
||||
}
|
||||
|
||||
public static void Register<T>(string serviceName, T obj)
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Bit.Core.Utilities
|
||||
{
|
||||
public static class VersionHelpers
|
||||
{
|
||||
private const char HOTFIX_SEPARATOR = '-';
|
||||
|
||||
/// <summary>
|
||||
/// Compares two server versions and gets whether the <paramref name="targetVersion"/>
|
||||
/// is greater than or equal to <paramref name="compareToVersion"/>.
|
||||
/// WARNING: This doesn't take into account hotfix suffix.
|
||||
/// </summary>
|
||||
/// <param name="targetVersion">Version to compare</param>
|
||||
/// <param name="compareToVersion">Version to compare against</param>
|
||||
/// <returns>
|
||||
/// <c>True</c> if <paramref name="targetVersion"/> is greater than or equal to <paramref name="compareToVersion"/>; <c>False</c> otherwise.
|
||||
/// </returns>
|
||||
public static bool IsServerVersionGreaterThanOrEqualTo(string targetVersion, string compareToVersion)
|
||||
{
|
||||
return GetServerVersionWithoutHotfix(targetVersion).CompareTo(GetServerVersionWithoutHotfix(compareToVersion)) >= 0;
|
||||
}
|
||||
|
||||
public static Version GetServerVersionWithoutHotfix(string version)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(version))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(version));
|
||||
}
|
||||
|
||||
return new Version(version.Split(HOTFIX_SEPARATOR)[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden.autofill</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2023.5.0</string>
|
||||
<string>2023.4.1</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CFBundleLocalizations</key>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden.find-login-action-extension</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2023.5.0</string>
|
||||
<string>2023.4.1</string>
|
||||
<key>CFBundleLocalizations</key>
|
||||
<array>
|
||||
<string>en</string>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2023.5.0</string>
|
||||
<string>2023.4.1</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2023.5.0</string>
|
||||
<string>2023.4.1</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CFBundleIconName</key>
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -0,0 +1,10 @@
|
||||
"ThereAreNoItemsToList"="There are no items to list";
|
||||
"ToViewVerificationCodesUpgradeToPremium"="To view verification codes, upgrade to premium";
|
||||
"Add2FactorAutenticationToAnItemToViewVerificationCodes"="Add 2 factor authentication to an item to view the verification codes";
|
||||
"LogInToBitwardenOnYourIPhoneToViewVerificationCodes"="Log in to Bitwarden on your iPhone to view verification codes";
|
||||
"SyncingItemsContainingVerificationCodes"="Syncing items containing verification codes";
|
||||
"UnlockBitwardenOnYourIPhoneToViewVerificationCodes"="Unlock Bitwarden on your iPhone to view verification codes";
|
||||
"SetUpBitwardenToViewItemsContainingVerificationCodes"="Set up Bitwarden to view items containing verification codes";
|
||||
"Search"="Search";
|
||||
"NoItemsFound"="No items found";
|
||||
"SetUpAppleWatchPasscodeInOrderToUseBitwarden"="Set up Apple Watch passcode in order to use Bitwarden";
|
||||
@@ -207,6 +207,66 @@
|
||||
1BDBFEB2290B5D07009C78C7 /* CoreDataHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataHelper.swift; sourceTree = "<group>"; };
|
||||
1BF5F6DA29103066002DDC0C /* CipherService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CipherService.swift; sourceTree = "<group>"; };
|
||||
1BF5F6DD29103B86002DDC0C /* CipherServiceMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CipherServiceMock.swift; sourceTree = "<group>"; };
|
||||
B78CEC4A2A25402900539F0D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC4B2A2540A200539F0D /* af */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = af; path = af.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC4C2A2540A800539F0D /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC4D2A2540E700539F0D /* az */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = az; path = az.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC4E2A25411000539F0D /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC4F2A25412100539F0D /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC502A25413300539F0D /* bn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bn; path = bn.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC512A25414C00539F0D /* bs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bs; path = bs.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC522A25415400539F0D /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC532A25415D00539F0D /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC542A2541B900539F0D /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC552A2541C300539F0D /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC562A2541CB00539F0D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC572A2541F700539F0D /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC582A25420000539F0D /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
B78CEC592A25420600539F0D /* en-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-IN"; path = "en-IN.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
B78CEC5A2A25422500539F0D /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC5B2A25425A00539F0D /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC5C2A25427E00539F0D /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC5D2A25429C00539F0D /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC5E2A2542CD00539F0D /* fil */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fil; path = fil.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC5F2A2542D400539F0D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC602A2542EC00539F0D /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC612A25430800539F0D /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC622A25431900539F0D /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC632A25432900539F0D /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC642A25433100539F0D /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC652A25433600539F0D /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC662A25433C00539F0D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC672A25434200539F0D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC682A25435600539F0D /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC692A25437200539F0D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC6A2A25437E00539F0D /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC6B2A25438F00539F0D /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC6C2A2543A500539F0D /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC6D2A2543BE00539F0D /* ml */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ml; path = ml.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC6E2A2543D900539F0D /* my */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = my; path = my.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC6F2A2543F000539F0D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC702A25440200539F0D /* ne */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ne; path = ne.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC712A25441700539F0D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC722A25442D00539F0D /* nn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nn; path = nn.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC732A25444C00539F0D /* or */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = or; path = or.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC742A25446600539F0D /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC752A25447100539F0D /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
B78CEC762A25447500539F0D /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
B78CEC772A25448100539F0D /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC782A25448700539F0D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC792A25449B00539F0D /* si */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = si; path = si.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC7A2A2544B300539F0D /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC7B2A2544CD00539F0D /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC7C2A2544DF00539F0D /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC7D2A2544EF00539F0D /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC7E2A25450800539F0D /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = ta.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC7F2A25451A00539F0D /* te */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = te; path = te.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC802A25453600539F0D /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC812A25454600539F0D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC822A25454E00539F0D /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC832A25455400539F0D /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B78CEC842A25455D00539F0D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
B78CEC852A25456400539F0D /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -576,6 +636,66 @@
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
es,
|
||||
af,
|
||||
ar,
|
||||
az,
|
||||
be,
|
||||
bg,
|
||||
bn,
|
||||
bs,
|
||||
ca,
|
||||
cs,
|
||||
cy,
|
||||
da,
|
||||
de,
|
||||
el,
|
||||
"en-GB",
|
||||
"en-IN",
|
||||
et,
|
||||
eu,
|
||||
fa,
|
||||
fi,
|
||||
fil,
|
||||
fr,
|
||||
gl,
|
||||
he,
|
||||
hi,
|
||||
hr,
|
||||
hu,
|
||||
id,
|
||||
it,
|
||||
ja,
|
||||
ka,
|
||||
kn,
|
||||
ko,
|
||||
lt,
|
||||
lv,
|
||||
ml,
|
||||
my,
|
||||
nb,
|
||||
ne,
|
||||
nl,
|
||||
nn,
|
||||
or,
|
||||
pl,
|
||||
"pt-BR",
|
||||
"pt-PT",
|
||||
ro,
|
||||
ru,
|
||||
si,
|
||||
sk,
|
||||
sl,
|
||||
sr,
|
||||
sv,
|
||||
ta,
|
||||
te,
|
||||
th,
|
||||
tr,
|
||||
uk,
|
||||
vi,
|
||||
"zh-Hans",
|
||||
"zh-Hant",
|
||||
);
|
||||
mainGroup = 1B15612628B7F3D400610B9B;
|
||||
packageReferences = (
|
||||
@@ -725,6 +845,66 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
1B5AFF0829197822004478F9 /* en */,
|
||||
B78CEC4A2A25402900539F0D /* es */,
|
||||
B78CEC4B2A2540A200539F0D /* af */,
|
||||
B78CEC4C2A2540A800539F0D /* ar */,
|
||||
B78CEC4D2A2540E700539F0D /* az */,
|
||||
B78CEC4E2A25411000539F0D /* be */,
|
||||
B78CEC4F2A25412100539F0D /* bg */,
|
||||
B78CEC502A25413300539F0D /* bn */,
|
||||
B78CEC512A25414C00539F0D /* bs */,
|
||||
B78CEC522A25415400539F0D /* ca */,
|
||||
B78CEC532A25415D00539F0D /* cs */,
|
||||
B78CEC542A2541B900539F0D /* cy */,
|
||||
B78CEC552A2541C300539F0D /* da */,
|
||||
B78CEC562A2541CB00539F0D /* de */,
|
||||
B78CEC572A2541F700539F0D /* el */,
|
||||
B78CEC582A25420000539F0D /* en-GB */,
|
||||
B78CEC592A25420600539F0D /* en-IN */,
|
||||
B78CEC5A2A25422500539F0D /* et */,
|
||||
B78CEC5B2A25425A00539F0D /* eu */,
|
||||
B78CEC5C2A25427E00539F0D /* fa */,
|
||||
B78CEC5D2A25429C00539F0D /* fi */,
|
||||
B78CEC5E2A2542CD00539F0D /* fil */,
|
||||
B78CEC5F2A2542D400539F0D /* fr */,
|
||||
B78CEC602A2542EC00539F0D /* gl */,
|
||||
B78CEC612A25430800539F0D /* he */,
|
||||
B78CEC622A25431900539F0D /* hi */,
|
||||
B78CEC632A25432900539F0D /* hr */,
|
||||
B78CEC642A25433100539F0D /* hu */,
|
||||
B78CEC652A25433600539F0D /* id */,
|
||||
B78CEC662A25433C00539F0D /* it */,
|
||||
B78CEC672A25434200539F0D /* ja */,
|
||||
B78CEC682A25435600539F0D /* ka */,
|
||||
B78CEC692A25437200539F0D /* kn */,
|
||||
B78CEC6A2A25437E00539F0D /* ko */,
|
||||
B78CEC6B2A25438F00539F0D /* lt */,
|
||||
B78CEC6C2A2543A500539F0D /* lv */,
|
||||
B78CEC6D2A2543BE00539F0D /* ml */,
|
||||
B78CEC6E2A2543D900539F0D /* my */,
|
||||
B78CEC6F2A2543F000539F0D /* nb */,
|
||||
B78CEC702A25440200539F0D /* ne */,
|
||||
B78CEC712A25441700539F0D /* nl */,
|
||||
B78CEC722A25442D00539F0D /* nn */,
|
||||
B78CEC732A25444C00539F0D /* or */,
|
||||
B78CEC742A25446600539F0D /* pl */,
|
||||
B78CEC752A25447100539F0D /* pt-BR */,
|
||||
B78CEC762A25447500539F0D /* pt-PT */,
|
||||
B78CEC772A25448100539F0D /* ro */,
|
||||
B78CEC782A25448700539F0D /* ru */,
|
||||
B78CEC792A25449B00539F0D /* si */,
|
||||
B78CEC7A2A2544B300539F0D /* sk */,
|
||||
B78CEC7B2A2544CD00539F0D /* sl */,
|
||||
B78CEC7C2A2544DF00539F0D /* sr */,
|
||||
B78CEC7D2A2544EF00539F0D /* sv */,
|
||||
B78CEC7E2A25450800539F0D /* ta */,
|
||||
B78CEC7F2A25451A00539F0D /* te */,
|
||||
B78CEC802A25453600539F0D /* th */,
|
||||
B78CEC812A25454600539F0D /* tr */,
|
||||
B78CEC822A25454E00539F0D /* uk */,
|
||||
B78CEC832A25455400539F0D /* vi */,
|
||||
B78CEC842A25455D00539F0D /* zh-Hans */,
|
||||
B78CEC852A25456400539F0D /* zh-Hant */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
@@ -736,6 +916,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
@@ -795,6 +976,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using AutoFixture;
|
||||
using Bit.Core.Models.Domain;
|
||||
using Bit.Core.Models.View;
|
||||
using Bit.Test.Common.AutoFixture;
|
||||
using Bit.Test.Common.AutoFixture.Attributes;
|
||||
|
||||
@@ -28,36 +26,16 @@ namespace Bit.Core.Test.AutoFixture
|
||||
}
|
||||
}
|
||||
|
||||
internal class UserCipherView : ICustomization
|
||||
{
|
||||
public void Customize(IFixture fixture)
|
||||
{
|
||||
byte[] getRandomBytes(int size)
|
||||
{
|
||||
Random random = new Random();
|
||||
|
||||
byte[] bytes = new byte[size];
|
||||
random.NextBytes(bytes);
|
||||
return bytes;
|
||||
};
|
||||
|
||||
fixture.Customize<CipherView>(composer => composer
|
||||
.Without(c => c.OrganizationId)
|
||||
.Without(c => c.Attachments)
|
||||
.With(c => c.Key, new SymmetricCryptoKey(getRandomBytes(32), Enums.EncryptionType.AesCbc128_HmacSha256_B64)));
|
||||
}
|
||||
}
|
||||
|
||||
internal class UserCipherAutoDataAttribute : CustomAutoDataAttribute
|
||||
{
|
||||
public UserCipherAutoDataAttribute() : base(new SutProviderCustomization(),
|
||||
new UserCipher(), new UserCipherView())
|
||||
new UserCipher())
|
||||
{ }
|
||||
}
|
||||
internal class InlineUserCipherAutoDataAttribute : InlineCustomAutoDataAttribute
|
||||
{
|
||||
public InlineUserCipherAutoDataAttribute(params object[] values) : base(new[] { typeof(SutProviderCustomization),
|
||||
typeof(UserCipher), typeof(UserCipherView) }, values)
|
||||
typeof(UserCipher) }, values)
|
||||
{ }
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Bit.Core.Test.Services
|
||||
{
|
||||
[Theory, UserCipherAutoData]
|
||||
public async Task SaveWithServerAsync_PrefersFileUploadService(SutProvider<CipherService> sutProvider,
|
||||
Cipher cipher, CipherView cipherView, string fileName, EncByteArray data, AttachmentUploadDataResponse uploadDataResponse, EncString encKey)
|
||||
Cipher cipher, string fileName, EncByteArray data, AttachmentUploadDataResponse uploadDataResponse, EncString encKey)
|
||||
{
|
||||
var encFileName = new EncString(fileName);
|
||||
sutProvider.GetDependency<ICryptoService>().EncryptAsync(fileName, Arg.Any<SymmetricCryptoKey>())
|
||||
@@ -33,7 +33,7 @@ namespace Bit.Core.Test.Services
|
||||
sutProvider.GetDependency<IApiService>().PostCipherAttachmentAsync(cipher.Id, Arg.Any<AttachmentRequest>())
|
||||
.Returns(uploadDataResponse);
|
||||
|
||||
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, cipherView, fileName, data.Buffer);
|
||||
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer);
|
||||
|
||||
await sutProvider.GetDependency<IFileUploadService>().Received(1)
|
||||
.UploadCipherAttachmentFileAsync(uploadDataResponse, encFileName, data);
|
||||
@@ -43,7 +43,7 @@ namespace Bit.Core.Test.Services
|
||||
[InlineUserCipherAutoData(HttpStatusCode.NotFound)]
|
||||
[InlineUserCipherAutoData(HttpStatusCode.MethodNotAllowed)]
|
||||
public async Task SaveWithServerAsync_FallsBackToLegacyFormData(HttpStatusCode statusCode,
|
||||
SutProvider<CipherService> sutProvider, Cipher cipher, CipherView cipherView, string fileName, EncByteArray data,
|
||||
SutProvider<CipherService> sutProvider, Cipher cipher, string fileName, EncByteArray data,
|
||||
CipherResponse response, EncString encKey)
|
||||
{
|
||||
sutProvider.GetDependency<ICryptoService>().EncryptAsync(fileName, Arg.Any<SymmetricCryptoKey>())
|
||||
@@ -56,7 +56,7 @@ namespace Bit.Core.Test.Services
|
||||
sutProvider.GetDependency<IApiService>().PostCipherAttachmentLegacyAsync(cipher.Id, Arg.Any<MultipartFormDataContent>())
|
||||
.Returns(response);
|
||||
|
||||
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, cipherView, fileName, data.Buffer);
|
||||
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer);
|
||||
|
||||
await sutProvider.GetDependency<IApiService>().Received(1)
|
||||
.PostCipherAttachmentLegacyAsync(cipher.Id, Arg.Any<MultipartFormDataContent>());
|
||||
@@ -64,7 +64,7 @@ namespace Bit.Core.Test.Services
|
||||
|
||||
[Theory, UserCipherAutoData]
|
||||
public async Task SaveWithServerAsync_ThrowsOnBadRequestApiException(SutProvider<CipherService> sutProvider,
|
||||
Cipher cipher, CipherView cipherView, string fileName, EncByteArray data, EncString encKey)
|
||||
Cipher cipher, string fileName, EncByteArray data, EncString encKey)
|
||||
{
|
||||
sutProvider.GetDependency<ICryptoService>().EncryptAsync(fileName, Arg.Any<SymmetricCryptoKey>())
|
||||
.Returns(new EncString(fileName));
|
||||
@@ -77,7 +77,7 @@ namespace Bit.Core.Test.Services
|
||||
.Throws(expectedException);
|
||||
|
||||
var actualException = await Assert.ThrowsAsync<ApiException>(async () =>
|
||||
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, cipherView, fileName, data.Buffer));
|
||||
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer));
|
||||
|
||||
Assert.Equal(expectedException.Error.StatusCode, actualException.Error.StatusCode);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user