From 4c8488268235b581af88d0be47c60fada428046b Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Thu, 18 May 2017 15:40:00 -0400 Subject: [PATCH] Connect to GSuite DirectoryService --- src/Core/Services/GSuiteDirectoryService.cs | 62 ++++++++++++++++++++- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/src/Core/Services/GSuiteDirectoryService.cs b/src/Core/Services/GSuiteDirectoryService.cs index 84a1c3cc..52600732 100644 --- a/src/Core/Services/GSuiteDirectoryService.cs +++ b/src/Core/Services/GSuiteDirectoryService.cs @@ -2,16 +2,35 @@ using System; using System.Threading.Tasks; using System.Collections.Generic; +using Google.Apis.Admin.Directory.directory_v1; +using Google.Apis.Services; +using Google.Apis.Auth.OAuth2; +using System.IO; +using Bit.Core.Utilities; +using System.Linq; namespace Bit.Core.Services { public class GSuiteDirectoryService : IDirectoryService { private static GSuiteDirectoryService _instance; + private static DirectoryService _service; private GSuiteDirectoryService() { - + GoogleCredential creds; + using(var stream = new FileStream(SettingsService.Instance.Server.GSuite.SecretFile, FileMode.Open)) + { + creds = GoogleCredential.FromStream(stream).CreateScoped( + DirectoryService.Scope.AdminDirectoryUserReadonly, + DirectoryService.Scope.AdminDirectoryGroupReadonly); + } + + _service = new DirectoryService(new BaseClientService.Initializer + { + HttpClientInitializer = creds, + ApplicationName = Constants.ProgramName + }); } public static IDirectoryService Instance @@ -27,9 +46,46 @@ namespace Bit.Core.Services } } - public Task, List>> GetEntriesAsync(bool force = false) + public async Task, List>> GetEntriesAsync(bool force = false) { - throw new NotImplementedException(); + if(!AuthService.Instance.Authenticated || !AuthService.Instance.OrganizationSet) + { + throw new ApplicationException("Not logged in or have an org set."); + } + + if(SettingsService.Instance.Server?.GSuite == null) + { + throw new ApplicationException("No configuration for directory server."); + } + + if(SettingsService.Instance.Sync == null) + { + throw new ApplicationException("No configuration for sync."); + } + + List users = null; + if(SettingsService.Instance.Sync.SyncUsers) + { + users = await GetUsersAsync(force); + } + + List groups = null; + if(SettingsService.Instance.Sync.SyncGroups) + { + groups = await GetGroupsAsync(force || (users?.Any(u => !u.Deleted && !u.Disabled) ?? false)); + } + + return new Tuple, List>(groups, users); + } + + private async Task> GetGroupsAsync(bool force) + { + return new List(); + } + + private async Task> GetUsersAsync(bool force) + { + return new List(); } } }