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