diff --git a/src/kibali/Kibali.csproj b/src/kibali/Kibali.csproj index 70680b8..b0dda77 100644 --- a/src/kibali/Kibali.csproj +++ b/src/kibali/Kibali.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/kibali/PermissionsImporter.cs b/src/kibali/PermissionsImporter.cs new file mode 100644 index 0000000..e2f3a47 --- /dev/null +++ b/src/kibali/PermissionsImporter.cs @@ -0,0 +1,170 @@ +using Kibali; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text.Json; +using System.Threading.Tasks; + +namespace Kibali +{ + public class PermissionsImporter + { + + public async Task Import(string inputFile, string permissionsFile) + { + var doc = new PermissionsDocument(); + JsonElement rootObject; + JsonElement permissionsObject; + + using (var client = new HttpClient()) + { + rootObject = await FetchAndParseJsonAsync(inputFile, client); + permissionsObject = await FetchAndParseJsonAsync(permissionsFile, client); + } + + var apiPermissions = rootObject.GetProperty("ApiPermissions"); + + CreatePermissions(doc, permissionsObject); + + var entries = CreatePermissionsEntries(apiPermissions); + + var permissionsInfoList = entries.GroupBy(pe => pe.Permission) + .Select(gr => new { Permission = gr.Key, Paths = gr.GroupBy(p => p.Path) }) + .OrderBy(gr => gr.Permission); + + foreach (var permissionInfo in permissionsInfoList) + { + if (!doc.Permissions.ContainsKey(permissionInfo.Permission)) + { + doc.Permissions.Add(permissionInfo.Permission, new Permission()); + } + + var perm = doc.Permissions[permissionInfo.Permission]; + foreach (var pathDetails in permissionInfo.Paths) + { + SortedSet methods = new SortedSet(); + SortedSet schemes = new SortedSet(); + foreach (var entry in pathDetails) + { + methods.Add(entry.Method); + schemes.Add(entry.Scheme); + } + var pathSet = GetOrCreatePathSet(perm, methods, schemes); + pathSet.Paths.Add(pathDetails.Key, string.Empty); + } + } + return doc; + } + + private void CreatePermissions(PermissionsDocument doc, JsonElement permissionsObject) + { + var delegatedElement = permissionsObject.GetProperty("delegatedScopesList"); + foreach (var entry in delegatedElement.EnumerateArray()) + { + var name = entry.GetProperty("value").GetString(); + if (!doc.Permissions.TryGetValue(name, out var permission)) + { + permission = new Permission(); + } + + var scheme = new Scheme + { + RequiresAdminConsent = entry.GetProperty("isAdmin").GetBoolean(), + AdminDescription = entry.GetProperty("adminConsentDescription").GetString(), + AdminDisplayName = entry.GetProperty("adminConsentDisplayName").GetString(), + UserDescription = entry.GetProperty("consentDescription").GetString(), + UserDisplayName = entry.GetProperty("consentDisplayName").GetString() + }; + + permission.Schemes["DelegatedWork"] = scheme; + + doc.Permissions.Add(name, permission); + } + + + var applicationElement = permissionsObject.GetProperty("applicationScopesList"); + foreach (var entry in applicationElement.EnumerateArray()) + { + var name = entry.GetProperty("value").GetString(); + if (!doc.Permissions.TryGetValue(name, out var permission)) + { + permission = new Permission(); + doc.Permissions.Add(name, permission); + } + + var scheme = new Scheme + { + RequiresAdminConsent = entry.GetProperty("isAdmin").GetBoolean(), + AdminDescription = entry.GetProperty("consentDescription").GetString(), + AdminDisplayName = entry.GetProperty("consentDisplayName").GetString(), + }; + + permission.Schemes["Application"] = scheme; + } + + } + + private List CreatePermissionsEntries(JsonElement apiPermissions) + { + List entries = new(); + + foreach (var path in apiPermissions.EnumerateObject()) + { + foreach (var method in path.Value.EnumerateObject()) + { + foreach (var scheme in method.Value.EnumerateObject()) + { + foreach (var permission in scheme.Value.EnumerateArray()) + { + entries.Add(new PermissionEntry() + { + Permission = permission.GetString(), + Path = path.Name, + Method = method.Name, + Scheme = scheme.Name + }); + } + } + } + } + return entries; + } + + private async Task FetchAndParseJsonAsync(string path, HttpClient client) + { + Stream inputStream = path.StartsWith("http") + ? await client.GetStreamAsync(path) + : new FileStream(path, FileMode.Open); + + using (inputStream) + { + var jsonDoc = await JsonDocument.ParseAsync(inputStream); + return jsonDoc.RootElement; + } + } + + private PathSet GetOrCreatePathSet(Permission perm, SortedSet methods, SortedSet schemes) + { + var pathSet = perm.PathSets.FirstOrDefault(x => x.SchemeKeys.SetEquals(schemes) && x.Methods.SetEquals(methods)); + if (pathSet != null) + return pathSet; + + var newPathSet = new PathSet() + { + Methods = methods, + SchemeKeys = schemes + }; + perm.PathSets.Add(newPathSet); + return newPathSet; + } + } + public class PermissionEntry + { + public string Path { get; set; } + public string Method { get; set; } + public string Scheme { get; set; } + public string Permission { get; set; } + } +} + diff --git a/src/kibaliTool/ImportCommand.cs b/src/kibaliTool/ImportCommand.cs index 7b87670..d098a0c 100644 --- a/src/kibaliTool/ImportCommand.cs +++ b/src/kibaliTool/ImportCommand.cs @@ -21,126 +21,20 @@ internal class ImportCommand { public static async Task Execute(ImportCommandParameters commandOptions) { - var doc = new PermissionsDocument(); - - await ParseFromGEPermissions(doc, commandOptions.SourcePermissionsFile, commandOptions.SourceDescriptionsFile); + var importer = new PermissionsImporter(); + + var doc = importer.Import(commandOptions.SourcePermissionsFile, commandOptions.SourceDescriptionsFile).Result; if (commandOptions.SingleFile) { await WriteSingleDocument(doc, commandOptions.OutFolder); - } else + } + else { await WriteDocuments(doc, commandOptions.OutFolder); } return 0; - } - - public static async Task ParseFromGEPermissions(PermissionsDocument doc, string inputFile, string permissionsFile) - { - JsonElement rootObject; - JsonElement permissionsObject; - - using (var client = new HttpClient()) - { - rootObject = await FetchAndParseJsonAsync(inputFile, client); - permissionsObject = await FetchAndParseJsonAsync(permissionsFile, client); - } - - var apiPermissions = rootObject.GetProperty("ApiPermissions"); - - CreatePermissions(doc, permissionsObject); - - var entries = CreatePermissionsEntries(apiPermissions); - - var permissionsInfoList = entries.GroupBy(pe => pe.Permission) - .Select(gr => new { Permission = gr.Key, Paths = gr.GroupBy(p => p.Path) }) - .OrderBy(gr => gr.Permission); - - foreach (var permissionInfo in permissionsInfoList) - { - if (!doc.Permissions.ContainsKey(permissionInfo.Permission)) - { - doc.Permissions.Add(permissionInfo.Permission, new Permission()); - } - - var perm = doc.Permissions[permissionInfo.Permission]; - foreach (var pathDetails in permissionInfo.Paths) - { - SortedSet methods = new SortedSet(); - SortedSet schemes = new SortedSet(); - foreach (var entry in pathDetails) - { - methods.Add(entry.Method); - schemes.Add(entry.Scheme); - } - var pathSet = GetOrCreatePathSet(perm, methods, schemes); - pathSet.Paths.Add(pathDetails.Key, string.Empty); - } - } - } - - private static void CreatePermissions(PermissionsDocument doc, JsonElement permissionsObject) - { - var delegatedElement = permissionsObject.GetProperty("delegatedScopesList"); - foreach (var entry in delegatedElement.EnumerateArray()) - { - var name = entry.GetProperty("value").GetString(); - if (!doc.Permissions.TryGetValue(name, out var permission)) - { - permission = new Permission(); - } - - var scheme = new Scheme - { - RequiresAdminConsent = entry.GetProperty("isAdmin").GetBoolean(), - AdminDescription = entry.GetProperty("adminConsentDescription").GetString(), - AdminDisplayName = entry.GetProperty("adminConsentDisplayName").GetString(), - UserDescription = entry.GetProperty("consentDescription").GetString(), - UserDisplayName = entry.GetProperty("consentDisplayName").GetString() - }; - - permission.Schemes["DelegatedWork"] = scheme; - - doc.Permissions.Add(name, permission); - } - - - var applicationElement = permissionsObject.GetProperty("applicationScopesList"); - foreach (var entry in applicationElement.EnumerateArray()) - { - var name = entry.GetProperty("value").GetString(); - if (!doc.Permissions.TryGetValue(name, out var permission)) - { - permission = new Permission(); - doc.Permissions.Add(name, permission); - } - - var scheme = new Scheme - { - RequiresAdminConsent = entry.GetProperty("isAdmin").GetBoolean(), - AdminDescription = entry.GetProperty("consentDescription").GetString(), - AdminDisplayName = entry.GetProperty("consentDisplayName").GetString(), - }; - - permission.Schemes["Application"] = scheme; - } - - } - - private static PathSet GetOrCreatePathSet(Permission perm, SortedSet methods, SortedSet schemes) - { - var pathSet = perm.PathSets.FirstOrDefault(x => x.SchemeKeys.SetEquals(schemes) && x.Methods.SetEquals(methods)); - if (pathSet != null) - return pathSet; - - var newPathSet = new PathSet() - { - Methods = methods, - SchemeKeys = schemes - }; - perm.PathSets.Add(newPathSet); - return newPathSet; } public static async Task WriteSingleDocument(PermissionsDocument doc, string outputPath) @@ -184,159 +78,6 @@ public static async Task WriteDocuments(PermissionsDocument doc, string outputPa } } - private static List CreatePermissionsEntries(JsonElement apiPermissions) - { - List entries = new(); - - foreach (var path in apiPermissions.EnumerateObject()) - { - foreach (var method in path.Value.EnumerateObject()) - { - foreach (var scheme in method.Value.EnumerateObject()) - { - foreach (var permission in scheme.Value.EnumerateArray()) - { - entries.Add(new PermissionEntry() - { - Permission = permission.GetString(), - Path = path.Name, - Method = method.Name, - Scheme = scheme.Name - }); - } - } - } - } - return entries; - } - - private static async Task FetchAndParseJsonAsync(string path, HttpClient client) - { - Stream inputStream = path.StartsWith("http") - ? await client.GetStreamAsync(path) - : new FileStream(path, FileMode.Open); - - using (inputStream) - { - var jsonDoc = await JsonDocument.ParseAsync(inputStream); - return jsonDoc.RootElement; - } - } - - //private static void ProcessPermissionsSchemes(string schemeType, JsonElement schemes, PermissionsDocument doc) - //{ - // foreach (var scheme in schemes.EnumerateArray()) - // { - // Permission perm; - // var name = scheme.GetProperty("Name").GetString(); - // // Use name to see if permission exists, if not create it - // if (!doc.Permissions.TryGetValue(name, out perm)) - // { - // perm = new Permission(); - // doc.Permissions.Add(name, perm); - // } - - // // add scheme of schemeType, set descriptions - // var newScheme = new Scheme - // { - // RequiresAdminConsent = scheme.GetProperty("Grant").GetString() == "admin", - // UserDescription = scheme.GetProperty("Description").GetString(), - // AdminDescription = scheme.GetProperty("ConsentDescription").GetString() - // }; - // if (!perm.Schemes.ContainsKey(schemeType)) - // { - // perm.Schemes.Add(schemeType, newScheme); - // } - // else - // { - // Console.WriteLine($"Duplicate entry for {name} in scheme {schemeType}"); - // } - // } - //} - - //private static string GetSchemeType(bool isApplication, bool isDelegatedWork) - //{ - // if (isApplication) - // { - // // Add ApplicationPermission - // return "Application"; - // } - // if (isDelegatedWork) - // { - // // Add DelegatePermission - // return "DelegatedWork"; - - // } - // return "DelegatedPersonal"; - //} - - //private static void ParseFromMerillCSV(PermissionsDocument doc, string inputfile) - //{ - // var reader = new StreamReader(inputfile); - // reader.ReadLine(); // Skip titles. - // string line; - // string[] row; - // while ((line = reader.ReadLine()) != null) - // { - // row = line.Split(','); - - // var name = row[0]; - - // CreatePath(doc, name, path: row[5], method: row[4].TrimEnd(), GetSchemeType(bool.Parse(row[1]), bool.Parse(row[2]))); - // } - //} - - //private static void CreatePath(PermissionsDocument doc, string name, string path, string method, string type) - //{ - // if (doc.Permissions.TryGetValue(name, out Permission perm)) - // { - - // if (!perm.Schemes.ContainsKey(type)) - // { - // perm.Schemes.Add(type, new Scheme()); - // } - // PathSet pathSet; - // if (perm.PathSets.Count == 0) - // { - // pathSet = new PathSet(); - // perm.PathSets.Add(pathSet); - // } - // else - // { - // pathSet = perm.PathSets[0]; - // } - - // pathSet.Methods.Add(method); - // pathSet.Paths.TryAdd(path, new ApiPermissions.PathConstraints()); - // } - // else - // { - // var newPermission = new Permission(); - // doc.Permissions.Add(name, newPermission); - // } - //} - - - //private static void CreatePermissions(PermissionsDocument doc, JsonElement rootObject) - //{ - // var permissionSchemes = rootObject.GetProperty("PermissionSchemes"); - - // ProcessPermissionsSchemes("DelegatedPersonal", - // permissionSchemes.GetProperty("DelegatedPersonal"), doc); - // ProcessPermissionsSchemes("DelegatedWork", - // permissionSchemes.GetProperty("DelegatedWork"), doc); - // ProcessPermissionsSchemes("Application", - // permissionSchemes.GetProperty("Application"), doc); - //} - - } - public class PermissionEntry - { - public string Path { get; set; } - public string Method { get; set; } - public string Scheme { get; set; } - public string Permission { get; set; } - } } diff --git a/src/kibaliTool/KibaliTool.csproj b/src/kibaliTool/KibaliTool.csproj index 40e2a63..257444d 100644 --- a/src/kibaliTool/KibaliTool.csproj +++ b/src/kibaliTool/KibaliTool.csproj @@ -18,7 +18,7 @@ - +