diff --git a/src/Console/Program.cs b/src/Console/Program.cs index a13315a4..40d45b7a 100644 --- a/src/Console/Program.cs +++ b/src/Console/Program.cs @@ -43,9 +43,10 @@ namespace Bit.Console Con.WriteLine("2. Log out"); Con.WriteLine("3. Configure directory connection"); Con.WriteLine("4. Configure sync"); - Con.WriteLine("5. Sync directory"); - Con.WriteLine("6. Start/stop background service"); - Con.WriteLine("7. Exit"); + Con.WriteLine("5. Simulate directory sync"); + Con.WriteLine("6. Sync directory"); + Con.WriteLine("7. Start/stop background service"); + Con.WriteLine("8. Exit"); Con.WriteLine(); Con.Write("What would you like to do? "); selection = Con.ReadLine(); @@ -75,6 +76,12 @@ namespace Bit.Console await ConfigSyncAsync(); break; case "5": + case "print": + case "sim": + case "simulate": + await PrintAsync(); + break; + case "6": case "sync": await SyncAsync(); break; @@ -543,7 +550,7 @@ namespace Bit.Console if(result.Success) { Con.ForegroundColor = ConsoleColor.Green; - Con.WriteLine("Syncing complete ({0} users, {1} groups).", result.UserCount, result.GroupCount); + Con.WriteLine("Syncing complete ({0} users, {1} groups).", result.Users.Count, result.Groups.Count); Con.ResetColor(); } else @@ -556,6 +563,58 @@ namespace Bit.Console } } + private static async Task PrintAsync() + { + if(!Core.Services.AuthService.Instance.Authenticated) + { + Con.WriteLine("You are not logged in."); + } + else if(Core.Services.SettingsService.Instance.Server == null) + { + Con.WriteLine("Server is not configured."); + } + else + { + var force = false; + if(_usingArgs) + { + var parameters = ParseParameters(); + force = parameters.ContainsKey("f"); + } + + Con.WriteLine("Querying..."); + Con.WriteLine(); + + var result = await Sync.GatherAsync(force); + if(result.Success) + { + Con.WriteLine("Groups:"); + foreach(var group in result.Groups) + { + Con.WriteLine(" {0} - {1}", group.Name, group.DistinguishedName); + } + + Con.WriteLine(); + Con.WriteLine("Users:"); + foreach(var user in result.Users) + { + Con.WriteLine(" {0}", user.Email); + foreach(var group in user.Groups) + { + Con.WriteLine(" {0}", group); + } + } + } + else + { + Con.ForegroundColor = ConsoleColor.Red; + Con.WriteLine("Querying failed."); + Con.WriteLine(result.ErrorMessage); + Con.ResetColor(); + } + } + } + private static string ReadSecureLine() { var input = string.Empty; diff --git a/src/Core/Models/SyncResult.cs b/src/Core/Models/SyncResult.cs index 290e9cbe..afa99723 100644 --- a/src/Core/Models/SyncResult.cs +++ b/src/Core/Models/SyncResult.cs @@ -10,7 +10,7 @@ namespace Bit.Core.Models { public bool Success { get; set; } public string ErrorMessage { get; set; } - public int GroupCount { get; set; } - public int UserCount { get; set; } + public List Groups { get; set; } + public List Users { get; set; } } } diff --git a/src/Core/Utilities/Sync.cs b/src/Core/Utilities/Sync.cs index ce9b37b7..cea5f111 100644 --- a/src/Core/Utilities/Sync.cs +++ b/src/Core/Utilities/Sync.cs @@ -12,6 +12,46 @@ namespace Bit.Core.Utilities public static class Sync { public static async Task SyncAllAsync(bool force = false) + { + var now = DateTime.UtcNow; + var gatherResult = await GatherAsync(force); + if(!gatherResult.Success) + { + return gatherResult; + } + + var request = new ImportRequest(gatherResult.Groups, gatherResult.Users); + var response = await ApiService.Instance.PostImportAsync(request); + if(response.Succeeded) + { + if(SettingsService.Instance.Sync.SyncGroups) + { + SettingsService.Instance.LastGroupSyncDate = now; + } + + if(SettingsService.Instance.Sync.SyncUsers) + { + SettingsService.Instance.LastUserSyncDate = now; + } + + return new SyncResult + { + Success = true, + Groups = gatherResult.Groups, + Users = gatherResult.Users + }; + } + else + { + return new SyncResult + { + Success = false, + ErrorMessage = response.Errors.FirstOrDefault()?.Message + }; + } + } + + public static async Task GatherAsync(bool force = false) { if(!AuthService.Instance.Authenticated || !AuthService.Instance.OrganizationSet) { @@ -40,8 +80,6 @@ namespace Bit.Core.Utilities }; } - var now = DateTime.UtcNow; - List groups = null; if(SettingsService.Instance.Sync.SyncGroups) { @@ -56,35 +94,12 @@ namespace Bit.Core.Utilities FlattenGroupsToUsers(groups, null, groups, users); - var request = new ImportRequest(groups, users); - var response = await ApiService.Instance.PostImportAsync(request); - if(response.Succeeded) + return new SyncResult { - if(SettingsService.Instance.Sync.SyncGroups) - { - SettingsService.Instance.LastGroupSyncDate = now; - } - - if(SettingsService.Instance.Sync.SyncUsers) - { - SettingsService.Instance.LastUserSyncDate = now; - } - - return new SyncResult - { - Success = true, - GroupCount = groups.Count, - UserCount = users.Count - }; - } - else - { - return new SyncResult - { - Success = false, - ErrorMessage = response.Errors.FirstOrDefault()?.Message - }; - } + Success = true, + Groups = groups, + Users = users + }; } private static Task> GetGroupsAsync(bool force = false)