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 @@
-
+