From 1635f0ca861defcec5f904cff1826552d98ba4a4 Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Tue, 23 Sep 2025 12:14:24 +0200 Subject: [PATCH 1/8] Dashlane: add automatic TOTP support in the example program --- example/Dashlane/Program.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/example/Dashlane/Program.cs b/example/Dashlane/Program.cs index 136409903..a16f1e721 100644 --- a/example/Dashlane/Program.cs +++ b/example/Dashlane/Program.cs @@ -8,13 +8,20 @@ namespace PasswordManagerAccess.Example.Dashlane { - class TextUi : Ui + class TextUi(string totpSecret) : Ui { public override Passcode ProvideGoogleAuthPasscode(int attempt) { if (attempt > 0) Bad("Google Authenticator code is invalid, try again"); + if (!string.IsNullOrEmpty(totpSecret)) + { + var totp = Util.CalculateGoogleAuthTotp(totpSecret); + Console.WriteLine($"Auto-generated TOTP: {totp}"); + return new Passcode(totp, false); + } + return GetPasscode($"Please enter Google Authenticator code {ToCancel}"); } @@ -83,12 +90,13 @@ static void Main(string[] args) var username = config["username"]; var password = config["password"]; + config.TryGetValue("google-auth-totp-secret", out var totpSecret); try { // Fetch and parse first. Console.WriteLine("Fetching and parsing the remote vault"); - var vault = Vault.Open(username, password, new TextUi(), new PlainStorage()); + var vault = Vault.Open(username, password, new TextUi(totpSecret), new PlainStorage()); // And then dump the accounts. Console.WriteLine("The vault has {0} account(s) in it:", vault.Accounts.Length); From fbee8fc19e810d1e5bca647648ff3f355a914a48 Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Tue, 23 Sep 2025 12:15:34 +0200 Subject: [PATCH 2/8] Dashlane: implement CLI protocol (ref #180, WIP) --- src/Dashlane/Client.cs | 54 +++++++++++++++++++------------- src/Dashlane/Dl1RequestSigner.cs | 34 +++++++++++++------- src/Dashlane/Response.cs | 12 +++++++ 3 files changed, 68 insertions(+), 32 deletions(-) diff --git a/src/Dashlane/Client.cs b/src/Dashlane/Client.cs index fa22407d7..827279365 100644 --- a/src/Dashlane/Client.cs +++ b/src/Dashlane/Client.cs @@ -151,6 +151,10 @@ internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string user } var info = RegisterDevice(username, ticket, code.RememberMe, rest); + + // TODO: Remove this + var r = PostJson("Get2FAStatusUnauthenticated", new Dictionary { ["login"] = username }, rest); + return new RegisterResult($"{info.AccessKey}-{info.SecretKey}", info.ServerKey ?? "", code.RememberMe); } } @@ -162,7 +166,7 @@ internal static R.VerificationMethod[] RequestDeviceRegistration(string username new Dictionary { ["login"] = username, - ["methods"] = new[] { "email_token", "totp", "duo_push", "dashlane_authenticator", "u2f" }, + ["methods"] = new[] { "email_token", "totp", "duo_push", "dashlane_authenticator" }, }, rest ).Methods; @@ -207,7 +211,12 @@ internal static string SubmitOtpToken(string username, string token, RestClient { return PostJson( "PerformTotpVerification", - new Dictionary { ["login"] = username, ["otp"] = token }, + new Dictionary + { + ["login"] = username, + ["otp"] = token, + ["activationFlow"] = false, + }, rest ).Ticket; } @@ -218,17 +227,17 @@ internal static R.DeviceInfo RegisterDevice(string username, string ticket, bool "CompleteDeviceRegistrationWithAuthTicket", new Dictionary { - ["login"] = username, - ["authTicket"] = ticket, ["device"] = new Dictionary { - ["appVersion"] = AppVersion, ["deviceName"] = ClientName, - ["osCountry"] = "US", - ["osLanguage"] = "en-US", + ["appVersion"] = AppVersion, ["platform"] = Platform, + ["osCountry"] = "en_US", + ["osLanguage"] = "en_US", ["temporary"] = !rememberMe, }, + ["login"] = username, + ["authTicket"] = ticket, }, rest ); @@ -250,17 +259,22 @@ internal static T PostJson(string endpoint, Dictionary parame internal static R.Vault Fetch(string username, string deviceId, IRestTransport transport) { - var rest = new RestClient(transport, FetchBaseApiUrl); + // Reuse the other RestClient + var rest = new RestClient( + transport, + "https://api.dashlane.com/", + new Dl1RequestSigner { Username = username, Uki = deviceId }, + defaultHeaders: new Dictionary { ["Dashlane-Client-Agent"] = ClientAgent, ["User-Agent"] = UserAgent } + ); var parameters = new Dictionary { - ["login"] = username, - ["lock"] = "nolock", - ["timestamp"] = "0", - ["sharingTimestamp"] = "0", - ["uki"] = deviceId, + ["timestamp"] = 0, + ["needsKeys"] = false, + ["teamAdminGroups"] = false, + ["transactions"] = Array.Empty(), }; - var response = rest.PostForm("12/backup/latest", parameters); + var response = rest.PostJson("v1/sync/GetLatestContent", parameters); if (response.IsSuccessful) return response.Data; @@ -339,15 +353,13 @@ internal static BaseException TryParseFetchError(RestResponse response) // private const string AuthApiBaseUrl = "https://api.dashlane.com/v1/authentication/"; - private const string FetchBaseApiUrl = "https://ws1.dashlane.com/"; - private const string UserAgent = - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"; + private const string UserAgent = "Dashlane CLI v6.2526.2"; private const string DeviceUkiKey = "device-uki"; - private const string AppVersion = "6.2450-prod-webapp-92fd706a"; - private const string Platform = "server_leeloo"; - private const string ClientName = "Chrome - Mac OS (PMA)"; + private const string AppVersion = "6.2526.2"; + private const string Platform = "server_cli"; + private const string ClientName = "hostname.local - darwin-arm64"; private const int MaxMfaAttempts = 3; private static readonly string ClientAgent = - $"{{\"platform\":\"{Platform}\",\"version\":\"{AppVersion}\",\"osversion\":\"OS_X_10_15_7\",\"language\":\"en\"}}"; + $$"""{"version":"{{AppVersion}}","platform":"{{Platform}}","osversion":"darwin-arm64","partner":"dashlane"}"""; } } diff --git a/src/Dashlane/Dl1RequestSigner.cs b/src/Dashlane/Dl1RequestSigner.cs index 5556218db..77b16514d 100644 --- a/src/Dashlane/Dl1RequestSigner.cs +++ b/src/Dashlane/Dl1RequestSigner.cs @@ -16,9 +16,13 @@ namespace PasswordManagerAccess.Dashlane // web/extension clients. It's been put on ice for now. internal class Dl1RequestSigner : IRequestSigner { + // TODO: Rework this! + public string Username { get; init; } = ""; + public string Uki { get; init; } = ""; + public IReadOnlyDictionary Sign(Uri uri, HttpMethod method, IReadOnlyDictionary headers, HttpContent content) { - return Sign(uri, method, headers, content, Os.UnixSeconds()); + return Sign(uri, method, headers, content, Os.UnixSeconds(), Username, Uki); } // @@ -30,7 +34,9 @@ internal static IReadOnlyDictionary Sign( HttpMethod method, IReadOnlyDictionary headers, HttpContent content, - uint timestamp + uint timestamp, + string username = "", + string uki = "" ) { var headersToSign = FormatHeaderForSigning(headers, content); @@ -38,16 +44,22 @@ uint timestamp var request = BuildRequest(uri, method, headersToSign, headerOrder, content); var requestHashHex = Crypto.Sha256(request).ToHex(); var signingMaterial = BuildAuthSigningMaterial(timestamp, requestHashHex); - var signature = Crypto.HmacSha256(AppAccessSecret, signingMaterial).ToHex(); - var extraHeaders = new Dictionary { ["Authorization"] = BuildAuthHeader(timestamp, headerOrder, signature) }; + var key = uki.IsNullOrEmpty() ? AppAccessSecret : $"{AppAccessSecret}\n{uki.Split('-')[1]}"; + var signature = Crypto.HmacSha256(key.ToBytes(), signingMaterial).ToHex(); + var extraHeaders = new Dictionary + { + ["Authorization"] = BuildAuthHeader(timestamp, headerOrder, signature, username, uki), + }; return headers.Merge(extraHeaders); } - internal static string BuildAuthHeader(uint timestamp, string[] headerOrder, string signature) + internal static string BuildAuthHeader(uint timestamp, string[] headerOrder, string signature, string username = "", string uki = "") { var headers = headerOrder.JoinToString(";"); - return $"DL1-HMAC-SHA256 AppAccessKey={AppAccessKey},Timestamp={timestamp},SignedHeaders={headers},Signature={signature}"; + var login = username.IsNullOrEmpty() ? "" : $"Login={username},"; + var device = uki.IsNullOrEmpty() ? "" : $"DeviceAccessKey={uki.Split('-')[0]},"; + return $"DL1-HMAC-SHA256 {login}AppAccessKey={AppAccessKey},{device}Timestamp={timestamp},SignedHeaders={headers},Signature={signature}"; } internal static string HashBody(HttpContent content) @@ -63,7 +75,7 @@ internal static Dictionary FormatHeaderForSigning(IReadOnlyDicti foreach (var kv in headers) { var name = kv.Key.ToLower(); - if (ExcludeHeadersLowerCase.Contains(name)) + if (!HeadersToSignLowerCase.Contains(name)) continue; formattedHeaders[name] = kv.Value; @@ -72,7 +84,7 @@ internal static Dictionary FormatHeaderForSigning(IReadOnlyDicti foreach (var kv in content.Headers) { var name = kv.Key.ToLower(); - if (ExcludeHeadersLowerCase.Contains(name)) + if (!HeadersToSignLowerCase.Contains(name)) continue; formattedHeaders[name] = kv.Value.JoinToString(", "); @@ -109,9 +121,9 @@ internal static string BuildAuthSigningMaterial(uint timestamp, string requestHa return $"DL1-HMAC-SHA256\n{timestamp}\n{requestHash}"; } - private const string AppAccessKey = "C4F8H4SEAMXNBQVSASVBWDDZNCVTESMY"; - private static readonly byte[] AppAccessSecret = "Na9Dz3WcmjMZ5pdYU1AmC5TdYkeWAOzvOK6PkbU4QjfjPQTSaXY8pjPwrvHfVH14".ToBytes(); + private const string AppAccessKey = "HB9JQATDY6Y62JYKT7KXBN4C7FH8HKC5"; + private static readonly string AppAccessSecret = "boUtXxmDgLUtNFaigCMQ3+u+LAx0tg1ePAUE13nkR7dto+Zwq1naOHZTwbxxM7iL"; - private static readonly HashSet ExcludeHeadersLowerCase = new HashSet { "content-length", "user-agent" }; + private static readonly HashSet HeadersToSignLowerCase = ["content-type", "user-agent"]; } } diff --git a/src/Dashlane/Response.cs b/src/Dashlane/Response.cs index 7fc335e91..72a1e4971 100644 --- a/src/Dashlane/Response.cs +++ b/src/Dashlane/Response.cs @@ -67,6 +67,18 @@ internal readonly struct SharingKeys public readonly string PrivateKey; } + public class MfaStatus + { + [JsonProperty("type", Required = Required.Always)] + public string Name { get; set; } + + [JsonProperty("hasDashlaneAuthenticator")] + public bool HasDashlaneAuthenticator { get; set; } + + [JsonProperty("isDuoEnabled")] + public bool IsDuoEnabled { get; set; } + } + internal readonly struct ErrorEnvelope { [JsonProperty("requestId", Required = Required.Always)] From 6989c8ad94ed7ef4cc683ddc27c975e4546e281e Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Tue, 23 Sep 2025 14:44:53 +0200 Subject: [PATCH 3/8] Dashlane: CLI protocol (ref #180, WIP) --- src/Dashlane/Client.cs | 6 +----- src/Dashlane/Response.cs | 25 ++++++------------------- src/Dashlane/Vault.cs | 23 +++++++++++++++-------- 3 files changed, 22 insertions(+), 32 deletions(-) diff --git a/src/Dashlane/Client.cs b/src/Dashlane/Client.cs index 827279365..7bf84b9c9 100644 --- a/src/Dashlane/Client.cs +++ b/src/Dashlane/Client.cs @@ -274,11 +274,7 @@ internal static R.Vault Fetch(string username, string deviceId, IRestTransport t ["transactions"] = Array.Empty(), }; - var response = rest.PostJson("v1/sync/GetLatestContent", parameters); - if (response.IsSuccessful) - return response.Data; - - throw MakeSpecializedError(response, TryParseFetchError); + return PostJson("v1/sync/GetLatestContent", parameters, rest); } internal static BaseException MakeSpecializedError(RestResponse response, Func, BaseException> parseError) diff --git a/src/Dashlane/Response.cs b/src/Dashlane/Response.cs index 72a1e4971..1423b2bbd 100644 --- a/src/Dashlane/Response.cs +++ b/src/Dashlane/Response.cs @@ -111,35 +111,22 @@ internal readonly struct FetchError internal class Vault { - [JsonProperty(PropertyName = "fullBackupFile")] - public readonly string EncryptedAccounts; - - [JsonProperty(PropertyName = "transactionList")] + [JsonProperty(PropertyName = "transactions", Required = Required.Always)] public readonly Transaction[] Transactions; - - // - // These ones are not used and only needed to identify this data structure during de-serialization. - // - - [JsonProperty(PropertyName = "timestamp", Required = Required.Always)] - public readonly string UnusedTimestamp; - - [JsonProperty(PropertyName = "summary", Required = Required.Always)] - public readonly object UnusedSummary; } internal class Transaction { - [JsonProperty(PropertyName = "type")] + [JsonProperty(PropertyName = "identifier", Required = Required.Always)] + public readonly string Id; + + [JsonProperty(PropertyName = "type", Required = Required.Always)] public readonly string Kind; - [JsonProperty(PropertyName = "action")] + [JsonProperty(PropertyName = "action", Required = Required.Always)] public readonly string Action; [JsonProperty(PropertyName = "content")] public readonly string Content; - - [JsonProperty(PropertyName = "identifier")] - public readonly string Id; } } diff --git a/src/Dashlane/Vault.cs b/src/Dashlane/Vault.cs index b860d44e0..5d18bbf17 100644 --- a/src/Dashlane/Vault.cs +++ b/src/Dashlane/Vault.cs @@ -35,12 +35,7 @@ internal Vault(R.Vault blob, string serverKey, string password) // This is used with the MFA. The server supplies the password prefix that is used in encryption. var fullPassword = serverKey + password; - var fullFile = blob.EncryptedAccounts; - if (!string.IsNullOrWhiteSpace(fullFile)) - foreach (var i in Parse.ExtractEncryptedAccounts(fullFile.Decode64(), fullPassword, keyCache)) - accounts[i.Id] = i; - - foreach (var transaction in blob.Transactions ?? Array.Empty()) + foreach (var transaction in blob.Transactions) { if (transaction.Kind != "AUTHENTIFIANT") continue; @@ -50,8 +45,20 @@ internal Vault(R.Vault blob, string serverKey, string password) case "BACKUP_EDIT": var content = transaction.Content; if (!string.IsNullOrWhiteSpace(content)) - foreach (var i in Parse.ExtractEncryptedAccounts(content.Decode64(), fullPassword, keyCache)) - accounts[i.Id] = i; + { + try + { + foreach (var i in Parse.ExtractEncryptedAccounts(content.Decode64(), fullPassword, keyCache)) + accounts[i.Id] = i; + } + catch (BadCredentialsException e) + { + // TODO: Remove this! + // TODO: Report errors! + Console.WriteLine($"Failed to decrypt transaction {transaction.Id}"); + // Ignore transaction + } + } break; case "BACKUP_REMOVE": From 49ed7a68268e324f6d95e9d11473a6318dcb1002 Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Tue, 23 Sep 2025 19:54:14 +0200 Subject: [PATCH 4/8] Dashlane: refactor request signing into add and device signer (ref #180, WIP) [skip ci] --- src/Dashlane/Client.cs | 10 +- src/Dashlane/Dl1AppRequestSigner.cs | 18 ++ src/Dashlane/Dl1BaseRequestSigner.cs | 117 +++++++++ src/Dashlane/Dl1DeviceRequestSigner.cs | 22 ++ src/Dashlane/Dl1RequestSigner.cs | 129 ---------- src/Dashlane/Vault.cs | 2 +- test/Dashlane/Dl1RequestSignerTest.cs | 320 +++++++++++++++---------- 7 files changed, 366 insertions(+), 252 deletions(-) create mode 100644 src/Dashlane/Dl1AppRequestSigner.cs create mode 100644 src/Dashlane/Dl1BaseRequestSigner.cs create mode 100644 src/Dashlane/Dl1DeviceRequestSigner.cs delete mode 100644 src/Dashlane/Dl1RequestSigner.cs diff --git a/src/Dashlane/Client.cs b/src/Dashlane/Client.cs index 7bf84b9c9..503055401 100644 --- a/src/Dashlane/Client.cs +++ b/src/Dashlane/Client.cs @@ -80,7 +80,7 @@ internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string user var rest = new RestClient( transport, AuthApiBaseUrl, - new Dl1RequestSigner(), + new Dl1AppRequestSigner(), defaultHeaders: new Dictionary(2) { ["Dashlane-Client-Agent"] = ClientAgent, ["User-Agent"] = UserAgent } ); @@ -263,7 +263,13 @@ internal static R.Vault Fetch(string username, string deviceId, IRestTransport t var rest = new RestClient( transport, "https://api.dashlane.com/", - new Dl1RequestSigner { Username = username, Uki = deviceId }, + new Dl1DeviceRequestSigner + { + Username = username, + // TODO: Improve this! + DeviceAccessKey = deviceId.Split('-')[0], + DeviceSecretKey = deviceId.Split('-')[1], + }, defaultHeaders: new Dictionary { ["Dashlane-Client-Agent"] = ClientAgent, ["User-Agent"] = UserAgent } ); var parameters = new Dictionary diff --git a/src/Dashlane/Dl1AppRequestSigner.cs b/src/Dashlane/Dl1AppRequestSigner.cs new file mode 100644 index 000000000..01f2d0033 --- /dev/null +++ b/src/Dashlane/Dl1AppRequestSigner.cs @@ -0,0 +1,18 @@ +// Copyright (C) Dmitry Yakimenko (detunized@gmail.com). +// Licensed under the terms of the MIT license. See LICENCE for details. + +#nullable enable + +namespace PasswordManagerAccess.Dashlane; + +// This signer is used to sign all requests before the device is registered. +internal class Dl1AppRequestSigner : Dl1BaseRequestSigner +{ + // + // Protected + // + + protected override string GetSigningKey() => AppAccessSecret; + + protected override string GetAuthIdentity() => $"AppAccessKey={AppAccessKey}"; +} diff --git a/src/Dashlane/Dl1BaseRequestSigner.cs b/src/Dashlane/Dl1BaseRequestSigner.cs new file mode 100644 index 000000000..4869ab6f2 --- /dev/null +++ b/src/Dashlane/Dl1BaseRequestSigner.cs @@ -0,0 +1,117 @@ +// Copyright (C) Dmitry Yakimenko (detunized@gmail.com). +// Licensed under the terms of the MIT license. See LICENCE for details. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using PasswordManagerAccess.Common; + +namespace PasswordManagerAccess.Dashlane; + +internal abstract class Dl1BaseRequestSigner : IRequestSigner +{ + public IReadOnlyDictionary Sign(Uri uri, HttpMethod method, IReadOnlyDictionary headers, HttpContent content) => + Sign(uri, method, headers, content, Os.UnixSeconds()); + + // + // Protected + // + + protected abstract string GetSigningKey(); + protected abstract string GetAuthIdentity(); + + // + // Internal + // + + internal IReadOnlyDictionary Sign( + Uri uri, + HttpMethod method, + IReadOnlyDictionary headers, + HttpContent content, + uint timestamp + ) + { + var headersToSign = FormatHeaderForSigning(headers, content); + var headerOrder = headersToSign.Keys.OrderBy(x => x).ToArray(); + var request = BuildRequest(uri, method, headersToSign, headerOrder, content); + var requestHashHex = Crypto.Sha256(request).ToHex(); + var signingMaterial = BuildAuthSigningMaterial(timestamp, requestHashHex); + var signature = Crypto.HmacSha256(GetSigningKey().ToBytes(), signingMaterial).ToHex(); + var extraHeaders = new Dictionary { ["Authorization"] = BuildAuthHeader(timestamp, headerOrder, signature) }; + + return headers.Merge(extraHeaders); + } + + internal string BuildAuthHeader(uint timestamp, string[] headerOrder, string signature) + { + var headers = headerOrder.JoinToString(";"); + var authId = GetAuthIdentity(); + return $"DL1-HMAC-SHA256 {authId},Timestamp={timestamp},SignedHeaders={headers},Signature={signature}"; + } + + internal static string HashBody(HttpContent content) + { + var body = content.ReadAsStringAsync().GetAwaiter().GetResult(); + return Crypto.Sha256(body).ToHex(); + } + + internal static Dictionary FormatHeaderForSigning(IReadOnlyDictionary headers, HttpContent content) + { + var formattedHeaders = new Dictionary(); + + foreach (var kv in headers) + { + var name = kv.Key.ToLower(); + if (!HeadersToSignLowerCase.Contains(name)) + continue; + + formattedHeaders[name] = kv.Value; + } + + foreach (var kv in content.Headers) + { + var name = kv.Key.ToLower(); + if (!HeadersToSignLowerCase.Contains(name)) + continue; + + formattedHeaders[name] = kv.Value.JoinToString(", "); + } + + return formattedHeaders; + } + + internal static string BuildRequest( + Uri uri, + HttpMethod method, + Dictionary headersToSign, + string[] headerOrder, + HttpContent content + ) + { + var request = new StringBuilder(); + request.AppendLineLf(method.ToString()); + request.AppendLineLf(uri.AbsolutePath); + request.AppendLineLf(""); + foreach (var name in headerOrder) + request.AppendLineLf($"{name}:{headersToSign[name]}"); + request.AppendLineLf(""); + request.AppendLineLf(headerOrder.JoinToString(";")); + + // The last line should not have the trailing '\n'! + request.Append(HashBody(content)); + + return request.ToString(); + } + + internal static string BuildAuthSigningMaterial(uint timestamp, string requestHash) => $"DL1-HMAC-SHA256\n{timestamp}\n{requestHash}"; + + internal const string AppAccessKey = "HB9JQATDY6Y62JYKT7KXBN4C7FH8HKC5"; + internal const string AppAccessSecret = "boUtXxmDgLUtNFaigCMQ3+u+LAx0tg1ePAUE13nkR7dto+Zwq1naOHZTwbxxM7iL"; + + internal static readonly HashSet HeadersToSignLowerCase = ["content-type", "user-agent"]; +} diff --git a/src/Dashlane/Dl1DeviceRequestSigner.cs b/src/Dashlane/Dl1DeviceRequestSigner.cs new file mode 100644 index 000000000..f361d93ba --- /dev/null +++ b/src/Dashlane/Dl1DeviceRequestSigner.cs @@ -0,0 +1,22 @@ +// Copyright (C) Dmitry Yakimenko (detunized@gmail.com). +// Licensed under the terms of the MIT license. See LICENCE for details. + +#nullable enable + +namespace PasswordManagerAccess.Dashlane; + +// This signer is used to sign all requests after the device is registered. +internal class Dl1DeviceRequestSigner : Dl1BaseRequestSigner +{ + public required string Username { get; init; } + public required string DeviceAccessKey { get; init; } + public required string DeviceSecretKey { get; init; } + + // + // Protected + // + + protected override string GetSigningKey() => $"{AppAccessSecret}\n{DeviceSecretKey}"; + + protected override string GetAuthIdentity() => $"Login={Username},AppAccessKey={AppAccessKey},DeviceAccessKey={DeviceAccessKey}"; +} diff --git a/src/Dashlane/Dl1RequestSigner.cs b/src/Dashlane/Dl1RequestSigner.cs deleted file mode 100644 index 77b16514d..000000000 --- a/src/Dashlane/Dl1RequestSigner.cs +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (C) Dmitry Yakimenko (detunized@gmail.com). -// Licensed under the terms of the MIT license. See LICENCE for details. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Text; -using PasswordManagerAccess.Common; - -namespace PasswordManagerAccess.Dashlane -{ - // This request signer is used in the new Web protocol that is not fully supported yet. - // The new web protocol doesn't seem to be fully implemented by Dashlane. They fall back - // to ws1.dashlane.com calls all the time. Some features are not supported by the - // web/extension clients. It's been put on ice for now. - internal class Dl1RequestSigner : IRequestSigner - { - // TODO: Rework this! - public string Username { get; init; } = ""; - public string Uki { get; init; } = ""; - - public IReadOnlyDictionary Sign(Uri uri, HttpMethod method, IReadOnlyDictionary headers, HttpContent content) - { - return Sign(uri, method, headers, content, Os.UnixSeconds(), Username, Uki); - } - - // - // Internal - // - - internal static IReadOnlyDictionary Sign( - Uri uri, - HttpMethod method, - IReadOnlyDictionary headers, - HttpContent content, - uint timestamp, - string username = "", - string uki = "" - ) - { - var headersToSign = FormatHeaderForSigning(headers, content); - var headerOrder = headersToSign.Keys.OrderBy(x => x).ToArray(); - var request = BuildRequest(uri, method, headersToSign, headerOrder, content); - var requestHashHex = Crypto.Sha256(request).ToHex(); - var signingMaterial = BuildAuthSigningMaterial(timestamp, requestHashHex); - var key = uki.IsNullOrEmpty() ? AppAccessSecret : $"{AppAccessSecret}\n{uki.Split('-')[1]}"; - var signature = Crypto.HmacSha256(key.ToBytes(), signingMaterial).ToHex(); - var extraHeaders = new Dictionary - { - ["Authorization"] = BuildAuthHeader(timestamp, headerOrder, signature, username, uki), - }; - - return headers.Merge(extraHeaders); - } - - internal static string BuildAuthHeader(uint timestamp, string[] headerOrder, string signature, string username = "", string uki = "") - { - var headers = headerOrder.JoinToString(";"); - var login = username.IsNullOrEmpty() ? "" : $"Login={username},"; - var device = uki.IsNullOrEmpty() ? "" : $"DeviceAccessKey={uki.Split('-')[0]},"; - return $"DL1-HMAC-SHA256 {login}AppAccessKey={AppAccessKey},{device}Timestamp={timestamp},SignedHeaders={headers},Signature={signature}"; - } - - internal static string HashBody(HttpContent content) - { - var body = content.ReadAsStringAsync().GetAwaiter().GetResult(); - return Crypto.Sha256(body).ToHex(); - } - - internal static Dictionary FormatHeaderForSigning(IReadOnlyDictionary headers, HttpContent content) - { - var formattedHeaders = new Dictionary(); - - foreach (var kv in headers) - { - var name = kv.Key.ToLower(); - if (!HeadersToSignLowerCase.Contains(name)) - continue; - - formattedHeaders[name] = kv.Value; - } - - foreach (var kv in content.Headers) - { - var name = kv.Key.ToLower(); - if (!HeadersToSignLowerCase.Contains(name)) - continue; - - formattedHeaders[name] = kv.Value.JoinToString(", "); - } - - return formattedHeaders; - } - - internal static string BuildRequest( - Uri uri, - HttpMethod method, - Dictionary headersToSign, - string[] headerOrder, - HttpContent content - ) - { - var request = new StringBuilder(); - request.AppendLineLf(method.ToString()); - request.AppendLineLf(uri.AbsolutePath); - request.AppendLineLf(""); - foreach (var name in headerOrder) - request.AppendLineLf($"{name}:{headersToSign[name]}"); - request.AppendLineLf(""); - request.AppendLineLf(headerOrder.JoinToString(";")); - - // The last line should not have the trailing '\n'! - request.Append(HashBody(content)); - - return request.ToString(); - } - - internal static string BuildAuthSigningMaterial(uint timestamp, string requestHash) - { - return $"DL1-HMAC-SHA256\n{timestamp}\n{requestHash}"; - } - - private const string AppAccessKey = "HB9JQATDY6Y62JYKT7KXBN4C7FH8HKC5"; - private static readonly string AppAccessSecret = "boUtXxmDgLUtNFaigCMQ3+u+LAx0tg1ePAUE13nkR7dto+Zwq1naOHZTwbxxM7iL"; - - private static readonly HashSet HeadersToSignLowerCase = ["content-type", "user-agent"]; - } -} diff --git a/src/Dashlane/Vault.cs b/src/Dashlane/Vault.cs index 5d18bbf17..3be061bdd 100644 --- a/src/Dashlane/Vault.cs +++ b/src/Dashlane/Vault.cs @@ -51,7 +51,7 @@ internal Vault(R.Vault blob, string serverKey, string password) foreach (var i in Parse.ExtractEncryptedAccounts(content.Decode64(), fullPassword, keyCache)) accounts[i.Id] = i; } - catch (BadCredentialsException e) + catch (BadCredentialsException) { // TODO: Remove this! // TODO: Report errors! diff --git a/test/Dashlane/Dl1RequestSignerTest.cs b/test/Dashlane/Dl1RequestSignerTest.cs index 184c15d1f..a07be7f86 100644 --- a/test/Dashlane/Dl1RequestSignerTest.cs +++ b/test/Dashlane/Dl1RequestSignerTest.cs @@ -8,149 +8,229 @@ using PasswordManagerAccess.Dashlane; using Xunit; -namespace PasswordManagerAccess.Test.Dashlane +namespace PasswordManagerAccess.Test.Dashlane; + +// All DL1 request signers tests +public class Dl1RequestSignerTest { - public class Dl1RequestSignerTest + // + // Dl1AppRequestSigner tests + // + + [Fact] + public void Dl1AppRequestSigner_Sign_returns_headers() { - [Fact] - public void Sign_returns_headers() + // Arrange + var originalHeaders = new Dictionary { - var headers = Dl1RequestSigner.Sign( - new Uri("https://blah.blah"), - HttpMethod.Post, - new Dictionary - { - ["name1"] = "value1", - ["name2"] = "value2", - ["name3"] = "value3", - ["User-Agent"] = "Browser", - ["Content-Length"] = "1337", - }, - MakeHttpContent(), - 1234567890 - ); - - var expected = new Dictionary - { - ["name1"] = "value1", - ["name2"] = "value2", - ["name3"] = "value3", - ["User-Agent"] = "Browser", - ["Content-Length"] = "1337", - ["Authorization"] = - "DL1-HMAC-SHA256 AppAccessKey=C4F8H4SEAMXNBQVSASVBWDDZNCVTESMY,Timestamp=1234567890,SignedHeaders=content-header-name;content-type;ignored-content-header-name;name1;name2;name3,Signature=c68d0658fe6707d0cbedafe24e6a845460ddb7e98baf1236815ed40ae30052ee", - }; - - Assert.Equal(expected, headers); + ["name1"] = "value1", + ["name2"] = "value2", + ["name3"] = "value3", + ["User-Agent"] = "Browser", + ["Content-Length"] = "1337", + }; + + // Act + var signedHeaders = new Dl1AppRequestSigner().Sign( + new Uri("https://blah.blah"), + HttpMethod.Post, + originalHeaders, + MakeHttpContent(), + 1234567890 + ); + + // Assert + // Only one header is added + Assert.Equal(originalHeaders.Count + 1, signedHeaders.Count); + + // All headers are the same + foreach (var k in originalHeaders.Keys) + { + var v = Assert.Contains(k, signedHeaders); + Assert.Equal(originalHeaders[k], v); } - [Fact] - public void BuildAuthHeader_returns_header() + // Authorization header is added + var auth = Assert.Contains("Authorization", signedHeaders); + Assert.StartsWith( + "DL1-HMAC-SHA256 AppAccessKey=HB9JQATDY6Y62JYKT7KXBN4C7FH8HKC5,Timestamp=1234567890,SignedHeaders=content-type;user-agent,Signature=", + auth + ); + } + + [Fact] + public void Dl1AppRequestSigner_BuildAuthHeader_returns_header() + { + // Arrange/Act + var header = new Dl1AppRequestSigner().BuildAuthHeader(1234567890, ["h1", "h2", "h3"], "deadbeef"); + + // Assert + Assert.Equal( + "DL1-HMAC-SHA256 AppAccessKey=HB9JQATDY6Y62JYKT7KXBN4C7FH8HKC5,Timestamp=1234567890,SignedHeaders=h1;h2;h3,Signature=deadbeef", + header + ); + } + + // + // Dl1DeviceRequestSigner tests + // + + [Fact] + public void Dl1DeviceRequestSigner_Sign_returns_headers() + { + // Arrange + var originalHeaders = new Dictionary { - var header = Dl1RequestSigner.BuildAuthHeader(1234567890, new[] { "h1", "h2", "h3" }, "deadbeef"); - var expected = - "DL1-HMAC-SHA256 AppAccessKey=C4F8H4SEAMXNBQVSASVBWDDZNCVTESMY,Timestamp=1234567890,SignedHeaders=h1;h2;h3,Signature=deadbeef"; + ["name1"] = "value1", + ["name2"] = "value2", + ["name3"] = "value3", + ["User-Agent"] = "Browser", + ["Content-Length"] = "1337", + }; + + // Act + var signedHeaders = new Dl1DeviceRequestSigner + { + Username = "username@example.com", + DeviceAccessKey = "device-access-key", + DeviceSecretKey = "device-secret-key", + }.Sign(new Uri("https://blah.blah"), HttpMethod.Post, originalHeaders, MakeHttpContent(), 1234567890); - Assert.Equal(expected, header); - } + // Assert + // Only one header is added + Assert.Equal(originalHeaders.Count + 1, signedHeaders.Count); - [Fact] - public void HashBody_return_body_hash() + // All headers are the same + foreach (var k in originalHeaders.Keys) { - var hash = Dl1RequestSigner.HashBody(MakeHttpContent()); - Assert.Equal(ContentSha256, hash); + var v = Assert.Contains(k, signedHeaders); + Assert.Equal(originalHeaders[k], v); } - [Fact] - public void FormatHeaderForSigning_returns_headers() + // Authorization header is added + var auth = Assert.Contains("Authorization", signedHeaders); + Assert.StartsWith( + "DL1-HMAC-SHA256 Login=username@example.com,AppAccessKey=HB9JQATDY6Y62JYKT7KXBN4C7FH8HKC5,DeviceAccessKey=device-access-key," + + "Timestamp=1234567890,SignedHeaders=content-type;user-agent,Signature=", + auth + ); + } + + [Fact] + public void Dl1DeviceRequestSigner_BuildAuthHeader_returns_header() + { + // Arrange/Act + var header = new Dl1DeviceRequestSigner { - var content = new ByteArrayContent("".ToBytes()); - content.Headers.Add("Content-Length", "1337"); - content.Headers.Add("Content-Header", "content-header-value1"); - content.Headers.Add("Content-Header", "content-header-value2"); - - var headers = Dl1RequestSigner.FormatHeaderForSigning( - new Dictionary - { - ["name1"] = "value1", - ["name2"] = "value2", - ["name3"] = "value3", - ["User-Agent"] = "Browser", - ["Content-Length"] = "1337", - }, - content - ); - - var expected = new Dictionary + Username = "username@example.com", + DeviceAccessKey = "device-access-key", + DeviceSecretKey = "device-secret-key", + }.BuildAuthHeader(1234567890, ["h1", "h2", "h3"], "deadbeef"); + + // Assert + Assert.Equal( + "DL1-HMAC-SHA256 Login=username@example.com,AppAccessKey=HB9JQATDY6Y62JYKT7KXBN4C7FH8HKC5,DeviceAccessKey=device-access-key," + + "Timestamp=1234567890,SignedHeaders=h1;h2;h3,Signature=deadbeef", + header + ); + } + + // + // Dl1BaseRequestSigner tests + // + + [Fact] + public void HashBody_return_body_hash() + { + // Arrange/Act + var hash = Dl1BaseRequestSigner.HashBody(MakeHttpContent()); + + // Assert + Assert.Equal(ContentSha256, hash); + } + + [Fact] + public void FormatHeaderForSigning_returns_headers() + { + // Arrange + var content = new ByteArrayContent("".ToBytes()); + content.Headers.Add("Content-Length", "1337"); + content.Headers.Add("Content-Header", "content-header-value1"); + content.Headers.Add("Content-Header", "content-header-value2"); + content.Headers.Add("Content-Type", "application/octet-stream"); + + // Act + var headers = Dl1BaseRequestSigner.FormatHeaderForSigning( + new Dictionary { ["name1"] = "value1", ["name2"] = "value2", ["name3"] = "value3", - ["content-header"] = "content-header-value1, content-header-value2", - }; + ["User-Agent"] = "Browser", + ["Content-Length"] = "1337", + }, + content + ); - Assert.Equal(expected, headers); - } + // Assert + var expected = new Dictionary { ["user-agent"] = "Browser", ["content-type"] = "application/octet-stream" }; + Assert.Equal(expected, headers); + } - [Fact] - public void BuildRequest_returns_request_string() - { - var r = Dl1RequestSigner.BuildRequest( - new Uri("https://blah.blah"), - HttpMethod.Post, - new Dictionary - { - ["name3"] = "value3", - ["ignored2"] = "ignored2", - ["name2"] = "value2", - ["ignored1"] = "ignored1", - ["name1"] = "value1", - }, - new[] { "name1", "name2", "name3" }, - MakeHttpContent() - ); - - var expected = new[] + [Fact] + public void BuildRequest_returns_request_string() + { + // Arrange/Act + var request = Dl1BaseRequestSigner.BuildRequest( + new Uri("https://blah.blah"), + HttpMethod.Post, + new Dictionary { - "POST", - "/", - "", - "name1:value1", - "name2:value2", - "name3:value3", - "", - "name1;name2;name3", - ContentSha256, - }.JoinToString("\n"); - - Assert.Equal(expected, r); - } + ["name3"] = "value3", + ["ignored2"] = "ignored2", + ["name2"] = "value2", + ["ignored1"] = "ignored1", + ["name1"] = "value1", + }, + ["name1", "name2", "name3"], + MakeHttpContent() + ); - [Fact] - public void BuildAuthSigningMaterial_returns_signing_material() - { - var material = Dl1RequestSigner.BuildAuthSigningMaterial(1234567890, "deadbeef"); - Assert.Equal("DL1-HMAC-SHA256\n1234567890\ndeadbeef", material); - } + // Assert + var expected = new[] { "POST", "/", "", "name1:value1", "name2:value2", "name3:value3", "", "name1;name2;name3", ContentSha256 }.JoinToString( + "\n" + ); - // - // Helpers - // + Assert.Equal(expected, request); + } - internal static HttpContent MakeHttpContent() - { - var content = new StringContent("string-content-line1\nstring-content-line2"); - content.Headers.Add("content-header-name", "content-header-value"); - content.Headers.Add("ignored-content-header-name", "ignored-content-header-value"); - return content; - } + [Fact] + public void BuildAuthSiefagningMaterial_returns_signing_material() + { + // Arrange/Act + var material = Dl1BaseRequestSigner.BuildAuthSigningMaterial(1234567890, "deadbeef"); + + // Assert + Assert.Equal("DL1-HMAC-SHA256\n1234567890\ndeadbeef", material); + } - // - // Data - // + // + // Helpers + // - private const uint Timestamp = 1234567890; - private const string ContentSha256 = "121daa986d8b8ef61459c322035929d9b14724cff672b88a9b8fc4ccf5787965"; - private const string RequestHash = "deadbeef"; + internal static HttpContent MakeHttpContent() + { + var content = new StringContent("string-content-line1\nstring-content-line2"); + content.Headers.Add("content-header-name", "content-header-value"); + content.Headers.Add("ignored-content-header-name", "ignored-content-header-value"); + return content; } + + // + // Data + // + + private const uint Timestamp = 1234567890; + private const string ContentSha256 = "121daa986d8b8ef61459c322035929d9b14724cff672b88a9b8fc4ccf5787965"; + private const string RequestHash = "deadbeef"; } From 58620ee3d833bc57e0fee3500e83c9769dd40c56 Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Fri, 26 Sep 2025 14:19:52 +0200 Subject: [PATCH 5/8] Common: improve RestFlow by allowing multiple partial header and cookie matches --- test/RestFlow.cs | 158 +++++++++++++++++++---------------------------- 1 file changed, 63 insertions(+), 95 deletions(-) diff --git a/test/RestFlow.cs b/test/RestFlow.cs index 39d7c8f89..7a32fa55c 100644 --- a/test/RestFlow.cs +++ b/test/RestFlow.cs @@ -58,13 +58,13 @@ public RestFlow Get( { _responses.Add( new Response( - method: HttpMethod.Get, - content: response, - status: status, - headers: headers ?? NoHeaders, - cookies: cookies ?? NoCookies, - responseUrl: responseUrl, - error: error + Method: HttpMethod.Get, + Content: response, + Status: status, + Headers: headers ?? [], + Cookies: cookies ?? [], + ResponseUrl: responseUrl, + Error: error ) ); return this; @@ -72,7 +72,7 @@ public RestFlow Get( public RestFlow Get(ResponseContent response, Exception error) { - return Get(response, HttpStatusCode.OK, NoHeaders, NoCookies, NoResponseUrl, error); + return Get(response, HttpStatusCode.OK, [], [], NoResponseUrl, error); } public RestFlow Get(Exception error) @@ -95,13 +95,13 @@ public RestFlow Post( { _responses.Add( new Response( - method: HttpMethod.Post, - content: response, - status: status, - headers: headers ?? NoHeaders, - cookies: cookies ?? NoCookies, - responseUrl: responseUrl, - error: error + Method: HttpMethod.Post, + Content: response, + Status: status, + Headers: headers ?? [], + Cookies: cookies ?? [], + ResponseUrl: responseUrl, + Error: error ) ); return this; @@ -109,7 +109,7 @@ public RestFlow Post( public RestFlow Post(ResponseContent response, Exception error) { - return Post(response, HttpStatusCode.OK, NoHeaders, NoCookies, NoResponseUrl, error); + return Post(response, HttpStatusCode.OK, [], [], NoResponseUrl, error); } public RestFlow Post(Exception error) @@ -132,13 +132,13 @@ public RestFlow Put( { _responses.Add( new Response( - method: HttpMethod.Put, - content: response, - status: status, - headers: headers ?? NoHeaders, - cookies: cookies ?? NoCookies, - responseUrl: responseUrl, - error: error + Method: HttpMethod.Put, + Content: response, + Status: status, + Headers: headers ?? [], + Cookies: cookies ?? [], + ResponseUrl: responseUrl, + Error: error ) ); return this; @@ -146,7 +146,7 @@ public RestFlow Put( public RestFlow Put(ResponseContent response, Exception error) { - return Put(response, HttpStatusCode.OK, NoHeaders, NoCookies, NoResponseUrl, error); + return Put(response, HttpStatusCode.OK, [], [], NoResponseUrl, error); } public RestFlow Put(Exception error) @@ -175,14 +175,14 @@ public static implicit operator RestClient(RestFlow flow) public RestFlow ExpectUrl(params string[] urlFragments) { var e = GetLastExpected(); - e.UrlFragments = e.UrlFragments.Concat(urlFragments).ToArray(); + e.UrlFragments.AddRange(urlFragments); return this; } public RestFlow ExpectContent(params string[] contentFragments) { var e = GetLastExpected(); - e.ContentFragments = e.ContentFragments.Concat(contentFragments).ToArray(); + e.ContentFragments.AddRange(contentFragments); return this; } @@ -193,27 +193,23 @@ public RestFlow ExpectContent(Action verify) return this; } - public RestFlow ExpectHeader(string name, string value) - { - return ExpectHeaders(new Dictionary { { name, value } }); - } - - public RestFlow ExpectHeaders(Dictionary partialHeaders) + public RestFlow ExpectHeader(string name, params string[] values) { var e = GetLastExpected(); - e.PartialHeaders = e.PartialHeaders.MergeCopy(partialHeaders); + if (e.PartialHeaders.TryGetValue(name, out var existing)) + existing.AddRange(values); + else + e.PartialHeaders[name] = values.ToList(); return this; } - public RestFlow ExpectCookie(string name, string value) - { - return ExpectCookies(new Dictionary { { name, value } }); - } - - public RestFlow ExpectCookies(Dictionary partialCookies) + public RestFlow ExpectCookie(string name, params string[] values) { var e = GetLastExpected(); - e.PartialCookies = e.PartialCookies.MergeCopy(partialCookies); + if (e.PartialCookies.TryGetValue(name, out var existing)) + existing.AddRange(values); + else + e.PartialCookies[name] = values.ToList(); return this; } @@ -221,53 +217,27 @@ public RestFlow ExpectCookies(Dictionary partialCookies) // Private // - private class Expected + private record Expected(HttpMethod Method) { - public HttpMethod Method; - public string[] UrlFragments = NoFragments; - public string[] ContentFragments = NoFragments; - public Dictionary PartialHeaders = NoHeaders; - public Dictionary PartialCookies = NoCookies; - - public List> ContentVerifiers = new List>(); - - public Expected(HttpMethod method) - { - Method = method; - } + public List UrlFragments { get; } = []; + public List ContentFragments { get; } = []; + public Dictionary> PartialHeaders { get; } = []; + public Dictionary> PartialCookies { get; } = []; + public List> ContentVerifiers { get; } = []; } - private class Response + private record Response( + HttpMethod Method, + ResponseContent Content, + HttpStatusCode Status, + Dictionary Headers, + Dictionary Cookies, + string ResponseUrl, + Exception Error + ) { - // Returned to the caller - public readonly ResponseContent Content; - public readonly HttpStatusCode Status; - public readonly Dictionary Headers; - public readonly Dictionary Cookies; - public readonly string ResponseUrl; - public readonly Exception Error; - // Expected to be received from the caller - public Expected Expected; - - public Response( - HttpMethod method, - ResponseContent content, - HttpStatusCode status, - Dictionary headers, - Dictionary cookies, - string responseUrl, - Exception error - ) - { - Content = content; - Status = status; - Headers = headers; - Cookies = cookies; - ResponseUrl = responseUrl; - Error = error; - Expected = new Expected(method); - } + public Expected Expected { get; } = new(Method); } private Response GetLastResponse() @@ -298,9 +268,9 @@ RestResponse allocatedResult ) { // Make sure we don't try to request in parallel during testing. - // Otherwise RestFlow has to be reworked to be made thread safe. + // Otherwise, RestFlow has to be reworked to be made thread safe. lock (_requestLock) - MakeRequestLocked(uri, method, content, headers, cookies, maxRedirectCount, allocatedResult); + MakeRequestLocked(uri, method, content, headers, cookies, allocatedResult); } // TODO: Fix this! @@ -330,12 +300,12 @@ CancellationToken cancellationToken protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // The cookies are coming in the headers, so we have to parse them out - var cookies = NoCookies; + var cookies = new Dictionary(); if (request.Headers.TryGetValues("Cookie", out var cookieHeader)) { var cc = new CookieContainer(); cc.SetCookies(request.RequestUri!, cookieHeader.JoinToString("; ")); - cookies = cc.GetCookies(request.RequestUri).Cast().ToDictionary(x => x.Name, x => x.Value); + cookies = cc.GetCookies(request.RequestUri).ToDictionary(x => x.Name, x => x.Value); } var result = new RestResponse(); @@ -367,7 +337,6 @@ private void MakeRequestLocked( HttpContent content, IReadOnlyDictionary headers, IReadOnlyDictionary cookies, - int maxRedirectCount, RestResponse allocatedResult ) { @@ -398,14 +367,16 @@ RestResponse allocatedResult foreach (var header in e.PartialHeaders) { Assert.Contains(header.Key, headers.Keys); - Assert.Equal(header.Value, headers[header.Key]); + foreach (var expectedValue in header.Value) + Assert.Contains(expectedValue, headers[header.Key]); } // TODO: Better messages foreach (var cookie in e.PartialCookies) { Assert.Contains(cookie.Key, cookies.Keys); - Assert.Equal(cookie.Value, cookies[cookie.Key]); + foreach (var expectedValue in cookie.Value) + Assert.Contains(expectedValue, cookies[cookie.Key]); } // Response @@ -442,14 +413,11 @@ RestResponse allocatedResult // Data // - private static readonly string[] NoFragments = new string[0]; - private static readonly Dictionary NoHeaders = new Dictionary(); - private static readonly Dictionary NoCookies = new Dictionary(); private const string NoResponseUrl = null; - private int _currentIndex = 0; - private readonly List _responses = new List(); + private int _currentIndex; + private readonly List _responses = []; - private readonly object _requestLock = new object(); + private readonly object _requestLock = new(); } } From 884166d8c30264ebb12b6db80b4a8238dcfbfd53 Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Fri, 26 Sep 2025 14:29:14 +0200 Subject: [PATCH 6/8] Dashlane: reworked the entire protocol to mimic the official CLI (ref #180, WIP) --- src/Dashlane/Account.cs | 23 +- src/Dashlane/Client.cs | 176 +++++---- src/Dashlane/ParseError.cs | 6 + src/Dashlane/Response.cs | 2 +- src/Dashlane/Ui.cs | 15 +- src/Dashlane/Vault.cs | 37 +- test/Dashlane/ClientTest.cs | 52 ++- ...-device-registration-with-auth-ticket.json | 24 ++ ...e-device-registration-with-server-key.json | 25 ++ test/Dashlane/Fixtures/device-registered.json | 24 -- test/Dashlane/Fixtures/email-token-sent.json | 11 - .../Fixtures/email-token-triggered.json | 4 - .../Fixtures/email-token-verified.json | 6 - .../empty-fullfile-one-add-transaction.json | 268 ------------- ...lfile-two-add-one-remove-transactions.json | 296 -------------- .../empty-fullfile-two-add-transactions.json | 278 ------------- test/Dashlane/Fixtures/empty-vault.json | 292 ++------------ .../error-invalid-authentication.json | 8 + .../Fixtures/error-other-message.json | 8 + .../error-unknown-userdevice-key.json | 10 + ...d-email.json => error-user-not-found.json} | 0 .../Fixtures/error-verification-failed.json | 10 + ...et-authentication-methods-for-device.json} | 6 +- .../Fixtures/invalid-email-token.json | 10 - test/Dashlane/Fixtures/invalid-uki.json | 4 - .../non-empty-vault-with-server-key.json | 89 +++++ test/Dashlane/Fixtures/non-empty-vault.json | 374 ++++-------------- .../Fixtures/perform-totp-verification.json | 6 + ...ts-in-fullfile-one-remove-transaction.json | 286 -------------- ...lfile-two-remove-one-add-transactions.json | 309 --------------- ...s-in-fullfile-two-remove-transactions.json | 297 -------------- .../Fixtures/two-accounts-in-fullfile.json | 273 ------------- test/Dashlane/VaultTest.cs | 332 ++++++---------- 33 files changed, 584 insertions(+), 2977 deletions(-) create mode 100644 src/Dashlane/ParseError.cs create mode 100644 test/Dashlane/Fixtures/complete-device-registration-with-auth-ticket.json create mode 100644 test/Dashlane/Fixtures/complete-device-registration-with-server-key.json delete mode 100644 test/Dashlane/Fixtures/device-registered.json delete mode 100644 test/Dashlane/Fixtures/email-token-sent.json delete mode 100644 test/Dashlane/Fixtures/email-token-triggered.json delete mode 100644 test/Dashlane/Fixtures/email-token-verified.json delete mode 100644 test/Dashlane/Fixtures/empty-fullfile-one-add-transaction.json delete mode 100644 test/Dashlane/Fixtures/empty-fullfile-two-add-one-remove-transactions.json delete mode 100644 test/Dashlane/Fixtures/empty-fullfile-two-add-transactions.json create mode 100644 test/Dashlane/Fixtures/error-invalid-authentication.json create mode 100644 test/Dashlane/Fixtures/error-other-message.json create mode 100644 test/Dashlane/Fixtures/error-unknown-userdevice-key.json rename test/Dashlane/Fixtures/{invalid-email.json => error-user-not-found.json} (100%) create mode 100644 test/Dashlane/Fixtures/error-verification-failed.json rename test/Dashlane/Fixtures/{otp-requested.json => get-authentication-methods-for-device.json} (50%) delete mode 100644 test/Dashlane/Fixtures/invalid-email-token.json delete mode 100644 test/Dashlane/Fixtures/invalid-uki.json create mode 100644 test/Dashlane/Fixtures/non-empty-vault-with-server-key.json create mode 100644 test/Dashlane/Fixtures/perform-totp-verification.json delete mode 100644 test/Dashlane/Fixtures/two-accounts-in-fullfile-one-remove-transaction.json delete mode 100644 test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-one-add-transactions.json delete mode 100644 test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-transactions.json delete mode 100644 test/Dashlane/Fixtures/two-accounts-in-fullfile.json diff --git a/src/Dashlane/Account.cs b/src/Dashlane/Account.cs index a781acf59..c7a49bc9c 100644 --- a/src/Dashlane/Account.cs +++ b/src/Dashlane/Account.cs @@ -1,25 +1,6 @@ // Copyright (C) Dmitry Yakimenko (detunized@gmail.com). // Licensed under the terms of the MIT license. See LICENCE for details. -namespace PasswordManagerAccess.Dashlane -{ - public class Account - { - public Account(string id, string name, string username, string password, string url, string note) - { - Id = id; - Name = name; - Username = username; - Password = password; - Url = url; - Note = note; - } +namespace PasswordManagerAccess.Dashlane; - public string Id { get; private set; } - public string Name { get; private set; } - public string Username { get; private set; } - public string Password { get; private set; } - public string Url { get; private set; } - public string Note { get; private set; } - } -} +public record Account(string Id, string Name, string Username, string Password, string Url, string Note); diff --git a/src/Dashlane/Client.cs b/src/Dashlane/Client.cs index 503055401..74c89457f 100644 --- a/src/Dashlane/Client.cs +++ b/src/Dashlane/Client.cs @@ -14,76 +14,52 @@ internal static class Client { public static (R.Vault Vault, string ServerKey) OpenVault(string username, Ui ui, ISecureStorage storage, IRestTransport transport) { - // Dashlane requires a registered known to the server device ID (UKI) to access the vault. When there's no - // UKI available we need to initiate a login sequence with a forced OTP. - var uki = storage.LoadString(DeviceUkiKey); - + // See if we have access keys stored in the previous run // Server key is a server provided part of the password used in the vault decryption. - var serverKey = ""; + // We do not store this. So in case OTP2 we need to request it every time. + var accessKeys = LoadAccessKeys(storage); - // Give 2 attempts max - // 1. Possibly fail to fetch the vault with an expired UKI - // 2. Try again with a new one - for (var i = 0; i < 2; i++) + // If we have access keys we can try to fetch the vault + if (accessKeys.IsValid) { - if (uki.IsNullOrEmpty()) - { - var registerResult = RegisterNewDeviceWithMultipleAttempts(username, ui, transport); - - uki = registerResult.Uki; - serverKey = registerResult.ServerKey; - - if (registerResult.RememberMe) - storage.StoreString(DeviceUkiKey, uki); - - // We don't want to try twice with a newly issued UKI. Take one attempt away. - i++; - } - try { - return (Fetch(username, uki, transport), serverKey); + // TODO: Add an extra check no OTP2 is used. See "authentication/Get2FAStatusUnauthenticated" endpoint. + return (Fetch(username, accessKeys, transport), accessKeys.ServerKey); } catch (BadCredentialsException) { - // In case of expired or invalid UKI we get a BadCredentialsException here - // Wipe the old UKI as it's no longer valid and try again - uki = ""; - storage.StoreString(DeviceUkiKey, ""); + // Erase the access keys and fall through to the full login + EraseAccessKeys(storage); } } - throw new InternalErrorException("Failed to fetch the vault"); + // Either we failed to fetch the vault or we didn't have access keys in the first place. + var result = RegisterNewDeviceWithMultipleAttempts(username, ui, MakeAppRestClient(transport)); + + // If we have OTP2 we need to erase the access keys + if (result.AccessKeys.IsOtp2) + EraseAccessKeys(storage); + else if (result.RememberMe) + StoreAccessKeys(result.AccessKeys, storage); + + return (Fetch(username, result.AccessKeys, transport), result.AccessKeys.ServerKey); } // // Internal // - internal readonly struct RegisterResult + internal record AccessKeys(string AccessKey, string SecretKey, string ServerKey) { - public readonly string Uki; - public readonly string ServerKey; - public readonly bool RememberMe; - - public RegisterResult(string uki, string serverKey, bool rememberMe) - { - Uki = uki; - ServerKey = serverKey; - RememberMe = rememberMe; - } + public bool IsValid => !AccessKey.IsNullOrEmpty() && !SecretKey.IsNullOrEmpty(); + public bool IsOtp2 => !ServerKey.IsNullOrEmpty(); } - // Returns a valid UKI and "remember me" - internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string username, Ui ui, IRestTransport transport) - { - var rest = new RestClient( - transport, - AuthApiBaseUrl, - new Dl1AppRequestSigner(), - defaultHeaders: new Dictionary(2) { ["Dashlane-Client-Agent"] = ClientAgent, ["User-Agent"] = UserAgent } - ); + internal record RegisterResult(AccessKeys AccessKeys, bool RememberMe); + internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string username, Ui ui, RestClient rest) + { var mfaMethods = RequestDeviceRegistration(username, rest); var mfaMethod = ChooseMfaMethod(mfaMethods); @@ -152,17 +128,14 @@ internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string user var info = RegisterDevice(username, ticket, code.RememberMe, rest); - // TODO: Remove this - var r = PostJson("Get2FAStatusUnauthenticated", new Dictionary { ["login"] = username }, rest); - - return new RegisterResult($"{info.AccessKey}-{info.SecretKey}", info.ServerKey ?? "", code.RememberMe); + return new RegisterResult(new AccessKeys(info.AccessKey, info.SecretKey, info.ServerKey ?? ""), code.RememberMe); } } internal static R.VerificationMethod[] RequestDeviceRegistration(string username, RestClient rest) { return PostJson( - "GetAuthenticationMethodsForDevice", + "authentication/GetAuthenticationMethodsForDevice", new Dictionary { ["login"] = username, @@ -174,7 +147,8 @@ internal static R.VerificationMethod[] RequestDeviceRegistration(string username internal static void TriggerEmailToken(string username, RestClient rest) { - PostJson("RequestEmailTokenVerification", new Dictionary { ["login"] = username }, rest); + // TODO: We need to open a browser to trigger the email 2FA + throw new UnsupportedFeatureException("Triggering email 2FA is not supported yet. Come back later."); } private enum MfaMethod @@ -195,22 +169,24 @@ private static MfaMethod ChooseMfaMethod(R.VerificationMethod[] mfaMethods) return MfaMethod.Email; var names = mfaMethods.Select(x => x.Name).JoinToString(", "); - throw new UnsupportedFeatureException($"None of the [{names}] MFA methods are supported"); + throw new UnsupportedFeatureException($"None of the available MFA methods are supported: [{names}]"); } + // Returns auth ticket internal static string SubmitEmailToken(string username, string token, RestClient rest) { return PostJson( - "PerformEmailTokenVerification", + "authentication/PerformEmailTokenVerification", new Dictionary { ["login"] = username, ["token"] = token }, rest ).Ticket; } + // Returns auth ticket internal static string SubmitOtpToken(string username, string token, RestClient rest) { return PostJson( - "PerformTotpVerification", + "authentication/PerformTotpVerification", new Dictionary { ["login"] = username, @@ -224,7 +200,7 @@ internal static string SubmitOtpToken(string username, string token, RestClient internal static R.DeviceInfo RegisterDevice(string username, string ticket, bool rememberMe, RestClient rest) { return PostJson( - "CompleteDeviceRegistrationWithAuthTicket", + "authentication/CompleteDeviceRegistrationWithAuthTicket", new Dictionary { ["device"] = new Dictionary @@ -257,21 +233,11 @@ internal static T PostJson(string endpoint, Dictionary parame throw MakeSpecializedError(response, TryParseAuthError); } - internal static R.Vault Fetch(string username, string deviceId, IRestTransport transport) + internal static R.Vault Fetch(string username, AccessKeys accessKeys, IRestTransport transport) => + Fetch(MakeDeviceRestClient(transport, username, accessKeys)); + + internal static R.Vault Fetch(RestClient rest) { - // Reuse the other RestClient - var rest = new RestClient( - transport, - "https://api.dashlane.com/", - new Dl1DeviceRequestSigner - { - Username = username, - // TODO: Improve this! - DeviceAccessKey = deviceId.Split('-')[0], - DeviceSecretKey = deviceId.Split('-')[1], - }, - defaultHeaders: new Dictionary { ["Dashlane-Client-Agent"] = ClientAgent, ["User-Agent"] = UserAgent } - ); var parameters = new Dictionary { ["timestamp"] = 0, @@ -280,9 +246,13 @@ internal static R.Vault Fetch(string username, string deviceId, IRestTransport t ["transactions"] = Array.Empty(), }; - return PostJson("v1/sync/GetLatestContent", parameters, rest); + return PostJson("sync/GetLatestContent", parameters, rest); } + // + // Error handling + // + internal static BaseException MakeSpecializedError(RestResponse response, Func, BaseException> parseError) { var uri = response.RequestUri; @@ -323,6 +293,9 @@ internal static BaseException TryParseAuthError(RestResponse response) { case "user_not_found": return new BadCredentialsException($"Invalid username: '{error.Message}'"); + case "invalid_authentication": + case "unknown_userdevice_key": + return new BadCredentialsException($"Invalid access codes: '{error.Message}'"); case "verification_failed": return new BadMultiFactorException($"MFA failed: '{error.Message}'"); default: @@ -350,18 +323,67 @@ internal static BaseException TryParseFetchError(RestResponse response) return new InternalErrorException($"Request failed with error: '{error.Content}'"); } + // + // Rest clients + // + + internal static RestClient MakeAppRestClient(IRestTransport transport) => MakeRestClient(new Dl1AppRequestSigner(), transport); + + internal static RestClient MakeDeviceRestClient(IRestTransport transport, string username, AccessKeys accessKeys) => + MakeRestClient( + new Dl1DeviceRequestSigner + { + Username = username, + DeviceAccessKey = accessKeys.AccessKey, + DeviceSecretKey = accessKeys.SecretKey, + }, + transport + ); + + internal static RestClient MakeRestClient(IRequestSigner signer, IRestTransport transport) => + new( + transport, + AuthApiBaseUrl, + signer, + defaultHeaders: new Dictionary(2) { ["Dashlane-Client-Agent"] = ClientAgent, ["User-Agent"] = UserAgent } + ); + + // + // Storage + // + + internal static AccessKeys LoadAccessKeys(ISecureStorage storage) => + // We don't store the server key + new(storage.LoadString(DeviceAccessKeyKey), storage.LoadString(DeviceSecretKeyKey), ""); + + internal static void StoreAccessKeys(AccessKeys accessKeys, ISecureStorage storage) + { + // We don't store the server key + storage.StoreString(DeviceAccessKeyKey, accessKeys.AccessKey); + storage.StoreString(DeviceSecretKeyKey, accessKeys.SecretKey); + } + + internal static void EraseAccessKeys(ISecureStorage storage) + { + storage.StoreString(DeviceAccessKeyKey, ""); + storage.StoreString(DeviceSecretKeyKey, ""); + } + // // Data // - private const string AuthApiBaseUrl = "https://api.dashlane.com/v1/authentication/"; + // Storage keys + private const string DeviceAccessKeyKey = "device-access-key"; + private const string DeviceSecretKeyKey = "device-secret-key"; + + private const string AuthApiBaseUrl = "https://api.dashlane.com/v1/"; private const string UserAgent = "Dashlane CLI v6.2526.2"; - private const string DeviceUkiKey = "device-uki"; private const string AppVersion = "6.2526.2"; private const string Platform = "server_cli"; private const string ClientName = "hostname.local - darwin-arm64"; private const int MaxMfaAttempts = 3; - private static readonly string ClientAgent = + private const string ClientAgent = $$"""{"version":"{{AppVersion}}","platform":"{{Platform}}","osversion":"darwin-arm64","partner":"dashlane"}"""; } } diff --git a/src/Dashlane/ParseError.cs b/src/Dashlane/ParseError.cs new file mode 100644 index 000000000..2adbcc999 --- /dev/null +++ b/src/Dashlane/ParseError.cs @@ -0,0 +1,6 @@ +// Copyright (C) Dmitry Yakimenko (detunized@gmail.com). +// Licensed under the terms of the MIT license. See LICENCE for details. + +namespace PasswordManagerAccess.Dashlane; + +public record ParseError(string Description, string Message, string CallStack); diff --git a/src/Dashlane/Response.cs b/src/Dashlane/Response.cs index 1423b2bbd..f9a21d02c 100644 --- a/src/Dashlane/Response.cs +++ b/src/Dashlane/Response.cs @@ -70,7 +70,7 @@ internal readonly struct SharingKeys public class MfaStatus { [JsonProperty("type", Required = Required.Always)] - public string Name { get; set; } + public string Kind { get; set; } [JsonProperty("hasDashlaneAuthenticator")] public bool HasDashlaneAuthenticator { get; set; } diff --git a/src/Dashlane/Ui.cs b/src/Dashlane/Ui.cs index 96a53b0a8..2c9e13168 100644 --- a/src/Dashlane/Ui.cs +++ b/src/Dashlane/Ui.cs @@ -10,22 +10,13 @@ public abstract class Ui // // Passcode result - public class Passcode + public record Passcode(string Code, bool RememberMe) { // Return this to signal the cancellation of the operation - public static readonly Passcode Cancel = new Passcode("cancel", false); + public static readonly Passcode Cancel = new("cancel", false); // Return this to resend the email token (not valid for Google Auth) - public static readonly Passcode Resend = new Passcode("resend", false); - - public readonly string Code; - public readonly bool RememberMe; - - public Passcode(string code, bool rememberMe) - { - Code = code; - RememberMe = rememberMe; - } + public static readonly Passcode Resend = new("resend", false); } // To cancel return Passcode.Cancel diff --git a/src/Dashlane/Vault.cs b/src/Dashlane/Vault.cs index 3be061bdd..24d79ac98 100644 --- a/src/Dashlane/Vault.cs +++ b/src/Dashlane/Vault.cs @@ -1,7 +1,6 @@ // Copyright (C) Dmitry Yakimenko (detunized@gmail.com). // Licensed under the terms of the MIT license. See LICENCE for details. -using System; using System.Collections.Generic; using System.Linq; using PasswordManagerAccess.Common; @@ -11,6 +10,9 @@ namespace PasswordManagerAccess.Dashlane { public class Vault { + public Account[] Accounts { get; } + public ParseError[] ParseErrors { get; } + public static Vault Open(string username, string password, Ui ui, ISecureStorage storage) { using var transport = new RestTransport(); @@ -27,9 +29,11 @@ internal static Vault Open(string username, string password, Ui ui, ISecureStora return new Vault(vault, serverKey, password); } + // TODO: Move to Client? internal Vault(R.Vault blob, string serverKey, string password) { var accounts = new Dictionary(); + var parseErrors = new List(); var keyCache = new Parse.DerivedKeyCache(); // This is used with the MFA. The server supplies the password prefix that is used in encryption. @@ -37,8 +41,19 @@ internal Vault(R.Vault blob, string serverKey, string password) foreach (var transaction in blob.Transactions) { - if (transaction.Kind != "AUTHENTIFIANT") - continue; + // This is a special transaction that can be decrypted to test if the master password is correct + if (transaction.Id == "SETTINGS_userId" && transaction.Kind == "SETTINGS" && transaction.Action == "BACKUP_EDIT") + { + try + { + // Decrypt and ignore the result + Parse.DecryptBlob(transaction.Content.Decode64(), fullPassword, keyCache); + } + catch (BadCredentialsException) + { + throw new BadCredentialsException("The password is incorrect"); + } + } switch (transaction.Action) { @@ -51,12 +66,15 @@ internal Vault(R.Vault blob, string serverKey, string password) foreach (var i in Parse.ExtractEncryptedAccounts(content.Decode64(), fullPassword, keyCache)) accounts[i.Id] = i; } - catch (BadCredentialsException) + catch (BadCredentialsException e) { - // TODO: Remove this! - // TODO: Report errors! - Console.WriteLine($"Failed to decrypt transaction {transaction.Id}"); - // Ignore transaction + parseErrors.Add( + new ParseError( + $"Failed to decrypt a vault item '{transaction.Id}' of type '{transaction.Action}'", + e.Message, + e.StackTrace + ) + ); } } @@ -71,8 +89,7 @@ internal Vault(R.Vault blob, string serverKey, string password) } Accounts = accounts.Values.OrderBy(i => i.Id).ToArray(); + ParseErrors = []; } - - public Account[] Accounts { get; private set; } } } diff --git a/test/Dashlane/ClientTest.cs b/test/Dashlane/ClientTest.cs index c91d28807..1115e1a29 100644 --- a/test/Dashlane/ClientTest.cs +++ b/test/Dashlane/ClientTest.cs @@ -16,18 +16,35 @@ public class ClientTest : TestBase [Fact] private void Fetch_makes_post_request_to_specific_endpoint() { + // Arrange var rest = new RestFlow().Post(GetFixture("empty-vault")).ExpectUrl(FetchEndpoint); - Client.Fetch(Username, Uki, rest); + + // Act/Assert + Client.Fetch(Username, AccessKeys, rest); + } + + [Fact] + private void Fetch_makes_post_request_with_correct_parameters() + { + // Arrange + var rest = new RestFlow() + .Post(GetFixture("empty-vault")) + .ExpectContent("\"timestamp\":0", "\"needsKeys\":false", "\"teamAdminGroups\":false", "\"transactions\":[]"); + + // Act/Assert + Client.Fetch(Username, AccessKeys, rest); } [Fact] - private void Fetch_makes_post_request_with_correct_username_uki_and_no_otp() + private void Fetch_signs_request_with_username_and_device_access_keys() { + // Arrange var rest = new RestFlow() .Post(GetFixture("empty-vault")) - .ExpectContent($"login={Username}", $"uki={Uki}") - .ExpectContent(s => Assert.DoesNotContain("otp=", s)); - Client.Fetch(Username, Uki, rest); + .ExpectHeader("Authorization", "DL1-HMAC-SHA256 Login=username,", ",DeviceAccessKey=access-key,"); + + // Act/Assert + Client.Fetch(Username, AccessKeys, rest); } [Fact] @@ -36,22 +53,24 @@ private void Fetch_throws_on_network_error() var error = new HttpRequestException("Network error"); var rest = new RestFlow().Post("{}", error); - var e = Exceptions.AssertThrowsNetworkError(() => Client.Fetch(Username, Uki, rest), "A network error occurred"); + var e = Exceptions.AssertThrowsNetworkError(() => Client.Fetch(rest), "A network error occurred"); Assert.Equal(error, e.InnerException); } - [Fact] - private void Fetch_throws_on_invalid_username_or_password() + [Theory] + [InlineData("error-unknown-userdevice-key")] + [InlineData("error-invalid-authentication")] + private void Fetch_throws_BadCredentials_on_bad_access_keys(string fixture) { - var rest = new RestFlow().Post("{'objectType': 'message', 'content': 'Incorrect authentification'}"); - Exceptions.AssertThrowsBadCredentials(() => Client.Fetch(Username, Uki, rest), "Invalid credentials"); + var rest = new RestFlow().Post(GetFixture(fixture)); + Exceptions.AssertThrowsBadCredentials(() => Client.Fetch(Username, AccessKeys, rest), "Invalid access codes"); } [Fact] - private void Fetch_throws_on_other_message() + private void Fetch_throws_InternalError_on_other_message() { - var rest = new RestFlow().Post("{'objectType': 'message', 'content': 'Oops!'}"); - Exceptions.AssertThrowsInternalError(() => Client.Fetch(Username, Uki, rest), "Oops!"); + var rest = new RestFlow().Post(GetFixture("error-other-message")); + Exceptions.AssertThrowsInternalError(() => Client.Fetch(Username, AccessKeys, rest), "Oops, something went wrong!"); } // @@ -59,7 +78,10 @@ private void Fetch_throws_on_other_message() // private const string Username = "username"; - private const string Uki = "uki"; - private const string FetchEndpoint = "/12/backup/latest"; + private const string FetchEndpoint = "/sync/GetLatestContent"; + private const string AccessKey = "access-key"; + private const string SecretKey = "secret-key"; + private const string ServerKey = "server-key"; + private static readonly Client.AccessKeys AccessKeys = new(AccessKey, SecretKey, ServerKey); } } diff --git a/test/Dashlane/Fixtures/complete-device-registration-with-auth-ticket.json b/test/Dashlane/Fixtures/complete-device-registration-with-auth-ticket.json new file mode 100644 index 000000000..b30ddb9f7 --- /dev/null +++ b/test/Dashlane/Fixtures/complete-device-registration-with-auth-ticket.json @@ -0,0 +1,24 @@ +{ + "requestId": "2c30d68a-9e53-476f-a5e8-bbcb221702d8", + "data": { + "deviceAccessKey": "7a9ba9207cb36988", + "deviceSecretKey": "583ac4dc6c6ea8b9380ca03d095b51cd15f178bad10715d7ba67f06f47e63995", + "hasDesktopDevices": false, + "numberOfDevices": 11, + "publicUserId": "6nRaionUjTR3n9Y9Yind_LeleuxfglQAAIDPiY9yqkZm_WrY403zjlXuVCbS5AjU", + "settings": { + "identifier": "SETTINGS_userId", + "backupDate": 1758558722000, + "type": "SETTINGS", + "time": 1758138708, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+Bh3L4mHKIKg3Rw708//HQjqHs6oBPCoCZjI0ixUbtJUvbMVFfgTu1/4mBD4vME/Ttuxc14wOuQZM4VOElKTxaI9bZNcIAfBHzCaIhEVPg9ydS1sWQWluBSqoITaA08PXPNRKWJuNmeU4gLuUvgwpKZAHKRMvgVKUj2ZVObY4pteD+SIqjPNtzqjP5sRnmyySFwUWfjshZ0G9NzfFkfmkWyqmWhqg2+EDMgNfSPD9EFipBwcOlUg2nR/L/Aey3DL7xyEt7i/NoAeII4hT8ZuZC5poiRuGqD+qtcBYMX7jFDViVSSO56ejGjYRvqMP/H46wGusjH8uedU1SbGFJlB8F7jlyMY4Zsqv582GJa6phjIW8zjoKcbqWFTUaWw142HluDmDSknIapUAjjOLHy0G5WXnDM3s61A1Gl9bSEc5D+WCir/lxbqt3UjkVuJPP2WmRs6DhnpsBwzRHF8RtimnmojTPpR0xQQLIz+B6R5j9i/fH2+wSifvooCJLF5uj5AdaRonXPgmtSpnPxZwqmpGkeuXmNySDpE2f9FYiXeVJAfdqnsrZNGo/+2BvNbMj0gfSR1Cpo0j8nr+9+AvudHcxurLDvZ3k5q2SRWdrfbkK8AsD3RjRc4pFulBojp3CYYX1LsCSFa6j6uoHy2cTJHnb4xDY8Hd5+vJahL0tbrbnVlaG1zsUp+FzVheBpnrzL/yelQnyPi9cdBpgX1gGFQRuHh6et4xGo3HC3KV7OzgsmyW4OwkjfcBaCV7nQ1GA2s0yc1b4HY/kgJ82q5i0NUaAV5AtgRhswJvi39NPxOEU3RfIG5ETijdsJ07Xhi126UIE+TqJgehXqbbnVPeH+WTuuU=" + }, + "sharingKeys": { + "publicKey": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAmWLEUmxgrXB9/VNLWHzjTjjixw9GRcU4QlXDdtgXg4XGOuc34F7S\nDkZt3l25s0N1j155RrFNTiCvYwnBssK4Dj2JPZOQQ13kPyqFQouhL4zrFztNmqmW\nOcCxOb1nK5GVMc8OLQIawHzEohdLpSLigRm13czuPXzTcgdC6iHEojc4H3dE++rI\nmBKigU87cYnS0ELh3dTqSv4Zhj0V/LBTtr05Jq49zmdxZl+fNwpyGCj4QgUB1EuI\nr+RLyHvmDYDktklAkEQVY9AwG4pYxlZ51k15RNthvC9JKIaOe6aEPJLfmUoiMrzp\n2TupwIUxvbcmlvbNKESSMoif7Smqj/jzlwIDAQAB\n-----END RSA PUBLIC KEY-----\n", + "privateKey": "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" + }, + "deviceAnalyticsId": "aa66ae2a-23f9-4a72-a22a-6fba6316f6e4", + "userAnalyticsId": "c46c93c3-ae92-4b3e-85be-5f405bab2154" + } +} diff --git a/test/Dashlane/Fixtures/complete-device-registration-with-server-key.json b/test/Dashlane/Fixtures/complete-device-registration-with-server-key.json new file mode 100644 index 000000000..0bdb8920a --- /dev/null +++ b/test/Dashlane/Fixtures/complete-device-registration-with-server-key.json @@ -0,0 +1,25 @@ +{ + "requestId": "2f16e31e-d991-4034-b6f0-ba360335fda7", + "data": { + "deviceAccessKey": "48abd54fedef0b35", + "deviceSecretKey": "de0e1b9a81d8f3673e3c8f7086e8fa0eb88ece62aeb608d43aa770074962cc08", + "hasDesktopDevices": false, + "numberOfDevices": 4, + "publicUserId": "uPLqC-N8K4nnxgWvSDiRCTZIkO5I0Z8pkQwkEAWT5YajqLgyKx384eBCZSPmDKxC", + "settings": { + "identifier": "SETTINGS_userId", + "backupDate": 1758873336000, + "type": "SETTINGS", + "time": 1758872949, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkNcaX14uA4b8RtndmdjpI9hNZpT4CPUkXhudOdm2F8bVI7NIHe+YXoqf3O5pZef5g3yAXiRE8NH3RlfU9bmm6AgItSc0d2m87QS+QFtYNew1QweU35vN0Lig0Err7a9BZt6c8ZE5l/+01Gjys3F3V2Eu1647QJ3rQcDcWgpfmOxI0hMWdWs4ftMALYUuWBkHK0OYoOLkPzaCY2RPbPN2XH4aep+axY4BiQvrGTtOZ1A7SyAvgcTkPiuRRSMcjBHRn4lT1ngPFHEyixN22RNXvdKOfhBsy3ksxiXICOOJPjzcLaDw8htsAQQH1YF1TO2/5OoUmGkzXgcQumUCAF3PzQOKJNbFrYo9DjIGl0ZULiH8h6L3/NMCfWFTQBsfM9G4wGc1J8+3Ri9J8EtcTb1uNqJ6/Dhro9iNcr/L6ZLq1ux4Os10VIy7tVsFc7GQnWIg/5cw1mOSQKgaHZKwubMOjWKHpZL4zigQ0e0wIEheJZ8vBICUesIuDQTi25fZVuoS33190+OnkuhI4Bp8/8CRX9A/+UYWiopbfTQZn91M6I6uT8SA2Gkeq/dyBXlGRmOwyxlbnLP7OBQXd8kzz9CJ9LNaXzhHfH/BxOH6tDJk9WGQIdd5Sie2w6SV7Asm+3JN1VdyVmSvkNmwShjz9XiN1gdxD/eizSkZdYQ3dKFO1rP5GPrVykex5XmyManEFUG7bE/Gr8x3EjM/tMgndY3W3tqIr16dt1mrfzhzdi33Z5cntJ6sxyoUrzVSNJ69OCIpXLgBWHYdZtbasXr23j43te/ZgaxjSERjOKyHrd1muOoZqMVchZ8Y8LRDxpxlbEWunBN6sXlbw7wkGEcXrGnu0mcXbImKcGeajBCmSQ4hsGjY=" + }, + "sharingKeys": { + "publicKey": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAmpbHRJPTO8yFT7cFrEjNnHtvJPj6JT0xaWCO91Io8xNeGbSJ0+fq\nJPBqtTZbQ5Ew+kXhqo+1IGqOZDUKEa0McyJmL6e9Hb1mQ+5Jw+iBGphCfluYurwr\nTjq9mTRmm8I4k854bRt6bTwseaDgMcSQuA4wgdTUgHUAelKeRjyduxLldA5BuPej\n59KxBzLejJkW7oOiuD73n4tJGVi6ZeT1x+bLBf0FBcWQtGdIoiG9ZMjfq2ffLii6\nVDTgyej4g7fqWF6sdXWnwNZnOclmQ16CASPwCmakiH2S4c+d8XGX+ixmdGxnWLS0\niqOWT2pfpNvuVr94MtjPYs4PdF2DZVB5NwIDAQAB\n-----END RSA PUBLIC KEY-----\n", + "privateKey": "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" + }, + "serverKey": "VZwVBHB43/ecfDZNbhicXVbV2XPkXeLeP3fjD4671hKCG0Ov", + "deviceAnalyticsId": "214d5da9-2a44-43bb-96f3-b81160726895", + "userAnalyticsId": "3a0a8837-19c0-4233-985e-8bcd024ed4f8" + } +} diff --git a/test/Dashlane/Fixtures/device-registered.json b/test/Dashlane/Fixtures/device-registered.json deleted file mode 100644 index ccd350f8e..000000000 --- a/test/Dashlane/Fixtures/device-registered.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "requestId": "7af5bfbf-19c4-4bdf-816c-040f775eddf2", - "data": { - "deviceAccessKey": "5d95e3ccccaa40a1", - "deviceSecretKey": "9cf2dbfd517b6b85ab0a7e2cb23972a195aeef5440db095c187782ea0d349962", - "hasDesktopDevices": true, - "numberOfDevices": 10, - "publicUserId": "e-5Cj97EeIpY6kTEf_mYEi-61zRskeQa6UqwMmI7w-AQPUmoAec621Wqt-oiL1fd", - "settings": { - "identifier": "SETTINGS_userId", - "backupDate": 1629042190000, - "type": "SETTINGS", - "time": 1629042190, - "action": "BACKUP_EDIT", - "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkM9MttaXD3Ua0RjaRpaYRzJ84iwHi2w4on1KaHSHBVKGmNBwGfX4JGoFyOUUBWu1cOw9R/P1cwB6D3nYrfnzeX48ut8W+GkMelomyLcjgCXlg5NQWblTTJtkUqIamFHZmEgMk9Eg/+gfpWCo4zgv4Etfb7JMqqkp1MuSLglsUvNggIRHBYJjqdcx+gBEVgES40F/cBik+INGM2/h3Q6sDc9Om+w4ZbIjEjZzDrnEdw7pp68XmFN1aLp0K1mkAdh0xj31sxHyTq7IGl13ydVm5WC65oCNXheUYx/xWS4kqT93CiIscZRg+G/FbrOeDeQR/2VC9Jlb6X5zALRfLkRXQfr7pvL0AV9LmmqPJFPqQxYdwft00/dZmO3lSYTv9dbvkl1VEUMyKYuv0vfmkVb6YfKeksW7W2ih86vfUxNxAMy7xJ3qC9uBkYHJDGieWTd+CrYH+uK/gIGqYuGXvHYwuHyZ/IW32oJsT+SoSesazIc0xljPjEFS0urrLSwRwl0Ip6cck1/e6b0022hxWX5HfxxlT5G0r8qHIfXER2fa17utKDtOm40IKsXzrjPoQ0Fl9VKG4384+B/Cwxj+6u72atFpZK7BShGB8F3iWFp8izA5JbqnuS+8I2RvkrnLnnRylAqb2QtZIN4vj2d+24D7YshSQK2nx93xd1J/Qy8IYz9mWhJeIP/TL556iSbl63OObQARBZFk0eVgBkSDVXCr8mdvYTnm+8kzeIHl4OIbW3R7prDKPj7w0OS3y27RtFuYkD3JynX3RvU8biJB3ZSO3y8EjbRB6BmUMgs53niTtKeYkseFtSEUEnxuuGEtxLhmpxw+VhMMoU/uOWB3LNtRcdjheqT1Ea4z8qTHUroILZfNPzpPdoMvKxDqNKgvS7IOQtu+WmhrmnMJW4TQ57Jc0i71cCjQP3v3y/M4+nB7cSZeQvCaGzoG4HgSY7v1sv7+NAHXxWmaeu0uKZJoZa7kQ4XFmHhxsGniNf3OkFbXujzjuYva+N5sM53SE4NU2I90N+r6a2pe3RPxjQxZQemVaDATkjjEjqT9TEnrYqk4EKLUyLF93wsE/8GEtmk4BqGaxHBvl19OyHSsL+WUMNAECd7WfcYzoEKf9Yc1wbg/V2PBs+JTU9oqivFD45D6Ue13+eYV0Q606HFruIA2RlYRt5jAslsP4aQIhqSdbA4D3ApZcIMK4MJoNejmbKcicEAtV5Q3m9vuzmmT1qvxQgvu8PUL42+D5v6sH5CrLSy8jPl/S1ICJqJCL7OWMdQiwLDyLLhkO4L7tYe/uLunnqRSadYW1XEZWrO10RzVvgkxtAqaApxM2oSw/9pnusnVTAHwlJgA0L9/LzPnror07Uet0daRVNEovcWwT/PXf3l32gnLorRSyMoY3qCoQdxR1YdZIqAEBSJt+uDzYj05tUrsRLI9A+hNtjwD6i9SytW+ZuGUax2V2H8E8M3MPn6xG8nM5Drv3CmbP8ReeL8HVVVR1N+0mlpS+DMj72B79FuAyQUDP+8NibfzWZANKz1tdSs8hBZmtTDx6DS/+yTdHDMslmsZjhAKvpdtl44of+wUr5TiiMRxRCFhDmYrTS7UemDuMPgh6daPWJ126frSX793Urw==" - }, - "sharingKeys": { - "publicKey": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCAKCAQEAva32yrFA+p9CMMiH70aDSajqe04hGAcoMeHXWOfSLIRXpKOEW0hH\nTmVnZEE0ER1RhYoPzb93y1JcQNrbO+wn91siirnJb9VXvnF+R845Sr9AtJKdunu1\nnBDCvUzyLRe/XMDPDn6NSOFigEuZKE/gPoIke49vE1Sas1j2oqIQUxs9gTf2RnDb\nO8cAF5mX5RicgoARJLypiHOdrbaPl8o0sW1E6VQ//Y8YuM52OmkwmTr23tklSeBA\n05rA0MdwBdF7MqO669P/OsSTMfZsPGDGPnqnyWZSShgn4+JFLUrlcYxaxAtSyJ3B\ncd0j9D/4SYcRcfYSxC1ZEV/UjoIBTz4XvQIBAw==\n-----END RSA PUBLIC KEY-----\n", - "privateKey": "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" - }, - "deviceAnalyticsId": "f39caadb-33f1-494c-89ca-7e93296e34ed", - "userAnalyticsId": "8fad2650-2168-43fb-99fc-8348fcf4307a" - } -} diff --git a/test/Dashlane/Fixtures/email-token-sent.json b/test/Dashlane/Fixtures/email-token-sent.json deleted file mode 100644 index 4030e4efa..000000000 --- a/test/Dashlane/Fixtures/email-token-sent.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "requestId": "ffaa5424-ab8a-40b7-b64d-260d30979bd9", - "data": { - "accountType": "masterPassword", - "verifications": [ - { - "type": "email_token" - } - ] - } -} diff --git a/test/Dashlane/Fixtures/email-token-triggered.json b/test/Dashlane/Fixtures/email-token-triggered.json deleted file mode 100644 index a8c015738..000000000 --- a/test/Dashlane/Fixtures/email-token-triggered.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "requestId": "c3d847f8-1d0d-4e3d-a9e9-73ea09f7b686", - "data": {} -} diff --git a/test/Dashlane/Fixtures/email-token-verified.json b/test/Dashlane/Fixtures/email-token-verified.json deleted file mode 100644 index d4a9f5751..000000000 --- a/test/Dashlane/Fixtures/email-token-verified.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "requestId": "77ea91bf-45ce-4a93-ab72-d033af4e539a", - "data": { - "authTicket": "0b2026a49954a2b22a347c27b045efa053e75c40ce778e05dbd7be91c2d49f2c" - } -} diff --git a/test/Dashlane/Fixtures/empty-fullfile-one-add-transaction.json b/test/Dashlane/Fixtures/empty-fullfile-one-add-transaction.json deleted file mode 100644 index fd4d9ffae..000000000 --- a/test/Dashlane/Fixtures/empty-fullfile-one-add-transaction.json +++ /dev/null @@ -1,268 +0,0 @@ -{ - "transactionList": [ - { - "backupDate": 1453205908000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzuCCN4Hd6gluk6uiaC7VX4BHZ16tnVXNKgj7+ZbdFk5QiYye3WwVUe6t+Ld0iBbqzolbvGmWtWzSRTVLxkqxng/dXhxsyovUSILDGfwTq/KO71zNSroA+ZAEqoQ9alb4Dfj9OBOeVZ8S6WoGPh0eeQzszj3jbWwT/edDIGnQ3GsQtib7wlEOoGbVvtpEJivnQxPCnwwzwgAccUZYIqHRQW3QmwYUgIsP7/jOlpExUHeBapYTl12I/bPm30h1jtDpAjYRBsB/063Arl6EUoDory+aejtCKSHezsgoFUr3WHBuUjTTX4TaoWSrx9+TaPCAlfDTo6KMY3hQaQsYAmVHHQF7AyX+Hsvb0dRCZMv3Ta6HXK9GahGknakBYccl6y+N3f0kAX3ee6vo7L2S/a/yWocNzIg8gpARn2qCHIpAzvTGGuccEo3h6WiFuT512AhAZjPxJOY5w18l56Vqhxn/3zOh3SGUUI+1VYhA+B8LLmyy2JQb9XKtD+rwoipuOY/rZFFZgYFsc+v9+5Nx5Wh6rhkDmYA9M9r0QiZOKrOdm6xA53RWy4QvglIaVNPILpf5nBlKXdUiYNLhKIGn5KtZW60DOxPWyJbqGE3q9ygtB4aYaZGvSQGywOI1+YcOCROnA2PuPB7eqynPpOWbGfmYNLxYHTXTmFThsGroaNomUSZ27taNZT1U/752pcaN8gmXiox30lndWcO8njaY3CdJcIE5g2HxnO1RfHN0jBSZChM2Jxfq/BRlEiywnKLOU2ca1MvTrYv7GSQze9QPUc69pDIt/5Bl9ADnh6YURD5mxFUTyQoSWQHP5yBc7IWbOc5QaivuXVkwGadSjZ/PUh0DDo45LWavbCnaCMulyX9IX0sDPVhGYlsklk5jJ8/15GCybgVXnVj6itavkos8w6xXVR96oHxjoT6R+ws+8XgNnBtEZrQdO6n2lF/tr+i3iXxKd/1dfm1y2Jt8ALx/ZZ7rz95c4VD58L40enJNCCjGrCPq6BEW3f4JRE34cLjsMCRKTvEo32YeKrGDwG05aVv4HOa12RMljaZXsXqt59XOSp20n7REOYnhk2AMcwzQPsBuP9apf7V76LDjRyJiWYgUR7PDe1QZDn43q6BU7cD9/I+5ZaF4PllC2QtTpzPCK2GhVEhvdshZXZYoRpFWqLYgtoxVmhqvBILdirJ/m1UzUidKaXicfZKxamOjYz5OjFlUYlHcHmvQQ+8ooad8OrRxklwdXN1UlMQ6BSCiHxCVDxNyx4+wP1g3ebabw2c5TrDwNCIwieYMz9LOKZM38vctElCs83ZK/l42+PlxOmVgC/TyYoFm8ZPmdmrxR6WaKHHbCgV2tUy+V/Oquv18QErCxqtRc3GRBe74VIc25bPteoJ9c/ndJN3sIuSfRv7/wzCDnBG0DZUDfWsWIADlhTrr21Jwj4iEKLQhrdsH8zEC/1bfOoMjbPotODwCTyROIluf824hCil+BrX7LXJHeNTytFVjADy3HuN+Rwnij3PUmZczhgc1cODJLyktfVDS/H1iMao52M/oEvHrwfK/g0eN0bg==" - }, - { - "backupDate": 1453205908000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzbmJw9AEXCauuLe0nwub+OvlMhnHlhHmkIaPLH7kKwc2UtmDE1+7ZsFD5V6ED2LTnNYYweECXIBmXAchhgVFjejdZrDoUB0BlUqxxu9DdpIZGwVjR2l3XegkwQUPMEYYk7J6Z/Pxz3ZEj0Sx2SgSAYPXftJPePp/NWj5GBUSbCbo=" - }, - { - "backupDate": 1453206907000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_EDIT", - "time": 1453206900, - "objectType": "transaction", - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}", - "content": "2iwN5pAlfM/62fNyU+/kMGzh1B82rv0CSJKfZV1rDjxLV0Mz/cKVDJdM+hMK8n7jCdH4mfTbyh8Glu0dPWedFTlWrvSwTs5VYwg4VNWGB95o24HJxxGM4ab3kuNdmJ/DbDzUyHMMtOdB0ArmRbxcFEzztpl6BHJtxpnpDA6YbhkjjSan8iD06QZHQwSKAnPnqhNi+LR0/JgUV7cZOtU1UqsGu3HIAGdW2/Pz/w/aimUEMBmHuqHVqORoiZMVMA6szYBz1lT7Gh3hZbVDrHkr/2rlnzD1W2NSESIItbSQDx5RxM3xiK7gn1l01i6WLa9X06itZ+X93zxq0mJW+1JypLpoSq0F8HueMP22SUrimMCldpx6Fk8HhJWPVfqbxTvPvE4/8xgdm7MdOT856bv8xdsRFjOqGmQrqCJt8v3P+k5yhym2iGF0TP6lRyNJUuzn2/TMZeb0QzwOaRD8jbMJNBGGIGS5sF1IAWaISgLo5F6NYBLy5jIzmUkWkBBtqEjbgJbl+hOtMV01QvZfoIV+/bg2A083is9lhQEv3C7wlYZVVgL3iAndIKn/QI2r6966i3sFtN/wrmyDCf4Uwd27CuflED1eiDQdKgsbEPqz7IMX11mRIUA6oGgv7Z12FDXbYed7MIzbW+x7B9Ahk38doUERJZo1gPz68HOa0swfCWAd00qNMncGashJcJTbjpUzVqtMSTpk1zA0/7nuHRhWGW0A7WW9Bhy0JWIqF86NCzf+6Mpj" - } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453205908000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453205908000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453205908000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453205908000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453205908000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453205908000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453205908000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453205908000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453205908000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453205908000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453205908000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453205908000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453205908000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453205908000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453205908000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453205908000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453205908000 - } - ], - "fullBackupFile": "FQsV3sglzlKG9yBz7mjBtoiht5Ufq4DBgbCVXnxlMypLV0MzLuz+1XstAZ95xsgnxOJBrL+Gn56uv8Q9+3PV3LfiYFh7q3yAqYPO9QR29KxVJ5qiV2pz2ePBQ8HtH+ZfBT4PCUnefFTKPXxdrrEhr80WnsuVJhUcvVXsYU5LbLGxdCEhaYPM5Ab0zPOfo1lNBDSVeAoXxPLjGvWWHOp+2K0BKZGH+uKM1801WSBJAlRjvR0QcazyfGM78ZCZa/y05YHaNKXhyvTy69+Rf4qX/abEkZX3P4+fsE9bVnjpYAbCprTWFc2KG2ceFl7HERy4EQTxvhV3s9t8WZEaMEmUxnwkWUWgaQEMMUnjrX55xsLNM45JYaD3J5p4zUNpUQF7Ckm/da8V4e10W1sqU+dIw/lR5UFPIhuJ+Vz6kPNYX3WNHYV6HWXpk89X6n5YCONy9Gz+mrbHNAyEZZ9QltBbimANW3AVlW3lHiQU9JsRhTB8nu1z6wAu8wnA04NSPEApql8m1NdPBVyvmsMyXifs32kkQkUlMo4xR2MRDLL6BaVe7/lqRJlK5r6khRxQPk0l/pW/7cjkTb4mM+b27bUjBNnxbOuwtNvsvMJtJhqC2msAS/UUvzaOzcw2zxS6i3VlM5QHEqTx9Snz+CYsidSYC/hkA2a4bhQ0KcoTQE9bGtXXc+rxTepu3i54vPyrBRrOn4LIa/qo04RX8TU3wunpYr0Ng4qQP1x0kTqLRsdIUqdBbZ/e5JWwOXZXK91BF1kcDyk1r5yF7AvQ70S3KjvZgCK3oHVd1RdfHSuQvJRD5On7a7T/4GWQt+oMfSkOirOv5vyhmhP4XR3EvYB7hzzAFaN2RmWvAT85pngo+WxfyNsIuMHUrWlu0+Tegte2uISIzB8caf+roJG94r6Dij6zR89EoiqHR70n2GojAe15cYe4/T9shZfb7y78w3EPfkBZB7Ayq/0MP4cT6UrFs4KFZVJ9K9IiekrBv/zvdrkV1Fd442WYxfiGa60rGcJQHgco2Z0/SjS39bxgg34AozIHF8U5QzAkkCTF5DJ9IJB9zz1nCcFTk38X9vj/23X9JqsZT0JQ7FBVogaLOQLEwWr2r34VquJzL5RzWdgsEkfe0NG5bxV18/RlY24AE3/TUYmtczDzVLzjh7Bij5zmrUyklP1KwvY5qqfaqKRG46SPOh/sfJuOK4VoTH00Zr3DL4zViOILiYMFjDHGX0o+1AqKO+jBe01FAipynmymVJXHk4vGkVEwcj40ONuxPg0HS+ukIitAjB1umnjRroOepw7odIKz0FSw6WgX2qaTCp9Fw1HemPyjuhb9e1YF+ryQRjG04eSAvbhwj51r8rWtvXOKWskNSCQneDH6hC3a1Is6RGYLmALvSX/sDqWX6LEndMHcxTjnzRHyHbmodrDVOms7sbi1XMnSxs+ITBDHeNVcGQXq9zG8EEuKIzl4XYOG+ThT7q/on99MRm5iauT+WeRfEf0l+1L3lf5cA/mW6tL5uo8svRz9ibZkFnj0ZxJF42NqV3CI1UEB4+BAhnHBg0XBXYzdbbnAmvlUXI74l+CER/YMbaWhqCtdGRR32GrCY/ozx1pvxkEU9IE0MgIG+6une90xn8A5TJZhsuvV1/5MAcIWd67ZQwIvN3n0Vw12CTBylhwaB7gHnCMt0Y2EzlRfqIZTob+Ped6sd163Et24sj7s8T9SW2WM/dYSQiZOG6dN79hN9fCXdrE/EY2rdJVwrJoJDRHedRCGI4rTge9A5EghwHCPCcH9AP5oyDx1x8vUO52Fmt3NUOnUPBmPZrG18c6u5ME1XKrVXfXp+0sJeUKUmUsqhiv+YqbXmCz/7LiFujRrVZeOo2wubpB1RzGtY2xYMBjyj6a12xRpyzsF6e3lzcj9CzERNBtmv3N9CElfvecV26D3Upn6sQjeCbVPcSJSUmOTRvE6ttxR7OLbHShmrHSyKnTEKTxuYWDEYiY1KCHfEsEMFCmtsTjt+CJ7dfQRN0mrZ1IYkmF89qxhokSlVtmdrbA2WtM40UcsVkouLx+vlyktKO4ig7vPimuFK26SUgGQre/aI/TtykPVK5ICUdEqXBcflvD8mGzUG3LDOjeEtBecEZc51hJRmtZJ7OsjQCvwvg2mGN+fYiv4oohavgbw2jliZslsffPEGSMa56P/xVdqkOOwRp8I6QJzW9HfYYz+Tmh4Ky6cDgxBe1jSa1lzvkL3vDfyFRLWdxSdBYReixKFYCdvyG64zZq70BE5RwB0RLr4Mi0E4tV7X4dt6+234Sscmls48LeGZsEbT6D3sMLGQmXCFvlJDRXBEcpNLCdlCrStVOpcd85+bwSQ2a6GUOi8TxgsEGBe66jqKmJDixCtJB7RI6bisWUqpH1a5nflBNAuLeaASRWbv+TGxGZex2FM/z/8aZQVFrK8pHPOSL7X0j8YYOAZiswN6rFKqGnUaeeDfPfBGA2je9/eelJvAsIVx44rXWzHsCsRE3X+WM6FfH15V5zXMJDjroiPPwxPwmRgn/lC6VWIlLMUOJvVHrusLi4ei3QFFcY+yk3JlUCQDnAACn9ouCd3llnoS35FPHY2gZk39T/hcdJ7C9PaBGNCJw2t70Vu2wZ2fBCh3dbJXQnB6IdVwKWyVICr2G4DBWNuJFRvZSJ33XkVrTa6kgaToaG2PxLxijs+qEZ423PQ0G+y6vrwjHRVzidxod174Itwo+FeKabTUB+mTX2Ltz3nhlZzAGjItcbIGRmxSc6rpqiRWeZUWNLsU9GxV6di947QrOhQtiwvoOwnnbIDX2xdc561oZKcKzpXrcP+dTa7Cpc2v/ArYLBsaWJZHmxf5Ay74rSKoXzocP/mC0DmkmnyaiNK7bve1qUwFTGDtAykE/Ualc3eHROtNFJDFPJJsMcYPxLbk8c/7AWYh2+PgGdx3iCk6aY1RuFpSQwCCmpJ3IMCuyh1rtWhChiitjK83+JGEpS15q1nkNRyoyXKStv+6E2qP5iciXWy+rmNrEGm3EXfsW5Ody2YYO3JLnxtca67r/j6Hu+WpLZWE4L2MJOUW6nmXrSfSJplQyyAxlWCqtJJb9clU1H18vH60cKxvyrsrpN2RdKQrIP+9oD4/0gIL+GBwfVFZlmmHOXljQZqjCtExoZQZTJPoMf08xRnIP9r717QQ+cxB1PwwLw2ZSd7ehb1T2XfH6VHLMoGe6Pc2AWmDbQF8F+l3VJV3zg8qDwusLxhSnSncoHjhyOu9H3UikOU77kyH9/R3C6slQ==", - "timestamp": "1453206907000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453205908000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453205908000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453205908000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453205908000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453205908000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453205908000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453205908000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453205908000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453205908000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453205908000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453205908000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453205908000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453205908000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453205908000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453205908000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453205908000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453205908000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453205908000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453205908000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453205908000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453205908000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453205908000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453205908000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453205908000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453205908000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453205908000 - }, - "AUTHENTIFIANT": { - "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}": 1453206907000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453205908000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453205908000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453205908000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453205908000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453205908000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453205908000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453205908000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453205908000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453205908000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453205908000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453205908000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453205908000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453205908000 - }, - "DATA_CHANGE_HISTORY": { - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453205908000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453205908000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453205908000 - } - } - } -} diff --git a/test/Dashlane/Fixtures/empty-fullfile-two-add-one-remove-transactions.json b/test/Dashlane/Fixtures/empty-fullfile-two-add-one-remove-transactions.json deleted file mode 100644 index 752f95c8a..000000000 --- a/test/Dashlane/Fixtures/empty-fullfile-two-add-one-remove-transactions.json +++ /dev/null @@ -1,296 +0,0 @@ -{ - "transactionList": [ - { - "backupDate": 1453205908000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzuCCN4Hd6gluk6uiaC7VX4BHZ16tnVXNKgj7+ZbdFk5QiYye3WwVUe6t+Ld0iBbqzolbvGmWtWzSRTVLxkqxng/dXhxsyovUSILDGfwTq/KO71zNSroA+ZAEqoQ9alb4Dfj9OBOeVZ8S6WoGPh0eeQzszj3jbWwT/edDIGnQ3GsQtib7wlEOoGbVvtpEJivnQxPCnwwzwgAccUZYIqHRQW3QmwYUgIsP7/jOlpExUHeBapYTl12I/bPm30h1jtDpAjYRBsB/063Arl6EUoDory+aejtCKSHezsgoFUr3WHBuUjTTX4TaoWSrx9+TaPCAlfDTo6KMY3hQaQsYAmVHHQF7AyX+Hsvb0dRCZMv3Ta6HXK9GahGknakBYccl6y+N3f0kAX3ee6vo7L2S/a/yWocNzIg8gpARn2qCHIpAzvTGGuccEo3h6WiFuT512AhAZjPxJOY5w18l56Vqhxn/3zOh3SGUUI+1VYhA+B8LLmyy2JQb9XKtD+rwoipuOY/rZFFZgYFsc+v9+5Nx5Wh6rhkDmYA9M9r0QiZOKrOdm6xA53RWy4QvglIaVNPILpf5nBlKXdUiYNLhKIGn5KtZW60DOxPWyJbqGE3q9ygtB4aYaZGvSQGywOI1+YcOCROnA2PuPB7eqynPpOWbGfmYNLxYHTXTmFThsGroaNomUSZ27taNZT1U/752pcaN8gmXiox30lndWcO8njaY3CdJcIE5g2HxnO1RfHN0jBSZChM2Jxfq/BRlEiywnKLOU2ca1MvTrYv7GSQze9QPUc69pDIt/5Bl9ADnh6YURD5mxFUTyQoSWQHP5yBc7IWbOc5QaivuXVkwGadSjZ/PUh0DDo45LWavbCnaCMulyX9IX0sDPVhGYlsklk5jJ8/15GCybgVXnVj6itavkos8w6xXVR96oHxjoT6R+ws+8XgNnBtEZrQdO6n2lF/tr+i3iXxKd/1dfm1y2Jt8ALx/ZZ7rz95c4VD58L40enJNCCjGrCPq6BEW3f4JRE34cLjsMCRKTvEo32YeKrGDwG05aVv4HOa12RMljaZXsXqt59XOSp20n7REOYnhk2AMcwzQPsBuP9apf7V76LDjRyJiWYgUR7PDe1QZDn43q6BU7cD9/I+5ZaF4PllC2QtTpzPCK2GhVEhvdshZXZYoRpFWqLYgtoxVmhqvBILdirJ/m1UzUidKaXicfZKxamOjYz5OjFlUYlHcHmvQQ+8ooad8OrRxklwdXN1UlMQ6BSCiHxCVDxNyx4+wP1g3ebabw2c5TrDwNCIwieYMz9LOKZM38vctElCs83ZK/l42+PlxOmVgC/TyYoFm8ZPmdmrxR6WaKHHbCgV2tUy+V/Oquv18QErCxqtRc3GRBe74VIc25bPteoJ9c/ndJN3sIuSfRv7/wzCDnBG0DZUDfWsWIADlhTrr21Jwj4iEKLQhrdsH8zEC/1bfOoMjbPotODwCTyROIluf824hCil+BrX7LXJHeNTytFVjADy3HuN+Rwnij3PUmZczhgc1cODJLyktfVDS/H1iMao52M/oEvHrwfK/g0eN0bg==" - }, - { - "backupDate": 1453205908000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzbmJw9AEXCauuLe0nwub+OvlMhnHlhHmkIaPLH7kKwc2UtmDE1+7ZsFD5V6ED2LTnNYYweECXIBmXAchhgVFjejdZrDoUB0BlUqxxu9DdpIZGwVjR2l3XegkwQUPMEYYk7J6Z/Pxz3ZEj0Sx2SgSAYPXftJPePp/NWj5GBUSbCbo=" - }, - { - "backupDate": 1453206907000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_EDIT", - "time": 1453206900, - "objectType": "transaction", - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}", - "content": "2iwN5pAlfM/62fNyU+/kMGzh1B82rv0CSJKfZV1rDjxLV0Mz/cKVDJdM+hMK8n7jCdH4mfTbyh8Glu0dPWedFTlWrvSwTs5VYwg4VNWGB95o24HJxxGM4ab3kuNdmJ/DbDzUyHMMtOdB0ArmRbxcFEzztpl6BHJtxpnpDA6YbhkjjSan8iD06QZHQwSKAnPnqhNi+LR0/JgUV7cZOtU1UqsGu3HIAGdW2/Pz/w/aimUEMBmHuqHVqORoiZMVMA6szYBz1lT7Gh3hZbVDrHkr/2rlnzD1W2NSESIItbSQDx5RxM3xiK7gn1l01i6WLa9X06itZ+X93zxq0mJW+1JypLpoSq0F8HueMP22SUrimMCldpx6Fk8HhJWPVfqbxTvPvE4/8xgdm7MdOT856bv8xdsRFjOqGmQrqCJt8v3P+k5yhym2iGF0TP6lRyNJUuzn2/TMZeb0QzwOaRD8jbMJNBGGIGS5sF1IAWaISgLo5F6NYBLy5jIzmUkWkBBtqEjbgJbl+hOtMV01QvZfoIV+/bg2A083is9lhQEv3C7wlYZVVgL3iAndIKn/QI2r6966i3sFtN/wrmyDCf4Uwd27CuflED1eiDQdKgsbEPqz7IMX11mRIUA6oGgv7Z12FDXbYed7MIzbW+x7B9Ahk38doUERJZo1gPz68HOa0swfCWAd00qNMncGashJcJTbjpUzVqtMSTpk1zA0/7nuHRhWGW0A7WW9Bhy0JWIqF86NCzf+6Mpj" - }, - { - "backupDate": 1453210044000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_EDIT", - "time": 1453210033, - "objectType": "transaction", - "identifier": "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}", - "content": "2iwN5pAlfM/62fNyU+/kMGzh1B82rv0CSJKfZV1rDjxLV0MziFFBM5vk/D1aJUmol0FC+ocHaslxu3YmkxIxhVBEIHj01Ur66JFKB7CmJkSm3iC0B3/QoLBLlOdbegyp2h+RmgU/IrwYptKzi0WpkeaRx8/SGw7QNwaw5sTPBpPmSGxSWo/BVvfh1U8KFamYBndwkd78IC12Oazm10V67zv5Klc3De4kjcTt70SdrSM9xawXt6jeF4uL2EHUeNr0lFWznQoovtFj4VGO7PaMI27PP5jQvfduBo5bwfrVaZ13es1IuhiJDOxg+YnO2S0rtocxzA7rRLcY8X4O1jcRoGy+myQrML99SCBotIPcXJ/cgHCa/a36R+aCdSWFepshxGD+xYsMgRS3k0TvDFz+W1OOphE9UFpiZaytRV+X5lPflZY42PuN0Q8ZEttxRReHO7kyAwNu5cNO8nhOIBOUiuyJlMMkb6xL/zC9id/wYHduMJR7KWyDcqUMQQ8TLAO7ql4r0s1NMscK7LnAVGNtxiN/K1v5fAhz8Lun4peMEjtvYW5EZn5BgpF9FtELJOlZh9c9uEMAIYGA3qTLezJnjAPBzQcZb/IAyS/cm9uyqJx8pNViPvRjZ2ChV/HHCVTTCjO6MsPFk/vklJBp7E0ulfU97aVNoTHfCLKGePCpZfmyuVrndJAK2IJzgRmWvmrWTF1GhFFK9+/6CpPDuwLHfHi8T/IhamTpnrawA78bkChKeaFr" - }, - { - "backupDate": 1453210500000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453210491, - "objectType": "transaction", - "identifier": "{23970418-7D66-4933-8A8B-EB61F8D1CDA4}" - }, - { - "backupDate": 1453210500000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453210491, - "objectType": "transaction", - "identifier": "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}", - "content": "2iwN5pAlfM/62fNyU+/kMGzh1B82rv0CSJKfZV1rDjxLV0MzIW2U/3ohbDAtfVtpARBEWgYQMhFFz/P2SVCOBmQYuMcxNlpeg8ubgJk3LFdhJ2LkC2rdevT9SreuJHrSwmqaWh5whnUL1q29a0WSlP201mtBvFk8AuXzk6MXSJVFzCxHd2Rtf+rvlTlvTO1EZ+U9egYuPY832FgqWIknXlDZsHZtZEbRcVfkzSrGOo3KAg4cI8TeFqZYaYBwzitcF6CYS5jfmxeDkuw2k8iezlUVX2I2zorK9KiB0mRYF8qNpoBI/Ml4vrrPQtONINgA/tmD4fM54kGxtcTIEV5dDuaKKSItS62ocTUQke3q7/5e/8d+FgD0QKmVTs0Bd2vt2sR2puFVtGtu9ZGZP7ROgRwe/1hJAgSy8GNBO8xJqkBcbbeZek7yM0b4XQq8pVeTzgd0yxHjAGxO1LsR6NZmfBI7LcXgnYITZ1Njn0Vs8aIcm8HJiXe4ATygaSdTk0l6JB1F1A+D+Y0J/oY6mD9lZh7iICSwwN691XhCI9t1UX9IN/xpAfcFnL8c32rJn4EUrQLGPe8yZ409MqcXpU26i5twuv24jaU2LXobZb2VHHU7EQOHlItQFGT1RaIZQTMU9yyNZidpTrasZ+A+czp1j5v5oCfcWiWJn6h3/C/B4U1aH/IPPHHnbxtm6nZAD0iRDA9eob7Nkvryv9c8Vx3mGOk7crOcWB+zKbmdZBMZ2G5MlLBP7l9jwgHh89VdlAFpa7B5bUbw00J2JerimYew/WBPhi5J5V0E97FEbaNvdUFaHGM4" - } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453205908000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453205908000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453205908000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453205908000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453205908000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453205908000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453205908000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453205908000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453205908000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453205908000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453205908000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453205908000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453205908000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453205908000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453205908000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453205908000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453205908000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453205908000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453210500000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453205908000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453205908000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453205908000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453205908000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453205908000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453205908000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453205908000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453205908000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453205908000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453205908000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453205908000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453205908000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453205908000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453205908000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453205908000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453205908000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453205908000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453205908000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453205908000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453205908000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453205908000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453205908000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453205908000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453205908000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453205908000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453205908000 - }, - "AUTHENTIFIANT": { - "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}": 1453206907000, - "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}": 1453210044000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453205908000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453205908000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453205908000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453205908000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453205908000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453205908000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453205908000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453205908000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453205908000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453205908000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453205908000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453205908000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453205908000 - }, - "DATA_CHANGE_HISTORY": { - "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}": 1453210500000, - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453205908000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453205908000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453205908000 - } - } - } -} diff --git a/test/Dashlane/Fixtures/empty-fullfile-two-add-transactions.json b/test/Dashlane/Fixtures/empty-fullfile-two-add-transactions.json deleted file mode 100644 index 7e35c885e..000000000 --- a/test/Dashlane/Fixtures/empty-fullfile-two-add-transactions.json +++ /dev/null @@ -1,278 +0,0 @@ -{ - "transactionList": [ - { - "backupDate": 1453205908000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzuCCN4Hd6gluk6uiaC7VX4BHZ16tnVXNKgj7+ZbdFk5QiYye3WwVUe6t+Ld0iBbqzolbvGmWtWzSRTVLxkqxng/dXhxsyovUSILDGfwTq/KO71zNSroA+ZAEqoQ9alb4Dfj9OBOeVZ8S6WoGPh0eeQzszj3jbWwT/edDIGnQ3GsQtib7wlEOoGbVvtpEJivnQxPCnwwzwgAccUZYIqHRQW3QmwYUgIsP7/jOlpExUHeBapYTl12I/bPm30h1jtDpAjYRBsB/063Arl6EUoDory+aejtCKSHezsgoFUr3WHBuUjTTX4TaoWSrx9+TaPCAlfDTo6KMY3hQaQsYAmVHHQF7AyX+Hsvb0dRCZMv3Ta6HXK9GahGknakBYccl6y+N3f0kAX3ee6vo7L2S/a/yWocNzIg8gpARn2qCHIpAzvTGGuccEo3h6WiFuT512AhAZjPxJOY5w18l56Vqhxn/3zOh3SGUUI+1VYhA+B8LLmyy2JQb9XKtD+rwoipuOY/rZFFZgYFsc+v9+5Nx5Wh6rhkDmYA9M9r0QiZOKrOdm6xA53RWy4QvglIaVNPILpf5nBlKXdUiYNLhKIGn5KtZW60DOxPWyJbqGE3q9ygtB4aYaZGvSQGywOI1+YcOCROnA2PuPB7eqynPpOWbGfmYNLxYHTXTmFThsGroaNomUSZ27taNZT1U/752pcaN8gmXiox30lndWcO8njaY3CdJcIE5g2HxnO1RfHN0jBSZChM2Jxfq/BRlEiywnKLOU2ca1MvTrYv7GSQze9QPUc69pDIt/5Bl9ADnh6YURD5mxFUTyQoSWQHP5yBc7IWbOc5QaivuXVkwGadSjZ/PUh0DDo45LWavbCnaCMulyX9IX0sDPVhGYlsklk5jJ8/15GCybgVXnVj6itavkos8w6xXVR96oHxjoT6R+ws+8XgNnBtEZrQdO6n2lF/tr+i3iXxKd/1dfm1y2Jt8ALx/ZZ7rz95c4VD58L40enJNCCjGrCPq6BEW3f4JRE34cLjsMCRKTvEo32YeKrGDwG05aVv4HOa12RMljaZXsXqt59XOSp20n7REOYnhk2AMcwzQPsBuP9apf7V76LDjRyJiWYgUR7PDe1QZDn43q6BU7cD9/I+5ZaF4PllC2QtTpzPCK2GhVEhvdshZXZYoRpFWqLYgtoxVmhqvBILdirJ/m1UzUidKaXicfZKxamOjYz5OjFlUYlHcHmvQQ+8ooad8OrRxklwdXN1UlMQ6BSCiHxCVDxNyx4+wP1g3ebabw2c5TrDwNCIwieYMz9LOKZM38vctElCs83ZK/l42+PlxOmVgC/TyYoFm8ZPmdmrxR6WaKHHbCgV2tUy+V/Oquv18QErCxqtRc3GRBe74VIc25bPteoJ9c/ndJN3sIuSfRv7/wzCDnBG0DZUDfWsWIADlhTrr21Jwj4iEKLQhrdsH8zEC/1bfOoMjbPotODwCTyROIluf824hCil+BrX7LXJHeNTytFVjADy3HuN+Rwnij3PUmZczhgc1cODJLyktfVDS/H1iMao52M/oEvHrwfK/g0eN0bg==" - }, - { - "backupDate": 1453205908000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzbmJw9AEXCauuLe0nwub+OvlMhnHlhHmkIaPLH7kKwc2UtmDE1+7ZsFD5V6ED2LTnNYYweECXIBmXAchhgVFjejdZrDoUB0BlUqxxu9DdpIZGwVjR2l3XegkwQUPMEYYk7J6Z/Pxz3ZEj0Sx2SgSAYPXftJPePp/NWj5GBUSbCbo=" - }, - { - "backupDate": 1453206907000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_EDIT", - "time": 1453206900, - "objectType": "transaction", - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}", - "content": "2iwN5pAlfM/62fNyU+/kMGzh1B82rv0CSJKfZV1rDjxLV0Mz/cKVDJdM+hMK8n7jCdH4mfTbyh8Glu0dPWedFTlWrvSwTs5VYwg4VNWGB95o24HJxxGM4ab3kuNdmJ/DbDzUyHMMtOdB0ArmRbxcFEzztpl6BHJtxpnpDA6YbhkjjSan8iD06QZHQwSKAnPnqhNi+LR0/JgUV7cZOtU1UqsGu3HIAGdW2/Pz/w/aimUEMBmHuqHVqORoiZMVMA6szYBz1lT7Gh3hZbVDrHkr/2rlnzD1W2NSESIItbSQDx5RxM3xiK7gn1l01i6WLa9X06itZ+X93zxq0mJW+1JypLpoSq0F8HueMP22SUrimMCldpx6Fk8HhJWPVfqbxTvPvE4/8xgdm7MdOT856bv8xdsRFjOqGmQrqCJt8v3P+k5yhym2iGF0TP6lRyNJUuzn2/TMZeb0QzwOaRD8jbMJNBGGIGS5sF1IAWaISgLo5F6NYBLy5jIzmUkWkBBtqEjbgJbl+hOtMV01QvZfoIV+/bg2A083is9lhQEv3C7wlYZVVgL3iAndIKn/QI2r6966i3sFtN/wrmyDCf4Uwd27CuflED1eiDQdKgsbEPqz7IMX11mRIUA6oGgv7Z12FDXbYed7MIzbW+x7B9Ahk38doUERJZo1gPz68HOa0swfCWAd00qNMncGashJcJTbjpUzVqtMSTpk1zA0/7nuHRhWGW0A7WW9Bhy0JWIqF86NCzf+6Mpj" - }, - { - "backupDate": 1453210044000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_EDIT", - "time": 1453210033, - "objectType": "transaction", - "identifier": "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}", - "content": "2iwN5pAlfM/62fNyU+/kMGzh1B82rv0CSJKfZV1rDjxLV0MziFFBM5vk/D1aJUmol0FC+ocHaslxu3YmkxIxhVBEIHj01Ur66JFKB7CmJkSm3iC0B3/QoLBLlOdbegyp2h+RmgU/IrwYptKzi0WpkeaRx8/SGw7QNwaw5sTPBpPmSGxSWo/BVvfh1U8KFamYBndwkd78IC12Oazm10V67zv5Klc3De4kjcTt70SdrSM9xawXt6jeF4uL2EHUeNr0lFWznQoovtFj4VGO7PaMI27PP5jQvfduBo5bwfrVaZ13es1IuhiJDOxg+YnO2S0rtocxzA7rRLcY8X4O1jcRoGy+myQrML99SCBotIPcXJ/cgHCa/a36R+aCdSWFepshxGD+xYsMgRS3k0TvDFz+W1OOphE9UFpiZaytRV+X5lPflZY42PuN0Q8ZEttxRReHO7kyAwNu5cNO8nhOIBOUiuyJlMMkb6xL/zC9id/wYHduMJR7KWyDcqUMQQ8TLAO7ql4r0s1NMscK7LnAVGNtxiN/K1v5fAhz8Lun4peMEjtvYW5EZn5BgpF9FtELJOlZh9c9uEMAIYGA3qTLezJnjAPBzQcZb/IAyS/cm9uyqJx8pNViPvRjZ2ChV/HHCVTTCjO6MsPFk/vklJBp7E0ulfU97aVNoTHfCLKGePCpZfmyuVrndJAK2IJzgRmWvmrWTF1GhFFK9+/6CpPDuwLHfHi8T/IhamTpnrawA78bkChKeaFr" - } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453205908000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453205908000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453205908000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453205908000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453205908000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453205908000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453205908000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453205908000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453205908000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453205908000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453205908000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453205908000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453205908000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453205908000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453205908000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453205908000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453205908000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453205908000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453210044000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453205908000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453205908000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453205908000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453205908000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453205908000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453205908000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453205908000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453205908000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453205908000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453205908000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453205908000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453205908000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453205908000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453205908000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453205908000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453205908000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453205908000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453205908000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453205908000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453205908000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453205908000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453205908000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453205908000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453205908000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453205908000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453205908000 - }, - "AUTHENTIFIANT": { - "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}": 1453206907000, - "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}": 1453210044000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453205908000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453205908000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453205908000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453205908000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453205908000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453205908000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453205908000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453205908000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453205908000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453205908000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453205908000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453205908000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453205908000 - }, - "DATA_CHANGE_HISTORY": { - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453205908000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453205908000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453205908000 - } - } - } -} diff --git a/test/Dashlane/Fixtures/empty-vault.json b/test/Dashlane/Fixtures/empty-vault.json index 25de99cdb..f33a61646 100644 --- a/test/Dashlane/Fixtures/empty-vault.json +++ b/test/Dashlane/Fixtures/empty-vault.json @@ -1,256 +1,42 @@ { - "transactionList": [ - { - "backupDate": 1453205908000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzuCCN4Hd6gluk6uiaC7VX4BHZ16tnVXNKgj7+ZbdFk5QiYye3WwVUe6t+Ld0iBbqzolbvGmWtWzSRTVLxkqxng/dXhxsyovUSILDGfwTq/KO71zNSroA+ZAEqoQ9alb4Dfj9OBOeVZ8S6WoGPh0eeQzszj3jbWwT/edDIGnQ3GsQtib7wlEOoGbVvtpEJivnQxPCnwwzwgAccUZYIqHRQW3QmwYUgIsP7/jOlpExUHeBapYTl12I/bPm30h1jtDpAjYRBsB/063Arl6EUoDory+aejtCKSHezsgoFUr3WHBuUjTTX4TaoWSrx9+TaPCAlfDTo6KMY3hQaQsYAmVHHQF7AyX+Hsvb0dRCZMv3Ta6HXK9GahGknakBYccl6y+N3f0kAX3ee6vo7L2S/a/yWocNzIg8gpARn2qCHIpAzvTGGuccEo3h6WiFuT512AhAZjPxJOY5w18l56Vqhxn/3zOh3SGUUI+1VYhA+B8LLmyy2JQb9XKtD+rwoipuOY/rZFFZgYFsc+v9+5Nx5Wh6rhkDmYA9M9r0QiZOKrOdm6xA53RWy4QvglIaVNPILpf5nBlKXdUiYNLhKIGn5KtZW60DOxPWyJbqGE3q9ygtB4aYaZGvSQGywOI1+YcOCROnA2PuPB7eqynPpOWbGfmYNLxYHTXTmFThsGroaNomUSZ27taNZT1U/752pcaN8gmXiox30lndWcO8njaY3CdJcIE5g2HxnO1RfHN0jBSZChM2Jxfq/BRlEiywnKLOU2ca1MvTrYv7GSQze9QPUc69pDIt/5Bl9ADnh6YURD5mxFUTyQoSWQHP5yBc7IWbOc5QaivuXVkwGadSjZ/PUh0DDo45LWavbCnaCMulyX9IX0sDPVhGYlsklk5jJ8/15GCybgVXnVj6itavkos8w6xXVR96oHxjoT6R+ws+8XgNnBtEZrQdO6n2lF/tr+i3iXxKd/1dfm1y2Jt8ALx/ZZ7rz95c4VD58L40enJNCCjGrCPq6BEW3f4JRE34cLjsMCRKTvEo32YeKrGDwG05aVv4HOa12RMljaZXsXqt59XOSp20n7REOYnhk2AMcwzQPsBuP9apf7V76LDjRyJiWYgUR7PDe1QZDn43q6BU7cD9/I+5ZaF4PllC2QtTpzPCK2GhVEhvdshZXZYoRpFWqLYgtoxVmhqvBILdirJ/m1UzUidKaXicfZKxamOjYz5OjFlUYlHcHmvQQ+8ooad8OrRxklwdXN1UlMQ6BSCiHxCVDxNyx4+wP1g3ebabw2c5TrDwNCIwieYMz9LOKZM38vctElCs83ZK/l42+PlxOmVgC/TyYoFm8ZPmdmrxR6WaKHHbCgV2tUy+V/Oquv18QErCxqtRc3GRBe74VIc25bPteoJ9c/ndJN3sIuSfRv7/wzCDnBG0DZUDfWsWIADlhTrr21Jwj4iEKLQhrdsH8zEC/1bfOoMjbPotODwCTyROIluf824hCil+BrX7LXJHeNTytFVjADy3HuN+Rwnij3PUmZczhgc1cODJLyktfVDS/H1iMao52M/oEvHrwfK/g0eN0bg==" - }, - { - "backupDate": 1453205908000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453205907, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "5qOF0pNuqSf2ct5wTugU/0C1wkj9aPLrbrZBe26YCWBLV0MzbmJw9AEXCauuLe0nwub+OvlMhnHlhHmkIaPLH7kKwc2UtmDE1+7ZsFD5V6ED2LTnNYYweECXIBmXAchhgVFjejdZrDoUB0BlUqxxu9DdpIZGwVjR2l3XegkwQUPMEYYk7J6Z/Pxz3ZEj0Sx2SgSAYPXftJPePp/NWj5GBUSbCbo=" + "requestId": "d74c4783-3526-41cb-8272-317548f371e2", + "data": { + "transactions": [ + { + "identifier": "SETTINGS_userId", + "backupDate": 1758558722000, + "type": "SETTINGS", + "time": 1758138708, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+Bh3L4mHKIKg3Rw708//HQjqHs6oBPCoCZjI0ixUbtJUvbMVFfgTu1/4mBD4vME/Ttuxc14wOuQZM4VOElKTxaI9bZNcIAfBHzCaIhEVPg9ydS1sWQWluBSqoITaA08PXPNRKWJuNmeU4gLuUvgwpKZAHKRMvgVKUj2ZVObY4pteD+SIqjPNtzqjP5sRnmyySFwUWfjshZ0G9NzfFkfmkWyqmWhqg2+EDMgNfSPD9EFipBwcOlUg2nR/L/Aey3DL7xyEt7i/NoAeII4hT8ZuZC5poiRuGqD+qtcBYMX7jFDViVSSO56ejGjYRvqMP/H46wGusjH8uedU1SbGFJlB8F7jlyMY4Zsqv582GJa6phjIW8zjoKcbqWFTUaWw142HluDmDSknIapUAjjOLHy0G5WXnDM3s61A1Gl9bSEc5D+WCir/lxbqt3UjkVuJPP2WmRs6DhnpsBwzRHF8RtimnmojTPpR0xQQLIz+B6R5j9i/fH2+wSifvooCJLF5uj5AdaRonXPgmtSpnPxZwqmpGkeuXmNySDpE2f9FYiXeVJAfdqnsrZNGo/+2BvNbMj0gfSR1Cpo0j8nr+9+AvudHcxurLDvZ3k5q2SRWdrfbkK8AsD3RjRc4pFulBojp3CYYX1LsCSFa6j6uoHy2cTJHnb4xDY8Hd5+vJahL0tbrbnVlaG1zsUp+FzVheBpnrzL/yelQnyPi9cdBpgX1gGFQRuHh6et4xGo3HC3KV7OzgsmyW4OwkjfcBaCV7nQ1GA2s0yc1b4HY/kgJ82q5i0NUaAV5AtgRhswJvi39NPxOEU3RfIG5ETijdsJ07Xhi126UIE+TqJgehXqbbnVPeH+WTuuU=" + }, + { + "identifier": "{4084481C-0787-4163-AFBB-AB100725833F}", + "backupDate": 1758558722000, + "type": "EMAIL", + "time": 1758138710, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+Br68IVkpT3TcAVDd1B5XuT9wrccJ2k39J25c5Z1jUE7ea+PwpY4fKfmYBnZ5NYD4UiglCGAUMeHp6kEk0GL/IkwxAPI7VJt5yzsbc8TWY+WEvVtSFFJogSuZQazIJ48FvhxOeYy4an1dCDpgomhz/Jv9/8CgkW2VYdppTSBmeB+RKUPDFzbkbOd7DMJkv958EcFQxPiDiTRmWPi6x0Ym6qrJkN2WcIgojI2BH22QZylLbBigb77hwjN3rylBoYiAyRMHDcJH3l3R9AcHeDXNf9iGKB4z78NhWQVkv9SVN8ft94Dzw9wJnKb9OHEsThhXvfHhW9grLhf0Ii5u8LHlpn9THDl8biq38kzGwNno4Fvn/uSJFL+Xkrqc7/VDUukrVP6N/DeKvmgzLrlZlcClr2MYlwNBNqbLeOIoE63eeSxr" + } + ], + "fullBackup": {}, + "timestamp": 1758558722000, + "sharing2": { + "permissionsVersion": "0a973613e957078b49e3e7721ed623c81283b007830c612887580ba29b45ed0b", + "itemGroups": [], + "items": [], + "userGroups": [], + "collections": [] + }, + "syncAllowed": true, + "uploadEnabled": true, + "summary": { + "SETTINGS": { + "SETTINGS_userId": 1758558722000 + }, + "EMAIL": { + "{4084481C-0787-4163-AFBB-AB100725833F}": 1758558722000 + } + } } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453205908000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453205908000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453205908000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453205908000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453205908000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453205908000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453205908000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453205908000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453205908000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453205908000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453205908000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453205908000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453205908000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453205908000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453205908000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453205908000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453205908000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453205908000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453205908000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453205908000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453205908000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453205908000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453205908000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453205908000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453205908000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453205908000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453205908000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453205908000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453205908000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453205908000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453205908000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453205908000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453205908000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453205908000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453205908000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453205908000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453205908000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453205908000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453205908000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453205908000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453205908000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453205908000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453205908000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453205908000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453205908000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453205908000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453205908000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453205908000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453205908000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453205908000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453205908000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453205908000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453205908000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453205908000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453205908000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453205908000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453205908000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453205908000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453205908000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453205908000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453205908000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453205908000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453205908000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453205908000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453205908000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453205908000 - }, - "DATA_CHANGE_HISTORY": { - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453205908000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453205908000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453205908000 - } - } - } } diff --git a/test/Dashlane/Fixtures/error-invalid-authentication.json b/test/Dashlane/Fixtures/error-invalid-authentication.json new file mode 100644 index 000000000..1ecb828ef --- /dev/null +++ b/test/Dashlane/Fixtures/error-invalid-authentication.json @@ -0,0 +1,8 @@ +{ + "requestId": "6659842c-cdbf-434a-8a86-7ed444e793f4", + "errors": [{ + "type": "invalid_request_error", + "code": "invalid_authentication", + "message": "Error during authentication" + }] +} diff --git a/test/Dashlane/Fixtures/error-other-message.json b/test/Dashlane/Fixtures/error-other-message.json new file mode 100644 index 000000000..7224aa781 --- /dev/null +++ b/test/Dashlane/Fixtures/error-other-message.json @@ -0,0 +1,8 @@ +{ + "requestId": "6659842c-cdbf-434a-8a86-7ed444e793f4", + "errors": [{ + "type": "invalid_request_error", + "code": "other_error", + "message": "Oops, something went wrong!" + }] +} diff --git a/test/Dashlane/Fixtures/error-unknown-userdevice-key.json b/test/Dashlane/Fixtures/error-unknown-userdevice-key.json new file mode 100644 index 000000000..a6ae43cc4 --- /dev/null +++ b/test/Dashlane/Fixtures/error-unknown-userdevice-key.json @@ -0,0 +1,10 @@ +{ + "requestId": "9373563f-9870-4166-9b06-0aba073767e5", + "errors": [ + { + "type": "invalid_request_error", + "code": "unknown_userdevice_key", + "message": "Error during authentication" + } + ] +} diff --git a/test/Dashlane/Fixtures/invalid-email.json b/test/Dashlane/Fixtures/error-user-not-found.json similarity index 100% rename from test/Dashlane/Fixtures/invalid-email.json rename to test/Dashlane/Fixtures/error-user-not-found.json diff --git a/test/Dashlane/Fixtures/error-verification-failed.json b/test/Dashlane/Fixtures/error-verification-failed.json new file mode 100644 index 000000000..8797b4d4a --- /dev/null +++ b/test/Dashlane/Fixtures/error-verification-failed.json @@ -0,0 +1,10 @@ +{ + "requestId": "65889786-bc10-4386-9d21-f98f9c4b2c46", + "errors": [ + { + "type": "business_error", + "code": "verification_failed", + "message": "The OTP verification failed. This could be due for example to the user inputing a wrong token." + } + ] +} diff --git a/test/Dashlane/Fixtures/otp-requested.json b/test/Dashlane/Fixtures/get-authentication-methods-for-device.json similarity index 50% rename from test/Dashlane/Fixtures/otp-requested.json rename to test/Dashlane/Fixtures/get-authentication-methods-for-device.json index 7a29f6e13..23a910a8d 100644 --- a/test/Dashlane/Fixtures/otp-requested.json +++ b/test/Dashlane/Fixtures/get-authentication-methods-for-device.json @@ -1,11 +1,11 @@ { - "requestId": "f8aec971-39a8-4ae6-a474-5e2ba1010d75", + "requestId": "0c3bfdac-53c3-4c98-aa41-91795814ea8e", "data": { - "accountType": "masterPassword", "verifications": [ { "type": "totp" } - ] + ], + "accountType": "masterPassword" } } diff --git a/test/Dashlane/Fixtures/invalid-email-token.json b/test/Dashlane/Fixtures/invalid-email-token.json deleted file mode 100644 index 413485ca5..000000000 --- a/test/Dashlane/Fixtures/invalid-email-token.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "requestId": "6aeda661-1d74-4ad8-aaee-db3b622ed816", - "errors": [ - { - "type": "business_error", - "code": "verification_failed", - "message": "The server was not able to verify the token. This could be due for example to the user inputing a wrong token" - } - ] -} diff --git a/test/Dashlane/Fixtures/invalid-uki.json b/test/Dashlane/Fixtures/invalid-uki.json deleted file mode 100644 index c569e3bc9..000000000 --- a/test/Dashlane/Fixtures/invalid-uki.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "objectType": "message", - "content": "Incorrect authentification" -} diff --git a/test/Dashlane/Fixtures/non-empty-vault-with-server-key.json b/test/Dashlane/Fixtures/non-empty-vault-with-server-key.json new file mode 100644 index 000000000..778087f28 --- /dev/null +++ b/test/Dashlane/Fixtures/non-empty-vault-with-server-key.json @@ -0,0 +1,89 @@ +{ + "requestId": "5abe32ea-c6ee-40e0-9d30-cf4770d251dc", + "data": { + "transactions": [ + { + "identifier": "SETTINGS_userId", + "backupDate": 1758873336000, + "type": "SETTINGS", + "time": 1758872949, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkNcaX14uA4b8RtndmdjpI9hNZpT4CPUkXhudOdm2F8bVI7NIHe+YXoqf3O5pZef5g3yAXiRE8NH3RlfU9bmm6AgItSc0d2m87QS+QFtYNew1QweU35vN0Lig0Err7a9BZt6c8ZE5l/+01Gjys3F3V2Eu1647QJ3rQcDcWgpfmOxI0hMWdWs4ftMALYUuWBkHK0OYoOLkPzaCY2RPbPN2XH4aep+axY4BiQvrGTtOZ1A7SyAvgcTkPiuRRSMcjBHRn4lT1ngPFHEyixN22RNXvdKOfhBsy3ksxiXICOOJPjzcLaDw8htsAQQH1YF1TO2/5OoUmGkzXgcQumUCAF3PzQOKJNbFrYo9DjIGl0ZULiH8h6L3/NMCfWFTQBsfM9G4wGc1J8+3Ri9J8EtcTb1uNqJ6/Dhro9iNcr/L6ZLq1ux4Os10VIy7tVsFc7GQnWIg/5cw1mOSQKgaHZKwubMOjWKHpZL4zigQ0e0wIEheJZ8vBICUesIuDQTi25fZVuoS33190+OnkuhI4Bp8/8CRX9A/+UYWiopbfTQZn91M6I6uT8SA2Gkeq/dyBXlGRmOwyxlbnLP7OBQXd8kzz9CJ9LNaXzhHfH/BxOH6tDJk9WGQIdd5Sie2w6SV7Asm+3JN1VdyVmSvkNmwShjz9XiN1gdxD/eizSkZdYQ3dKFO1rP5GPrVykex5XmyManEFUG7bE/Gr8x3EjM/tMgndY3W3tqIr16dt1mrfzhzdi33Z5cntJ6sxyoUrzVSNJ69OCIpXLgBWHYdZtbasXr23j43te/ZgaxjSERjOKyHrd1muOoZqMVchZ8Y8LRDxpxlbEWunBN6sXlbw7wkGEcXrGnu0mcXbImKcGeajBCmSQ4hsGjY=" + }, + { + "identifier": "{6437274A-7027-403D-A1CB-5F4DBE776B63}", + "backupDate": 1758873336000, + "type": "EMAIL", + "time": 1758872950, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkNcaX14uA4b8RtndmdjpI9ho01r4j61UcX84zMvxrNLDwj5mZSxVoTv5U0JN6gOqJWHbYGvo+sHduK0OnRZgaX6K8ADmlOlwrEt1QJp7ydDa3A0af7T0QBJlP4TXf76j06Cnk+yKHOpzLOgpz4OLNOqFaVZguLNjKetKe8RFdgkrREYQoa8b94s/cY8Uyg8Y8/TmLHz2JaXdnQWcf2pd7ScfmNdzAGhY3TVjC8P6SkOIRaAPa3YQOnJs6kl27I7IpmuOE0beQlmxDtXsAZfvJp+r52R84EfSv1Q3q7hM1KsUWxsN7/ArwpWm1O+b6hUxb4jOonAO16yV0ramZlE/ekqCYfNZv2x7eLwcyHAfFOVKafdGvp7UDLGbQFiOpIgmVpqH8NGdLv5lCADOLd/tMng13EFRONL/5yFQk8ZGJ8GzSmUum2V1t7lWJvLKpbaId" + }, + { + "identifier": "{1BB7F422-C6BF-450F-958A-7C6B682527BD}", + "backupDate": 1758887627000, + "type": "AUTHENTIFIANT", + "time": 1758887627, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkNcaX14uA4b8RtndmdjpI9gbGZdVfSuXnMGzLvsSjFw2wRR0K9MVA8Dea/5oxa2RHcpalGYPdjY2hnEPiqXAl9twZANgMxNB+4Jsz3dIjnVMnKLDxDn7X/hhSoLSR/+LpTNb6w3DQ0DJE67atHqj8JJt5BknDq45Yc+1YCXcE+WAp65CgavdrRRi+6xY2Na5SGDXwuU2GR2gudKtdcxxUWN5JL6Y6qVg4F0LUBymRTjcHiYfPjUPn8luI6D7TP5d4IyLIdhzBdF1NKfWSe6M+egcwS6gz+4GUlqDNySB0E00rwmAlKFMiuPeZIYpD6NnL7jrZTfXFWK1E/ibNa6xAg+v2tKMs3KuXCBYaAe+mZoFKTkrgYzFqWpts5/BAsmMpUxGSYTXKf/rTNe44ZrWupuPD1I0oXSUtD0IQijwzmA6GN/63JkisJOlLISqsFpg7hMosm6VZEepUclgAF8qjOG1DfDwEoUbY8KRAVAtMsWBmqJsPgcAPB4yHjjXaasMgL1jcKF77dgF/mFrCK37ZfUXWWmclwsy6RW7rzZHWsE1k/kLKRlIFBWz5w80ViunYVXjzyT34cluWhgZyMAEQO37tEh/OIwMnmnjCY7Mrlc4NSqVO5Es9vpIuz5NF5YcYqG1j69m/TCLinUh8znTOmPBu8u6yiY7pJxM4hdErwmA=" + }, + { + "identifier": "{5CFED12E-92B4-4F1D-B5EF-81BC70E957C3}", + "backupDate": 1758887627000, + "type": "AUTHENTIFIANT", + "time": 1758887627, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkNcaX14uA4b8RtndmdjpI9nrkWS6zWKfVpJsS5NNDscWDdDk7AcfitGHgNXFUiVeWH1UVq5mPMO/az2h8Kb/Ml787PzLYi8rSMDyqaeS6nXuXJbn9PtRCwFTX2M8j3Eu8MWbBSyobDG/VeaZjPJvJcYxcbUY+L7Gtl8bnwpP0EGjIn1nx1IeYu4IMeMl9wijvJBjtsCpHpWpScNvh2Y4xU+mlmva7tMbiLPdK3ohNTuMkyXGa6KlsOoZMH8ZEZa62iXFagbpuutc87ftRMQ14cMJkidk52/HKBXlXAsU+EG3eWNOWvvf+OcqYxe61ZkhvHxoabV4tK3EaUordaQPSauo0QaUSqrdTQtgo/RmfI1KcHxc19lY33eShrKr0IdkdS2sROaoHL5Bictzd3fUtrIL2hulvIwpT0eoUG9XU6AfNnq8WAw006O03WyuK8/YI0lWQD4NJuNSxKBgFgj/BFzhwNcRL2KH1tcuwhZCDdP7sTWauSRXG7/dasyOGyf4Zt6DK5IRCbsFHL4YySzxDI/xzG8T5sDKM5kUbiqmj0ms6SwC2ZkOM6ODt+kZCu6appH+4J35UpGAw5z1YfgNMEvcn9o+7Qt/nu3uSjeEYv51G6IFhvQredvqlYDSVxOWRS0Io5K3/VrBcMbzoO0tDgFq/f9kj3DDlFy5Ba+7Tvsg=" + }, + { + "identifier": "{AC8CC8AC-61E6-49F8-ACD2-6BD2B4C86D3E}", + "backupDate": 1758887627000, + "type": "AUTHENTIFIANT", + "time": 1758887627, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkNcaX14uA4b8RtndmdjpI9hS9Z/yuGP0Ts9Bhbh7VL9wwko45vLDK5DRIgOHM1Qr85YfizsniPZd157hdHJC/VgtQYViRisaSR9pfBxOl5coYII+yJVACzb8CrvKbbSyqLTk4eODgIJrccOqAhANF1BAsxpszTJXYQlGF7ZQGCoJrPtR928z3e37cKO1wIvL1B9Hraz83hTMWQGnoc3B7HmoFFg5CGsflhA5c6kwhLyB2i8W9WFgvS3zUVFgJ2OKuHPHWfCUGLo973y1dhzGoM/gmH7Txdn37EBJDK3/M2LCPJScdoKNBgLFrgkqE7QI5JjNyG9AGvp8IiyvmKjMx9fIn5+OavHO6O7/YNw5mG+5/jBuqyHERzK2FbnPY4OOvYl6gYVTGlsdMbmjm0hNJDdVvzCgHnbMUT/oLlq4bUPoBHp9hB5GRHUJpr/0TRXkajbZV1ogpkmUNCd5JgNqk16Xt1ZOdJnUuEfuXYfZreZciyYZ+z+lo4bMZBwIcf9E8Tq0KAl7dqqnpObcQeIqwd/Yqh2Fds/8EJFWFBBPwMZ+FkpcVB3H/FxdScNvBi3CoawtaXh3Bflpd/sh5zZYOwm5N1HKTjuUHz3scfFlTD+3u6Lzv/KfQbjsb8WKX3DP+LTQL9OVLggvW8Y5uqpaIEzkeafPd5/t8RTW9J/FbwlU=" + }, + { + "identifier": "{7735620D-E5C9-4C5D-982D-BEE0F2B5ED98}", + "backupDate": 1758887635000, + "type": "AUTHENTIFIANT", + "time": 1758887635, + "action": "BACKUP_REMOVE" + }, + { + "identifier": "{E99E0CBF-CB10-4790-86E2-7AE9B492F1A4}", + "backupDate": 1758887635000, + "type": "DATA_CHANGE_HISTORY", + "time": 1758887635, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkNcaX14uA4b8RtndmdjpI9s6UkLtttynwtYlre1Q5blJIh/Pj+ZwgUnPjRnuXfPcBmEgiQfPeAWZMSZzo6gU1i2LPJGTWOtGTVn8sRdbV+9qb61HdBjdGguq4E6r0gO4zqzsRauLocVcCkX21hygaG15z264ilgkM5ocd1mgZKoxmTA1mXamVEB2jkp+dgHjt7VH6iDIIuLI3A9ggs5f7WSMix6crPxwqzFSNviNzD1t8BlxBFgj0WMIj+h8gejZ7O2F7NH3h67bwhGiscBCnVun4tNvZUwxHKqHXdrsGmpzGN+ez/3T26wgwRx3y3yvIlLfdhgP65VmVjla4GlDrMpaReHVZHkE+m1MdbunKcVGxBrwVizqAZa0LpLJY4hzxEb3D98XezBPJUYu0tbm8Vs4Bt6q00Tt20KWTLyezLnRizRwiAEOKfEwu0p9jLkgn/K+E6PRRsEw0v6fRXE3UFCBndvhfDRB8metwsmUtYKnckC8uTIpKj1Wz6qdl3Jdy1uZNwOUbwEjGTybdoQ6Get5RBva1zptlTCVBMeUXsWGrG2PBv02goawXTc19XJrvgsYJJQgxJU9Ki7bRCtwxyQjOhaV1ljsFZo35W6df8u/ml5HjbBV0PRTc12yK6Nqj6Oll08jMWChTTQR6PI/3zQwWWMLQB+2xWxeuMNsFUtZcedFZTbzk0kKRukS5eyZ+9J/VL992HJv06B9XO5b2B+MumJgP2kzvCu1vFffpITcGBTB4/jAeTxg4D0gQxddoCZVrzbb8ttuo84jH/yB8lLM2cuElXeX7n43CtLiiJU2ifAqJZ3kPQA3Z+Drt7VlA1qt+rU34L8y3s8GEjn8mtTWTgNQ7nCxjnlaQL4geQPU=" + } + ], + "fullBackup": {}, + "timestamp": 1758887635000, + "sharing2": { + "permissionsVersion": "0a973613e957078b49e3e7721ed623c81283b007830c612887580ba29b45ed0b", + "itemGroups": [], + "items": [], + "userGroups": [], + "collections": [] + }, + "syncAllowed": true, + "uploadEnabled": true, + "summary": { + "DATA_CHANGE_HISTORY": { + "{E99E0CBF-CB10-4790-86E2-7AE9B492F1A4}": 1758887635000 + }, + "AUTHENTIFIANT": { + "{AC8CC8AC-61E6-49F8-ACD2-6BD2B4C86D3E}": 1758887627000, + "{1BB7F422-C6BF-450F-958A-7C6B682527BD}": 1758887627000, + "{5CFED12E-92B4-4F1D-B5EF-81BC70E957C3}": 1758887627000 + }, + "SETTINGS": { + "SETTINGS_userId": 1758873336000 + }, + "EMAIL": { + "{6437274A-7027-403D-A1CB-5F4DBE776B63}": 1758873336000 + } + } + } +} diff --git a/test/Dashlane/Fixtures/non-empty-vault.json b/test/Dashlane/Fixtures/non-empty-vault.json index 1f5cdcb6f..4c08e5358 100644 --- a/test/Dashlane/Fixtures/non-empty-vault.json +++ b/test/Dashlane/Fixtures/non-empty-vault.json @@ -1,309 +1,71 @@ { - "transactionList": [ - { - "backupDate": 1453226868000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453226865, - "objectType": "transaction", - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}" - }, - { - "backupDate": 1453210891000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}" - }, - { - "backupDate": 1453210696000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzphA+pFnGUZ305gLQyZARVMIvxSmdm7tut36PQJW8pziaAhpYBi/RhnJcqDQ0VSbn5HHFKpwfmnK5QNElEvKnnibWCBMcgBDuBV3YZYHVcE1hl3X++j9WCFqUTSv1yJukxEMlpJrUjjbLd8nAPssPJoYH6LmBIbJkgOPRDdC4zSMnOAm18KTLVVUdGruyEZlUYRCVxUn8HoYpnup6bCHB81u94MNYid3DvoyAdgjCh7nzLnT9eDAetnkvpoMOywAk2w5e3nbRSUhHyGMzOzrZx2ww1xghxmHpJQqPT14dHTbGSPy4HpLKIASHUjomZGXdwAcaA+vd56jw9QcWxnOi0aN0tBjfNQ9dKjBdvRnMYZeQt0Q5inYVG7YDrt0OisJF2r/PaBy+p/I/NvfpxfV+ejidyA8/vnS0+M29Mc6ma/Y7da+Cgdt9GJXzpQk4mOVK4XnvCVxy4/Rpn1hQzH23/sJIsPbHPj1hEG9M/c+38sZ1acUzD0CO2GhkQ2fAL7kQE17ID+R1lGXQLIEaa93k5r+eHuLCmRdygvHOCt0S6zQza+evUodiKS+eBIP196OAouGNhLuvw/x+TP++SInM0guV/umiOv74FhL8QuOCOi/cSy1MXfGoBxaD4OrtGIEo+nI8lbkMwsy4bTBAqUkSF+bAboVgk0y+ThnbW4iMUg6hIe2nHsVlwtWNSMYPDVPKQULYFBF8YPL2ITmQDWx+nhX7FOoFT573jahN+QmFxvIGg4QuVe/gOfv68rCn8rxBPwWBu1nZEKLuXcqni6fR5G2so88CI03neUs/d8tLUfXghPZJ4n/DF9naVd5Nwj81Jnoc8Zb5c11lPphekcqM/66zyWyfUd6v5jooGGXXgpu8yaUlTYzJaGCgY6YtvGOt6cx0hchPhUcInhb1KjHk9ju/upP0yjqBo7KjiYR6wJE1ndDA8X1treFrquJhCh6Qw5PXfnQZMhFQU5P/3E/Sb2NcCGeZPQxbjadFuH7WkTG+5L+J1vNqgxdCPeYoeTLpQUnJXGgLaYPrEcqylqGGkNfbZzCqiBbprDoal7zRJRFXrgbmpL8qx/EC8OxM8hcHQvu2Z2pLGPryLT2Zl3b9xJgRyr8jCBJl+OKQA0Jf/rrHf9MbKgGBN++2pwwRWdhjqSVFxByPlzC00PrRH284VBqsCXw+JFyOb13F7DbyJxvOE9LuxiL8ri6VFdcgMjai3iSTwWyoq1CKdE7NHEAj3hniixApfBZRNkxmT1UKoIIQnM701W0Wp0/Sj7PVd4d+nGvyn1U+1WnP0V4WW5FQVjZwcU9kUdRvzAyB/2tr9BoroFATemhRBiSY0egzX9mpJ2zNsZ59hXnSsx4JrFrYcPFiUGOeGc4Fy8NNHSDV5dzxADf98c9ybfWhzF4w9m2EWbC2fIBF81qiboQauY//ZRMm5lbMq7tH9rdqcXMIM5yQZgmEs9Gz1tPfWL1CFX43h85fP6r+W2etdj2bEZKBiNIhB/Tzg7OiAz+bwuZ03XkoTIxoxWBfJsPyO8dLfSe/SJsmAuJ50I9m6oYvTPrAfA==" - }, - { - "backupDate": 1453210696000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzZS6BP+U8RyTCev8l1M2AAG71gU+FXwDqVA71XaIbDD5Tsmos/hrObgUQ97vBMDhxNfXFkgnWcKVbjVhAUm+b7GpqL/DL9e6bX2QID+U5zqkK1S9KgvnVlsJJJZIrxBdgR2ixUkT7GxPZMdF7WkImKtC7N0pLvQpV1D1T9Yezys4=" - }, - { - "backupDate": 1453210891000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzT2XNoa5f6d1YtrBFSnIfNnADDmno73z66z3noFgs8CSWpZvgMVRaSPts4mMab2SEVPuxJgA2s0nXK1g0/YskCT7Fs4Mt3v9Vj/jo14Xa3FfV8b//X2zJkJ5SU2VmQIIWIMh+HYsGZS7N2egpL22AheSNFDlU2aBs5U4LED4HNBFhngVDRAC2BEzhTYKV21G2Oc37sV38N8vOY4jXGU0aU2GeO1JeidCdgw45f5sEnnp990+/S+IGZWfKxnxeRobiP7XjOxgkJvEJG0qjGn3ECqCCLukGrmuSmQDtN6kQCo2ynWclp8JNZQJhR6X37ihcenWaDMK32cOXyrcbFn2m2ACwF2iGm76DhrBowYVbKvs0h3L5crBY7vjfaXgRsXxjzVH9q7eUArsla54YESeyBcXNI7G1rmKTUfrt5/5f/Ri9zCLeMNdiv8QgxnZIZuBC0CAwn6pRY3V/8QSqh1BAY/A7PwYag1N4zPeKeUTmmots031jDQ8SKS6qmG3C9yeQUOV+NW+j/wah2849li6qdedO1qKtnw0j7Jg0is+WKpVmnLfV8RTrCf34MQfP2NC+yJwjTv8lMlVsCD6UynocXj11sy+ERmDYUazRaIIVJimC4pCMebRiZPl2V883D+vUAIQYYfHLuC8OJCt75GXP6ofQwL3ZcHvH7ASVPpaXKdbQbcs+zilWNQ7Bz8yqZi1QkyPuLZZklxVdTpdsWlf6yYKedIQSccGdWPN7OBQ5BSlpv7jL7awwlsBXlB0JVVBj5CAIY3RLxauJRyejRawSWG3/E2tYUTHsFmpQJRNzLSk=" - }, - { - "backupDate": 1453226868000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453226865, - "objectType": "transaction", - "identifier": "{D5916191-FCBA-4D25-8676-53E6CEB61397}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzaQWkd/oE6b6cunO6kxYffPIQPUF1Qdj9hhdfX5Nj2lbsdVMRDk/iHRtV742J8CEYhzOzJi3Fno4nMZcfzqdQY1Eakvj79eGy9JnEewVaNXaDil3m3ByKE8I8DfLBJss+pf+LnlV0y6AkqmOjl7J30esaGy3MMUPo1cLb1W5Nqsp5qvSKynah/AHenx09mF+23X3eJI4Y5j3+wRTQ2VuC0dfiTZdIpUGxmCHp3Z73lGrP+X4SOEp72NygWUd/u5lFj/ynJzVLbJrufrWeuHwv1kS/Zr3+QOsrj6nS0S+lyptF+7AmtoJ4LrEYodm1/Q1SxECc7KuBurqr7aZ305v/UjLNG1lJfQWTYaO7J/gxkUUwbdXzkcRZ8/yHuLmf4nDI9XeQx5lr4vqUc0wraKOK0k97HuBgm5ZELuZEZhy/gZADjU9T+nLd+HKd+f1oITFUcuQZOxjsV53AIsQO8KMVRj54IHkZIrht8TEGry7S+Unox5htdqjF0zGULv82IR3vQ0RVq3H4DS2c+DiMXCMTe37NmJwWiXRU492WYJ7HymVJXGgPmGt4XWPkcYqDLA7hCKtb28SBuGFO/gHLhlJ/OcJA7EDJkFs+WJ0HxUP0nchII8DtXXusMwPCTTjnmo6wQ4QKT69nf98qirPYg4WhRaHwGuqf+GNHucErJhxHM8keV8sdhmlclYBoCf0IkqCWFH+ngmyH5sQHF1z5S1KRYj7oLSqE4oKoakslsG9qRpjUsC24n8ci4IhV4tlY+FrK9KMOUZF4zKVXay0n8Mwidw==" - }, - { - "backupDate": 1453228251000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_EDIT", - "time": 1453228249, - "objectType": "transaction", - "identifier": "{0E1B1BAB-B690-4DF2-BC43-D7D28A4437FC}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzDIv8L5VlBZh4YTsRjw/76iC2hdTOJPRXQYLFMcTSfjM/FoWNu+zhq6Rh45UZyB3npoC+K+Myoway9nW8/R5VXZVgXDf7PTer2Uuzsr7JYZHKWGON0HnMUNNEt/Y6tsae5P3GBy7YMvw7TbJPimGrjntGNtkD7a4QKF7rd1/BTDBI0N6FyjeMyykHMRPcDhNXPkqUJDygwMVAmUYVdehbBpdMGTrB6N/p5vJJ2p3KMxGogzCuVFR0a3FXbwZXGE3Q803oEyRtvM9uVCtYtSkGd08v/ioN2i1VJKNL3Me+TjDwdlCPrUPPNTycgbnWQx0aokzXuqEMpWfPUEzV6ttFpmWTp5kMWpmuM65hX0WZFRCXcAQyDzOfyuZKEXKHjPel/rXT04ksMMnjbNUkXjiaqVQND1X1oKKImMbuJfG6/Cut0BxLdZDf4TfBB1wqYPYml+8j3jrUmw6+VXUywCSkO74VSFS5w6a0MXEFuzXb1vpMh2lKduG/k15rMNnzFeSEUmx2H5dF3GTidFbqXn00cvUbje5XGaGU6NUuggc+Dg71gEa0jYK5+5DomHXKJ0dBtS7RtUB9T54o9UMIWmGZ5f7tHW+UVBOxt/DfWh1PBi65aZUXmHqHUBbxPCfBy4rWYjfOgjSuetdI/535yPn6zZHwcdLSD0pfRilITYGRaxs=" + "requestId": "af666705-943c-410c-bdb5-add9d48e9f39", + "data": { + "transactions": [ + { + "identifier": "SETTINGS_userId", + "backupDate": 1758558722000, + "type": "SETTINGS", + "time": 1758138708, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+Bh3L4mHKIKg3Rw708//HQjqHs6oBPCoCZjI0ixUbtJUvbMVFfgTu1/4mBD4vME/Ttuxc14wOuQZM4VOElKTxaI9bZNcIAfBHzCaIhEVPg9ydS1sWQWluBSqoITaA08PXPNRKWJuNmeU4gLuUvgwpKZAHKRMvgVKUj2ZVObY4pteD+SIqjPNtzqjP5sRnmyySFwUWfjshZ0G9NzfFkfmkWyqmWhqg2+EDMgNfSPD9EFipBwcOlUg2nR/L/Aey3DL7xyEt7i/NoAeII4hT8ZuZC5poiRuGqD+qtcBYMX7jFDViVSSO56ejGjYRvqMP/H46wGusjH8uedU1SbGFJlB8F7jlyMY4Zsqv582GJa6phjIW8zjoKcbqWFTUaWw142HluDmDSknIapUAjjOLHy0G5WXnDM3s61A1Gl9bSEc5D+WCir/lxbqt3UjkVuJPP2WmRs6DhnpsBwzRHF8RtimnmojTPpR0xQQLIz+B6R5j9i/fH2+wSifvooCJLF5uj5AdaRonXPgmtSpnPxZwqmpGkeuXmNySDpE2f9FYiXeVJAfdqnsrZNGo/+2BvNbMj0gfSR1Cpo0j8nr+9+AvudHcxurLDvZ3k5q2SRWdrfbkK8AsD3RjRc4pFulBojp3CYYX1LsCSFa6j6uoHy2cTJHnb4xDY8Hd5+vJahL0tbrbnVlaG1zsUp+FzVheBpnrzL/yelQnyPi9cdBpgX1gGFQRuHh6et4xGo3HC3KV7OzgsmyW4OwkjfcBaCV7nQ1GA2s0yc1b4HY/kgJ82q5i0NUaAV5AtgRhswJvi39NPxOEU3RfIG5ETijdsJ07Xhi126UIE+TqJgehXqbbnVPeH+WTuuU=" + }, + { + "identifier": "{4084481C-0787-4163-AFBB-AB100725833F}", + "backupDate": 1758558722000, + "type": "EMAIL", + "time": 1758138710, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+Br68IVkpT3TcAVDd1B5XuT9wrccJ2k39J25c5Z1jUE7ea+PwpY4fKfmYBnZ5NYD4UiglCGAUMeHp6kEk0GL/IkwxAPI7VJt5yzsbc8TWY+WEvVtSFFJogSuZQazIJ48FvhxOeYy4an1dCDpgomhz/Jv9/8CgkW2VYdppTSBmeB+RKUPDFzbkbOd7DMJkv958EcFQxPiDiTRmWPi6x0Ym6qrJkN2WcIgojI2BH22QZylLbBigb77hwjN3rylBoYiAyRMHDcJH3l3R9AcHeDXNf9iGKB4z78NhWQVkv9SVN8ft94Dzw9wJnKb9OHEsThhXvfHhW9grLhf0Ii5u8LHlpn9THDl8biq38kzGwNno4Fvn/uSJFL+Xkrqc7/VDUukrVP6N/DeKvmgzLrlZlcClr2MYlwNBNqbLeOIoE63eeSxr" + }, + { + "identifier": "{499E5C10-C8DC-466A-9785-AEC8382217DB}", + "backupDate": 1758884066000, + "type": "AUTHENTIFIANT", + "time": 1758884067, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+Bjcg0wnL7GSQTNVpESOHjEwmlpiaGmJNZVX1UruVV95ial+OFdR6KQ6fbh1iv0GlrJK1xMazNEaNr43YuttypgKLgwTZjWWAsvaxuOZakAXV9eVUx9Av6avcSjys40056/in2FWkTAHLxxk8TYqtbG5OMzqc4WiIUpOl3uDvQLqg5of7mqc1ETnba0TumOLzhzWfiNjJqC0wKrNqqkaRyBNB5TlzXV2Dq1PCTkaF0Mb4JsMcbDe78KnbXinfT5XpRv0cObCLOOB/4AgXCSvxJZckANZmfOWfIuZHamPKbgJh48forq7ZkKGTM2xK7VzU1ZBK4fDFSx5RyAyQFhQX/0oNGlCqQCl1gY4UtEKK+jsi38R0pgxv2UnhTByXXKr8cjHOXJnEwcQDVU1RvMQQ8MHFawX4R9ubg0+uBLnpfdmmJ17zmPn9htAABrjWcn/LEYgF6lyf6aGnAbXINt8qcjUyoJX7SkksoBFZPbpqeK/u0Bbm4fyqrYUoQH93bfzGfTNjtv0Ac+lKH0TjYh3tcP5zHlMk/B5p+KHOgDYu6r1voZsIOTy81G4NC6rc1aadn1bBssux3Le2srdaFi5ERR0qxLqUjfTvBAGMZX4gprw0ieuCB7ppe50qzqmWCk+u2LHDZa2HUisX6d8JE6f5Ax4NAfe+1GsrjIyEtoyMC0l87mNCDSfb27Y7kL1dV0WHRRzRKGlNlRoBdTwj2KfuSQuTjulpFVVG3WKbp+0iWTPjkj6yI/OB2oV9NmM9ON9R5g==" + }, + { + "identifier": "{32B0CE17-6929-4E20-9CC5-26DCD3835B69}", + "backupDate": 1758884121000, + "type": "AUTHENTIFIANT", + "time": 1758884121, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+BmU8GZReOo8qJ7lMFr47ftkDhmSR9949RWqCC2AMo2kFi5aOo/630FpsEec8eFEMYa24GXaBth3UQEJuOxzg0U1rDu9KF3ZoL8l5QEWtEArtuOIGmzR2by2hdE4q/OSlo4Qxd1BCDTEsCsJCuqbufxGz6r0u2ItblX/+PdDUi14zKFq/ft1na3k7vIPgKOX0ieQld7iBduVY3ohl8qK6J/4gs+LajTcoGNTDyki/pqEYZjyTHjI/vd9w7umsQslfq1mWQZQZw+QONSKFp1LO7IgWzy0BCQCwFI8HZ/9NW3ZpyHz3ovtrC7HtDWsgDss/KfvKmShmsX4Avb0LVsSAIBRqvCOKMksJqONvbCZ1REi10YD4TsB1x4LZx47QUfTxMeefo2HKUab8RcRvNClwcWyoP3ngUQAB6JUBr+znf3deMegERzRzuQHfcP/jnJDsJYsdegPYZU0BsAq35ji7gIq/LellxYUP2i0CJG7c+z6V09Vl2C3PbxLRBwsEBOh2oh2VHYHq5wgk4fJwfeqzJduX4GehTv14hVeAsFv6b9DSBDWPeuV90W/AKQtab8M7P4vCO6/xqIRFbP1gr+i0koXV3h2afzcWRp9pZgjsOKLLv0ZrZFwVsPH4tz4Ra2NBHngNKwdO7Ga561sxU4No/B+r47qH9cKtVI/YDMOm+NustooZcmGjefXBGLDBum1utr/XQcFczcXKxMIpr4Ib0gYi5g/XuUIe9j1zJlMrvLd6o8od7aGCoV7t08GMyuoRoQ==" + }, + { + "identifier": "{647E63D0-0024-4E64-B264-D7D1293E3B39}", + "backupDate": 1758884144000, + "type": "AUTHENTIFIANT", + "time": 1758884145, + "action": "BACKUP_EDIT", + "content": "JDEkYXJnb24yZCQxNiQzJDMyNzY4JDIkYWVzMjU2JGNiY2htYWMkMTYkj+OFlkXQYTjUuUlCXh3+BhO6IyymEm8FfFo9KWO/zhrIaanmwR9IFoeCvqzeOTXG2BtrQcgz0wNd8nFEiLsPCxahL+UqWoNiYcrOy1vcf0JgUZdFSbbehcT/OLQACUqVW/NHav5+4nuUwTFMFiTm/rkAWzxmXElMzV2SWz2oFtRCD99hwTWrvK+5nmgShCUVmKTyIXQJP2uSBeh4iQz6xFpeewk1XFiGDB4Fr1d87pO4BJwaRq9MXH+4Nj+jgxyu5jWYlI4jBY4gXdKs0fSEo5TzzvJrn+jHmeTKjlYU6l8Cr04mI+Xz4YzSGBn48DQiHcl1ozFPXcUmdbG/LI2ovkNcxwjPp0Ee7A5g/utmPRtqlAS7L//7k0/1IY5K3AoqBMH1ddQ2M7O0bTLlxwhv+azrEyZJiNGgipDNe2wkTvYNfHrJiY+vu0CG3/KppFLrNjgYAHDoA6Db6pojN9xtNyxYtrQ843ri48fPpSsX1s8JktgJCbKXwLZCk3VhtDWmeh/ltU6WY6KFb4FUabzpAytVmlujj9kn+V4CpkyXhUDFp11BLp9LD4Hyeb0BoD52zQPefNRubZuknQV/IV33DUO5SKkQ+/ojtPXGJCXJ/3xXBU9i/z5LWWiIitfPR/v95liLXGlrbU/IW2lcmwGop4128oVn/3UmJJx12TgcuazmOJ497u8Y5L1noE9/HDQ07siPwK3JcN4zhNi4clfiZC0kS7pqDroeYAR7AICioMyatVkll3MZjwlKMf63ntCYBaGdmdSWHSXmDywPwoGd+g==" + } + ], + "fullBackup": {}, + "timestamp": 1758884144000, + "sharing2": { + "permissionsVersion": "0a973613e957078b49e3e7721ed623c81283b007830c612887580ba29b45ed0b", + "itemGroups": [], + "items": [], + "userGroups": [], + "collections": [] + }, + "syncAllowed": true, + "uploadEnabled": true, + "summary": { + "AUTHENTIFIANT": { + "{647E63D0-0024-4E64-B264-D7D1293E3B39}": 1758884144000, + "{32B0CE17-6929-4E20-9CC5-26DCD3835B69}": 1758884121000, + "{499E5C10-C8DC-466A-9785-AEC8382217DB}": 1758884066000 + }, + "SETTINGS": { + "SETTINGS_userId": 1758558722000 + }, + "EMAIL": { + "{4084481C-0787-4163-AFBB-AB100725833F}": 1758558722000 + } + } } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453210696000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453210696000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453210696000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453210696000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453210696000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453210696000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453210696000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453210696000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453210696000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453210696000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453210696000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453210696000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453210696000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453210696000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453210696000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453210696000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453210696000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453210696000 - }, - { - "identifier": "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}", - "backupDate": 1453210696000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453228251000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453210696000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453210696000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453210696000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453210696000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453210696000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453210696000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453210696000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453210696000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453210696000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453210696000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453210696000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453210696000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453210696000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453210696000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453210696000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453210696000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453210696000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453210696000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453210696000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453210696000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453210696000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453210696000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453210696000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453210696000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453210696000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453210696000 - }, - "AUTHENTIFIANT": { - "{0E1B1BAB-B690-4DF2-BC43-D7D28A4437FC}": 1453228251000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453210696000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453210696000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453210696000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453210696000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453210696000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453210696000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453210696000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453210696000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453210696000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453210696000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453210696000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453210696000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453210696000 - }, - "DATA_CHANGE_HISTORY": { - "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}": 1453210696000, - "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}": 1453210891000, - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453210696000, - "{D5916191-FCBA-4D25-8676-53E6CEB61397}": 1453226868000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453210696000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453210696000 - } - } - } } diff --git a/test/Dashlane/Fixtures/perform-totp-verification.json b/test/Dashlane/Fixtures/perform-totp-verification.json new file mode 100644 index 000000000..c14e3f2e4 --- /dev/null +++ b/test/Dashlane/Fixtures/perform-totp-verification.json @@ -0,0 +1,6 @@ +{ + "requestId": "9efb28c6-347a-402f-9a3d-f3e9c4b95ec7", + "data": { + "authTicket": "ded7bc9ecaf3311d537cfb9cba38e5508cc86a584e6f7576c710a562875eac19" + } +} diff --git a/test/Dashlane/Fixtures/two-accounts-in-fullfile-one-remove-transaction.json b/test/Dashlane/Fixtures/two-accounts-in-fullfile-one-remove-transaction.json deleted file mode 100644 index efbbd8cf2..000000000 --- a/test/Dashlane/Fixtures/two-accounts-in-fullfile-one-remove-transaction.json +++ /dev/null @@ -1,286 +0,0 @@ -{ - "transactionList": [ - { - "backupDate": 1453210891000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}" - }, - { - "backupDate": 1453210696000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzphA+pFnGUZ305gLQyZARVMIvxSmdm7tut36PQJW8pziaAhpYBi/RhnJcqDQ0VSbn5HHFKpwfmnK5QNElEvKnnibWCBMcgBDuBV3YZYHVcE1hl3X++j9WCFqUTSv1yJukxEMlpJrUjjbLd8nAPssPJoYH6LmBIbJkgOPRDdC4zSMnOAm18KTLVVUdGruyEZlUYRCVxUn8HoYpnup6bCHB81u94MNYid3DvoyAdgjCh7nzLnT9eDAetnkvpoMOywAk2w5e3nbRSUhHyGMzOzrZx2ww1xghxmHpJQqPT14dHTbGSPy4HpLKIASHUjomZGXdwAcaA+vd56jw9QcWxnOi0aN0tBjfNQ9dKjBdvRnMYZeQt0Q5inYVG7YDrt0OisJF2r/PaBy+p/I/NvfpxfV+ejidyA8/vnS0+M29Mc6ma/Y7da+Cgdt9GJXzpQk4mOVK4XnvCVxy4/Rpn1hQzH23/sJIsPbHPj1hEG9M/c+38sZ1acUzD0CO2GhkQ2fAL7kQE17ID+R1lGXQLIEaa93k5r+eHuLCmRdygvHOCt0S6zQza+evUodiKS+eBIP196OAouGNhLuvw/x+TP++SInM0guV/umiOv74FhL8QuOCOi/cSy1MXfGoBxaD4OrtGIEo+nI8lbkMwsy4bTBAqUkSF+bAboVgk0y+ThnbW4iMUg6hIe2nHsVlwtWNSMYPDVPKQULYFBF8YPL2ITmQDWx+nhX7FOoFT573jahN+QmFxvIGg4QuVe/gOfv68rCn8rxBPwWBu1nZEKLuXcqni6fR5G2so88CI03neUs/d8tLUfXghPZJ4n/DF9naVd5Nwj81Jnoc8Zb5c11lPphekcqM/66zyWyfUd6v5jooGGXXgpu8yaUlTYzJaGCgY6YtvGOt6cx0hchPhUcInhb1KjHk9ju/upP0yjqBo7KjiYR6wJE1ndDA8X1treFrquJhCh6Qw5PXfnQZMhFQU5P/3E/Sb2NcCGeZPQxbjadFuH7WkTG+5L+J1vNqgxdCPeYoeTLpQUnJXGgLaYPrEcqylqGGkNfbZzCqiBbprDoal7zRJRFXrgbmpL8qx/EC8OxM8hcHQvu2Z2pLGPryLT2Zl3b9xJgRyr8jCBJl+OKQA0Jf/rrHf9MbKgGBN++2pwwRWdhjqSVFxByPlzC00PrRH284VBqsCXw+JFyOb13F7DbyJxvOE9LuxiL8ri6VFdcgMjai3iSTwWyoq1CKdE7NHEAj3hniixApfBZRNkxmT1UKoIIQnM701W0Wp0/Sj7PVd4d+nGvyn1U+1WnP0V4WW5FQVjZwcU9kUdRvzAyB/2tr9BoroFATemhRBiSY0egzX9mpJ2zNsZ59hXnSsx4JrFrYcPFiUGOeGc4Fy8NNHSDV5dzxADf98c9ybfWhzF4w9m2EWbC2fIBF81qiboQauY//ZRMm5lbMq7tH9rdqcXMIM5yQZgmEs9Gz1tPfWL1CFX43h85fP6r+W2etdj2bEZKBiNIhB/Tzg7OiAz+bwuZ03XkoTIxoxWBfJsPyO8dLfSe/SJsmAuJ50I9m6oYvTPrAfA==" - }, - { - "backupDate": 1453210696000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzZS6BP+U8RyTCev8l1M2AAG71gU+FXwDqVA71XaIbDD5Tsmos/hrObgUQ97vBMDhxNfXFkgnWcKVbjVhAUm+b7GpqL/DL9e6bX2QID+U5zqkK1S9KgvnVlsJJJZIrxBdgR2ixUkT7GxPZMdF7WkImKtC7N0pLvQpV1D1T9Yezys4=" - }, - { - "backupDate": 1453210891000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzT2XNoa5f6d1YtrBFSnIfNnADDmno73z66z3noFgs8CSWpZvgMVRaSPts4mMab2SEVPuxJgA2s0nXK1g0/YskCT7Fs4Mt3v9Vj/jo14Xa3FfV8b//X2zJkJ5SU2VmQIIWIMh+HYsGZS7N2egpL22AheSNFDlU2aBs5U4LED4HNBFhngVDRAC2BEzhTYKV21G2Oc37sV38N8vOY4jXGU0aU2GeO1JeidCdgw45f5sEnnp990+/S+IGZWfKxnxeRobiP7XjOxgkJvEJG0qjGn3ECqCCLukGrmuSmQDtN6kQCo2ynWclp8JNZQJhR6X37ihcenWaDMK32cOXyrcbFn2m2ACwF2iGm76DhrBowYVbKvs0h3L5crBY7vjfaXgRsXxjzVH9q7eUArsla54YESeyBcXNI7G1rmKTUfrt5/5f/Ri9zCLeMNdiv8QgxnZIZuBC0CAwn6pRY3V/8QSqh1BAY/A7PwYag1N4zPeKeUTmmots031jDQ8SKS6qmG3C9yeQUOV+NW+j/wah2849li6qdedO1qKtnw0j7Jg0is+WKpVmnLfV8RTrCf34MQfP2NC+yJwjTv8lMlVsCD6UynocXj11sy+ERmDYUazRaIIVJimC4pCMebRiZPl2V883D+vUAIQYYfHLuC8OJCt75GXP6ofQwL3ZcHvH7ASVPpaXKdbQbcs+zilWNQ7Bz8yqZi1QkyPuLZZklxVdTpdsWlf6yYKedIQSccGdWPN7OBQ5BSlpv7jL7awwlsBXlB0JVVBj5CAIY3RLxauJRyejRawSWG3/E2tYUTHsFmpQJRNzLSk=" - } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453210696000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453210696000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453210696000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453210696000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453210696000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453210696000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453210696000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453210696000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453210696000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453210696000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453210696000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453210696000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453210696000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453210696000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453210696000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453210696000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453210696000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453210696000 - }, - { - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}", - "backupDate": 1453210696000 - }, - { - "identifier": "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}", - "backupDate": 1453210696000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453210891000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453210696000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453210696000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453210696000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453210696000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453210696000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453210696000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453210696000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453210696000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453210696000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453210696000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453210696000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453210696000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453210696000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453210696000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453210696000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453210696000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453210696000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453210696000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453210696000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453210696000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453210696000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453210696000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453210696000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453210696000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453210696000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453210696000 - }, - "AUTHENTIFIANT": { - "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}": 1453210696000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453210696000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453210696000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453210696000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453210696000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453210696000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453210696000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453210696000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453210696000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453210696000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453210696000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453210696000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453210696000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453210696000 - }, - "DATA_CHANGE_HISTORY": { - "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}": 1453210696000, - "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}": 1453210891000, - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453210696000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453210696000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453210696000 - } - } - } -} diff --git a/test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-one-add-transactions.json b/test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-one-add-transactions.json deleted file mode 100644 index 1f5cdcb6f..000000000 --- a/test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-one-add-transactions.json +++ /dev/null @@ -1,309 +0,0 @@ -{ - "transactionList": [ - { - "backupDate": 1453226868000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453226865, - "objectType": "transaction", - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}" - }, - { - "backupDate": 1453210891000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}" - }, - { - "backupDate": 1453210696000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzphA+pFnGUZ305gLQyZARVMIvxSmdm7tut36PQJW8pziaAhpYBi/RhnJcqDQ0VSbn5HHFKpwfmnK5QNElEvKnnibWCBMcgBDuBV3YZYHVcE1hl3X++j9WCFqUTSv1yJukxEMlpJrUjjbLd8nAPssPJoYH6LmBIbJkgOPRDdC4zSMnOAm18KTLVVUdGruyEZlUYRCVxUn8HoYpnup6bCHB81u94MNYid3DvoyAdgjCh7nzLnT9eDAetnkvpoMOywAk2w5e3nbRSUhHyGMzOzrZx2ww1xghxmHpJQqPT14dHTbGSPy4HpLKIASHUjomZGXdwAcaA+vd56jw9QcWxnOi0aN0tBjfNQ9dKjBdvRnMYZeQt0Q5inYVG7YDrt0OisJF2r/PaBy+p/I/NvfpxfV+ejidyA8/vnS0+M29Mc6ma/Y7da+Cgdt9GJXzpQk4mOVK4XnvCVxy4/Rpn1hQzH23/sJIsPbHPj1hEG9M/c+38sZ1acUzD0CO2GhkQ2fAL7kQE17ID+R1lGXQLIEaa93k5r+eHuLCmRdygvHOCt0S6zQza+evUodiKS+eBIP196OAouGNhLuvw/x+TP++SInM0guV/umiOv74FhL8QuOCOi/cSy1MXfGoBxaD4OrtGIEo+nI8lbkMwsy4bTBAqUkSF+bAboVgk0y+ThnbW4iMUg6hIe2nHsVlwtWNSMYPDVPKQULYFBF8YPL2ITmQDWx+nhX7FOoFT573jahN+QmFxvIGg4QuVe/gOfv68rCn8rxBPwWBu1nZEKLuXcqni6fR5G2so88CI03neUs/d8tLUfXghPZJ4n/DF9naVd5Nwj81Jnoc8Zb5c11lPphekcqM/66zyWyfUd6v5jooGGXXgpu8yaUlTYzJaGCgY6YtvGOt6cx0hchPhUcInhb1KjHk9ju/upP0yjqBo7KjiYR6wJE1ndDA8X1treFrquJhCh6Qw5PXfnQZMhFQU5P/3E/Sb2NcCGeZPQxbjadFuH7WkTG+5L+J1vNqgxdCPeYoeTLpQUnJXGgLaYPrEcqylqGGkNfbZzCqiBbprDoal7zRJRFXrgbmpL8qx/EC8OxM8hcHQvu2Z2pLGPryLT2Zl3b9xJgRyr8jCBJl+OKQA0Jf/rrHf9MbKgGBN++2pwwRWdhjqSVFxByPlzC00PrRH284VBqsCXw+JFyOb13F7DbyJxvOE9LuxiL8ri6VFdcgMjai3iSTwWyoq1CKdE7NHEAj3hniixApfBZRNkxmT1UKoIIQnM701W0Wp0/Sj7PVd4d+nGvyn1U+1WnP0V4WW5FQVjZwcU9kUdRvzAyB/2tr9BoroFATemhRBiSY0egzX9mpJ2zNsZ59hXnSsx4JrFrYcPFiUGOeGc4Fy8NNHSDV5dzxADf98c9ybfWhzF4w9m2EWbC2fIBF81qiboQauY//ZRMm5lbMq7tH9rdqcXMIM5yQZgmEs9Gz1tPfWL1CFX43h85fP6r+W2etdj2bEZKBiNIhB/Tzg7OiAz+bwuZ03XkoTIxoxWBfJsPyO8dLfSe/SJsmAuJ50I9m6oYvTPrAfA==" - }, - { - "backupDate": 1453210696000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzZS6BP+U8RyTCev8l1M2AAG71gU+FXwDqVA71XaIbDD5Tsmos/hrObgUQ97vBMDhxNfXFkgnWcKVbjVhAUm+b7GpqL/DL9e6bX2QID+U5zqkK1S9KgvnVlsJJJZIrxBdgR2ixUkT7GxPZMdF7WkImKtC7N0pLvQpV1D1T9Yezys4=" - }, - { - "backupDate": 1453210891000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzT2XNoa5f6d1YtrBFSnIfNnADDmno73z66z3noFgs8CSWpZvgMVRaSPts4mMab2SEVPuxJgA2s0nXK1g0/YskCT7Fs4Mt3v9Vj/jo14Xa3FfV8b//X2zJkJ5SU2VmQIIWIMh+HYsGZS7N2egpL22AheSNFDlU2aBs5U4LED4HNBFhngVDRAC2BEzhTYKV21G2Oc37sV38N8vOY4jXGU0aU2GeO1JeidCdgw45f5sEnnp990+/S+IGZWfKxnxeRobiP7XjOxgkJvEJG0qjGn3ECqCCLukGrmuSmQDtN6kQCo2ynWclp8JNZQJhR6X37ihcenWaDMK32cOXyrcbFn2m2ACwF2iGm76DhrBowYVbKvs0h3L5crBY7vjfaXgRsXxjzVH9q7eUArsla54YESeyBcXNI7G1rmKTUfrt5/5f/Ri9zCLeMNdiv8QgxnZIZuBC0CAwn6pRY3V/8QSqh1BAY/A7PwYag1N4zPeKeUTmmots031jDQ8SKS6qmG3C9yeQUOV+NW+j/wah2849li6qdedO1qKtnw0j7Jg0is+WKpVmnLfV8RTrCf34MQfP2NC+yJwjTv8lMlVsCD6UynocXj11sy+ERmDYUazRaIIVJimC4pCMebRiZPl2V883D+vUAIQYYfHLuC8OJCt75GXP6ofQwL3ZcHvH7ASVPpaXKdbQbcs+zilWNQ7Bz8yqZi1QkyPuLZZklxVdTpdsWlf6yYKedIQSccGdWPN7OBQ5BSlpv7jL7awwlsBXlB0JVVBj5CAIY3RLxauJRyejRawSWG3/E2tYUTHsFmpQJRNzLSk=" - }, - { - "backupDate": 1453226868000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453226865, - "objectType": "transaction", - "identifier": "{D5916191-FCBA-4D25-8676-53E6CEB61397}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzaQWkd/oE6b6cunO6kxYffPIQPUF1Qdj9hhdfX5Nj2lbsdVMRDk/iHRtV742J8CEYhzOzJi3Fno4nMZcfzqdQY1Eakvj79eGy9JnEewVaNXaDil3m3ByKE8I8DfLBJss+pf+LnlV0y6AkqmOjl7J30esaGy3MMUPo1cLb1W5Nqsp5qvSKynah/AHenx09mF+23X3eJI4Y5j3+wRTQ2VuC0dfiTZdIpUGxmCHp3Z73lGrP+X4SOEp72NygWUd/u5lFj/ynJzVLbJrufrWeuHwv1kS/Zr3+QOsrj6nS0S+lyptF+7AmtoJ4LrEYodm1/Q1SxECc7KuBurqr7aZ305v/UjLNG1lJfQWTYaO7J/gxkUUwbdXzkcRZ8/yHuLmf4nDI9XeQx5lr4vqUc0wraKOK0k97HuBgm5ZELuZEZhy/gZADjU9T+nLd+HKd+f1oITFUcuQZOxjsV53AIsQO8KMVRj54IHkZIrht8TEGry7S+Unox5htdqjF0zGULv82IR3vQ0RVq3H4DS2c+DiMXCMTe37NmJwWiXRU492WYJ7HymVJXGgPmGt4XWPkcYqDLA7hCKtb28SBuGFO/gHLhlJ/OcJA7EDJkFs+WJ0HxUP0nchII8DtXXusMwPCTTjnmo6wQ4QKT69nf98qirPYg4WhRaHwGuqf+GNHucErJhxHM8keV8sdhmlclYBoCf0IkqCWFH+ngmyH5sQHF1z5S1KRYj7oLSqE4oKoakslsG9qRpjUsC24n8ci4IhV4tlY+FrK9KMOUZF4zKVXay0n8Mwidw==" - }, - { - "backupDate": 1453228251000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_EDIT", - "time": 1453228249, - "objectType": "transaction", - "identifier": "{0E1B1BAB-B690-4DF2-BC43-D7D28A4437FC}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzDIv8L5VlBZh4YTsRjw/76iC2hdTOJPRXQYLFMcTSfjM/FoWNu+zhq6Rh45UZyB3npoC+K+Myoway9nW8/R5VXZVgXDf7PTer2Uuzsr7JYZHKWGON0HnMUNNEt/Y6tsae5P3GBy7YMvw7TbJPimGrjntGNtkD7a4QKF7rd1/BTDBI0N6FyjeMyykHMRPcDhNXPkqUJDygwMVAmUYVdehbBpdMGTrB6N/p5vJJ2p3KMxGogzCuVFR0a3FXbwZXGE3Q803oEyRtvM9uVCtYtSkGd08v/ioN2i1VJKNL3Me+TjDwdlCPrUPPNTycgbnWQx0aokzXuqEMpWfPUEzV6ttFpmWTp5kMWpmuM65hX0WZFRCXcAQyDzOfyuZKEXKHjPel/rXT04ksMMnjbNUkXjiaqVQND1X1oKKImMbuJfG6/Cut0BxLdZDf4TfBB1wqYPYml+8j3jrUmw6+VXUywCSkO74VSFS5w6a0MXEFuzXb1vpMh2lKduG/k15rMNnzFeSEUmx2H5dF3GTidFbqXn00cvUbje5XGaGU6NUuggc+Dg71gEa0jYK5+5DomHXKJ0dBtS7RtUB9T54o9UMIWmGZ5f7tHW+UVBOxt/DfWh1PBi65aZUXmHqHUBbxPCfBy4rWYjfOgjSuetdI/535yPn6zZHwcdLSD0pfRilITYGRaxs=" - } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453210696000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453210696000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453210696000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453210696000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453210696000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453210696000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453210696000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453210696000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453210696000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453210696000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453210696000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453210696000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453210696000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453210696000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453210696000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453210696000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453210696000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453210696000 - }, - { - "identifier": "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}", - "backupDate": 1453210696000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453228251000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453210696000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453210696000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453210696000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453210696000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453210696000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453210696000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453210696000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453210696000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453210696000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453210696000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453210696000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453210696000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453210696000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453210696000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453210696000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453210696000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453210696000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453210696000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453210696000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453210696000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453210696000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453210696000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453210696000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453210696000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453210696000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453210696000 - }, - "AUTHENTIFIANT": { - "{0E1B1BAB-B690-4DF2-BC43-D7D28A4437FC}": 1453228251000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453210696000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453210696000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453210696000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453210696000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453210696000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453210696000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453210696000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453210696000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453210696000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453210696000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453210696000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453210696000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453210696000 - }, - "DATA_CHANGE_HISTORY": { - "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}": 1453210696000, - "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}": 1453210891000, - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453210696000, - "{D5916191-FCBA-4D25-8676-53E6CEB61397}": 1453226868000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453210696000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453210696000 - } - } - } -} diff --git a/test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-transactions.json b/test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-transactions.json deleted file mode 100644 index 46e818161..000000000 --- a/test/Dashlane/Fixtures/two-accounts-in-fullfile-two-remove-transactions.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "transactionList": [ - { - "backupDate": 1453226868000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453226865, - "objectType": "transaction", - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}" - }, - { - "backupDate": 1453210891000, - "type": "AUTHENTIFIANT", - "action": "BACKUP_REMOVE", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}" - }, - { - "backupDate": 1453210696000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzphA+pFnGUZ305gLQyZARVMIvxSmdm7tut36PQJW8pziaAhpYBi/RhnJcqDQ0VSbn5HHFKpwfmnK5QNElEvKnnibWCBMcgBDuBV3YZYHVcE1hl3X++j9WCFqUTSv1yJukxEMlpJrUjjbLd8nAPssPJoYH6LmBIbJkgOPRDdC4zSMnOAm18KTLVVUdGruyEZlUYRCVxUn8HoYpnup6bCHB81u94MNYid3DvoyAdgjCh7nzLnT9eDAetnkvpoMOywAk2w5e3nbRSUhHyGMzOzrZx2ww1xghxmHpJQqPT14dHTbGSPy4HpLKIASHUjomZGXdwAcaA+vd56jw9QcWxnOi0aN0tBjfNQ9dKjBdvRnMYZeQt0Q5inYVG7YDrt0OisJF2r/PaBy+p/I/NvfpxfV+ejidyA8/vnS0+M29Mc6ma/Y7da+Cgdt9GJXzpQk4mOVK4XnvCVxy4/Rpn1hQzH23/sJIsPbHPj1hEG9M/c+38sZ1acUzD0CO2GhkQ2fAL7kQE17ID+R1lGXQLIEaa93k5r+eHuLCmRdygvHOCt0S6zQza+evUodiKS+eBIP196OAouGNhLuvw/x+TP++SInM0guV/umiOv74FhL8QuOCOi/cSy1MXfGoBxaD4OrtGIEo+nI8lbkMwsy4bTBAqUkSF+bAboVgk0y+ThnbW4iMUg6hIe2nHsVlwtWNSMYPDVPKQULYFBF8YPL2ITmQDWx+nhX7FOoFT573jahN+QmFxvIGg4QuVe/gOfv68rCn8rxBPwWBu1nZEKLuXcqni6fR5G2so88CI03neUs/d8tLUfXghPZJ4n/DF9naVd5Nwj81Jnoc8Zb5c11lPphekcqM/66zyWyfUd6v5jooGGXXgpu8yaUlTYzJaGCgY6YtvGOt6cx0hchPhUcInhb1KjHk9ju/upP0yjqBo7KjiYR6wJE1ndDA8X1treFrquJhCh6Qw5PXfnQZMhFQU5P/3E/Sb2NcCGeZPQxbjadFuH7WkTG+5L+J1vNqgxdCPeYoeTLpQUnJXGgLaYPrEcqylqGGkNfbZzCqiBbprDoal7zRJRFXrgbmpL8qx/EC8OxM8hcHQvu2Z2pLGPryLT2Zl3b9xJgRyr8jCBJl+OKQA0Jf/rrHf9MbKgGBN++2pwwRWdhjqSVFxByPlzC00PrRH284VBqsCXw+JFyOb13F7DbyJxvOE9LuxiL8ri6VFdcgMjai3iSTwWyoq1CKdE7NHEAj3hniixApfBZRNkxmT1UKoIIQnM701W0Wp0/Sj7PVd4d+nGvyn1U+1WnP0V4WW5FQVjZwcU9kUdRvzAyB/2tr9BoroFATemhRBiSY0egzX9mpJ2zNsZ59hXnSsx4JrFrYcPFiUGOeGc4Fy8NNHSDV5dzxADf98c9ybfWhzF4w9m2EWbC2fIBF81qiboQauY//ZRMm5lbMq7tH9rdqcXMIM5yQZgmEs9Gz1tPfWL1CFX43h85fP6r+W2etdj2bEZKBiNIhB/Tzg7OiAz+bwuZ03XkoTIxoxWBfJsPyO8dLfSe/SJsmAuJ50I9m6oYvTPrAfA==" - }, - { - "backupDate": 1453210696000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzZS6BP+U8RyTCev8l1M2AAG71gU+FXwDqVA71XaIbDD5Tsmos/hrObgUQ97vBMDhxNfXFkgnWcKVbjVhAUm+b7GpqL/DL9e6bX2QID+U5zqkK1S9KgvnVlsJJJZIrxBdgR2ixUkT7GxPZMdF7WkImKtC7N0pLvQpV1D1T9Yezys4=" - }, - { - "backupDate": 1453210891000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453210884, - "objectType": "transaction", - "identifier": "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzT2XNoa5f6d1YtrBFSnIfNnADDmno73z66z3noFgs8CSWpZvgMVRaSPts4mMab2SEVPuxJgA2s0nXK1g0/YskCT7Fs4Mt3v9Vj/jo14Xa3FfV8b//X2zJkJ5SU2VmQIIWIMh+HYsGZS7N2egpL22AheSNFDlU2aBs5U4LED4HNBFhngVDRAC2BEzhTYKV21G2Oc37sV38N8vOY4jXGU0aU2GeO1JeidCdgw45f5sEnnp990+/S+IGZWfKxnxeRobiP7XjOxgkJvEJG0qjGn3ECqCCLukGrmuSmQDtN6kQCo2ynWclp8JNZQJhR6X37ihcenWaDMK32cOXyrcbFn2m2ACwF2iGm76DhrBowYVbKvs0h3L5crBY7vjfaXgRsXxjzVH9q7eUArsla54YESeyBcXNI7G1rmKTUfrt5/5f/Ri9zCLeMNdiv8QgxnZIZuBC0CAwn6pRY3V/8QSqh1BAY/A7PwYag1N4zPeKeUTmmots031jDQ8SKS6qmG3C9yeQUOV+NW+j/wah2849li6qdedO1qKtnw0j7Jg0is+WKpVmnLfV8RTrCf34MQfP2NC+yJwjTv8lMlVsCD6UynocXj11sy+ERmDYUazRaIIVJimC4pCMebRiZPl2V883D+vUAIQYYfHLuC8OJCt75GXP6ofQwL3ZcHvH7ASVPpaXKdbQbcs+zilWNQ7Bz8yqZi1QkyPuLZZklxVdTpdsWlf6yYKedIQSccGdWPN7OBQ5BSlpv7jL7awwlsBXlB0JVVBj5CAIY3RLxauJRyejRawSWG3/E2tYUTHsFmpQJRNzLSk=" - }, - { - "backupDate": 1453226868000, - "type": "DATA_CHANGE_HISTORY", - "action": "BACKUP_EDIT", - "time": 1453226865, - "objectType": "transaction", - "identifier": "{D5916191-FCBA-4D25-8676-53E6CEB61397}", - "content": "lWzUWdfFJjk7M81NiznTx3WHZu18c+oeJ/AdH7RO2zxLV0MzaQWkd/oE6b6cunO6kxYffPIQPUF1Qdj9hhdfX5Nj2lbsdVMRDk/iHRtV742J8CEYhzOzJi3Fno4nMZcfzqdQY1Eakvj79eGy9JnEewVaNXaDil3m3ByKE8I8DfLBJss+pf+LnlV0y6AkqmOjl7J30esaGy3MMUPo1cLb1W5Nqsp5qvSKynah/AHenx09mF+23X3eJI4Y5j3+wRTQ2VuC0dfiTZdIpUGxmCHp3Z73lGrP+X4SOEp72NygWUd/u5lFj/ynJzVLbJrufrWeuHwv1kS/Zr3+QOsrj6nS0S+lyptF+7AmtoJ4LrEYodm1/Q1SxECc7KuBurqr7aZ305v/UjLNG1lJfQWTYaO7J/gxkUUwbdXzkcRZ8/yHuLmf4nDI9XeQx5lr4vqUc0wraKOK0k97HuBgm5ZELuZEZhy/gZADjU9T+nLd+HKd+f1oITFUcuQZOxjsV53AIsQO8KMVRj54IHkZIrht8TEGry7S+Unox5htdqjF0zGULv82IR3vQ0RVq3H4DS2c+DiMXCMTe37NmJwWiXRU492WYJ7HymVJXGgPmGt4XWPkcYqDLA7hCKtb28SBuGFO/gHLhlJ/OcJA7EDJkFs+WJ0HxUP0nchII8DtXXusMwPCTTjnmo6wQ4QKT69nf98qirPYg4WhRaHwGuqf+GNHucErJhxHM8keV8sdhmlclYBoCf0IkqCWFH+ngmyH5sQHF1z5S1KRYj7oLSqE4oKoakslsG9qRpjUsC24n8ci4IhV4tlY+FrK9KMOUZF4zKVXay0n8Mwidw==" - } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453210696000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453210696000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453210696000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453210696000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453210696000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453210696000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453210696000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453210696000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453210696000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453210696000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453210696000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453210696000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453210696000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453210696000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453210696000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453210696000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453210696000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453210696000 - }, - { - "identifier": "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}", - "backupDate": 1453210696000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453226868000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453210696000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453210696000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453210696000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453210696000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453210696000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453210696000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453210696000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453210696000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453210696000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453210696000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453210696000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453210696000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453210696000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453210696000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453210696000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453210696000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453210696000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453210696000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453210696000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453210696000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453210696000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453210696000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453210696000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453210696000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453210696000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453210696000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453210696000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453210696000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453210696000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453210696000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453210696000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453210696000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453210696000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453210696000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453210696000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453210696000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453210696000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453210696000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453210696000 - }, - "DATA_CHANGE_HISTORY": { - "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}": 1453210696000, - "{246C3B9D-8DD7-49EB-9F41-4C642736BD2A}": 1453210891000, - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453210696000, - "{D5916191-FCBA-4D25-8676-53E6CEB61397}": 1453226868000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453210696000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453210696000 - } - } - } -} diff --git a/test/Dashlane/Fixtures/two-accounts-in-fullfile.json b/test/Dashlane/Fixtures/two-accounts-in-fullfile.json deleted file mode 100644 index 793e546ab..000000000 --- a/test/Dashlane/Fixtures/two-accounts-in-fullfile.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "transactionList": [ - { - "backupDate": 1453210696000, - "type": "SETTINGS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SETTINGS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzphA+pFnGUZ305gLQyZARVMIvxSmdm7tut36PQJW8pziaAhpYBi/RhnJcqDQ0VSbn5HHFKpwfmnK5QNElEvKnnibWCBMcgBDuBV3YZYHVcE1hl3X++j9WCFqUTSv1yJukxEMlpJrUjjbLd8nAPssPJoYH6LmBIbJkgOPRDdC4zSMnOAm18KTLVVUdGruyEZlUYRCVxUn8HoYpnup6bCHB81u94MNYid3DvoyAdgjCh7nzLnT9eDAetnkvpoMOywAk2w5e3nbRSUhHyGMzOzrZx2ww1xghxmHpJQqPT14dHTbGSPy4HpLKIASHUjomZGXdwAcaA+vd56jw9QcWxnOi0aN0tBjfNQ9dKjBdvRnMYZeQt0Q5inYVG7YDrt0OisJF2r/PaBy+p/I/NvfpxfV+ejidyA8/vnS0+M29Mc6ma/Y7da+Cgdt9GJXzpQk4mOVK4XnvCVxy4/Rpn1hQzH23/sJIsPbHPj1hEG9M/c+38sZ1acUzD0CO2GhkQ2fAL7kQE17ID+R1lGXQLIEaa93k5r+eHuLCmRdygvHOCt0S6zQza+evUodiKS+eBIP196OAouGNhLuvw/x+TP++SInM0guV/umiOv74FhL8QuOCOi/cSy1MXfGoBxaD4OrtGIEo+nI8lbkMwsy4bTBAqUkSF+bAboVgk0y+ThnbW4iMUg6hIe2nHsVlwtWNSMYPDVPKQULYFBF8YPL2ITmQDWx+nhX7FOoFT573jahN+QmFxvIGg4QuVe/gOfv68rCn8rxBPwWBu1nZEKLuXcqni6fR5G2so88CI03neUs/d8tLUfXghPZJ4n/DF9naVd5Nwj81Jnoc8Zb5c11lPphekcqM/66zyWyfUd6v5jooGGXXgpu8yaUlTYzJaGCgY6YtvGOt6cx0hchPhUcInhb1KjHk9ju/upP0yjqBo7KjiYR6wJE1ndDA8X1treFrquJhCh6Qw5PXfnQZMhFQU5P/3E/Sb2NcCGeZPQxbjadFuH7WkTG+5L+J1vNqgxdCPeYoeTLpQUnJXGgLaYPrEcqylqGGkNfbZzCqiBbprDoal7zRJRFXrgbmpL8qx/EC8OxM8hcHQvu2Z2pLGPryLT2Zl3b9xJgRyr8jCBJl+OKQA0Jf/rrHf9MbKgGBN++2pwwRWdhjqSVFxByPlzC00PrRH284VBqsCXw+JFyOb13F7DbyJxvOE9LuxiL8ri6VFdcgMjai3iSTwWyoq1CKdE7NHEAj3hniixApfBZRNkxmT1UKoIIQnM701W0Wp0/Sj7PVd4d+nGvyn1U+1WnP0V4WW5FQVjZwcU9kUdRvzAyB/2tr9BoroFATemhRBiSY0egzX9mpJ2zNsZ59hXnSsx4JrFrYcPFiUGOeGc4Fy8NNHSDV5dzxADf98c9ybfWhzF4w9m2EWbC2fIBF81qiboQauY//ZRMm5lbMq7tH9rdqcXMIM5yQZgmEs9Gz1tPfWL1CFX43h85fP6r+W2etdj2bEZKBiNIhB/Tzg7OiAz+bwuZ03XkoTIxoxWBfJsPyO8dLfSe/SJsmAuJ50I9m6oYvTPrAfA==" - }, - { - "backupDate": 1453210696000, - "type": "SECURITYALERTS", - "action": "BACKUP_EDIT", - "time": 1453210694, - "objectType": "transaction", - "identifier": "SECURITYALERTS_userId", - "content": "Wxai34nWaLjieBwuazKSvxssPSgV6+dfoFq40BtLxPdLV0MzZS6BP+U8RyTCev8l1M2AAG71gU+FXwDqVA71XaIbDD5Tsmos/hrObgUQ97vBMDhxNfXFkgnWcKVbjVhAUm+b7GpqL/DL9e6bX2QID+U5zqkK1S9KgvnVlsJJJZIrxBdgR2ixUkT7GxPZMdF7WkImKtC7N0pLvQpV1D1T9Yezys4=" - } - ], - "syncAllowed": true, - "fullBackupFileList": [ - { - "identifier": "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}", - "backupDate": 1453210696000 - }, - { - "identifier": "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}", - "backupDate": 1453210696000 - }, - { - "identifier": "{281E62F8-11D3-4744-8997-CED72D7E68EA}", - "backupDate": 1453210696000 - }, - { - "identifier": "{28D577F3-66FB-4952-BA15-85DA6A22A608}", - "backupDate": 1453210696000 - }, - { - "identifier": "{30519D0F-4D13-4F8C-9073-E8210B7260FC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{570A5942-C02C-442E-8761-C49EE0C2D199}", - "backupDate": 1453210696000 - }, - { - "identifier": "{61FCB40C-6419-4B59-9989-10C19A0CD98B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}", - "backupDate": 1453210696000 - }, - { - "identifier": "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{B6D30AF3-7291-4518-AD4A-917547756AC9}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DAF4E01C-F027-4C8D-952C-187831D65FD7}", - "backupDate": 1453210696000 - }, - { - "identifier": "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}", - "backupDate": 1453210696000 - }, - { - "identifier": "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}", - "backupDate": 1453210696000 - }, - { - "identifier": "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}", - "backupDate": 1453210696000 - }, - { - "identifier": "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}", - "backupDate": 1453210696000 - }, - { - "identifier": "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}", - "backupDate": 1453210696000 - }, - { - "identifier": "{5161A9E1-C18B-424C-A442-3B836A6425B0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}", - "backupDate": 1453210696000 - }, - { - "identifier": "{736D1E8F-FCD2-41B7-9702-A513338E3D63}", - "backupDate": 1453210696000 - }, - { - "identifier": "{87B52342-114D-4C8C-888D-E53FC64252A6}", - "backupDate": 1453210696000 - }, - { - "identifier": "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}", - "backupDate": 1453210696000 - }, - { - "identifier": "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}", - "backupDate": 1453210696000 - }, - { - "identifier": "{C96E31D5-0763-4CAE-AB33-C07F446E8009}", - "backupDate": 1453210696000 - }, - { - "identifier": "{0724DD29-B932-4763-98C6-A39D217F0A56}", - "backupDate": 1453210696000 - }, - { - "identifier": "{2B615981-044E-44A9-A3C0-E2358969C033}", - "backupDate": 1453210696000 - }, - { - "identifier": "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}", - "backupDate": 1453210696000 - }, - { - "identifier": "{65724CD6-731A-45DA-B910-D6289C795D82}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}", - "backupDate": 1453210696000 - }, - { - "identifier": "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}", - "backupDate": 1453210696000 - }, - { - "identifier": "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}", - "backupDate": 1453210696000 - }, - { - "identifier": "{A48C833A-A504-4B93-9296-BC626F0CDC4C}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}", - "backupDate": 1453210696000 - }, - { - "identifier": "{DDA2C715-E719-440A-B4F6-B2923408D150}", - "backupDate": 1453210696000 - }, - { - "identifier": "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}", - "backupDate": 1453210696000 - } - ], - "fullBackupFile": "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", - "timestamp": "1453210696000", - "sharingTimestamp": "0", - "summary": { - "groups": { - }, - "sharedTransactions": { - }, - "objectKeys": { - }, - "transactions": { - "SECURITYALERTS": { - "SECURITYALERTS_userId": 1453210696000 - }, - "SETTINGS": { - "SETTINGS_userId": 1453210696000 - }, - "PURCHASE_CATEGORY": { - "{011F017D-77A9-4F15-B53F-CBD83DBE46D3}": 1453210696000, - "{19245471-36DC-4F07-BE2B-E6E71AC4EC89}": 1453210696000, - "{4FFB980E-FFA2-46BB-85CE-262D1E91A420}": 1453210696000, - "{5161A9E1-C18B-424C-A442-3B836A6425B0}": 1453210696000, - "{51C20F2B-B5A2-476A-BCCC-D3401FF5082F}": 1453210696000, - "{65D0A2D0-4BA4-49EC-ABED-4A8DE30329BE}": 1453210696000, - "{6B731C0D-2E7F-465C-9C2C-EE1618D48CE4}": 1453210696000, - "{6FDB21D2-758A-4339-A37E-2868F8BACA1B}": 1453210696000, - "{736D1E8F-FCD2-41B7-9702-A513338E3D63}": 1453210696000, - "{87B52342-114D-4C8C-888D-E53FC64252A6}": 1453210696000, - "{8F8168D0-4D58-4085-AC50-AAE9CD460EFC}": 1453210696000, - "{D073ABB2-DA92-4302-81DE-0EA4FBA70973}": 1453210696000 - }, - "SECURENOTE_CATEGORY": { - "{0724DD29-B932-4763-98C6-A39D217F0A56}": 1453210696000, - "{2B615981-044E-44A9-A3C0-E2358969C033}": 1453210696000, - "{4B2F69B6-C84F-4A73-9408-CA28C82DF7FE}": 1453210696000, - "{65724CD6-731A-45DA-B910-D6289C795D82}": 1453210696000, - "{6594AAA9-8F70-40FC-AEA0-B82A5CE32B2E}": 1453210696000, - "{6F2E7F1C-3554-4FC7-9242-28AAC68A1372}": 1453210696000, - "{7670E88F-35CD-442A-BE49-E9A5CD1AC5A0}": 1453210696000, - "{A48C833A-A504-4B93-9296-BC626F0CDC4C}": 1453210696000, - "{DA66D564-9AB6-4374-88ED-766AC6CCAE6D}": 1453210696000, - "{DDA2C715-E719-440A-B4F6-B2923408D150}": 1453210696000, - "{E080C9BE-9DC9-473B-AFA0-01391AAF4A42}": 1453210696000 - }, - "EMAIL": { - "{07D82DB3-7A37-4822-BBB8-DAF009D8DBF0}": 1453210696000 - }, - "AUTHENTIFIANT": { - "{0C26F178-1D95-4AD2-98F4-FE9CEAB0E020}": 1453210696000, - "{A20B1562-1719-48D7-9D48-DDB27A16A9E0}": 1453210696000 - }, - "AUTH_CATEGORY": { - "{12EFB092-0629-49E9-8A38-64E4BCB3EAEF}": 1453210696000, - "{143DB6EB-DD0C-4412-815E-1E5B688F4F1A}": 1453210696000, - "{281E62F8-11D3-4744-8997-CED72D7E68EA}": 1453210696000, - "{28D577F3-66FB-4952-BA15-85DA6A22A608}": 1453210696000, - "{30519D0F-4D13-4F8C-9073-E8210B7260FC}": 1453210696000, - "{570A5942-C02C-442E-8761-C49EE0C2D199}": 1453210696000, - "{61FCB40C-6419-4B59-9989-10C19A0CD98B}": 1453210696000, - "{6437CECF-EE6A-4A40-8F2D-C5F932659F46}": 1453210696000, - "{96A3E31C-8433-4597-9C6C-DE3212D3EE25}": 1453210696000, - "{A2CAD919-76F1-4768-92C9-E25DD99F07E3}": 1453210696000, - "{B6D30AF3-7291-4518-AD4A-917547756AC9}": 1453210696000, - "{C2B75093-6858-4A39-BE1F-FC766A7F7C2E}": 1453210696000, - "{DAF4E01C-F027-4C8D-952C-187831D65FD7}": 1453210696000 - }, - "DATA_CHANGE_HISTORY": { - "{142E15CF-7FCD-4A29-A5BA-2081489E2F61}": 1453210696000, - "{99F59DBF-E4F9-47D4-876F-F946DEFE5260}": 1453210696000, - "{F953F9C8-F3FB-4FA6-98B6-BBC6EA3AD460}": 1453210696000 - }, - "SECURENOTE": { - "{C96E31D5-0763-4CAE-AB33-C07F446E8009}": 1453210696000 - } - } - } -} diff --git a/test/Dashlane/VaultTest.cs b/test/Dashlane/VaultTest.cs index 0c38e961e..bbf6cf318 100644 --- a/test/Dashlane/VaultTest.cs +++ b/test/Dashlane/VaultTest.cs @@ -1,11 +1,10 @@ // Copyright (C) Dmitry Yakimenko (detunized@gmail.com). // Licensed under the terms of the MIT license. See LICENCE for details. +using System; using System.Collections.Generic; -using System.Linq; -using System.Net; -using PasswordManagerAccess.Common; using PasswordManagerAccess.Dashlane; +using Shouldly; using Xunit; namespace PasswordManagerAccess.Test.Dashlane @@ -13,111 +12,70 @@ namespace PasswordManagerAccess.Test.Dashlane public class VaultTest : TestBase { [Fact] - public void Open_returns_accounts_with_existing_device_id() + public void Open_throws_on_user_not_found() { - var flow = new RestFlow().Post(GetFixture("non-empty-vault")); - - var vault = Vault.Open(Username, Password, null, new Storage(Uki), flow); - - Assert.NotEmpty(vault.Accounts); - } - - [Fact] - public void Open_returns_accounts_with_email_token_and_device_registration() - { - var flow = new RestFlow() - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("email-token-triggered")) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) - .Post(GetFixture("non-empty-vault")); - - var vault = Vault.Open(Username, Password, MakeUi(Otp, false), new Storage(""), flow); - - Assert.NotEmpty(vault.Accounts); - } - - [Fact] - public void Open_returns_accounts_with_otp_token_and_device_registration() - { - var flow = new RestFlow() - .Post(GetFixture("otp-requested")) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) - .Post(GetFixture("non-empty-vault")); + // Arrange + var flow = new RestFlow().Post(GetFixture("error-user-not-found")); - var vault = Vault.Open(Username, Password, MakeUi(Otp, false), new Storage(""), flow); - - Assert.NotEmpty(vault.Accounts); - } - - [Fact] - public void Open_throws_on_resend_with_totp() - { - var flow = new RestFlow().Post(GetFixture("otp-requested")); - - Exceptions.AssertThrowsInternalError( - () => Vault.Open(Username, Password, MakeUi(Ui.Passcode.Resend), new Storage(""), flow), - "Return value Resend is invalid in this context" + // Act/Assert + Exceptions.AssertThrowsBadCredentials( + () => Vault.Open(Username, Password, new ThrowingUi(), MakeEmptyStorage(), flow), + "The given login does not exist." ); } [Fact] - public void Open_returns_accounts_with_email_token_and_device_registration_with_expired_device_id() + public void Open_returns_accounts_with_existing_device_keys() { - var flow = new RestFlow() - .Post(GetFixture("invalid-uki")) - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("email-token-triggered")) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) - .Post(GetFixture("non-empty-vault")); + // Arrange + var flow = new RestFlow().Post(GetFixture("non-empty-vault")); - var vault = Vault.Open(Username, Password, MakeUi(Otp, false), new Storage(Uki), flow); + // Act + var vault = Vault.Open(Username, Password, new ThrowingUi(), MakeStorage(), flow); - Assert.NotEmpty(vault.Accounts); + // Assert + vault.Accounts.ShouldNotBeEmpty(); } [Fact] - public void Open_returns_accounts_with_otp_token_and_device_registration_with_expired_device_id() + public void Open_returns_accounts_with_totp_device_registration() { + // Arrange var flow = new RestFlow() - .Post(GetFixture("invalid-uki")) - .Post(GetFixture("otp-requested")) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) + .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); - var vault = Vault.Open(Username, Password, MakeUi(Otp, false), new Storage(Uki), flow); + // Act + var vault = Vault.Open(Username, Password, MakeUi(Otp, false), MakeEmptyStorage(), flow); - Assert.NotEmpty(vault.Accounts); + // Assert + vault.Accounts.ShouldNotBeEmpty(); } [Fact] - public void Open_throws_on_invalid_email_address() - { - var flow = new RestFlow().Post(GetFixture("invalid-email"), HttpStatusCode.BadRequest); - - Exceptions.AssertThrowsBadCredentials( - () => Vault.Open(Username, Password, MakeUi(Otp, false), new Storage(""), flow), - "Invalid username: " - ); - } - - [Fact] - public void Open_returns_accounts_with_email_token_after_1_resend() + public void Open_returns_accounts_after_retry_on_failed_otp() { + // Arrange var flow = new RestFlow() - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("email-token-triggered")) // First token trigger - .Post(GetFixture("email-token-triggered")) // Resend - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) + .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("error-verification-failed")) + .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); - var vault = Vault.Open(Username, Password, MakeUi(Ui.Passcode.Resend, new Ui.Passcode(Otp, false)), new Storage(""), flow); + // Act + var vault = Vault.Open( + Username, + Password, + MakeUi(new Ui.Passcode("123456", false), new Ui.Passcode(Otp, false), new Ui.Passcode(Otp, false)), + MakeEmptyStorage(), + flow + ); - Assert.NotEmpty(vault.Accounts); + // Assert + vault.Accounts.ShouldNotBeEmpty(); } [Theory] @@ -128,214 +86,162 @@ public void Open_returns_accounts_with_email_token_after_1_resend() [InlineData("1234567")] public void Open_asks_ui_for_another_token_when_it_is_not_6_digits(string token) { + // Arrange var flow = new RestFlow() - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("email-token-triggered")) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) - .Post(GetFixture("non-empty-vault")); - - var vault = Vault.Open(Username, Password, MakeUi(new Ui.Passcode(token, false), new Ui.Passcode(Otp, false)), new Storage(""), flow); - - Assert.NotEmpty(vault.Accounts); - } - - [Fact] - public void Open_returns_accounts_with_email_token_after_2_bad_attempts() - { - var flow = new RestFlow() - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("email-token-triggered")) - .Post(GetFixture("invalid-email-token"), HttpStatusCode.BadRequest) - .Post(GetFixture("invalid-email-token"), HttpStatusCode.BadRequest) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) + .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); - var vault = Vault.Open(Username, Password, MakeUi(Otp, false), new Storage(""), flow); + // Act + var vault = Vault.Open(Username, Password, MakeUi(new Ui.Passcode(token, false), new Ui.Passcode(Otp, false)), MakeEmptyStorage(), flow); - Assert.NotEmpty(vault.Accounts); + // Assert + vault.Accounts.ShouldNotBeEmpty(); } [Fact] - public void Open_throws_on_invalid_email_token_after_3_attempts() + public void Open_saves_device_keys_when_remember_me_is_true() { + // Arrange var flow = new RestFlow() - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("invalid-email-token"), HttpStatusCode.BadRequest) - .Post(GetFixture("invalid-email-token"), HttpStatusCode.BadRequest) - .Post(GetFixture("invalid-email-token"), HttpStatusCode.BadRequest); - - Exceptions.AssertThrowsBadMultiFactor(() => Vault.Open(Username, Password, MakeUi(Otp, false), new Storage(""), flow), "MFA failed: "); - } - - [Theory] - [InlineData(false, "")] - [InlineData(true, "5d95e3ccccaa40a1-9cf2dbfd517b6b85ab0a7e2cb23972a195aeef5440db095c187782ea0d349962")] - public void Open_respects_remember_me_option(bool rememberMe, string expectedDeviceId) - { - var flow = new RestFlow() - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("email-token-triggered")) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) + .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); - var storage = new Storage(""); + var storage = MakeEmptyStorage(); - Vault.Open(Username, Password, MakeUi(Otp, rememberMe), storage, flow); + // Act + Vault.Open(Username, Password, MakeUi(Otp, true), storage, flow); - Assert.Equal(expectedDeviceId, storage.Values["device-uki"]); + // Assert + storage.Values.ShouldContainKeyAndValue("device-access-key", "7a9ba9207cb36988"); + storage.Values.ShouldContainKeyAndValue("device-secret-key", "583ac4dc6c6ea8b9380ca03d095b51cd15f178bad10715d7ba67f06f47e63995"); } [Fact] - public void Open_erases_invalid_uki() + public void Open_does_not_save_device_keys_when_remember_me_is_false() { + // Arrange var flow = new RestFlow() - .Post(GetFixture("invalid-uki")) - .Post(GetFixture("email-token-sent")) - .Post(GetFixture("email-token-triggered")) - .Post(GetFixture("email-token-verified")) - .Post(GetFixture("device-registered")) + .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); - var storage = new Storage("invalid-uki"); + var storage = MakeEmptyStorage(); - var vault = Vault.Open(Username, Password, MakeUi(Otp, false), storage, flow); + // Act + Vault.Open(Username, Password, MakeUi(Otp, false), storage, flow); - Assert.Equal("", storage.Values["device-uki"]); + // Assert + storage.Values["device-access-key"].ShouldBe(""); + storage.Values["device-secret-key"].ShouldBe(""); } [Fact] - public void Open_opens_empty_vault() + public void Open_opens_vault_with_server_key() { - Assert.Empty(Accounts("empty-vault")); - } + // Arrange + var flow = new RestFlow() + .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("complete-device-registration-with-server-key")) + .Post(GetFixture("non-empty-vault-with-server-key")); - [Fact] - public void Open_opens_a_vault_with_empty_fullfile_and_one_add_transaction() - { - Assert.Equal(new[] { Dude }, Accounts("empty-fullfile-one-add-transaction")); - } + // Act + var vault = Vault.Open(UsernameWithServerKey, PasswordWithServerKey, MakeUi(Otp, false), MakeEmptyStorage(), flow); - [Fact] - public void Open_opens_a_vault_with_empty_fullfile_and_two_add_transations() - { - Assert.Equal(new[] { Dude, Nam }, Accounts("empty-fullfile-two-add-transactions")); + // Assert + vault.Accounts.ShouldNotBeEmpty(); } [Fact] - public void Open_opens_a_vault_with_empty_fullfile_and_two_add_and_one_remove_transations() + public void Open_with_server_ignores_remember_me_and_does_not_save_device_keys() { - Assert.Equal(new[] { Dude, Nam }, Accounts("empty-fullfile-two-add-one-remove-transactions")); - } + // Arrange + var flow = new RestFlow() + .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("complete-device-registration-with-server-key")) + .Post(GetFixture("non-empty-vault-with-server-key")); - [Fact] - public void Open_opens_a_vault_with_two_accounts_in_fullfile() - { - Assert.Equal(new[] { Dude, Nam }, Accounts("two-accounts-in-fullfile")); - } + var storage = MakeEmptyStorage(); - [Fact] - public void Open_opens_a_vault_with_two_accounts_in_fullfile_and_one_remove_transaction() - { - Assert.Equal(new[] { Dude }, Accounts("two-accounts-in-fullfile-one-remove-transaction")); - } + // Act + Vault.Open(UsernameWithServerKey, PasswordWithServerKey, MakeUi(Otp, true), storage, flow); - [Fact] - public void Open_opens_a_vault_with_two_accounts_in_fullfile_and_two_remove_transactions() - { - Assert.Empty(Accounts("two-accounts-in-fullfile-two-remove-transactions")); + // Assert + storage.Values["device-access-key"].ShouldBe(""); + storage.Values["device-secret-key"].ShouldBe(""); } - [Fact] - public void Open_opens_a_vault_with_two_accounts_in_fullfile_and_two_remove_and_one_add_transactions() - { - Assert.Equal(new[] { Dude }, Accounts("two-accounts-in-fullfile-two-remove-one-add-transactions")); - } + // TODO: Add tests to check transactions in the vault. // // Helpers // - class SequenceUi : Ui + private class SequenceUi(Ui.Passcode[] passcodes, bool loop = false) : Ui { - private readonly bool _loop; - private readonly Passcode[] _passcodes; private int _current; - public SequenceUi(Passcode[] passcodes, bool loop = false) - { - _passcodes = passcodes; - _loop = loop; - } - public override Passcode ProvideGoogleAuthPasscode(int attempt) => Next(); public override Passcode ProvideEmailPasscode(int attempt) => Next(); private Passcode Next() { - if (_current >= _passcodes.Length) + if (_current >= passcodes.Length) Assert.Fail("SequenceUi: No more passcodes"); - var passcode = _passcodes[_current]; + var passcode = passcodes[_current]; _current++; - if (_loop && _current >= _passcodes.Length) + if (loop && _current >= passcodes.Length) _current = 0; return passcode; } } - Ui MakeUi(string code, bool rememberMe) + private class ThrowingUi : Ui { - return new SequenceUi(new[] { new Ui.Passcode(code, rememberMe) }, true); + public override Passcode ProvideGoogleAuthPasscode(int attempt) => throw new InvalidOperationException("Google Auth passcode"); + + public override Passcode ProvideEmailPasscode(int attempt) => throw new InvalidOperationException("Email passcode"); } - Ui MakeUi(params Ui.Passcode[] passcodes) + private static Ui MakeUi(string code, bool rememberMe) { - return new SequenceUi(passcodes, false); + return new SequenceUi([new Ui.Passcode(code, rememberMe)], true); } - class Storage : ISecureStorage + private static Ui MakeUi(params Ui.Passcode[] passcodes) { - public Dictionary Values { get; } = new Dictionary(); - - public Storage(string deviceId) - { - StoreString("device-uki", deviceId); - } + return new SequenceUi(passcodes, false); + } - public string LoadString(string name) - { - return Values[name]; - } + private static MemoryStorage MakeStorage() => MakeStorage(AccessKey, SecretKey); - public void StoreString(string name, string value) - { - Values[name] = value; - } - } + private static MemoryStorage MakeEmptyStorage() => MakeStorage("", ""); - private string[] Accounts(string filename) + private static MemoryStorage MakeStorage(string accessKey, string secretKey) { - var flow = new RestFlow().Post(GetFixture(filename)); - return Vault.Open(Username, Password, null, new Storage(Uki), flow).Accounts.Select(i => i.Name).ToArray(); + return new MemoryStorage(new Dictionary { ["device-access-key"] = accessKey, ["device-secret-key"] = secretKey }); } // // Data // - private const string Username = "username"; - private const string Password = "password"; - private const string Uki = "uki"; - - private const string Dude = "dude.com"; - private const string Nam = "nam.com"; - + private const string Username = "lastpass.ruby+17-september-2025@gmail.com"; + private const string Password = "PasswordPassword123!?"; + private const string UsernameWithServerKey = "lastpass.ruby+26-september-2025@gmail.com"; + private const string PasswordWithServerKey = "PasswordPassword123!?"; + private const string AccessKey = "access-key"; + private const string SecretKey = "secret-key"; private const string Otp = "123456"; } } From 9b5c46b0dc13d4f7b1b0678bf6a8babfdcce30ce Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Sat, 27 Sep 2025 17:50:36 +0200 Subject: [PATCH 7/8] Dashlane: add email token trigger via browser (ref #180, WIP) --- example/Dashlane/Program.cs | 9 +++++++++ src/Dashlane/Client.cs | 14 +++++++++----- src/Dashlane/Ui.cs | 6 ++++++ test/Dashlane/VaultTest.cs | 4 ++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/example/Dashlane/Program.cs b/example/Dashlane/Program.cs index a16f1e721..248a5345f 100644 --- a/example/Dashlane/Program.cs +++ b/example/Dashlane/Program.cs @@ -42,6 +42,15 @@ public override Passcode ProvideEmailPasscode(int attempt) } } + public override bool OpenInBrowser(string url, int attempt) + { + Console.WriteLine("Please open the following URL in your browser to trigger the email token:"); + Console.WriteLine(url); + Console.WriteLine("Press ENTER when you're done or type 'c' to cancel"); + + return Console.ReadLine()?.Trim().ToLower() != "c"; + } + // // Private // diff --git a/src/Dashlane/Client.cs b/src/Dashlane/Client.cs index 74c89457f..9420947a5 100644 --- a/src/Dashlane/Client.cs +++ b/src/Dashlane/Client.cs @@ -65,7 +65,7 @@ internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string user // When email 2FA is selected we need to tell the server to send the token to the user if (mfaMethod == MfaMethod.Email) - TriggerEmailToken(username, rest); + TriggerEmailToken(username, 0, ui); for (var attempt = 0; ; attempt++) { @@ -83,7 +83,8 @@ internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string user { if (mfaMethod == MfaMethod.Email) { - TriggerEmailToken(username, rest); + // For resend, we ignore the returned RememberMe since user already chose + TriggerEmailToken(username, attempt, ui); --attempt; // There was no attempt yet, we're just resending the token continue; } @@ -145,10 +146,13 @@ internal static R.VerificationMethod[] RequestDeviceRegistration(string username ).Methods; } - internal static void TriggerEmailToken(string username, RestClient rest) + internal static void TriggerEmailToken(string username, int attempt, Ui ui) { - // TODO: We need to open a browser to trigger the email 2FA - throw new UnsupportedFeatureException("Triggering email 2FA is not supported yet. Come back later."); + var url = $"https://www.dashlane.com/cli-device-registration?login={username.EncodeUriData()}"; + var proceed = ui.OpenInBrowser(url, attempt); + + if (!proceed) + throw new CanceledMultiFactorException("Email MFA canceled by the user"); } private enum MfaMethod diff --git a/src/Dashlane/Ui.cs b/src/Dashlane/Ui.cs index 2c9e13168..f19800ad7 100644 --- a/src/Dashlane/Ui.cs +++ b/src/Dashlane/Ui.cs @@ -26,5 +26,11 @@ public record Passcode(string Code, bool RememberMe) // To cancel return Passcode.Cancel // To resend the token return Passcode.Resend public abstract Passcode ProvideEmailPasscode(int attempt); + + // Open the URL in a regular or embedded browser to trigger the email token. + // The page is not interactive, but it executes some JavaScript to send the email. + // Potentially the user might need to solve a CAPTCHA. + // Return true to continue, false to cancel. + public abstract bool OpenInBrowser(string url, int attempt); } } diff --git a/test/Dashlane/VaultTest.cs b/test/Dashlane/VaultTest.cs index bbf6cf318..e80ed1ffa 100644 --- a/test/Dashlane/VaultTest.cs +++ b/test/Dashlane/VaultTest.cs @@ -191,6 +191,8 @@ private class SequenceUi(Ui.Passcode[] passcodes, bool loop = false) : Ui public override Passcode ProvideEmailPasscode(int attempt) => Next(); + public override bool OpenInBrowser(string url, int attempt) => true; + private Passcode Next() { if (_current >= passcodes.Length) @@ -211,6 +213,8 @@ private class ThrowingUi : Ui public override Passcode ProvideGoogleAuthPasscode(int attempt) => throw new InvalidOperationException("Google Auth passcode"); public override Passcode ProvideEmailPasscode(int attempt) => throw new InvalidOperationException("Email passcode"); + + public override bool OpenInBrowser(string url, int attempt) => throw new InvalidOperationException("Open in browser"); } private static Ui MakeUi(string code, bool rememberMe) From 820a874d7c713a2ec79e251e6b81ff4fb79c1512 Mon Sep 17 00:00:00 2001 From: Dmitry Yakimenko Date: Sat, 27 Sep 2025 19:01:56 +0200 Subject: [PATCH 8/8] Dashlane: add a better exception and improve tests (fixes #180) --- src/Dashlane/Client.cs | 5 +- .../Dashlane/Fixtures/auth-methods-email.json | 11 ++ ...for-device.json => auth-methods-totp.json} | 0 ...ion.json => perform-otp-verification.json} | 0 test/Dashlane/VaultTest.cs | 121 +++++++++++++++--- 5 files changed, 121 insertions(+), 16 deletions(-) create mode 100644 test/Dashlane/Fixtures/auth-methods-email.json rename test/Dashlane/Fixtures/{get-authentication-methods-for-device.json => auth-methods-totp.json} (100%) rename test/Dashlane/Fixtures/{perform-totp-verification.json => perform-otp-verification.json} (100%) diff --git a/src/Dashlane/Client.cs b/src/Dashlane/Client.cs index 9420947a5..e81793451 100644 --- a/src/Dashlane/Client.cs +++ b/src/Dashlane/Client.cs @@ -121,8 +121,11 @@ internal static RegisterResult RegisterNewDeviceWithMultipleAttempts(string user _ => throw new InternalErrorException("Logical error"), }; } - catch (BadMultiFactorException) when (attempt < MaxMfaAttempts - 1) + catch (BadMultiFactorException) { + if (attempt == MaxMfaAttempts - 1) + throw new BadMultiFactorException("MFA failed too many times"); + // Do nothing, try again continue; } diff --git a/test/Dashlane/Fixtures/auth-methods-email.json b/test/Dashlane/Fixtures/auth-methods-email.json new file mode 100644 index 000000000..6f06494e3 --- /dev/null +++ b/test/Dashlane/Fixtures/auth-methods-email.json @@ -0,0 +1,11 @@ +{ + "requestId": "0c3bfdac-53c3-4c98-aa41-91795814ea8e", + "data": { + "verifications": [ + { + "type": "email_token" + } + ], + "accountType": "masterPassword" + } +} diff --git a/test/Dashlane/Fixtures/get-authentication-methods-for-device.json b/test/Dashlane/Fixtures/auth-methods-totp.json similarity index 100% rename from test/Dashlane/Fixtures/get-authentication-methods-for-device.json rename to test/Dashlane/Fixtures/auth-methods-totp.json diff --git a/test/Dashlane/Fixtures/perform-totp-verification.json b/test/Dashlane/Fixtures/perform-otp-verification.json similarity index 100% rename from test/Dashlane/Fixtures/perform-totp-verification.json rename to test/Dashlane/Fixtures/perform-otp-verification.json diff --git a/test/Dashlane/VaultTest.cs b/test/Dashlane/VaultTest.cs index e80ed1ffa..30b84badb 100644 --- a/test/Dashlane/VaultTest.cs +++ b/test/Dashlane/VaultTest.cs @@ -42,8 +42,8 @@ public void Open_returns_accounts_with_totp_device_registration() { // Arrange var flow = new RestFlow() - .Post(GetFixture("get-authentication-methods-for-device")) - .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("perform-otp-verification")) .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); @@ -59,9 +59,9 @@ public void Open_returns_accounts_after_retry_on_failed_otp() { // Arrange var flow = new RestFlow() - .Post(GetFixture("get-authentication-methods-for-device")) + .Post(GetFixture("auth-methods-totp")) .Post(GetFixture("error-verification-failed")) - .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("perform-otp-verification")) .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); @@ -69,7 +69,7 @@ public void Open_returns_accounts_after_retry_on_failed_otp() var vault = Vault.Open( Username, Password, - MakeUi(new Ui.Passcode("123456", false), new Ui.Passcode(Otp, false), new Ui.Passcode(Otp, false)), + MakeUi(new Ui.Passcode(WrongOtp, false), new Ui.Passcode(Otp, false)), MakeEmptyStorage(), flow ); @@ -88,8 +88,8 @@ public void Open_asks_ui_for_another_token_when_it_is_not_6_digits(string token) { // Arrange var flow = new RestFlow() - .Post(GetFixture("get-authentication-methods-for-device")) - .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("perform-otp-verification")) .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); @@ -105,8 +105,8 @@ public void Open_saves_device_keys_when_remember_me_is_true() { // Arrange var flow = new RestFlow() - .Post(GetFixture("get-authentication-methods-for-device")) - .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("perform-otp-verification")) .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); @@ -125,8 +125,8 @@ public void Open_does_not_save_device_keys_when_remember_me_is_false() { // Arrange var flow = new RestFlow() - .Post(GetFixture("get-authentication-methods-for-device")) - .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("perform-otp-verification")) .Post(GetFixture("complete-device-registration-with-auth-ticket")) .Post(GetFixture("non-empty-vault")); @@ -145,8 +145,8 @@ public void Open_opens_vault_with_server_key() { // Arrange var flow = new RestFlow() - .Post(GetFixture("get-authentication-methods-for-device")) - .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("perform-otp-verification")) .Post(GetFixture("complete-device-registration-with-server-key")) .Post(GetFixture("non-empty-vault-with-server-key")); @@ -162,8 +162,8 @@ public void Open_with_server_ignores_remember_me_and_does_not_save_device_keys() { // Arrange var flow = new RestFlow() - .Post(GetFixture("get-authentication-methods-for-device")) - .Post(GetFixture("perform-totp-verification")) + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("perform-otp-verification")) .Post(GetFixture("complete-device-registration-with-server-key")) .Post(GetFixture("non-empty-vault-with-server-key")); @@ -177,6 +177,96 @@ public void Open_with_server_ignores_remember_me_and_does_not_save_device_keys() storage.Values["device-secret-key"].ShouldBe(""); } + [Fact] + public void Open_returns_accounts_with_email_token_device_registration() + { + // Arrange + var flow = new RestFlow() + .Post(GetFixture("auth-methods-email")) + .Post(GetFixture("perform-otp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) + .Post(GetFixture("non-empty-vault")); + + // Act + var vault = Vault.Open(Username, Password, MakeUi(new Ui.Passcode(Otp, false)), MakeEmptyStorage(), flow); + + // Assert + vault.Accounts.ShouldNotBeEmpty(); + } + + [Fact] + public void Open_returns_accounts_after_retry_on_failed_email_token() + { + // Arrange + var flow = new RestFlow() + .Post(GetFixture("auth-methods-email")) + .Post(GetFixture("error-verification-failed")) + .Post(GetFixture("perform-otp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) + .Post(GetFixture("non-empty-vault")); + + // Act + var vault = Vault.Open( + Username, + Password, + MakeUi(new Ui.Passcode(WrongOtp, false), new Ui.Passcode(Otp, false)), + MakeEmptyStorage(), + flow + ); + + // Assert + vault.Accounts.ShouldNotBeEmpty(); + } + + [Fact] + public void Open_succeeds_after_two_failed_otp_attempts_and_third_successful() + { + // Arrange + var flow = new RestFlow() + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("error-verification-failed")) + .Post(GetFixture("error-verification-failed")) + .Post(GetFixture("perform-otp-verification")) + .Post(GetFixture("complete-device-registration-with-auth-ticket")) + .Post(GetFixture("non-empty-vault")); + + // Act + var vault = Vault.Open( + Username, + Password, + MakeUi(new Ui.Passcode(WrongOtp, false), new Ui.Passcode(WrongOtp, false), new Ui.Passcode(Otp, false)), + MakeEmptyStorage(), + flow + ); + + // Assert + vault.Accounts.ShouldNotBeEmpty(); + } + + [Fact] + public void Open_throws_canceled_mfa_after_three_wrong_otp_attempts() + { + // Arrange + var flow = new RestFlow() + .Post(GetFixture("auth-methods-totp")) + .Post(GetFixture("error-verification-failed")) + .Post(GetFixture("error-verification-failed")) + .Post(GetFixture("error-verification-failed")); + + // Act/Assert + Exceptions.AssertThrowsBadMultiFactor( + () => + Vault.Open( + Username, + Password, + MakeUi(new Ui.Passcode(WrongOtp, false), new Ui.Passcode(WrongOtp, false), new Ui.Passcode(WrongOtp, false)), + MakeEmptyStorage(), + flow + ), + "MFA failed too many times" + ); + } + // TODO: Add tests to check transactions in the vault. // @@ -247,5 +337,6 @@ private static MemoryStorage MakeStorage(string accessKey, string secretKey) private const string AccessKey = "access-key"; private const string SecretKey = "secret-key"; private const string Otp = "123456"; + private const string WrongOtp = "654321"; } }