From 2b276e99866935cf7101aa1999e7b107ffaaf2a9 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Thu, 1 Mar 2018 09:29:49 -0500 Subject: [PATCH] backwards compat apis on Uri --- src/Core/Models/Api/CipherFieldModel.cs | 2 ++ src/Core/Models/Api/CipherLoginModel.cs | 34 +++++++++++++------ .../Models/Api/Request/CipherRequestModel.cs | 7 ++-- .../Api/Response/CipherResponseModel.cs | 2 +- src/Core/Models/Data/CipherData.cs | 2 +- src/Core/Models/Data/CipherLoginData.cs | 19 +++++++---- 6 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/Core/Models/Api/CipherFieldModel.cs b/src/Core/Models/Api/CipherFieldModel.cs index f703bd3931..8bf4aee4e0 100644 --- a/src/Core/Models/Api/CipherFieldModel.cs +++ b/src/Core/Models/Api/CipherFieldModel.cs @@ -6,6 +6,8 @@ namespace Bit.Core.Models.Api { public class CipherFieldModel { + public CipherFieldModel() { } + public CipherFieldModel(CipherFieldData data) { Type = data.Type; diff --git a/src/Core/Models/Api/CipherLoginModel.cs b/src/Core/Models/Api/CipherLoginModel.cs index 74cb15e185..8f99db188e 100644 --- a/src/Core/Models/Api/CipherLoginModel.cs +++ b/src/Core/Models/Api/CipherLoginModel.cs @@ -4,14 +4,22 @@ using Bit.Core.Enums; using System.Collections.Generic; using System.Linq; using Bit.Core.Models.Data; +using Newtonsoft.Json; namespace Bit.Core.Models.Api { public class CipherLoginModel { + public CipherLoginModel() { } + public CipherLoginModel(CipherLoginData data) { - Uris = data.Uris.Select(u => new LoginApiUriModel(u)); + Uris = data.Uris?.Select(u => new CipherLoginUriModel(u))?.ToList(); + if(!Uris?.Any() ?? true) + { + Uri = data.Uri; + } + Username = data.Username; Password = data.Password; Totp = data.Totp; @@ -24,15 +32,20 @@ namespace Bit.Core.Models.Api get => Uris?.FirstOrDefault()?.Uri; set { - if(Uris == null) + if(string.IsNullOrWhiteSpace(value)) { - Uris = new List(); + return; } - Uris.Append(new LoginApiUriModel(value)); + if(Uris == null) + { + Uris = new List(); + } + + Uris.Add(new CipherLoginUriModel(value)); } } - public IEnumerable Uris { get; set; } + public List Uris { get; set; } [EncryptedString] [StringLength(1000)] public string Username { get; set; } @@ -43,17 +56,16 @@ namespace Bit.Core.Models.Api [StringLength(1000)] public string Totp { get; set; } - public class LoginApiUriModel + public class CipherLoginUriModel { - public LoginApiUriModel() { } + public CipherLoginUriModel() { } - public LoginApiUriModel(string uri) + public CipherLoginUriModel(string uri) { Uri = uri; - Match = UriMatchType.BaseDomain; } - public LoginApiUriModel(CipherLoginData.LoginDataUriModel uri) + public CipherLoginUriModel(CipherLoginData.CipherLoginUriData uri) { Uri = uri.Uri; Match = uri.Match; @@ -62,7 +74,7 @@ namespace Bit.Core.Models.Api [EncryptedString] [StringLength(10000)] public string Uri { get; set; } - public UriMatchType Match { get; set; } + public UriMatchType? Match { get; set; } } } } diff --git a/src/Core/Models/Api/Request/CipherRequestModel.cs b/src/Core/Models/Api/Request/CipherRequestModel.cs index b4489ad025..844fdb30aa 100644 --- a/src/Core/Models/Api/Request/CipherRequestModel.cs +++ b/src/Core/Models/Api/Request/CipherRequestModel.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Linq; using Core.Models.Data; using Bit.Core.Models.Data; +using Newtonsoft.Json.Linq; namespace Bit.Core.Models.Api { @@ -60,8 +61,10 @@ namespace Bit.Core.Models.Api switch(existingCipher.Type) { case CipherType.Login: - existingCipher.Data = JsonConvert.SerializeObject(new CipherLoginData(this), - new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); + var loginObj = JObject.FromObject(new CipherLoginData(this), + new JsonSerializer { NullValueHandling = NullValueHandling.Ignore }); + loginObj[nameof(CipherLoginData.Uri)]?.Parent?.Remove(); + existingCipher.Data = loginObj.ToString(Formatting.None); break; case CipherType.Card: existingCipher.Data = JsonConvert.SerializeObject(new CipherCardData(this), diff --git a/src/Core/Models/Api/Response/CipherResponseModel.cs b/src/Core/Models/Api/Response/CipherResponseModel.cs index 10cbe1f733..cba6173170 100644 --- a/src/Core/Models/Api/Response/CipherResponseModel.cs +++ b/src/Core/Models/Api/Response/CipherResponseModel.cs @@ -54,7 +54,7 @@ namespace Bit.Core.Models.Api Name = cipherData.Name; Notes = cipherData.Notes; - Fields = cipherData.Fields.Select(f => new CipherFieldModel(f)); + Fields = cipherData.Fields?.Select(f => new CipherFieldModel(f)); RevisionDate = cipher.RevisionDate; OrganizationId = cipher.OrganizationId?.ToString(); Attachments = AttachmentResponseModel.FromCipher(cipher, globalSettings); diff --git a/src/Core/Models/Data/CipherData.cs b/src/Core/Models/Data/CipherData.cs index c12d68beea..66b393db5f 100644 --- a/src/Core/Models/Data/CipherData.cs +++ b/src/Core/Models/Data/CipherData.cs @@ -12,7 +12,7 @@ namespace Bit.Core.Models.Data { Name = cipher.Name; Notes = cipher.Notes; - Fields = cipher.Fields.Select(f => new CipherFieldData(f)); + Fields = cipher.Fields?.Select(f => new CipherFieldData(f)); } public string Name { get; set; } diff --git a/src/Core/Models/Data/CipherLoginData.cs b/src/Core/Models/Data/CipherLoginData.cs index 634c76ea62..6def026800 100644 --- a/src/Core/Models/Data/CipherLoginData.cs +++ b/src/Core/Models/Data/CipherLoginData.cs @@ -7,34 +7,41 @@ namespace Bit.Core.Models.Data { public class CipherLoginData : CipherData { + private string _uri; + public CipherLoginData() { } public CipherLoginData(CipherRequestModel cipher) : base(cipher) { - Uris = cipher.Login.Uris?.Where(u => u != null).Select(u => new LoginDataUriModel(u)); + Uris = cipher.Login.Uris?.Where(u => u != null).Select(u => new CipherLoginUriData(u)); Username = cipher.Login.Username; Password = cipher.Login.Password; Totp = cipher.Login.Totp; } - public IEnumerable Uris { get; set; } + public string Uri + { + get => Uris?.FirstOrDefault()?.Uri ?? _uri; + set { _uri = value; } + } + public IEnumerable Uris { get; set; } public string Username { get; set; } public string Password { get; set; } public string Totp { get; set; } - public class LoginDataUriModel + public class CipherLoginUriData { - public LoginDataUriModel() { } + public CipherLoginUriData() { } - public LoginDataUriModel(CipherLoginModel.LoginApiUriModel uri) + public CipherLoginUriData(CipherLoginModel.CipherLoginUriModel uri) { Uri = uri.Uri; Match = uri.Match; } public string Uri { get; set; } - public UriMatchType Match { get; set; } + public UriMatchType? Match { get; set; } } } }