diff --git a/Borepin/Borepin/Borepin.csproj b/Borepin/Borepin/Borepin.csproj
index 85e36df..5738be6 100644
--- a/Borepin/Borepin/Borepin.csproj
+++ b/Borepin/Borepin/Borepin.csproj
@@ -19,6 +19,11 @@
+
+
+
+
+
@@ -120,9 +125,6 @@
MSBuild:UpdateDesignTimeXaml
-
-
-
diff --git a/Borepin/Borepin/Converter/MachineStateColorConverter.cs b/Borepin/Borepin/Converter/MachineStateColorConverter.cs
index de7b2ca..26442a8 100644
--- a/Borepin/Borepin/Converter/MachineStateColorConverter.cs
+++ b/Borepin/Borepin/Converter/MachineStateColorConverter.cs
@@ -8,9 +8,9 @@ namespace Borepin.Converter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
- switch((FabAccessAPI.Schema.State)value)
+ switch((FabAccessAPI.Schema.Machine.MachineState)value)
{
- case (FabAccessAPI.Schema.State.free):
+ case (FabAccessAPI.Schema.Machine.MachineState.free):
return (Color)Application.Current.Resources["FirstColor"];
default:
return (Color)Application.Current.Resources["SixthColor"];
diff --git a/Borepin/Borepin/Converter/MachineStateStringConverter.cs b/Borepin/Borepin/Converter/MachineStateStringConverter.cs
index 21bd030..8969c5c 100644
--- a/Borepin/Borepin/Converter/MachineStateStringConverter.cs
+++ b/Borepin/Borepin/Converter/MachineStateStringConverter.cs
@@ -8,19 +8,19 @@ namespace Borepin.Converter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
- switch((FabAccessAPI.Schema.State)value)
+ switch((FabAccessAPI.Schema.Machine.MachineState)value)
{
- case (FabAccessAPI.Schema.State.free):
+ case (FabAccessAPI.Schema.Machine.MachineState.free):
return "Free";
- case (FabAccessAPI.Schema.State.inUse):
+ case (FabAccessAPI.Schema.Machine.MachineState.inUse):
return "In Use";
- case (FabAccessAPI.Schema.State.toCheck):
+ case (FabAccessAPI.Schema.Machine.MachineState.toCheck):
return "To Check";
- case (FabAccessAPI.Schema.State.reserved):
+ case (FabAccessAPI.Schema.Machine.MachineState.reserved):
return "Reserved";
- case (FabAccessAPI.Schema.State.blocked):
+ case (FabAccessAPI.Schema.Machine.MachineState.blocked):
return "Blocked";
- case (FabAccessAPI.Schema.State.disabled):
+ case (FabAccessAPI.Schema.Machine.MachineState.disabled):
return "Disabled";
default:
return "Unknown";
diff --git a/Borepin/Borepin/Model/Machine.cs b/Borepin/Borepin/Model/Machine.cs
deleted file mode 100644
index af21027..0000000
--- a/Borepin/Borepin/Model/Machine.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Borepin.Model
-{
- public class Machine
- {
- public FabAccessAPI.Machine Instance { get; set; }
- public FabAccessAPI.Schema.Machine.MInfo MInfo { get; set; }
- }
-}
diff --git a/Borepin/Borepin/PageModel/MachineListPageModel.cs b/Borepin/Borepin/PageModel/MachineListPageModel.cs
index faef925..00480e0 100644
--- a/Borepin/Borepin/PageModel/MachineListPageModel.cs
+++ b/Borepin/Borepin/PageModel/MachineListPageModel.cs
@@ -37,23 +37,22 @@ namespace Borepin.PageModel
IsConnected = true;
}
- FabAccessAPI.Machines machineInterface = await _BFFHService.GetMachineInterface();
+ FabAccessAPI.Schema.IMachineSystem machineInterface = await _BFFHService.GetMachineSystemInterface();
+ FabAccessAPI.Schema.MachineSystem.IInfoInterface infoInterface = await machineInterface.Info();
- List list = new List();
+ //IReadOnlyList machine_list = await machineInterface.Info();
+ //foreach (FabAccessAPI.Machine machine in machine_list)
+ //{
+ // list.Add(new Machine() { Instance = machine, MInfo = await machine.GetMInfo() });
+ //}
- IReadOnlyList machine_list = await machineInterface.ListMachines();
- foreach (FabAccessAPI.Machine machine in machine_list)
- {
- list.Add(new Machine() { Instance = machine, MInfo = await machine.GetMInfo() });
- }
+ //List viewmodel_list = new List();
+ //foreach (Machine machine in list)
+ //{
+ // viewmodel_list.Add(new MachineListItemViewModel(machine));
+ //}
- List viewmodel_list = new List();
- foreach (Machine machine in list)
- {
- viewmodel_list.Add(new MachineListItemViewModel(machine));
- }
-
- MachineListItemViewModel_List = viewmodel_list;
+ MachineListItemViewModel_List = null;//viewmodel_list;
IsBusy = false;
}
@@ -88,7 +87,7 @@ namespace Borepin.PageModel
NavigationParameters parameters = new NavigationParameters
{
- { "instance", viewmodel.Instance }
+ //{ "instance", viewmodel.Instance }
};
INavigationResult result = await _NavigationService.NavigateAsync($"MachinePage", parameters);
diff --git a/Borepin/Borepin/PageModel/MachinePageModel.cs b/Borepin/Borepin/PageModel/MachinePageModel.cs
index 3dc629e..f77a54f 100644
--- a/Borepin/Borepin/PageModel/MachinePageModel.cs
+++ b/Borepin/Borepin/PageModel/MachinePageModel.cs
@@ -4,7 +4,6 @@ using Prism.Commands;
using Prism.Navigation;
using System.Threading.Tasks;
using System.Windows.Input;
-using static FabAccessAPI.Schema.Machine.WriteInterface;
namespace Borepin.PageModel
{
@@ -21,16 +20,7 @@ namespace Borepin.PageModel
#region Data
public override Task LoadData()
{
- Name = MachineItem.MInfo.Name;
-
- CanUse = MachineItem.MInfo.State == FabAccessAPI.Schema.State.free;
-
- //if (GiveBack == null)
- //{
- // GiveBack = await MachineItem.Instance.GetGiveBack();
- //}
-
- CanGiveBack = GiveBack != null;
+ //Name = MachineItem.MInfo.Name;
IsBusy = false;
@@ -40,12 +30,12 @@ namespace Borepin.PageModel
#endregion
#region Properties
- private Machine _MachineItem;
- public Machine MachineItem
- {
- get => _MachineItem;
- set => SetProperty(ref _MachineItem, value);
- }
+ //private Machine _MachineItem;
+ //public Machine MachineItem
+ //{
+ // get => _MachineItem;
+ // set => SetProperty(ref _MachineItem, value);
+ //}
private string _Name;
public string Name
@@ -54,13 +44,6 @@ namespace Borepin.PageModel
set => SetProperty(ref _Name, value);
}
- private IGiveBack _GiveBack;
- public IGiveBack GiveBack
- {
- get => _GiveBack;
- set => SetProperty(ref _GiveBack, value);
- }
-
private bool _CanUse;
public bool CanUse
{
@@ -86,12 +69,12 @@ namespace Borepin.PageModel
private async void UseMachineCommandExecuted()
{
- GiveBack = await MachineItem.Instance.Use();
- CanGiveBack = GiveBack != null;
+ //GiveBack = await MachineItem.Instance.Use();
+ //CanGiveBack = GiveBack != null;
- MachineItem.MInfo = await MachineItem.Instance.GetMInfo();
+ //MachineItem.MInfo = await MachineItem.Instance.GetMInfo();
- CanUse = MachineItem.MInfo.State == FabAccessAPI.Schema.State.free;
+ //CanUse = MachineItem.MInfo.State == FabAccessAPI.Schema.Machine.MachineState.free;
}
private ICommand _GiveBackMachineCommand;
@@ -103,14 +86,14 @@ namespace Borepin.PageModel
private async void GiveBackMachineCommandExecuted()
{
- await GiveBack.Ret();
+ //await GiveBack.Ret();
- GiveBack = null;
- CanGiveBack = GiveBack != null;
+ //GiveBack = null;
+ //CanGiveBack = GiveBack != null;
- MachineItem.MInfo = await MachineItem.Instance.GetMInfo();
+ //MachineItem.MInfo = await MachineItem.Instance.GetMInfo();
- CanUse = MachineItem.MInfo.State == FabAccessAPI.Schema.State.free;
+ //CanUse = MachineItem.MInfo.State == FabAccessAPI.Schema.Machine.MachineState.free;
}
#endregion
@@ -122,7 +105,7 @@ namespace Borepin.PageModel
public override void OnNavigatedTo(INavigationParameters parameters)
{
- MachineItem = parameters["instance"] as Machine;
+ //MachineItem = parameters["instance"] as Machine;
IsBusy = true;
Task.Run(LoadData);
diff --git a/Borepin/Borepin/Service/BFFH/BFFHService.cs b/Borepin/Borepin/Service/BFFH/BFFHService.cs
index 1b54c5e..52f8c97 100644
--- a/Borepin/Borepin/Service/BFFH/BFFHService.cs
+++ b/Borepin/Borepin/Service/BFFH/BFFHService.cs
@@ -3,8 +3,7 @@ using Borepin.Service.Credentials;
using System.Threading.Tasks;
using Capnp.Rpc;
using System.Collections.Generic;
-using System.Threading;
-using System;
+using FabAccessAPI.Schema;
namespace Borepin.Service.BFFH
{
@@ -75,9 +74,19 @@ namespace Borepin.Service.BFFH
return await Task.FromResult(true);
}
- public Task GetMachineInterface()
+ public Task GetMachineSystemInterface()
{
- return _Connection.AccessMachines();
+ return _Connection.AccessMachineSystem();
+ }
+
+ public Task GetUserSystemInterface()
+ {
+ return _Connection.AccessUserSystem();
+ }
+
+ public Task GetPermissionSystemInterface()
+ {
+ return _Connection.AccessPermissionSystem();
}
}
}
diff --git a/Borepin/Borepin/Service/BFFH/IBFFHService.cs b/Borepin/Borepin/Service/BFFH/IBFFHService.cs
index 47eab62..b4a6682 100644
--- a/Borepin/Borepin/Service/BFFH/IBFFHService.cs
+++ b/Borepin/Borepin/Service/BFFH/IBFFHService.cs
@@ -1,4 +1,5 @@
using Borepin.Model;
+using FabAccessAPI.Schema;
using System.Threading.Tasks;
namespace Borepin.Service.BFFH
@@ -46,6 +47,8 @@ namespace Borepin.Service.BFFH
/// address + username
Task Authenticate(Connection connection, string password);
- Task GetMachineInterface();
+ Task GetMachineSystemInterface();
+ Task GetUserSystemInterface();
+ Task GetPermissionSystemInterface();
}
}
diff --git a/Borepin/Borepin/ViewModel/ServerListItemViewModel.cs b/Borepin/Borepin/ViewModel/ServerListItemViewModel.cs
index 0a4d80f..87f19be 100644
--- a/Borepin/Borepin/ViewModel/ServerListItemViewModel.cs
+++ b/Borepin/Borepin/ViewModel/ServerListItemViewModel.cs
@@ -4,20 +4,20 @@ namespace Borepin.ViewModel
{
public class MachineListItemViewModel : BindableBase
{
- public MachineListItemViewModel(Model.Machine instance)
+ public MachineListItemViewModel()//Model.Machine instance)
{
- _Instance = instance;
+ //_Instance = null;
- Name = instance.MInfo.Name;
- State = instance.MInfo.State;
+ //Name = instance.MInfo.Name;
+ //State = instance.MInfo.State;
}
- private Model.Machine _Instance;
- public Model.Machine Instance
- {
- get => _Instance;
- set => SetProperty(ref _Instance, value);
- }
+ //private Model.Machine _Instance;
+ //public Model.Machine Instance
+ //{
+ // get => _Instance;
+ // set => SetProperty(ref _Instance, value);
+ //}
private string _Name;
public string Name
@@ -26,8 +26,8 @@ namespace Borepin.ViewModel
set => SetProperty(ref _Name, value);
}
- private FabAccessAPI.Schema.State _State;
- public FabAccessAPI.Schema.State State
+ private FabAccessAPI.Schema.Machine.MachineState _State;
+ public FabAccessAPI.Schema.Machine.MachineState State
{
get => _State;
set => SetProperty(ref _State, value);
diff --git a/FabAccessAPI/Auth.cs b/FabAccessAPI/Auth.cs
index a041182..db71786 100644
--- a/FabAccessAPI/Auth.cs
+++ b/FabAccessAPI/Auth.cs
@@ -1,163 +1,176 @@
-//using FabAccessAPI.Schema;
-//using S22.Sasl;
-//using System.Collections.Generic;
-//using System.Linq;
-//using System.Threading.Tasks;
-//using Exception = System.Exception;
+using FabAccessAPI.Schema;
+using S22.Sasl;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Exception = System.Exception;
-//namespace FabAccessAPI
-//{
-// / Authentication Identity
-// /
-// / Under the hood a string because the form depends heavily on the method
-// public struct AuthCId {
-// public string Id { get; private set; }
+namespace FabAccessAPI
+{
+ /// Authentication Identity
+ ///
+ /// Under the hood a string because the form depends heavily on the method
+ public struct AuthCId
+ {
+ public string Id { get; private set; }
-// public AuthCId(string id) : this() { Id = id; }
-// }
-
-// / Authorization Identity
-// /
-// / This identity is internal to FabAccess and completely independent from the authentication
-// / method or source
-// public struct AuthZId {
-// / Main User ID. Generally an user name or similar
-// public string Uid;
+ public AuthCId(string id) : this() { Id = id; }
+ }
-// / Sub user ID.
-// /
-// / Can change scopes for permissions, e.g. having a +admin account with more permissions than
-// / the default account and +dashboard et.al. accounts that have restricted permissions for
-// / their applications
-// public string Subuid;
+ /// Authorization Identity
+ ///
+ /// This identity is internal to FabAccess and completely independent from the authentication
+ /// method or source
+ public struct AuthZId
+ {
+ /// Main User ID. Generally an user name or similar
+ public string Uid;
-// / Realm this account originates.
-// /
-// / The Realm is usually described by a domain name but local policy may dictate an unrelated
-// / mapping
-// public string Realm;
-// }
+ /// Sub user ID.
+ ///
+ /// Can change scopes for permissions, e.g. having a +admin account with more permissions than
+ /// the default account and +dashboard et.al. accounts that have restricted permissions for
+ /// their applications
+ public string Subuid;
-// / Authentication/Authorization user object.
-// /
-// / This struct contains the user as is passed to the actual authentication/authorization
-// / subsystems
-// /
-// public struct AuthUser {
-// / Contains the Authentication ID used
-// /
-// / The authentication ID is an identifier for the authentication exchange. This is different
-// / than the ID of the user to be authenticated; for example when using x509 the authcid is
-// / the dn of the certificate, when using GSSAPI the authcid is of form `@`
-// public AuthCId Authcid;
+ /// Realm this account originates.
+ ///
+ /// The Realm is usually described by a domain name but local policy may dictate an unrelated
+ /// mapping
+ public string Realm;
+ }
-// / Contains the Authorization ID
-// /
-// / This is the identifier of the user to *authenticate as*. This in several cases is different
-// / to the `authcid`:
-// / If somebody wants to authenticate as somebody else, su-style.
-// / If a person wants to authenticate as a higher-permissions account, e.g. foo may set authzid foo+admin
-// / to split normal user and "admin" accounts.
-// / If a method requires a specific authcid that is different from the identifier of the user
-// / to authenticate as, e.g. GSSAPI, x509 client certificates, API TOKEN authentication.
-// public AuthZId Authzid;
+ /// Authentication/Authorization user object.
+ ///
+ /// This struct contains the user as is passed to the actual authentication/authorization
+ /// subsystems
+ ///
+ public struct AuthUser
+ {
+ /// Contains the Authentication ID used
+ ///
+ /// The authentication ID is an identifier for the authentication exchange. This is different
+ /// than the ID of the user to be authenticated; for example when using x509 the authcid is
+ /// the dn of the certificate, when using GSSAPI the authcid is of form `@`
+ public AuthCId Authcid;
-// / Contains the authentication method used
-// /
-// / For the most part this is the SASL method
-// public string AuthMethod;
+ /// Contains the Authorization ID
+ ///
+ /// This is the identifier of the user to *authenticate as*. This in several cases is different
+ /// to the `authcid`:
+ /// If somebody wants to authenticate as somebody else, su-style.
+ /// If a person wants to authenticate as a higher-permissions account, e.g. foo may set authzid foo+admin
+ /// to split normal user and "admin" accounts.
+ /// If a method requires a specific authcid that is different from the identifier of the user
+ /// to authenticate as, e.g. GSSAPI, x509 client certificates, API TOKEN authentication.
+ public AuthZId Authzid;
-// / Method-specific key-value pairs
-// /
-// / Each method can use their own key-value pairs.
-// / E.g. EXTERNAL encodes the actual method used (x509 client certs, UID/GID for unix sockets,
-// / ...)
-// public Dictionary Kvs;
+ /// Contains the authentication method used
+ ///
+ /// For the most part this is the SASL method
+ public string AuthMethod;
-// }
+ /// Method-specific key-value pairs
+ ///
+ /// Each method can use their own key-value pairs.
+ /// E.g. EXTERNAL encodes the actual method used (x509 client certs, UID/GID for unix sockets,
+ /// ...)
+ public Dictionary Kvs;
-// Authentication has two parts: Granting the authentication itself and then performing the
-// authentication.
-// Granting the authentication checks if
-// a) the given authcid fits with the given (authMethod, kvs). In general a failure here indicates
-// a programming failure — the authcid come from the same source as that tuple
-// b) the given authcid may authenticate as the given authzid. E.g. if a given client certificate
-// has been configured for that user, if a GSSAPI user maps to a given user,
-// public enum AuthError {
-// / Authentication ID is bad/unknown/..
-// BadAuthcid,
-// / Authorization ID is unknown/..
-// BadAuthzid,
-// / Authorization ID is not of form user+uid@realm
-// MalformedAuthzid,
-// / User may not use that authorization id
-// NotAllowedAuthzid,
+ }
-// }
+ // Authentication has two parts: Granting the authentication itself and then performing the
+ // authentication.
+ // Granting the authentication checks if
+ // a) the given authcid fits with the given (authMethod, kvs). In general a failure here indicates
+ // a programming failure — the authcid come from the same source as that tuple
+ // b) the given authcid may authenticate as the given authzid. E.g. if a given client certificate
+ // has been configured for that user, if a GSSAPI user maps to a given user,
+ public enum AuthError
+ {
+ /// Authentication ID is bad/unknown/..
+ BadAuthcid,
+ /// Authorization ID is unknown/..
+ BadAuthzid,
+ /// Authorization ID is not of form user+uid@realm
+ MalformedAuthzid,
+ /// User may not use that authorization id
+ NotAllowedAuthzid,
-// public class UnauthorizedException : Exception{}
-// public class UnsupportedMechanismException : Exception{}
+ }
-// /
-// / THIS IS VERY INCOMPLETE!
-// /
-// public class Auth {
-// #region Log
-// private static readonly log4net.ILog _Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-// #endregion
-
-// private IAuthentication _authCap;
-// public Auth(IAuthentication authCap) {
-// _authCap = authCap;
-// }
+ public class UnauthorizedException : Exception { }
+ public class UnsupportedMechanismException : Exception { }
-// public Task> GetMechanisms() {
-// return _authCap.Mechanisms();
-// }
+ ///
+ /// THIS IS VERY INCOMPLETE!
+ ///
+ public class Auth
+ {
+ #region Log
+ private static readonly log4net.ILog _Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ #endregion
-// public async Task Authenticate(string mech, Dictionary properties) {
+ private IAuthenticationSystem _authCap;
+ public Auth(IAuthenticationSystem authCap)
+ {
+ _authCap = authCap;
+ }
-// var m = SaslFactory.Create(mech);
-// foreach (KeyValuePair entry in properties) {
-// m.Properties.Add(entry.Key, entry.Value);
-// }
+ public Task> GetMechanisms()
+ {
+ return _authCap.Mechanisms();
+ }
-// var initialResponse = new Request.initialResponse();
-// if (m.HasInitial) {
-// initialResponse.Initial = m.GetResponse(new byte[0]);
-// }
+ public async Task Authenticate(string mech, Dictionary properties)
+ {
-// var req = new Request {
-// Mechanism = m.Name,
-// InitialResponse = initialResponse
-// };
+ var m = SaslFactory.Create(mech);
+ foreach (KeyValuePair entry in properties)
+ {
+ m.Properties.Add(entry.Key, entry.Value);
+ }
-// var resp = await _authCap.Start(req);
-// while (!m.IsCompleted) {
-// if (resp.which == Response.WHICH.Challence) {
-// var additional = m.GetResponse(resp.Challence.ToArray());
-// resp = await _authCap.Step(additional);
-// }
-// else {
-// break;
-// }
-// }
+ var initialResponse = new Request.initialResponse();
+ if (m.HasInitial)
+ {
+ initialResponse.Initial = m.GetResponse(new byte[0]);
+ }
-// if (resp.which == Response.WHICH.Outcome) {
-// if (resp.Outcome.Result == Response.Result.successful) {
-// return true;
-// }
-// else {
-// TODO: Provide meaningful info about auth failure
-// return false;
-// }
-// }
+ var req = new Request
+ {
+ Mechanism = m.Name,
+ InitialResponse = initialResponse
+ };
-// return false;
-// }
+ var resp = await _authCap.Start(req);
+ while (!m.IsCompleted)
+ {
+ if (resp.which == Response.WHICH.Challence)
+ {
+ var additional = m.GetResponse(resp.Challence.ToArray());
+ resp = await _authCap.Step(additional);
+ }
+ else
+ {
+ break;
+ }
+ }
-
+ if (resp.which == Response.WHICH.Outcome)
+ {
+ if (resp.Outcome.Result == Response.Result.successful)
+ {
+ return true;
+ }
+ else
+ {
+ //TODO: Provide meaningful info about auth failure
+ return false;
+ }
+ }
-// }
-
-//}
+ return false;
+ }
+ }
+}
diff --git a/FabAccessAPI/Connection.cs b/FabAccessAPI/Connection.cs
index 2fd9808..f3c0c46 100644
--- a/FabAccessAPI/Connection.cs
+++ b/FabAccessAPI/Connection.cs
@@ -1,64 +1,86 @@
-//using Capnp.Rpc;
-//using FabAccessAPI.Schema;
-//using System;
-//using System.Collections.Generic;
-//using System.Linq;
-//using System.Threading;
-//using System.Threading.Tasks;
+using Capnp.Rpc;
+using FabAccessAPI.Schema;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
-//namespace FabAccessAPI {
-// public class Connection {
-// #region private variables
-// private readonly TcpRpcClient? _rpcClient = null;
-// private readonly IBootstrap? _bootstrapCap = null;
-// private Auth? _auth = null;
-// private Machines? _machines = null;
-// #endregion
-
-// public TcpRpcClient? RpcClient => _rpcClient;
-
-// #region Log
-// private static readonly log4net.ILog _Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-// #endregion
-
-// ///
-// ///
-// ///
-// /// Should be an already configured and connected TcpRpcClient
-// public Connection(TcpRpcClient rpcClient) {
-// _rpcClient = rpcClient;
-// _bootstrapCap = _rpcClient.GetMain();
-// _Log.Debug($"Done bootstraping API connection.");
-// }
+namespace FabAccessAPI
+{
+ public class Connection
+ {
+ #region private variables
+ private readonly TcpRpcClient? _rpcClient = null;
+ private readonly IBootstrap? _bootstrapCap = null;
+ private Auth? _auth = null;
+ #endregion
-// ///
-// /// Authenticate this connection.
-// /// Calling this more then once is UB
-// ///
-// /// The desired authentication mechanism
-// /// Key-Value data specific to the mechanism
-// ///
-// public async Task Auth(string mech, Dictionary kvs, CancellationToken cancellationToken_ = default) {
-// // _bootstrapCap = await _bootstrapCap.Unwrap();
-// var authCap = await _bootstrapCap.Auth(cancellationToken_);
-// _auth = new Auth(authCap);
-// var mechs = await _auth.GetMechanisms();
-// _Log.Debug($"The Server supports the following auth mechs: {string.Join(", ", mechs)}");
+ public TcpRpcClient? RpcClient => _rpcClient;
-// if (!mechs.Contains(mech)) {
-// throw new UnsupportedMechanismException();
-// }
+ #region Log
+ private static readonly log4net.ILog _Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ #endregion
-// await _auth.Authenticate(mech, kvs);
-// }
+ ///
+ ///
+ ///
+ /// Should be an already configured and connected TcpRpcClient
+ public Connection(TcpRpcClient rpcClient)
+ {
+ _rpcClient = rpcClient;
+ _bootstrapCap = _rpcClient.GetMain();
+ _Log.Debug($"Done bootstraping API connection.");
+ }
-// ///
-// /// Get a wrapped capability to interact with machines
-// ///
-// /// A wrapped capability to interact with machines
-// public async Task AccessMachines() {
-// _machines ??= new Machines(await _bootstrapCap.Machines());
-// return _machines;
-// }
-// }
-//}
+ ///
+ /// Authenticate this connection.
+ /// Calling this more then once is UB
+ ///
+ /// The desired authentication mechanism
+ /// Key-Value data specific to the mechanism
+ ///
+ public async Task Auth(string mech, Dictionary kvs, CancellationToken cancellationToken_ = default)
+ {
+ // _bootstrapCap = await _bootstrapCap.Unwrap();
+ var authCap = await _bootstrapCap.AuthenticationSystem(cancellationToken_);
+ _auth = new Auth(authCap);
+ var mechs = await _auth.GetMechanisms();
+ _Log.Debug($"The Server supports the following auth mechs: {string.Join(", ", mechs)}");
+
+ if (!mechs.Contains(mech))
+ {
+ throw new UnsupportedMechanismException();
+ }
+
+ await _auth.Authenticate(mech, kvs);
+ }
+
+ ///
+ /// Get a wrapped capability to interact with machines
+ ///
+ /// A wrapped capability to interact with machines
+ public async Task AccessMachineSystem()
+ {
+ return await _bootstrapCap.MachineSystem();
+ }
+
+ ///
+ /// Get a wrapped capability to interact with users
+ ///
+ /// A wrapped capability to interact with users
+ public async Task AccessUserSystem()
+ {
+ return await _bootstrapCap.UserSystem();
+ }
+
+ ///
+ /// Get a wrapped capability to interact with permissions
+ ///
+ /// A wrapped capability to interact with permissions
+ public async Task AccessPermissionSystem()
+ {
+ return await _bootstrapCap.PermissionSystem();
+ }
+ }
+}
diff --git a/FabAccessAPI/FabAccessAPI.csproj b/FabAccessAPI/FabAccessAPI.csproj
index 7724f57..c6c513d 100644
--- a/FabAccessAPI/FabAccessAPI.csproj
+++ b/FabAccessAPI/FabAccessAPI.csproj
@@ -14,7 +14,7 @@
-
+
diff --git a/FabAccessAPI/Machines.cs b/FabAccessAPI/Machines.cs
deleted file mode 100644
index aa2b4de..0000000
--- a/FabAccessAPI/Machines.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-//using FabAccessAPI.Schema;
-//using System;
-//using System.Collections.Generic;
-//using System.Threading.Tasks;
-
-//namespace FabAccessAPI
-//{
-
-// public class MachineException : Exception { }
-
-// ///
-// /// Wraps a capability for accessing the Machines subsystem of BFFH
-// ///
-// public class Machines {
-
-// private readonly IMachines _machinesCap;
-
-// ///
-// /// Constructs the Wrapper Class from a given capability.
-// ///
-// /// The capability that should be wrapped.
-// public Machines(IMachines machinesCap) {
-// _machinesCap = machinesCap;
-// }
-
-// ///
-// /// List of all machines that BFFH knows about the user has been granted at least read access on
-// ///
-// /// ReadOnlyList of available Machines
-// public async Task?> ListMachines()
-// {
-// IReadOnlyList? machineList = await _machinesCap.ListMachines().ConfigureAwait(false);
-// List machineList_new = new List();
-// foreach(Schema.Machine machine in machineList)
-// {
-// machineList_new.Add(new Machine(machine));
-// }
-
-// return machineList_new;
-// }
-
-// ///
-// /// Access a particular machine by known name. This may fail for two reasons:
-// /// The user has not been granted access to know the machine exists or the machine does in fact not exist.
-// /// In both cases the `machine` result will be a NULL-pointer
-// ///
-// /// Name of the Machine
-// /// The Machine we requested
-// public async Task GetMachine(string name) {
-// var mach = (await _machinesCap.GetMachine(name).ConfigureAwait(false)).Item1;
-// if (mach == null) {
-// //TODO: Throw a more specific exception!
-// throw new MachineException();
-// }
-// return new Machine(mach);
-// }
-// }
-
-// ///
-// /// A machine. This represents a machine as BFFH thinks about it which may mean
-// ///several machines or just part of a machine in the real world.
-// ///By itself this struct is completely useless since it contains only the information
-// ///that the machine exists the user is allowed to know about that fact. For all further
-// ///information the user has to call the contained capabilities which depending on the
-// ///access level may not be set. For example an admin will have every capability here
-// ///set but a simple user may only have `read` and `write` set while some users may not
-// /// even have `read` set and are unable to even see if the machine is currently in use.
-// ///
-// public class Machine {
-// private readonly Schema.Machine _machine;
-
-// ///
-// /// Constructs the Wrapper Class from a given capability
-// ///
-// /// The capability that should be wrapped.
-// public Machine(Schema.Machine machine) {
-// _machine = machine;
-// }
-
-// // read operations
-
-// ///
-// /// Get the MInfo Struct for the Machine.
-// /// This contains everything BFFH knows about the Machine.
-// ///
-// ///
-// /// The MInfo Struct describing the Machine
-// public async Task GetMInfo() {
-// var readCap = _machine.Read;
-// if (readCap == null) {
-// throw new UnauthorizedException();
-// }
-
-// return (await _machine.Read.Info().ConfigureAwait(false)).Item1;
-// }
-
-// //write operations
-
-// ///
-// /// Try to use a machine. Throws a UnauthorizedException if the user does not have the required
-// /// permissions to use this machine.
-// ///
-// /// Use the Ret() Method of the returned Object to return the machine
-// ///
-// ///
-// /// Capability to give back the machine
-// public Task Use() {
-// var writeCap = _machine.Write;
-// if (writeCap == null) {
-// throw new UnauthorizedException();
-// }
-
-// return writeCap.Use();
-// }
-
-// ///
-// /// Try to get a GiveBack capability for a machine.
-// ///
-// /// Capability to give back the machine or null
-// ///
-// public Task GetGiveBack()
-// {
-// var writeCap = _machine.Write;
-// if (writeCap == null)
-// {
-// throw new UnauthorizedException();
-// }
-
-// return writeCap.GetGiveBack();
-// }
-
-// ///
-// /// Try to reserve a machine. Throws a UnauthorizedException if the user does not have the required
-// /// permissions to use this machine.
-// ///
-// /// Use the Ret() Method of the returned Object to return the machine
-// /// Use the Use() Nethod of the Machine to use your reserved machine.
-// ///
-// ///
-// /// Capability to give back the machine
-// public Task Reserve()
-// {
-// var writeCap = _machine.Write;
-// if (writeCap == null)
-// {
-// throw new UnauthorizedException();
-// }
-
-// return writeCap.Reserve();
-// }
-
-
-// // public void GiveBack(Schema.Machine.WriteInterface.IGiveBack cap) {
-// // cap.Ret();
-// // }
-
-// //manage operations
-
-// ///
-// /// After a machine has been used by an user with low enough permissions it's
-// /// in the 'toCheck' state. This call then allows more priviledged users to
-// /// "check" the machine and move it to the `free` state.
-// ///
-// /// Calling this method signifies that the machine was checked and in an acceptable state.
-// ///
-// public async void MarkOk() {
-// var manageCap = _machine.Manage;
-// if (manageCap == null) {
-// throw new UnauthorizedException();
-// }
-// // TODO: Do we really want to check this here?
-// if ((await GetMInfo().ConfigureAwait(false)).State == State.toCheck) {
-// await _machine.Manage.Ok().ConfigureAwait(false);
-// }
-// }
-
-// ///
-// /// After a machine has been used by an user with low enough permissions it's
-// /// in the 'toCheck' state. This call then allows more priviledged users to
-// /// "check" the machine and move it to the `free` state.
-// ///
-// /// Calling this method signifies that the machine was checked and in an unacceptable state.
-// /// It will most likely be marked as `blocked` and the previous user will somehow be informed.
-// ///
-// public async void MarkNotOk() {
-// var manageCap = _machine.Manage;
-// if (manageCap == null) {
-// throw new UnauthorizedException();
-// }
-// // TODO: Do we really want to check this here?
-// if ((await GetMInfo().ConfigureAwait(false)).State == State.toCheck) {
-// await _machine.Manage.NotOk().ConfigureAwait(false);
-// }
-// }
-
-// //administrative operations
-
-// ///
-// /// Forcefully set a machine state.
-// ///
-// /// The desired machine state.
-// public async void ForceSetState(State state) {
-// var adminCap = _machine.Admin;
-// if (adminCap == null) {
-// throw new UnauthorizedException();
-// }
-
-// await adminCap.ForceSetState(state).ConfigureAwait(false);
-// }
-
-// ///
-// /// Set the given user as current responsible
-// ///
-// /// The user
-// public async void ForceSetUser(String user) {
-// var adminCap = _machine.Admin;
-// if (adminCap == null) {
-// throw new UnauthorizedException();
-// }
-
-// await adminCap.ForceSetUser(user).ConfigureAwait(false);
-// }
-// }
-//}
diff --git a/FabAccessAPI/Permissions.cs b/FabAccessAPI/Permissions.cs
deleted file mode 100644
index 1b115fb..0000000
--- a/FabAccessAPI/Permissions.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-////This is where the permissions subsystem will live
-//namespace FabAccessAPI
-//{
-// public class Permissions {
-// #region Log
-// private static readonly log4net.ILog _Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-// #endregion
-// }
-//}
diff --git a/FabAccessAPI_Test/FabAccessAPITests.cs b/FabAccessAPI_Test/FabAccessAPITests.cs
index a20fc4f..198a19b 100644
--- a/FabAccessAPI_Test/FabAccessAPITests.cs
+++ b/FabAccessAPI_Test/FabAccessAPITests.cs
@@ -6,7 +6,6 @@ using Capnp;
using Capnp.Rpc;
using log4net.Config;
using Microsoft.Extensions.Logging;
-using static FabAccessAPI.Schema.Machine.WriteInterface;
namespace FabAccessAPI_Test {
public class Tests {
@@ -51,50 +50,5 @@ namespace FabAccessAPI_Test {
public async Task Authenticate() {
await _connection.Auth("PLAIN", new Dictionary{{"Username", "Testuser"}, {"Password", "secret"}});
}
-
- [Test]
- public async Task GetMInfo() {
- await _connection.Auth("PLAIN", new Dictionary{{"Username", "Testuser"}, {"Password", "secret"}});
- Machines machines = await _connection.AccessMachines();
-
- Machine testmachine = await machines.GetMachine("Testmachine");
- Assert.NotNull(testmachine);
-
- FabAccessAPI.Schema.Machine.MInfo minfo = await testmachine.GetMInfo();
- Assert.NotNull(minfo);
- _Log.Info($"Name: {minfo.Name}, Description: {minfo.Description}, State: {minfo.State}");
- }
-
- [Test]
- public async Task ListMachines()
- {
- await _connection.Auth("PLAIN", new Dictionary { { "Username", "Testuser" }, { "Password", "secret" } });
- Machines machines = await _connection.AccessMachines();
-
- IReadOnlyList machineList = await machines.ListMachines();
- Assert.NotNull(machineList);
- Assert.AreNotEqual(0, machineList.Count);
- }
-
- [Test]
- public async Task UseMachine()
- {
- await _connection.Auth("PLAIN", new Dictionary { { "Username", "Testuser" }, { "Password", "secret" } });
- Machines machines = await _connection.AccessMachines();
-
- Machine testmachine = await machines.GetMachine("Testmachine");
- Assert.NotNull(testmachine);
-
- await testmachine.Use();
-
- FabAccessAPI.Schema.Machine.MInfo minfo = await testmachine.GetMInfo();
- Assert.NotNull(minfo);
- Assert.AreEqual(FabAccessAPI.Schema.State.inUse, minfo.State);
-
- //await giveBack.Ret();
- //minfo = await testmachine.GetMInfo();
- //Assert.NotNull(minfo);
- //Assert.AreEqual(FabAccessAPI.Schema.State.free, minfo.State);
- }
}
}
\ No newline at end of file
diff --git a/FabAccessAPI_Test/FabAccessAPI_Test.csproj b/FabAccessAPI_Test/FabAccessAPI_Test.csproj
index 4d59767..36c952c 100644
--- a/FabAccessAPI_Test/FabAccessAPI_Test.csproj
+++ b/FabAccessAPI_Test/FabAccessAPI_Test.csproj
@@ -7,7 +7,7 @@
-
+