Merge remote-tracking branch 'origin/main'
# Conflicts: # csharp/App/Backend/DataTypes/Methods/User.cs # csharp/App/Backend/Database/Db.cs
This commit is contained in:
commit
e4dd24c1b0
|
@ -4,7 +4,6 @@ using InnovEnergy.App.Backend.DataTypes.Methods;
|
||||||
using InnovEnergy.App.Backend.Relations;
|
using InnovEnergy.App.Backend.Relations;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using static System.Net.HttpStatusCode;
|
using static System.Net.HttpStatusCode;
|
||||||
using static System.String;
|
|
||||||
using Folder = InnovEnergy.App.Backend.DataTypes.Folder;
|
using Folder = InnovEnergy.App.Backend.DataTypes.Folder;
|
||||||
using Installation = InnovEnergy.App.Backend.DataTypes.Installation;
|
using Installation = InnovEnergy.App.Backend.DataTypes.Installation;
|
||||||
using Object = System.Object;
|
using Object = System.Object;
|
||||||
|
|
|
@ -33,7 +33,9 @@ public static class FolderMethods
|
||||||
|
|
||||||
public static IEnumerable<Folder> Ancestors(this Folder folder)
|
public static IEnumerable<Folder> Ancestors(this Folder folder)
|
||||||
{
|
{
|
||||||
return folder.Unfold(Parent);
|
return folder
|
||||||
|
.Unfold(Parent)
|
||||||
|
.Skip(1); // skip self
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Folder? Parent(this Folder folder)
|
public static Folder? Parent(this Folder folder)
|
||||||
|
|
|
@ -33,9 +33,12 @@ public static class InstallationMethods
|
||||||
{
|
{
|
||||||
var parentFolder = Parent(installation);
|
var parentFolder = Parent(installation);
|
||||||
|
|
||||||
return parentFolder is null
|
if (parentFolder is null)
|
||||||
? Enumerable.Empty<Folder>()
|
return Enumerable.Empty<Folder>();
|
||||||
: parentFolder.Ancestors();
|
|
||||||
|
return parentFolder
|
||||||
|
.Ancestors()
|
||||||
|
.Prepend(parentFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Folder? Parent(this Installation installation)
|
public static Folder? Parent(this Installation installation)
|
||||||
|
|
|
@ -110,6 +110,34 @@ public static class SessionMethods
|
||||||
&& Db.Delete(userToDelete);
|
&& Db.Delete(userToDelete);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Boolean GrantUserAccessTo(this Session? session, User? user, Installation? installation)
|
||||||
|
{
|
||||||
|
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.Create(new InstallationAccess { UserId = user.Id, InstallationId = installation.Id });
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean GrantUserAccessTo(this Session? session, User? user, Folder? folder)
|
||||||
|
{
|
||||||
|
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.Create(new FolderAccess { UserId = user.Id, FolderId = folder.Id });
|
||||||
|
}
|
||||||
|
|
||||||
public static Boolean Logout(this Session? session)
|
public static Boolean Logout(this Session? session)
|
||||||
{
|
{
|
||||||
return session is not null
|
return session is not null
|
||||||
|
|
|
@ -1,11 +1,5 @@
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Net.Mail;
|
using System.Net.Mail;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
|
||||||
using System.Text.Json.Nodes;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using CliWrap;
|
|
||||||
using CliWrap.Buffered;
|
|
||||||
using InnovEnergy.App.Backend.Database;
|
using InnovEnergy.App.Backend.Database;
|
||||||
using InnovEnergy.Lib.Utils;
|
using InnovEnergy.Lib.Utils;
|
||||||
using Convert = System.Convert;
|
using Convert = System.Convert;
|
||||||
|
@ -91,7 +85,9 @@ public static class UserMethods
|
||||||
|
|
||||||
private static IEnumerable<User> Ancestors(this User user)
|
private static IEnumerable<User> Ancestors(this User user)
|
||||||
{
|
{
|
||||||
return user.Unfold(Parent);
|
return user
|
||||||
|
.Unfold(Parent)
|
||||||
|
.Skip(1); // skip self
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Boolean VerifyPassword(this User user, String password)
|
public static Boolean VerifyPassword(this User user, String password)
|
||||||
|
@ -138,7 +134,8 @@ public static class UserMethods
|
||||||
if (folder is null)
|
if (folder is null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return folder
|
return user.HasDirectAccessTo(folder)
|
||||||
|
|| folder
|
||||||
.Ancestors()
|
.Ancestors()
|
||||||
.Any(user.HasDirectAccessTo);
|
.Any(user.HasDirectAccessTo);
|
||||||
}
|
}
|
||||||
|
@ -147,7 +144,7 @@ public static class UserMethods
|
||||||
{
|
{
|
||||||
return Db
|
return Db
|
||||||
.User2Installation
|
.User2Installation
|
||||||
.Any(r => r.InstallationId == installation.Id && r.UserId == user.Id);
|
.Any(r => r.UserId == user.Id && r.InstallationId == installation.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Boolean HasAccessTo(this User user, Installation? installation)
|
public static Boolean HasAccessTo(this User user, Installation? installation)
|
||||||
|
@ -166,7 +163,6 @@ public static class UserMethods
|
||||||
|
|
||||||
return other
|
return other
|
||||||
.Ancestors()
|
.Ancestors()
|
||||||
.Skip(1) // Important! skip self, user cannot delete or edit himself
|
|
||||||
.Contains(user);
|
.Contains(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,8 +173,8 @@ public static class UserMethods
|
||||||
|
|
||||||
return $"{user.Id}InnovEnergy";
|
return $"{user.Id}InnovEnergy";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
|
|
|
@ -29,10 +29,18 @@ public static partial class Db
|
||||||
return Connection.Insert(user) > 0;
|
return Connection.Insert(user) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Boolean Create(Session session)
|
public static Boolean Create(Session session)
|
||||||
{
|
{
|
||||||
return Connection.Insert(session) > 0;
|
return Connection.Insert(session) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Boolean Create(InstallationAccess installationAccess)
|
||||||
|
{
|
||||||
|
return Connection.Insert(installationAccess) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean Create(FolderAccess folderAccess)
|
||||||
|
{
|
||||||
|
return Connection.Insert(folderAccess) > 0;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
using InnovEnergy.App.Backend.DataTypes;
|
using InnovEnergy.App.Backend.DataTypes;
|
||||||
using InnovEnergy.App.Backend.DataTypes.Methods;
|
|
||||||
using InnovEnergy.App.Backend.Relations;
|
using InnovEnergy.App.Backend.Relations;
|
||||||
using InnovEnergy.Lib.Utils;
|
using InnovEnergy.Lib.Utils;
|
||||||
using SQLite;
|
using SQLite;
|
||||||
|
@ -20,8 +19,8 @@ public static partial class Db
|
||||||
public static TableQuery<Folder> Folders => Connection.Table<Folder>();
|
public static TableQuery<Folder> Folders => Connection.Table<Folder>();
|
||||||
public static TableQuery<Installation> Installations => Connection.Table<Installation>();
|
public static TableQuery<Installation> Installations => Connection.Table<Installation>();
|
||||||
public static TableQuery<User> Users => Connection.Table<User>();
|
public static TableQuery<User> Users => Connection.Table<User>();
|
||||||
public static TableQuery<User2Folder> User2Folder => Connection.Table<User2Folder>();
|
public static TableQuery<FolderAccess> User2Folder => Connection.Table<FolderAccess>();
|
||||||
public static TableQuery<User2Installation> User2Installation => Connection.Table<User2Installation>();
|
public static TableQuery<InstallationAccess> User2Installation => Connection.Table<InstallationAccess>();
|
||||||
|
|
||||||
|
|
||||||
static Db()
|
static Db()
|
||||||
|
@ -33,8 +32,8 @@ public static partial class Db
|
||||||
Connection.CreateTable<User>();
|
Connection.CreateTable<User>();
|
||||||
Connection.CreateTable<Installation>();
|
Connection.CreateTable<Installation>();
|
||||||
Connection.CreateTable<Folder>();
|
Connection.CreateTable<Folder>();
|
||||||
Connection.CreateTable<User2Folder>();
|
Connection.CreateTable<FolderAccess>();
|
||||||
Connection.CreateTable<User2Installation>();
|
Connection.CreateTable<InstallationAccess>();
|
||||||
Connection.CreateTable<Session>();
|
Connection.CreateTable<Session>();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -71,46 +70,10 @@ public static partial class Db
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static Boolean AddToAccessibleInstallations(Int64 userId, Int64 updatedInstallationId)
|
|
||||||
{
|
|
||||||
var con = new User2Installation
|
|
||||||
{
|
|
||||||
UserId = userId,
|
|
||||||
InstallationId = updatedInstallationId
|
|
||||||
};
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Connection.Insert(con);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean AddToAccessibleFolders(Int64 userId, Int64 updatedFolderId)
|
|
||||||
{
|
|
||||||
var con = new User2Folder
|
|
||||||
{
|
|
||||||
UserId = userId,
|
|
||||||
FolderId = updatedFolderId
|
|
||||||
};
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Connection.Insert(con);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static async Task<Boolean> Cleanup(Int64 _)
|
private static void Cleanup(Int64 _)
|
||||||
{
|
{
|
||||||
await UpdateS3Urls();
|
await UpdateS3Urls();
|
||||||
DeleteStaleSessions();
|
DeleteStaleSessions();
|
||||||
|
|
|
@ -70,7 +70,7 @@ public static partial class Db
|
||||||
foreach (var user in Users)
|
foreach (var user in Users)
|
||||||
while (Random.Shared.Next((Int32)(nUsers - user.Id + 1)) != 0)
|
while (Random.Shared.Next((Int32)(nUsers - user.Id + 1)) != 0)
|
||||||
{
|
{
|
||||||
var relation = new User2Folder
|
var relation = new FolderAccess
|
||||||
{
|
{
|
||||||
UserId = user.Id,
|
UserId = user.Id,
|
||||||
FolderId = Random.Shared.Next(nFolders) + 1
|
FolderId = Random.Shared.Next(nFolders) + 1
|
||||||
|
@ -89,7 +89,7 @@ public static partial class Db
|
||||||
foreach (var user in Users)
|
foreach (var user in Users)
|
||||||
while (Random.Shared.Next(5) != 0)
|
while (Random.Shared.Next(5) != 0)
|
||||||
{
|
{
|
||||||
var relation = new User2Installation
|
var relation = new InstallationAccess
|
||||||
{
|
{
|
||||||
UserId = user.Id,
|
UserId = user.Id,
|
||||||
InstallationId = Random.Shared.Next(nbInstallations) + 1
|
InstallationId = Random.Shared.Next(nbInstallations) + 1
|
||||||
|
|
|
@ -57,7 +57,7 @@ public static class Program
|
||||||
var session = Db.GetSession(token);
|
var session = Db.GetSession(token);
|
||||||
|
|
||||||
if (session is not null)
|
if (session is not null)
|
||||||
ctx.Items["User"] = session;
|
ctx.Items["Session"] = session;
|
||||||
}
|
}
|
||||||
|
|
||||||
await next(ctx);
|
await next(ctx);
|
||||||
|
|
|
@ -2,7 +2,7 @@ using SQLite;
|
||||||
|
|
||||||
namespace InnovEnergy.App.Backend.Relations;
|
namespace InnovEnergy.App.Backend.Relations;
|
||||||
|
|
||||||
public class User2Folder : Relation<Int64, Int64>
|
public class FolderAccess : Relation<Int64, Int64>
|
||||||
{
|
{
|
||||||
[Indexed] public Int64 UserId { get => Left ; init => Left = value;}
|
[Indexed] public Int64 UserId { get => Left ; init => Left = value;}
|
||||||
[Indexed] public Int64 FolderId { get => Right; init => Right = value;}
|
[Indexed] public Int64 FolderId { get => Right; init => Right = value;}
|
|
@ -2,7 +2,7 @@ using SQLite;
|
||||||
|
|
||||||
namespace InnovEnergy.App.Backend.Relations;
|
namespace InnovEnergy.App.Backend.Relations;
|
||||||
|
|
||||||
public class User2Installation : Relation<Int64, Int64>
|
public class InstallationAccess : Relation<Int64, Int64>
|
||||||
{
|
{
|
||||||
[Indexed] public Int64 UserId { get => Left ; init => Left = value;}
|
[Indexed] public Int64 UserId { get => Left ; init => Left = value;}
|
||||||
[Indexed] public Int64 InstallationId { get => Right; init => Right = value;}
|
[Indexed] public Int64 InstallationId { get => Right; init => Right = value;}
|
Loading…
Reference in New Issue