From 96bdc7a4949ae91ec865346407032b519c1285b4 Mon Sep 17 00:00:00 2001 From: atef Date: Fri, 17 Mar 2023 12:47:19 +0100 Subject: [PATCH 1/7] Fix misplaced docs --- .../Doc/ADAM-6000_User_Manaul_Ed_9-51-53.pdf | Bin .../Doc/ADAM-6360D-A1_DS(080321)20210804101056.pdf | Bin ...023_02_20_48TL200_AF06_Firmware Release Note.pdf | Bin .../Battery48TL/Doc/EOC Procedure for 48Tl200.pdf | Bin .../TI_48TL200 ModBus protocol_rev.INNOVENERGY.pdf | Bin .../TI_48TLxxx ModBus protocol_rev.7.1-1GoodOne.pdf | Bin .../TruConvertAc/Doc/A67-0141-00.BKde-001-09.pdf | Bin ...F_Betriebsanleitung_TruConvert_DC_1000_Serie.pdf | Bin 8 files changed, 0 insertions(+), 0 deletions(-) rename csharp/{lib => Lib}/Devices/Adam6060/Doc/ADAM-6000_User_Manaul_Ed_9-51-53.pdf (100%) rename csharp/{lib => Lib}/Devices/Adam6060/Doc/ADAM-6360D-A1_DS(080321)20210804101056.pdf (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/Doc/2023_02_20_48TL200_AF06_Firmware Release Note.pdf (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/Doc/EOC Procedure for 48Tl200.pdf (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/Doc/TI_48TL200 ModBus protocol_rev.INNOVENERGY.pdf (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/Doc/TI_48TLxxx ModBus protocol_rev.7.1-1GoodOne.pdf (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/Doc/A67-0141-00.BKde-001-09.pdf (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/Doc/TRUMPF_Betriebsanleitung_TruConvert_DC_1000_Serie.pdf (100%) diff --git a/csharp/lib/Devices/Adam6060/Doc/ADAM-6000_User_Manaul_Ed_9-51-53.pdf b/csharp/Lib/Devices/Adam6060/Doc/ADAM-6000_User_Manaul_Ed_9-51-53.pdf similarity index 100% rename from csharp/lib/Devices/Adam6060/Doc/ADAM-6000_User_Manaul_Ed_9-51-53.pdf rename to csharp/Lib/Devices/Adam6060/Doc/ADAM-6000_User_Manaul_Ed_9-51-53.pdf diff --git a/csharp/lib/Devices/Adam6060/Doc/ADAM-6360D-A1_DS(080321)20210804101056.pdf b/csharp/Lib/Devices/Adam6060/Doc/ADAM-6360D-A1_DS(080321)20210804101056.pdf similarity index 100% rename from csharp/lib/Devices/Adam6060/Doc/ADAM-6360D-A1_DS(080321)20210804101056.pdf rename to csharp/Lib/Devices/Adam6060/Doc/ADAM-6360D-A1_DS(080321)20210804101056.pdf diff --git a/csharp/lib/Devices/Battery48TL/Doc/2023_02_20_48TL200_AF06_Firmware Release Note.pdf b/csharp/Lib/Devices/Battery48TL/Doc/2023_02_20_48TL200_AF06_Firmware Release Note.pdf similarity index 100% rename from csharp/lib/Devices/Battery48TL/Doc/2023_02_20_48TL200_AF06_Firmware Release Note.pdf rename to csharp/Lib/Devices/Battery48TL/Doc/2023_02_20_48TL200_AF06_Firmware Release Note.pdf diff --git a/csharp/lib/Devices/Battery48TL/Doc/EOC Procedure for 48Tl200.pdf b/csharp/Lib/Devices/Battery48TL/Doc/EOC Procedure for 48Tl200.pdf similarity index 100% rename from csharp/lib/Devices/Battery48TL/Doc/EOC Procedure for 48Tl200.pdf rename to csharp/Lib/Devices/Battery48TL/Doc/EOC Procedure for 48Tl200.pdf diff --git a/csharp/lib/Devices/Battery48TL/Doc/TI_48TL200 ModBus protocol_rev.INNOVENERGY.pdf b/csharp/Lib/Devices/Battery48TL/Doc/TI_48TL200 ModBus protocol_rev.INNOVENERGY.pdf similarity index 100% rename from csharp/lib/Devices/Battery48TL/Doc/TI_48TL200 ModBus protocol_rev.INNOVENERGY.pdf rename to csharp/Lib/Devices/Battery48TL/Doc/TI_48TL200 ModBus protocol_rev.INNOVENERGY.pdf diff --git a/csharp/lib/Devices/Battery48TL/Doc/TI_48TLxxx ModBus protocol_rev.7.1-1GoodOne.pdf b/csharp/Lib/Devices/Battery48TL/Doc/TI_48TLxxx ModBus protocol_rev.7.1-1GoodOne.pdf similarity index 100% rename from csharp/lib/Devices/Battery48TL/Doc/TI_48TLxxx ModBus protocol_rev.7.1-1GoodOne.pdf rename to csharp/Lib/Devices/Battery48TL/Doc/TI_48TLxxx ModBus protocol_rev.7.1-1GoodOne.pdf diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/Doc/A67-0141-00.BKde-001-09.pdf b/csharp/Lib/Devices/Trumpf/TruConvertAc/Doc/A67-0141-00.BKde-001-09.pdf similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/Doc/A67-0141-00.BKde-001-09.pdf rename to csharp/Lib/Devices/Trumpf/TruConvertAc/Doc/A67-0141-00.BKde-001-09.pdf diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/Doc/TRUMPF_Betriebsanleitung_TruConvert_DC_1000_Serie.pdf b/csharp/Lib/Devices/Trumpf/TruConvertDc/Doc/TRUMPF_Betriebsanleitung_TruConvert_DC_1000_Serie.pdf similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/Doc/TRUMPF_Betriebsanleitung_TruConvert_DC_1000_Serie.pdf rename to csharp/Lib/Devices/Trumpf/TruConvertDc/Doc/TRUMPF_Betriebsanleitung_TruConvert_DC_1000_Serie.pdf From ed7c65be2cd9a0bad95eeaabd2d53b5ec716aa35 Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 19 Mar 2023 16:09:37 +0100 Subject: [PATCH 2/7] group S3 related functions into S3 namespace --- .../Backend/DataTypes/Methods/Installation.cs | 100 ++++++------------ .../App/Backend/DataTypes/Methods/Session.cs | 33 +++--- csharp/App/Backend/Database/Db.cs | 9 +- csharp/App/Backend/S3/S3Access.cs | 16 +++ csharp/App/Backend/S3/S3Cmd.cs | 62 +++++++++++ csharp/InnovEnergy.sln.DotSettings | 1 + 6 files changed, 129 insertions(+), 92 deletions(-) create mode 100644 csharp/App/Backend/S3/S3Access.cs create mode 100644 csharp/App/Backend/S3/S3Cmd.cs diff --git a/csharp/App/Backend/DataTypes/Methods/Installation.cs b/csharp/App/Backend/DataTypes/Methods/Installation.cs index 608827041..8409371a0 100644 --- a/csharp/App/Backend/DataTypes/Methods/Installation.cs +++ b/csharp/App/Backend/DataTypes/Methods/Installation.cs @@ -1,6 +1,5 @@ -using CliWrap; -using CliWrap.Buffered; using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.S3; using InnovEnergy.Lib.Utils; namespace InnovEnergy.App.Backend.DataTypes.Methods; @@ -8,96 +7,59 @@ namespace InnovEnergy.App.Backend.DataTypes.Methods; public static class InstallationMethods { - public static async Task RenewS3BucketUrl(this Installation installation) + private const String BucketNameSalt = "3e5b3069-214a-43ee-8d85-57d72000c19d"; + + public static String BucketName(this Installation installation) { - await RenewS3BucketUrl(installation, TimeSpan.FromDays(1)); + return $"s3://{installation.Id}-{BucketNameSalt}"; } - public static async Task RenewS3BucketUrl(this Installation installation, TimeSpan validity) + public static async Task RenewS3BucketUrl(this Installation installation) { - const String secret = "55MAqyO_FqUmh7O64VIO0egq50ERn_WIAWuc2QC44QU"; - const String apiKey = "EXO44d2979c8e570eae81ead564"; - const String salt = "3e5b3069-214a-43ee-8d85-57d72000c19d"; - var cmd = Cli - .Wrap("python3") - .WithArguments(new[] - { - "Resources/s3cmd.py", "signurl", $"s3://{installation.Id}-{salt}", validity.TotalSeconds.ToString(), "--access_key", - apiKey, "--secret_key", secret - }); - var x = await cmd.ExecuteBufferedAsync(); - installation.S3Url = x.StandardOutput.Replace("\n", "").Replace(" ", ""); + return await RenewS3BucketUrl(installation, TimeSpan.FromDays(1)); + } - Db.Update(installation); + public static async Task RenewS3BucketUrl(this Installation installation, TimeSpan validity) + { + installation.S3Url = await S3Access.ReadOnly.SignUrl(installation.BucketName(), validity); + return Db.Update(installation); } - - public static async Task CreateBucket(this Installation installation) + public static Task CreateBucket(this Installation installation) { - const String secret = "-T9TAqy9a3-0-xj7HKsFFJOCcxfRpcnL6OW5oOrOcWU"; - - const String apiKey = "EXO87ca85e29dd412f1238f1cf0"; - const String salt = "3e5b3069-214a-43ee-8d85-57d72000c19d"; - - var cmd = Cli - .Wrap("python3") - .WithArguments(new[] - { - "Resources/s3cmd.py", "mb", $"s3://{installation.Id}-{salt}", "--access_key", - apiKey, "--secret_key", secret - }); - var x = await cmd.ExecuteBufferedAsync(); - - //Updating the url in the db as not wait until the next bi-daily update - var cmd2 = Cli - .Wrap("python3") - .WithArguments(new[] - { - "Resources/s3cmd.py", "signurl", $"s3://{installation.Id}-{salt}", - TimeSpan.FromDays(1).TotalSeconds.ToString(), "--access_key", - apiKey, "--secret_key", secret - }); - - var y = await cmd2.ExecuteBufferedAsync(); - installation.S3Url = y.StandardOutput.Replace("\n", "").Replace(" ", ""); - - Db.Update(installation); - - return x.ExitCode == 0; + return S3Access + .ReadWrite + .CreateBucket(installation.BucketName()); } - public static async Task DeleteBucket(this Installation installation) + public static Task DeleteBucket(this Installation installation) { - const String secret = "-T9TAqy9a3-0-xj7HKsFFJOCcxfRpcnL6OW5oOrOcWU"; - const String apiKey = "EXO87ca85e29dd412f1238f1cf0"; - const String salt = "3e5b3069-214a-43ee-8d85-57d72000c19d"; - var cmd = Cli - .Wrap("python3") - .WithArguments(new[] - { - "Resources/s3cmd.py", "rb", $"s3://{installation.Id}-{salt}", "--access_key", - apiKey, "--secret_key", secret - }); - var x = await cmd.ExecuteBufferedAsync(); - return x.ExitCode == 0; + return S3Access + .ReadWrite + .DeleteBucket(installation.BucketName()); } public static IEnumerable UsersWithAccess(this Installation installation) { - return UsersWithDirectAccess(installation).Concat(UsersWithInheritedAccess(installation)); + return installation.UsersWithDirectAccess() + .Concat(installation.UsersWithInheritedAccess()); } public static IEnumerable UsersWithDirectAccess(this Installation installation) { - return Db.InstallationAccess - .Where(access => access.InstallationId == installation.Id) - .Select(access => Db.GetUserById(access.UserId)) - .NotNull(); + return Db + .InstallationAccess + .Where(a => a.InstallationId == installation.Id) + .Select(a => Db.GetUserById(a.UserId)) + .NotNull(); } public static IEnumerable UsersWithInheritedAccess(this Installation installation) { - return installation.Ancestors().SelectMany(f => f.UsersWithDirectAccess()).NotNull(); + return installation + .Ancestors() + .SelectMany(FolderMethods.UsersWithDirectAccess) + .NotNull(); } public static IEnumerable Ancestors(this Installation installation) diff --git a/csharp/App/Backend/DataTypes/Methods/Session.cs b/csharp/App/Backend/DataTypes/Methods/Session.cs index 5b8dfae0a..7d76b1f0b 100644 --- a/csharp/App/Backend/DataTypes/Methods/Session.cs +++ b/csharp/App/Backend/DataTypes/Methods/Session.cs @@ -14,7 +14,7 @@ public static class SessionMethods && user.HasWriteAccess && user.HasAccessTo(folder.Parent()) && Db.Create(folder) - && Db.Create(new FolderAccess() { UserId = user.Id, FolderId = folder.Id }); + && Db.Create(new FolderAccess { UserId = user.Id, FolderId = folder.Id }); } public static Boolean Update(this Session? session, Folder? folder) @@ -52,7 +52,7 @@ public static class SessionMethods && user.HasWriteAccess && user.HasAccessTo(installation.Parent()) && Db.Create(installation) - && installation.CreateBucket().Result + && installation.CreateBucket().Result // TODO: await? && Db.Create(new InstallationAccess { UserId = user.Id, InstallationId = installation.Id }); } @@ -77,6 +77,7 @@ public static class SessionMethods && installation is not null && user.HasWriteAccess && user.HasAccessTo(installation) +// && installation.DeleteBucket().Result // TODO: await? && Db.Delete(installation); } @@ -154,13 +155,12 @@ public static class SessionMethods var sessionUser = session?.User; return sessionUser is not null - && user is not null - && installation is not null - && user.IsDescendantOf(sessionUser) - && sessionUser.HasAccessTo(installation) - && user.HasAccessTo(installation) - && Db.InstallationAccess.Delete(access => - access.UserId == user.Id && access.InstallationId == installation.Id) > 0; + && user is not null + && installation is not null + && user.IsDescendantOf(sessionUser) + && sessionUser.HasAccessTo(installation) + && user.HasAccessTo(installation) + && Db.InstallationAccess.Delete(a => a.UserId == user.Id && a.InstallationId == installation.Id) > 0; } public static Boolean RevokeAccessTo(this Session? session, User? user, Folder? folder) @@ -168,19 +168,18 @@ public static class SessionMethods var sessionUser = session?.User; return sessionUser is not null - && user is not null - && folder is not null - && user.IsDescendantOf(sessionUser) - && sessionUser.HasAccessTo(folder) - && user.HasAccessTo(folder) - && Db.FolderAccess.Delete(access => - access.UserId == user.Id && access.FolderId == folder.Id) > 0; + && user is not null + && folder is not null + && user.IsDescendantOf(sessionUser) + && sessionUser.HasAccessTo(folder) + && user.HasAccessTo(folder) + && Db.FolderAccess.Delete(a => a.UserId == user.Id && a.FolderId == folder.Id) > 0; } public static Boolean Logout(this Session? session) { return session is not null - && Db.Sessions.Delete(s => s.Token == session.Token) > 0; + && Db.Sessions.Delete(s => s.Token == session.Token) > 0; } } \ No newline at end of file diff --git a/csharp/App/Backend/Database/Db.cs b/csharp/App/Backend/Database/Db.cs index f7eaafd7f..80cd15454 100644 --- a/csharp/App/Backend/Database/Db.cs +++ b/csharp/App/Backend/Database/Db.cs @@ -6,7 +6,6 @@ using InnovEnergy.Lib.Utils; using SQLite; - namespace InnovEnergy.App.Backend.Database; @@ -38,9 +37,6 @@ public static partial class Db Connection.CreateTable(); }); - - - Observable.Interval(TimeSpan.FromDays(0.5)) .StartWith(0) // Do it right away (on startup) .SelectMany(Cleanup) @@ -85,7 +81,8 @@ public static partial class Db private static Task UpdateS3Urls() { - var renewTasks = Installations.Select(i => i.RenewS3BucketUrl()).ToArray(); - return Task.WhenAll(renewTasks); + return Installations + .Select(i => i.RenewS3BucketUrl()) + .WhenAll(); } } \ No newline at end of file diff --git a/csharp/App/Backend/S3/S3Access.cs b/csharp/App/Backend/S3/S3Access.cs new file mode 100644 index 000000000..7ef89ca8f --- /dev/null +++ b/csharp/App/Backend/S3/S3Access.cs @@ -0,0 +1,16 @@ +namespace InnovEnergy.App.Backend.S3; + +public static class S3Access +{ + public static S3Cmd ReadOnly { get; } = new S3Cmd + ( + key : "EXO44d2979c8e570eae81ead564", + secret: "55MAqyO_FqUmh7O64VIO0egq50ERn_WIAWuc2QC44QU" + ); + + public static S3Cmd ReadWrite { get; } = new S3Cmd + ( + key : "EXO87ca85e29dd412f1238f1cf0", + secret: "-T9TAqy9a3-0-xj7HKsFFJOCcxfRpcnL6OW5oOrOcWU" + ); +} \ No newline at end of file diff --git a/csharp/App/Backend/S3/S3Cmd.cs b/csharp/App/Backend/S3/S3Cmd.cs new file mode 100644 index 000000000..fd1442f74 --- /dev/null +++ b/csharp/App/Backend/S3/S3Cmd.cs @@ -0,0 +1,62 @@ +using CliWrap; +using CliWrap.Buffered; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.Backend.S3; + +public class S3Cmd +{ + private static readonly Command Python = Cli.Wrap("python3"); + + private const String S3CmdPath = "Resources/s3cmd.py"; + private const String BucketPrefix = "s3://"; + + private String[] DefaultArgs { get; } + + // ReSharper disable StringLiteralTypo + // ReSharper enable StringLiteralTypo + + public S3Cmd(String key, String secret) + { + DefaultArgs = new[] + { + S3CmdPath, + "--access_key", key, + "--secret_key", secret, + }; + } + + public async Task SignUrl(String bucketName, TimeSpan validity) + { + var result = await Run(bucketName, "signurl", $"+{validity.TotalSeconds}"); + + return result + .StandardOutput + .Replace("\n", "") + .Replace(" ", ""); + } + + public async Task CreateBucket(String bucketName) + { + var result = await Run(bucketName, "mb"); + return result.ExitCode == 0; + } + + public async Task DeleteBucket(String bucketName) + { + var result = await Run(bucketName, "rb"); + return result.ExitCode == 0; + } + + private Task Run(String bucketName, String operation, params String[] optionalArgs) + { + var args = DefaultArgs + .Append(operation) + .Append(bucketName.EnsureStartsWith(BucketPrefix)) + .Concat(optionalArgs); + + return Python + .WithArguments(args) + .ExecuteBufferedAsync(); + } +} \ No newline at end of file diff --git a/csharp/InnovEnergy.sln.DotSettings b/csharp/InnovEnergy.sln.DotSettings index 0584ce254..116325457 100644 --- a/csharp/InnovEnergy.sln.DotSettings +++ b/csharp/InnovEnergy.sln.DotSettings @@ -33,6 +33,7 @@ True True True + True True True True From 0541918beb25fe85342ff85cd73d2e07dba8d3be Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 19 Mar 2023 17:02:18 +0100 Subject: [PATCH 3/7] RevokeAccessTo => RevokeUserAccessTo, BucketPrefix => S3Prefix --- csharp/App/Backend/Controllers/Controller.cs | 22 ++------------ .../App/Backend/DataTypes/Methods/Session.cs | 30 +++++++++---------- csharp/App/Backend/DataTypes/Methods/User.cs | 5 ++-- csharp/App/Backend/S3/S3Access.cs | 5 ++++ csharp/App/Backend/S3/S3Cmd.cs | 4 +-- 5 files changed, 26 insertions(+), 40 deletions(-) diff --git a/csharp/App/Backend/Controllers/Controller.cs b/csharp/App/Backend/Controllers/Controller.cs index 46d6d67ad..10a569953 100644 --- a/csharp/App/Backend/Controllers/Controller.cs +++ b/csharp/App/Backend/Controllers/Controller.cs @@ -176,23 +176,6 @@ public class Controller : user.AccessibleFolders(); } - // [Returns] // assuming swagger knows about arrays but not lists (JSON) - // [Returns(Unauthorized)] - // [HttpGet($"{nameof(GetUsersOfFolder)}/")] - // public Object GetUsersOfFolder(Int64 folderId) - // { - // var caller = GetCaller(); - // if (caller == null) - // return new HttpResponseMessage(Unauthorized); - // - // var folder = Db.GetFolderById(folderId); - // - // if (folder is null || !caller.HasAccessTo(folder)) - // return new HttpResponseMessage(Unauthorized); - // - // return descendantUsers; - // } - [Returns] // assuming swagger knows about arrays but not lists (JSON) [Returns(Unauthorized)] [HttpGet($"{nameof(GetAllFoldersAndInstallations)}/")] @@ -281,7 +264,7 @@ public class Controller var user = id is not null ? Db.GetUserById(id) : session?.User; - return session.RevokeAccessTo(user, Db.GetInstallationById(installationId)) + return session.RevokeUserAccessTo(user, Db.GetInstallationById(installationId)) ? _Ok : _Unauthorized; } @@ -294,8 +277,7 @@ public class Controller var session = GetSession(); var user = id is not null ? Db.GetUserById(id) : session?.User; - - return session.RevokeAccessTo(user, Db.GetFolderById(folderId)) + return session.RevokeUserAccessTo(user, Db.GetFolderById(folderId)) ? _Ok : _Unauthorized; } diff --git a/csharp/App/Backend/DataTypes/Methods/Session.cs b/csharp/App/Backend/DataTypes/Methods/Session.cs index 7d76b1f0b..9bcdd2295 100644 --- a/csharp/App/Backend/DataTypes/Methods/Session.cs +++ b/csharp/App/Backend/DataTypes/Methods/Session.cs @@ -44,16 +44,16 @@ public static class SessionMethods public static Boolean Create(this Session? session, Installation? installation) { var user = session?.User; - - //Note: keep generation of access _after_ generation of object to prevent "zombie" access-rights. - + return user is not null && installation is not null && user.HasWriteAccess - && user.HasAccessTo(installation.Parent()) + && user.HasAccessTo(installation.Parent()) && Db.Create(installation) - && installation.CreateBucket().Result // TODO: await? - && Db.Create(new InstallationAccess { UserId = user.Id, InstallationId = installation.Id }); + && Db.Create(new InstallationAccess { UserId = user.Id, InstallationId = installation.Id }) + && installation.CreateBucket().Result // TODO: await? + && installation.RenewS3BucketUrl().Result; // generation of access _after_ generation of + // bucket to prevent "zombie" access-rights. } public static Boolean Update(this Session? session, Installation? installation) @@ -77,7 +77,7 @@ public static class SessionMethods && installation is not null && user.HasWriteAccess && user.HasAccessTo(installation) -// && installation.DeleteBucket().Result // TODO: await? + // && installation.DeleteBucket().Result // TODO: await? && Db.Delete(installation); } @@ -98,13 +98,11 @@ public static class SessionMethods var sessionUser = session?.User; if (editedUser == null || sessionUser == null) return false; - - //Password change is only allowed for oneself - if ( editedUser.Id != sessionUser.Id) editedUser.Password = sessionUser.Password; - else - { - editedUser.Password = sessionUser.SaltAndHashPassword(editedUser.Password); - } + // TODO: make specific method for changing user account settings like pwd + // Password change is only allowed for oneself + editedUser.Password = editedUser.Id != sessionUser.Id + ? sessionUser.Password + : sessionUser.SaltAndHashPassword(editedUser.Password); return sessionUser.HasWriteAccess && sessionUser.HasAccessTo(editedUser) @@ -150,7 +148,7 @@ public static class SessionMethods && Db.Create(new FolderAccess { UserId = user.Id, FolderId = folder.Id }); } - public static Boolean RevokeAccessTo(this Session? session, User? user, Installation? installation) + public static Boolean RevokeUserAccessTo(this Session? session, User? user, Installation? installation) { var sessionUser = session?.User; @@ -163,7 +161,7 @@ public static class SessionMethods && Db.InstallationAccess.Delete(a => a.UserId == user.Id && a.InstallationId == installation.Id) > 0; } - public static Boolean RevokeAccessTo(this Session? session, User? user, Folder? folder) + public static Boolean RevokeUserAccessTo(this Session? session, User? user, Folder? folder) { var sessionUser = session?.User; diff --git a/csharp/App/Backend/DataTypes/Methods/User.cs b/csharp/App/Backend/DataTypes/Methods/User.cs index f0d2c347f..410b4680b 100644 --- a/csharp/App/Backend/DataTypes/Methods/User.cs +++ b/csharp/App/Backend/DataTypes/Methods/User.cs @@ -32,7 +32,9 @@ public static class UserMethods // Distinct because the user might have direct access // to a child folder of a folder he has already access to - // ---TODO shouldn't we prevent doubling permissions? -K" + // TODO shouldn't we prevent doubling permissions? -K" + // TODO yes we should -ig (still TODO) + // however we should leave the distinct, defensive programming... } public static IEnumerable AccessibleFoldersAndInstallations(this User user) @@ -81,7 +83,6 @@ public static class UserMethods public static Boolean IsDescendantOf(this User user, User ancestor) { - // if (user.Id == ancestor.Id) return true; return user .Ancestors() .Any(u => u.Id == ancestor.Id); diff --git a/csharp/App/Backend/S3/S3Access.cs b/csharp/App/Backend/S3/S3Access.cs index 7ef89ca8f..0fe957ad5 100644 --- a/csharp/App/Backend/S3/S3Access.cs +++ b/csharp/App/Backend/S3/S3Access.cs @@ -2,6 +2,11 @@ namespace InnovEnergy.App.Backend.S3; public static class S3Access { + // TODO: put these into Json files in /Resources and read them from + // there so they can be changed without recompiling + // they should be read from disk on each use, + // so the backend does not need to be restarted on change + public static S3Cmd ReadOnly { get; } = new S3Cmd ( key : "EXO44d2979c8e570eae81ead564", diff --git a/csharp/App/Backend/S3/S3Cmd.cs b/csharp/App/Backend/S3/S3Cmd.cs index fd1442f74..b8bd8f890 100644 --- a/csharp/App/Backend/S3/S3Cmd.cs +++ b/csharp/App/Backend/S3/S3Cmd.cs @@ -9,7 +9,7 @@ public class S3Cmd private static readonly Command Python = Cli.Wrap("python3"); private const String S3CmdPath = "Resources/s3cmd.py"; - private const String BucketPrefix = "s3://"; + private const String S3Prefix = "s3://"; private String[] DefaultArgs { get; } @@ -52,7 +52,7 @@ public class S3Cmd { var args = DefaultArgs .Append(operation) - .Append(bucketName.EnsureStartsWith(BucketPrefix)) + .Append(bucketName.EnsureStartsWith(S3Prefix)) .Concat(optionalArgs); return Python From 9454fbf8786cbf123d3b1af30ac12620f4276a28 Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 19 Mar 2023 17:53:00 +0100 Subject: [PATCH 4/7] Use InstallationAccess/FolderAccess as arguments to GrantUserAccessTo* RevokeUserAccessTo* --- csharp/App/Backend/Controllers/Controller.cs | 97 ++++++++++--------- .../App/Backend/DataTypes/Methods/Folder.cs | 20 ++-- .../Backend/DataTypes/Methods/Installation.cs | 2 +- 3 files changed, 66 insertions(+), 53 deletions(-) diff --git a/csharp/App/Backend/Controllers/Controller.cs b/csharp/App/Backend/Controllers/Controller.cs index 10a569953..321e1b8bc 100644 --- a/csharp/App/Backend/Controllers/Controller.cs +++ b/csharp/App/Backend/Controllers/Controller.cs @@ -4,10 +4,6 @@ using InnovEnergy.App.Backend.DataTypes.Methods; using InnovEnergy.App.Backend.Relations; using Microsoft.AspNetCore.Mvc; using static System.Net.HttpStatusCode; -using Folder = InnovEnergy.App.Backend.DataTypes.Folder; -using Installation = InnovEnergy.App.Backend.DataTypes.Installation; -using Object = System.Object; -using User = InnovEnergy.App.Backend.DataTypes.User; namespace InnovEnergy.App.Backend.Controllers; @@ -96,22 +92,20 @@ public class Controller if (installation is null || !user.HasAccessTo(installation)) return _Unauthorized; - var usersWithInheritedAccess = installation - .Ancestors() - .SelectMany(f => f.UsersWithDirectAccess() - .Where(u => u.IsDescendantOf(user)) - .Select(u => new { folderId = f.Id, user = u })) - .OfType(); + var directAccess = installation + .UsersWithDirectAccess() + .Where(u => u.IsDescendantOf(user)); - var usersWithDirectAccess = installation.UsersWithDirectAccess() - .Where(u => u.IsDescendantOf(user)) - .Select(u => new { installationId = installation.Id, user = u }) - .OfType(); - - return usersWithInheritedAccess.Concat(usersWithDirectAccess); + var inheritedAccess = installation + .Ancestors() + .SelectMany(f => f.UsersWithDirectAccess() + .Where(u => u.IsDescendantOf(user)) + .Select(u => new { folderId = f.Id, user = u })); + + return directAccess + .Concat(inheritedAccess); } - [Returns] [Returns(Unauthorized)] [HttpGet($"{nameof(GetUsersWithAccessToFolder)}")] public Object GetUsersWithAccessToFolder(Int64 id) @@ -126,11 +120,11 @@ public class Controller return _Unauthorized; return folder - .Ancestors() - .Append(folder) - .SelectMany(f => f.UsersWithDirectAccess() - .Where(u => u.IsDescendantOf(user)) - .Select(u => new { folderId = f.Id, user = u })); + .Ancestors() + .Prepend(folder) + .SelectMany(f => f.UsersWithDirectAccess() + .Where(u => u.IsDescendantOf(user)) + .Select(u => new { folderId = f.Id, user = u })); } [Returns] @@ -230,12 +224,32 @@ public class Controller [Returns(OK)] [Returns(Unauthorized)] [HttpPost($"{nameof(GrantUserAccessToFolder)}/")] - public Object GrantUserAccessToFolder([FromQuery] Int64 folderId, [FromQuery] Int64? id) + public Object GrantUserAccessToFolder(FolderAccess folderAccess) { var session = GetSession(); - var user = id is not null ? Db.GetUserById(id) : session?.User; - return session.GrantUserAccessTo(user, Db.GetFolderById(folderId)) + // TODO: automatic BadRequest when properties are null during deserialization + var folder = Db.GetFolderById(folderAccess.FolderId); + var user = Db.GetUserById(folderAccess.UserId); + + return session.GrantUserAccessTo(user, folder) + ? _Ok + : _Unauthorized; + } + + + [Returns(OK)] + [Returns(Unauthorized)] + [HttpPost($"{nameof(RevokeUserAccessToFolder)}/")] + public Object RevokeUserAccessToFolder(FolderAccess folderAccess) + { + var session = GetSession(); + + // TODO: automatic BadRequest when properties are null during deserialization + var folder = Db.GetFolderById(folderAccess.FolderId); + var user = Db.GetUserById(folderAccess.UserId); + + return session.RevokeUserAccessTo(user, folder) ? _Ok : _Unauthorized; } @@ -244,13 +258,15 @@ public class Controller [Returns(OK)] [Returns(Unauthorized)] [HttpPost($"{nameof(GrantUserAccessToInstallation)}/")] - public Object GrantUserAccessToInstallation([FromQuery] Int64 installationId, [FromQuery] Int64? id) + public Object GrantUserAccessToInstallation(InstallationAccess installationAccess) { var session = GetSession(); + + // TODO: automatic BadRequest when properties are null during deserialization + var installation = Db.GetFolderById(installationAccess.InstallationId); + var user = Db.GetUserById(installationAccess.UserId); - var user = id is not null ? Db.GetUserById(id) : session?.User; - - return session.GrantUserAccessTo(user, Db.GetInstallationById(installationId)) + return session.GrantUserAccessTo(user, installation) ? _Ok : _Unauthorized; } @@ -258,29 +274,20 @@ public class Controller [Returns(OK)] [Returns(Unauthorized)] [HttpPost($"{nameof(RevokeUserAccessToInstallation)}/")] - public Object RevokeUserAccessToInstallation([FromQuery] Int64 installationId, [FromQuery] Int64? id) + public Object RevokeUserAccessToInstallation(InstallationAccess installationAccess) { var session = GetSession(); - var user = id is not null ? Db.GetUserById(id) : session?.User; - + + // TODO: automatic BadRequest when properties are null during deserialization + var installation = Db.GetFolderById(installationAccess.InstallationId); + var user = Db.GetUserById(installationAccess.UserId); - return session.RevokeUserAccessTo(user, Db.GetInstallationById(installationId)) + return session.RevokeUserAccessTo(user, installation) ? _Ok : _Unauthorized; } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(RevokeUserAccessToFolder)}/")] - public Object RevokeUserAccessToFolder([FromQuery] Int64 folderId, [FromQuery] Int64? id) - { - var session = GetSession(); - var user = id is not null ? Db.GetUserById(id) : session?.User; - - return session.RevokeUserAccessTo(user, Db.GetFolderById(folderId)) - ? _Ok - : _Unauthorized; - } + [Returns(OK)] [Returns(Unauthorized)] diff --git a/csharp/App/Backend/DataTypes/Methods/Folder.cs b/csharp/App/Backend/DataTypes/Methods/Folder.cs index 404410997..b8ac4c496 100644 --- a/csharp/App/Backend/DataTypes/Methods/Folder.cs +++ b/csharp/App/Backend/DataTypes/Methods/Folder.cs @@ -1,4 +1,3 @@ -using System.Collections; using InnovEnergy.App.Backend.Database; using InnovEnergy.Lib.Utils; @@ -9,20 +8,27 @@ public static class FolderMethods public static IEnumerable UsersWithAccess(this Folder folder) { - return UsersWithDirectAccess(folder).Concat(UsersWithInheritedAccess(folder)); + var direct = folder.UsersWithDirectAccess(); + var inherited = folder.UsersWithInheritedAccess(); + + return direct.Concat(inherited); } public static IEnumerable UsersWithDirectAccess(this Folder folder) { - return Db.FolderAccess - .Where(access => access.FolderId == folder.Id) - .Select(access => Db.GetUserById(access.UserId)) - .NotNull(); + return Db + .FolderAccess + .Where(a => a.FolderId == folder.Id) + .Select(a => Db.GetUserById(a.UserId)) + .NotNull(); } public static IEnumerable UsersWithInheritedAccess(this Folder folder) { - return folder.Ancestors().SelectMany(f => f.UsersWithDirectAccess()).NotNull(); + return folder + .Ancestors() + .SelectMany(f => f.UsersWithDirectAccess()) + .NotNull(); } public static IEnumerable ChildFolders(this Folder parent) diff --git a/csharp/App/Backend/DataTypes/Methods/Installation.cs b/csharp/App/Backend/DataTypes/Methods/Installation.cs index 8409371a0..134db9c11 100644 --- a/csharp/App/Backend/DataTypes/Methods/Installation.cs +++ b/csharp/App/Backend/DataTypes/Methods/Installation.cs @@ -58,7 +58,7 @@ public static class InstallationMethods { return installation .Ancestors() - .SelectMany(FolderMethods.UsersWithDirectAccess) + .SelectMany(f => f.UsersWithDirectAccess()) .NotNull(); } From e025b8cd110efffce496e92ba9321761efe94845 Mon Sep 17 00:00:00 2001 From: ig Date: Mon, 20 Mar 2023 08:33:44 +0100 Subject: [PATCH 5/7] Make Controller less magic. --- csharp/App/Backend/Controllers/Controller.cs | 286 ++++++++---------- .../Backend/Controllers/ReturnsAttribute.cs | 22 -- .../App/Backend/DataTypes/Methods/Folder.cs | 2 +- .../App/Backend/DataTypes/Methods/Session.cs | 6 +- csharp/App/Backend/Program.cs | 7 +- csharp/App/Backend/db.sqlite | Bin 495616 -> 495616 bytes 6 files changed, 129 insertions(+), 194 deletions(-) delete mode 100644 csharp/App/Backend/Controllers/ReturnsAttribute.cs diff --git a/csharp/App/Backend/Controllers/Controller.cs b/csharp/App/Backend/Controllers/Controller.cs index 321e1b8bc..99d622456 100644 --- a/csharp/App/Backend/Controllers/Controller.cs +++ b/csharp/App/Backend/Controllers/Controller.cs @@ -2,95 +2,80 @@ using InnovEnergy.App.Backend.Database; using InnovEnergy.App.Backend.DataTypes; using InnovEnergy.App.Backend.DataTypes.Methods; using InnovEnergy.App.Backend.Relations; +using InnovEnergy.Lib.Utils; using Microsoft.AspNetCore.Mvc; -using static System.Net.HttpStatusCode; namespace InnovEnergy.App.Backend.Controllers; [ApiController] [Route("api/")] -public class Controller +public class Controller : ControllerBase { - private static readonly HttpResponseMessage _Unauthorized = new HttpResponseMessage(Unauthorized); - private static readonly HttpResponseMessage _Ok = new HttpResponseMessage(OK); - private static readonly HttpResponseMessage _BadRequest = new HttpResponseMessage(BadRequest); - - [Returns] - [Returns(Unauthorized)] - [Returns(BadRequest)] - [HttpPost($"{nameof(Login)}")] - public Object Login(Credentials credentials) + [HttpPost(nameof(Login))] + public ActionResult Login(Credentials credentials) { var session = credentials.Login(); return session is null - ? _Unauthorized - : session; + ? Unauthorized() + : session; } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(Logout)}")] - public Object Logout() + [HttpPost(nameof(Logout))] + public ActionResult Logout() { var session = GetSession(); return session.Logout() - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } - [Returns] - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetUserById)}")] - public Object GetUserById(Int64 id) + [HttpGet(nameof(GetUserById))] + public ActionResult GetUserById(Int64 id) { var caller = GetSession()?.User; if (caller == null) - return _Unauthorized; + return Unauthorized(); var user = Db.GetUserById(id); if (user is null || !caller.HasAccessTo(user)) - return _Unauthorized; + return Unauthorized(); user.Password = ""; return user; } - [Returns] - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetInstallationById)}")] - public Object GetInstallationById(Int64 id) + [HttpGet(nameof(GetInstallationById))] + public ActionResult GetInstallationById(Int64 id) { var user = GetSession()?.User; if (user == null) - return _Unauthorized; + return Unauthorized(); var installation = Db.GetInstallationById(id); if (installation is null || !user.HasAccessTo(installation)) - return _Unauthorized; + return Unauthorized(); return installation; } - [Returns] - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetUsersWithAccessToInstallation)}")] - public Object GetUsersWithAccessToInstallation(Int64 id) + [HttpGet(nameof(GetUsersWithAccessToInstallation))] + public ActionResult> GetUsersWithAccessToInstallation(Int64 id) { var user = GetSession()?.User; if (user == null) - return _Unauthorized; + return Unauthorized(); var installation = Db.GetInstallationById(id); if (installation is null || !user.HasAccessTo(installation)) - return _Unauthorized; + return Unauthorized(); var directAccess = installation .UsersWithDirectAccess() @@ -103,128 +88,114 @@ public class Controller .Select(u => new { folderId = f.Id, user = u })); return directAccess - .Concat(inheritedAccess); + .Concat(inheritedAccess) + .Apply(Ok); // TODO: typing } - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetUsersWithAccessToFolder)}")] - public Object GetUsersWithAccessToFolder(Int64 id) + [HttpGet(nameof(GetUsersWithAccessToFolder))] + public ActionResult> GetUsersWithAccessToFolder(Int64 id) { var user = GetSession()?.User; if (user == null) - return _Unauthorized; + return Unauthorized(); var folder = Db.GetFolderById(id); if (folder is null || !user.HasAccessTo(folder)) - return _Unauthorized; + return Unauthorized(); return folder .Ancestors() .Prepend(folder) .SelectMany(f => f.UsersWithDirectAccess() .Where(u => u.IsDescendantOf(user)) - .Select(u => new { folderId = f.Id, user = u })); + .Select(u => new { folderId = f.Id, user = u })) + .ToList(); } - [Returns] - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetFolderById)}")] - public Object GetFolderById(Int64 id) + [HttpGet(nameof(GetFolderById))] + public ActionResult GetFolderById(Int64 id) { var user = GetSession()?.User; if (user == null) - return _Unauthorized; + return Unauthorized(); var folder = Db.GetFolderById(id); if (folder is null || !user.HasAccessTo(folder)) - return _Unauthorized; + return Unauthorized(); return folder; } - [Returns] // assuming swagger knows about arrays but not lists (JSON) - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetAllInstallations)}/")] - public Object GetAllInstallations() + [HttpGet(nameof(GetAllInstallations))] + public ActionResult> GetAllInstallations() { var user = GetSession()?.User; + + if (user is null) + return Unauthorized(); - return user is null - ? _Unauthorized - : user.AccessibleInstallations(); + return user.AccessibleInstallations().ToList(); } - [Returns] // assuming swagger knows about arrays but not lists (JSON) - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetAllFolders)}/")] - public Object GetAllFolders() + + [HttpGet(nameof(GetAllFolders))] + public ActionResult> GetAllFolders() { var user = GetSession()?.User; + + if (user is null) + return Unauthorized(); - return user is null - ? _Unauthorized - : user.AccessibleFolders(); + return new(user.AccessibleFolders()); } - [Returns] // assuming swagger knows about arrays but not lists (JSON) - [Returns(Unauthorized)] - [HttpGet($"{nameof(GetAllFoldersAndInstallations)}/")] - public Object GetAllFoldersAndInstallations() + + [HttpGet(nameof(GetAllFoldersAndInstallations))] + public ActionResult> GetAllFoldersAndInstallations() { var user = GetSession()?.User; - - return user is null - ? _Unauthorized - : user.AccessibleFoldersAndInstallations(); - } + if (user is null) + return Unauthorized(); + + return new (user.AccessibleFoldersAndInstallations()); + } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(CreateUser)}/")] - public Object CreateUser(User newUser) + [HttpPost(nameof(CreateUser))] + public ActionResult CreateUser(User newUser) { - var session = GetSession(); - - return session.Create(newUser) + return GetSession().Create(newUser) ? newUser - : _Unauthorized ; + : Unauthorized() ; } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(CreateInstallation)}/")] - public Object CreateInstallation(Installation installation) + [HttpPost(nameof(CreateInstallation))] + public async Task> CreateInstallation(Installation installation) + { + if (!await GetSession().Create(installation)) + return Unauthorized(); + + return installation; + } + + [HttpPost(nameof(CreateFolder))] + public ActionResult CreateFolder(Folder folder) { var session = GetSession(); - return session.Create(installation) - ? installation - : _Unauthorized; + if (!session.Create(folder)) + return Unauthorized(); + + return folder; } - [Returns(OK)] - [Returns(Unauthorized)] - [Returns(InternalServerError)] - [HttpPost($"{nameof(CreateFolder)}/")] - public Object CreateFolder(Folder folder) - { - var session = GetSession(); - - return session.Create(folder) - ? folder - : _Unauthorized; - } - - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(GrantUserAccessToFolder)}/")] - public Object GrantUserAccessToFolder(FolderAccess folderAccess) + [HttpPost(nameof(GrantUserAccessToFolder))] + public ActionResult GrantUserAccessToFolder(FolderAccess folderAccess) { var session = GetSession(); @@ -233,15 +204,13 @@ public class Controller var user = Db.GetUserById(folderAccess.UserId); return session.GrantUserAccessTo(user, folder) - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(RevokeUserAccessToFolder)}/")] - public Object RevokeUserAccessToFolder(FolderAccess folderAccess) + [HttpPost(nameof(RevokeUserAccessToFolder))] + public ActionResult RevokeUserAccessToFolder(FolderAccess folderAccess) { var session = GetSession(); @@ -250,15 +219,13 @@ public class Controller var user = Db.GetUserById(folderAccess.UserId); return session.RevokeUserAccessTo(user, folder) - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(GrantUserAccessToInstallation)}/")] - public Object GrantUserAccessToInstallation(InstallationAccess installationAccess) + [HttpPost(nameof(GrantUserAccessToInstallation))] + public ActionResult GrantUserAccessToInstallation(InstallationAccess installationAccess) { var session = GetSession(); @@ -267,14 +234,12 @@ public class Controller var user = Db.GetUserById(installationAccess.UserId); return session.GrantUserAccessTo(user, installation) - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPost($"{nameof(RevokeUserAccessToInstallation)}/")] - public Object RevokeUserAccessToInstallation(InstallationAccess installationAccess) + [HttpPost(nameof(RevokeUserAccessToInstallation))] + public ActionResult RevokeUserAccessToInstallation(InstallationAccess installationAccess) { var session = GetSession(); @@ -283,88 +248,81 @@ public class Controller var user = Db.GetUserById(installationAccess.UserId); return session.RevokeUserAccessTo(user, installation) - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPut($"{nameof(UpdateUser)}/")] - public Object UpdateUser(User updatedUser) + [HttpPut(nameof(UpdateUser))] + public ActionResult UpdateUser(User updatedUser) { var session = GetSession(); - if (!session.Update(updatedUser)) return _Unauthorized; - updatedUser.Password = ""; + if (!session.Update(updatedUser)) + return Unauthorized(); + + updatedUser.Password = ""; // TODO: generic sanitize return values + return updatedUser; } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPut($"{nameof(UpdateInstallation)}/")] - public Object UpdateInstallation(Installation installation) + [HttpPut(nameof(UpdateInstallation))] + public ActionResult UpdateInstallation(Installation installation) { var session = GetSession(); + + if (!session.Update(installation)) + return Unauthorized(); - return session.Update(installation) - ? installation - : _Unauthorized; + return installation; } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpPut($"{nameof(UpdateFolder)}/")] - public Object UpdateFolder(Folder folder) + [HttpPut(nameof(UpdateFolder))] + public ActionResult UpdateFolder(Folder folder) { var session = GetSession(); + + if (!session.Update(folder)) + return Unauthorized(); - return session.Update(folder) - ? folder - : _Unauthorized; + return folder; } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpDelete($"{nameof(DeleteUser)}/")] - public Object DeleteUser(Int64 userId) + [HttpDelete(nameof(DeleteUser))] + public ActionResult DeleteUser(Int64 userId) { var session = GetSession(); var user = Db.GetUserById(userId); return session.Delete(user) - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } - [Returns(OK)] - [Returns(Unauthorized)] - [HttpDelete($"{nameof(DeleteInstallation)}/")] - public Object DeleteInstallation(Int64 installationId) + [HttpDelete(nameof(DeleteInstallation))] + public ActionResult DeleteInstallation(Int64 installationId) { var session = GetSession(); var installation = Db.GetInstallationById(installationId); return session.Delete(installation) - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } - - [ProducesResponseType(200)] - [ProducesResponseType(401)] - [HttpDelete($"{nameof(DeleteFolder)}/")] - public Object DeleteFolder(Int64 folderId) + + [HttpDelete(nameof(DeleteFolder))] + public ActionResult DeleteFolder(Int64 folderId) { var session = GetSession(); var folder = Db.GetFolderById(folderId); return session.Delete(folder) - ? _Ok - : _Unauthorized; + ? Ok() + : Unauthorized(); } diff --git a/csharp/App/Backend/Controllers/ReturnsAttribute.cs b/csharp/App/Backend/Controllers/ReturnsAttribute.cs deleted file mode 100644 index 2ef924055..000000000 --- a/csharp/App/Backend/Controllers/ReturnsAttribute.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Net; -using Microsoft.AspNetCore.Mvc; - -namespace InnovEnergy.App.Backend.Controllers; - -public class ReturnsAttribute : ProducesResponseTypeAttribute -{ - public ReturnsAttribute(HttpStatusCode statusCode) : base((Int32)statusCode) - { - } -} - -public class ReturnsAttribute : ProducesResponseTypeAttribute -{ - public ReturnsAttribute(HttpStatusCode statusCode) : base(typeof(T), (Int32)statusCode) - { - } - - public ReturnsAttribute() : base(typeof(T), (Int32)HttpStatusCode.OK) - { - } -} \ No newline at end of file diff --git a/csharp/App/Backend/DataTypes/Methods/Folder.cs b/csharp/App/Backend/DataTypes/Methods/Folder.cs index b8ac4c496..68c12c68b 100644 --- a/csharp/App/Backend/DataTypes/Methods/Folder.cs +++ b/csharp/App/Backend/DataTypes/Methods/Folder.cs @@ -80,7 +80,7 @@ public static class FolderMethods public static Boolean IsRelativeRoot(this Folder folder) { - return folder.ParentId < 0; + return folder.ParentId < 0; // TODO } public static Boolean WasMoved(this Folder folder) diff --git a/csharp/App/Backend/DataTypes/Methods/Session.cs b/csharp/App/Backend/DataTypes/Methods/Session.cs index 9bcdd2295..a1ecf900c 100644 --- a/csharp/App/Backend/DataTypes/Methods/Session.cs +++ b/csharp/App/Backend/DataTypes/Methods/Session.cs @@ -41,7 +41,7 @@ public static class SessionMethods } - public static Boolean Create(this Session? session, Installation? installation) + public static async Task Create(this Session? session, Installation? installation) { var user = session?.User; @@ -51,8 +51,8 @@ public static class SessionMethods && user.HasAccessTo(installation.Parent()) && Db.Create(installation) && Db.Create(new InstallationAccess { UserId = user.Id, InstallationId = installation.Id }) - && installation.CreateBucket().Result // TODO: await? - && installation.RenewS3BucketUrl().Result; // generation of access _after_ generation of + && await installation.CreateBucket() + && await installation.RenewS3BucketUrl(); // generation of access _after_ generation of // bucket to prevent "zombie" access-rights. } diff --git a/csharp/App/Backend/Program.cs b/csharp/App/Backend/Program.cs index e7500ff1a..fbf86d381 100644 --- a/csharp/App/Backend/Program.cs +++ b/csharp/App/Backend/Program.cs @@ -7,13 +7,11 @@ public static class Program { public static void Main(String[] args) { - Db.CreateFakeRelations(); + //Db.CreateFakeRelations(); var builder = WebApplication.CreateBuilder(args); - builder.Services.AddControllers(); // TODO: remove magic, specify controllers explicitly - // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle - + builder.Services.AddControllers(); builder.Services.AddHttpContextAccessor(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddCors(o => o.AddDefaultPolicy(p => p.WithOrigins("*").AllowAnyHeader().AllowAnyMethod())); @@ -22,6 +20,7 @@ public static class Program c.SwaggerDoc("v1", new OpenApiInfo { Title = "InnovEnergy Backend API", Version = "v1" }); c.UseAllOfToExtendReferenceSchemas(); c.OperationFilter(); //Todo testing throw me out + c.SupportNonNullableReferenceTypes(); }); diff --git a/csharp/App/Backend/db.sqlite b/csharp/App/Backend/db.sqlite index ea45e7dbdef3f57a2905eb1b3dc5fe42f3c0a480..8cddf61095957479fb5c2d7cbfd90f5ec4235b82 100644 GIT binary patch delta 177641 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
0d&#&Ml;WAIt%Uz_`c<=sb|NRnlUhh8 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 From 5ef49de74261924c373f021fac85da4615d73a46 Mon Sep 17 00:00:00 2001 From: ig Date: Mon, 20 Mar 2023 10:20:56 +0100 Subject: [PATCH 6/7] simplify WebApplication builder --- csharp/App/Backend/Controllers/Controller.cs | 118 +++++++++--------- csharp/App/Backend/DataTypes/Credentials.cs | 6 - .../Backend/DataTypes/Methods/Credentials.cs | 27 ---- csharp/App/Backend/Program.cs | 50 ++++---- 4 files changed, 82 insertions(+), 119 deletions(-) delete mode 100644 csharp/App/Backend/DataTypes/Credentials.cs delete mode 100644 csharp/App/Backend/DataTypes/Methods/Credentials.cs diff --git a/csharp/App/Backend/Controllers/Controller.cs b/csharp/App/Backend/Controllers/Controller.cs index 99d622456..d9228f964 100644 --- a/csharp/App/Backend/Controllers/Controller.cs +++ b/csharp/App/Backend/Controllers/Controller.cs @@ -7,25 +7,32 @@ using Microsoft.AspNetCore.Mvc; namespace InnovEnergy.App.Backend.Controllers; +using Token = String; + [ApiController] [Route("api/")] public class Controller : ControllerBase { [HttpPost(nameof(Login))] - public ActionResult Login(Credentials credentials) + public ActionResult Login(String username, String password) { - var session = credentials.Login(); + var user = Db.GetUserByEmail(username); - return session is null - ? Unauthorized() - : session; + if (user is null || !user.VerifyPassword(password)) + return Unauthorized(); + + var session = new Session(user); + + return Db.Create(session) + ? session + : Unauthorized(); } [HttpPost(nameof(Logout))] - public ActionResult Logout() + public ActionResult Logout(Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); return session.Logout() ? Ok() @@ -34,15 +41,15 @@ public class Controller : ControllerBase [HttpGet(nameof(GetUserById))] - public ActionResult GetUserById(Int64 id) + public ActionResult GetUserById(Int64 id, Token authToken) { - var caller = GetSession()?.User; - if (caller == null) + var session = Db.GetSession(authToken)?.User; + if (session == null) return Unauthorized(); var user = Db.GetUserById(id); - if (user is null || !caller.HasAccessTo(user)) + if (user is null || !session.HasAccessTo(user)) return Unauthorized(); user.Password = ""; @@ -51,9 +58,9 @@ public class Controller : ControllerBase [HttpGet(nameof(GetInstallationById))] - public ActionResult GetInstallationById(Int64 id) + public ActionResult GetInstallationById(Int64 id, Token authToken) { - var user = GetSession()?.User; + var user = Db.GetSession(authToken)?.User; if (user == null) return Unauthorized(); @@ -66,9 +73,9 @@ public class Controller : ControllerBase } [HttpGet(nameof(GetUsersWithAccessToInstallation))] - public ActionResult> GetUsersWithAccessToInstallation(Int64 id) + public ActionResult> GetUsersWithAccessToInstallation(Int64 id, Token authToken) { - var user = GetSession()?.User; + var user = Db.GetSession(authToken)?.User; if (user == null) return Unauthorized(); @@ -93,9 +100,9 @@ public class Controller : ControllerBase } [HttpGet(nameof(GetUsersWithAccessToFolder))] - public ActionResult> GetUsersWithAccessToFolder(Int64 id) + public ActionResult> GetUsersWithAccessToFolder(Int64 id, Token authToken) { - var user = GetSession()?.User; + var user = Db.GetSession(authToken)?.User; if (user == null) return Unauthorized(); @@ -114,9 +121,9 @@ public class Controller : ControllerBase } [HttpGet(nameof(GetFolderById))] - public ActionResult GetFolderById(Int64 id) + public ActionResult GetFolderById(Int64 id, Token authToken) { - var user = GetSession()?.User; + var user = Db.GetSession(authToken)?.User; if (user == null) return Unauthorized(); @@ -130,9 +137,9 @@ public class Controller : ControllerBase [HttpGet(nameof(GetAllInstallations))] - public ActionResult> GetAllInstallations() + public ActionResult> GetAllInstallations(Token authToken) { - var user = GetSession()?.User; + var user = Db.GetSession(authToken)?.User; if (user is null) return Unauthorized(); @@ -143,9 +150,9 @@ public class Controller : ControllerBase [HttpGet(nameof(GetAllFolders))] - public ActionResult> GetAllFolders() + public ActionResult> GetAllFolders(Token authToken) { - var user = GetSession()?.User; + var user = Db.GetSession(authToken)?.User; if (user is null) return Unauthorized(); @@ -155,9 +162,9 @@ public class Controller : ControllerBase [HttpGet(nameof(GetAllFoldersAndInstallations))] - public ActionResult> GetAllFoldersAndInstallations() + public ActionResult> GetAllFoldersAndInstallations(Token authToken) { - var user = GetSession()?.User; + var user = Db.GetSession(authToken)?.User; if (user is null) return Unauthorized(); @@ -167,26 +174,26 @@ public class Controller : ControllerBase [HttpPost(nameof(CreateUser))] - public ActionResult CreateUser(User newUser) + public ActionResult CreateUser(User newUser, Token authToken) { - return GetSession().Create(newUser) + return Db.GetSession(authToken).Create(newUser) ? newUser : Unauthorized() ; } [HttpPost(nameof(CreateInstallation))] - public async Task> CreateInstallation(Installation installation) + public async Task> CreateInstallation(Installation installation, Token authToken) { - if (!await GetSession().Create(installation)) + if (!await Db.GetSession(authToken).Create(installation)) return Unauthorized(); return installation; } [HttpPost(nameof(CreateFolder))] - public ActionResult CreateFolder(Folder folder) + public ActionResult CreateFolder(Folder folder, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); if (!session.Create(folder)) return Unauthorized(); @@ -195,9 +202,9 @@ public class Controller : ControllerBase } [HttpPost(nameof(GrantUserAccessToFolder))] - public ActionResult GrantUserAccessToFolder(FolderAccess folderAccess) + public ActionResult GrantUserAccessToFolder(FolderAccess folderAccess, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); // TODO: automatic BadRequest when properties are null during deserialization var folder = Db.GetFolderById(folderAccess.FolderId); @@ -210,9 +217,9 @@ public class Controller : ControllerBase [HttpPost(nameof(RevokeUserAccessToFolder))] - public ActionResult RevokeUserAccessToFolder(FolderAccess folderAccess) + public ActionResult RevokeUserAccessToFolder(FolderAccess folderAccess, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); // TODO: automatic BadRequest when properties are null during deserialization var folder = Db.GetFolderById(folderAccess.FolderId); @@ -225,9 +232,9 @@ public class Controller : ControllerBase [HttpPost(nameof(GrantUserAccessToInstallation))] - public ActionResult GrantUserAccessToInstallation(InstallationAccess installationAccess) + public ActionResult GrantUserAccessToInstallation(InstallationAccess installationAccess, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); // TODO: automatic BadRequest when properties are null during deserialization var installation = Db.GetFolderById(installationAccess.InstallationId); @@ -239,9 +246,9 @@ public class Controller : ControllerBase } [HttpPost(nameof(RevokeUserAccessToInstallation))] - public ActionResult RevokeUserAccessToInstallation(InstallationAccess installationAccess) + public ActionResult RevokeUserAccessToInstallation(InstallationAccess installationAccess, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); // TODO: automatic BadRequest when properties are null during deserialization var installation = Db.GetFolderById(installationAccess.InstallationId); @@ -255,9 +262,9 @@ public class Controller : ControllerBase [HttpPut(nameof(UpdateUser))] - public ActionResult UpdateUser(User updatedUser) + public ActionResult UpdateUser(User updatedUser, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); if (!session.Update(updatedUser)) return Unauthorized(); @@ -269,9 +276,9 @@ public class Controller : ControllerBase [HttpPut(nameof(UpdateInstallation))] - public ActionResult UpdateInstallation(Installation installation) + public ActionResult UpdateInstallation(Installation installation, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); if (!session.Update(installation)) return Unauthorized(); @@ -281,9 +288,9 @@ public class Controller : ControllerBase [HttpPut(nameof(UpdateFolder))] - public ActionResult UpdateFolder(Folder folder) + public ActionResult UpdateFolder(Folder folder, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); if (!session.Update(folder)) return Unauthorized(); @@ -292,9 +299,9 @@ public class Controller : ControllerBase } [HttpDelete(nameof(DeleteUser))] - public ActionResult DeleteUser(Int64 userId) + public ActionResult DeleteUser(Int64 userId, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); var user = Db.GetUserById(userId); return session.Delete(user) @@ -303,9 +310,9 @@ public class Controller : ControllerBase } [HttpDelete(nameof(DeleteInstallation))] - public ActionResult DeleteInstallation(Int64 installationId) + public ActionResult DeleteInstallation(Int64 installationId, Token authToken) { - var session = GetSession(); + var session = Db.GetSession(authToken); var installation = Db.GetInstallationById(installationId); return session.Delete(installation) @@ -314,11 +321,10 @@ public class Controller : ControllerBase } [HttpDelete(nameof(DeleteFolder))] - public ActionResult DeleteFolder(Int64 folderId) + public ActionResult DeleteFolder(Int64 folderId, Token authToken) { - var session = GetSession(); - - var folder = Db.GetFolderById(folderId); + var session = Db.GetSession(authToken); + var folder = Db.GetFolderById(folderId); return session.Delete(folder) ? Ok() @@ -326,11 +332,7 @@ public class Controller : ControllerBase } - private static Session? GetSession() - { - var ctxAccessor = new HttpContextAccessor(); - return ctxAccessor.HttpContext?.Items["Session"] as Session; - } + } diff --git a/csharp/App/Backend/DataTypes/Credentials.cs b/csharp/App/Backend/DataTypes/Credentials.cs deleted file mode 100644 index d17c3f063..000000000 --- a/csharp/App/Backend/DataTypes/Credentials.cs +++ /dev/null @@ -1,6 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -namespace InnovEnergy.App.Backend.DataTypes; - -[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] -public record Credentials(String Username, String Password); \ No newline at end of file diff --git a/csharp/App/Backend/DataTypes/Methods/Credentials.cs b/csharp/App/Backend/DataTypes/Methods/Credentials.cs deleted file mode 100644 index 2e29149b1..000000000 --- a/csharp/App/Backend/DataTypes/Methods/Credentials.cs +++ /dev/null @@ -1,27 +0,0 @@ -using InnovEnergy.App.Backend.Database; -using InnovEnergy.App.Backend.Relations; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.App.Backend.DataTypes.Methods; - -public static class CredentialsMethods -{ - public static Session? Login(this Credentials credentials) - { - var (username, password) = credentials; - - if (username.IsNullOrEmpty() || password.IsNullOrEmpty()) - return null; - - var user = Db.GetUserByEmail(username); - - if (user is null || !user.VerifyPassword(password)) - return null; - - var session = new Session(user); - - return Db.Create(session) - ? session - : null; - } -} \ No newline at end of file diff --git a/csharp/App/Backend/Program.cs b/csharp/App/Backend/Program.cs index fbf86d381..686e29d7f 100644 --- a/csharp/App/Backend/Program.cs +++ b/csharp/App/Backend/Program.cs @@ -1,4 +1,3 @@ -using InnovEnergy.App.Backend.Database; using Microsoft.OpenApi.Models; namespace InnovEnergy.App.Backend; @@ -10,53 +9,48 @@ public static class Program //Db.CreateFakeRelations(); var builder = WebApplication.CreateBuilder(args); - - builder.Services.AddControllers(); - builder.Services.AddHttpContextAccessor(); - builder.Services.AddEndpointsApiExplorer(); - builder.Services.AddCors(o => o.AddDefaultPolicy(p => p.WithOrigins("*").AllowAnyHeader().AllowAnyMethod())); + + //builder.Services.AddHttpContextAccessor(); + //builder.Services.AddEndpointsApiExplorer(); + //builder.Services.AddCors(o => o.AddDefaultPolicy(p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); + + builder.Services.AddControllers(); builder.Services.AddSwaggerGen(c => { - c.SwaggerDoc("v1", new OpenApiInfo { Title = "InnovEnergy Backend API", Version = "v1" }); + c.SwaggerDoc("v1", OpenApiInfo); c.UseAllOfToExtendReferenceSchemas(); - c.OperationFilter(); //Todo testing throw me out c.SupportNonNullableReferenceTypes(); }); var app = builder.Build(); - // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); - app.UseSwaggerUI(cfg => cfg.EnableFilter()); + app.UseSwaggerUI(); } - - app.UseCors(); + + app.UseCors(p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()) ; app.UseHttpsRedirection(); - app.UseAuthorization(); - app.Use(SetSessionUser); + //app.UseAuthorization(); app.MapControllers(); app.Run(); } - - - private static async Task SetSessionUser(HttpContext ctx, RequestDelegate next) + private static OpenApiInfo OpenApiInfo { get; } = new OpenApiInfo { - var headers = ctx.Request.Headers; - var hasToken = headers.TryGetValue("auth", out var token) ; + Title = "InnovEnergy Backend API", + Version = "v1" + }; - if (hasToken) - { - var session = Db.GetSession(token); +} - if (session is not null) - ctx.Items["Session"] = session; - } - await next(ctx); - } -} \ No newline at end of file +// var x = new CorsPolicy +// { +// Headers = { "*" }, +// Origins = { "*" }, +// Methods = { "*" } +// }; From 3613199917cf0372fc96adc71ea947f9dec2eb02 Mon Sep 17 00:00:00 2001 From: ig Date: Mon, 20 Mar 2023 10:31:24 +0100 Subject: [PATCH 7/7] tentatively remove cors (we don't need it) --- csharp/App/Backend/Program.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/csharp/App/Backend/Program.cs b/csharp/App/Backend/Program.cs index 686e29d7f..385c6250b 100644 --- a/csharp/App/Backend/Program.cs +++ b/csharp/App/Backend/Program.cs @@ -22,7 +22,6 @@ public static class Program c.SupportNonNullableReferenceTypes(); }); - var app = builder.Build(); if (app.Environment.IsDevelopment()) @@ -31,7 +30,7 @@ public static class Program app.UseSwaggerUI(); } - app.UseCors(p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()) ; + //app.UseCors(p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()) ; app.UseHttpsRedirection(); //app.UseAuthorization(); app.MapControllers();