Showcase impl:

This commit is contained in:
Gregor Reitzenstein 2020-02-19 14:50:23 +01:00
parent 9c4144ac66
commit 3ff68ceb2d
3 changed files with 25 additions and 15 deletions

View File

@ -29,6 +29,11 @@ impl PermissionsProvider {
pub fn enforce(&self, actor: &str, object: &str, action: &str) -> Result<bool> { pub fn enforce(&self, actor: &str, object: &str, action: &str) -> Result<bool> {
let b = self.pdb.enforce(vec![actor, object, action])?; let b = self.pdb.enforce(vec![actor, object, action])?;
if b {
trace!(self.log, "Granted {} on {} for {}", action, object, actor);
} else {
trace!(self.log, "Denied {} on {} for {}", action, object, actor);
}
Ok(b) Ok(b)
} }
} }

View File

@ -23,6 +23,7 @@ use capnp::Error;
use capnp_rpc::Server; use capnp_rpc::Server;
use uuid::Uuid; use uuid::Uuid;
use std::ops::DerefMut;
/// Status of a Machine /// Status of a Machine
#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)] #[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
@ -83,6 +84,13 @@ impl MachinesProvider {
pub fn get_perm_req(&self, uuid: &Uuid) -> Option<String> { pub fn get_perm_req(&self, uuid: &Uuid) -> Option<String> {
self.mdb.get(uuid).map(|m| m.perm.clone()) self.mdb.get(uuid).map(|m| m.perm.clone())
} }
pub fn set_blocked(&mut self, uuid: &Uuid, blocked: bool) -> std::result::Result<(), capnp::Error> {
// If the value can not be found map doesn't run and ok_or changes it into a Err with the
// given error value
self.mdb.get_mut(uuid).map(|m| m.set_blocked(blocked))
.ok_or(capnp::Error::failed("No such machine".to_string()))
}
} }
#[derive(Clone)] #[derive(Clone)]
@ -125,8 +133,8 @@ impl api::machines::Server for Machines {
// Magic incantation to get a capability to send // Magic incantation to get a capability to send
// Also since we move i in here we at this point *must* have dropped // Also since we move i in here we at this point *must* have dropped
// all locks we may still have on it. // all locks we may still have on it.
b.set_manage(api::machines::give_back::ToClient::new( b.set_manage(api::machines::manage::ToClient::new(
MachineManager::new(i, uuid)).into_client::<Server>()); MachineManager::new(uuid, i)).into_client::<Server>());
} }
} }
Ok(()) Ok(())
@ -232,7 +240,7 @@ pub struct MachineManager {
} }
impl MachineManager { impl MachineManager {
pub fn new(uuid: Uuid, mdb: Arc<RwLock<MachineDB>>) -> Self { pub fn new(uuid: Uuid, mdb: Arc<RwLock<MachinesProvider>>) -> Self {
Self { mdb, uuid } Self { mdb, uuid }
} }
} }
@ -240,19 +248,19 @@ impl MachineManager {
impl api::machines::manage::Server for MachineManager { impl api::machines::manage::Server for MachineManager {
fn set_blocked(&mut self, fn set_blocked(&mut self,
params: api::machines::manage::SetBlockedParams, params: api::machines::manage::SetBlockedParams,
mut results: api::machines::manage::SetBlockedResults) results: api::machines::manage::SetBlockedResults)
-> Promise<(), Error> -> Promise<(), Error>
{ {
let mut db = self.mdb.lock_mut(); let uuid = self.uuid.clone();
if let Some(m) = db.get_mut(&self.uuid) { let mdb = self.mdb.clone();
let params = pry!(params.get()); let f = async move {
let params = params.get()?;
let blocked = params.get_blocked(); let blocked = params.get_blocked();
mdb.write().await.set_blocked(&uuid, blocked)?;
Ok(())
};
m.set_blocked(blocked); Promise::from_future(f)
Promise::ok(())
} else {
Promise::err(Error::failed("No such machine".to_string()))
}
} }
} }

View File

@ -12,7 +12,6 @@ mod api;
mod config; mod config;
mod error; mod error;
mod machine; mod machine;
mod session;
use signal_hook::iterator::Signals; use signal_hook::iterator::Signals;
@ -20,8 +19,6 @@ use clap::{App, Arg};
use api::api as api_capnp; use api::api as api_capnp;
use session::Session;
use futures::prelude::*; use futures::prelude::*;
use futures::executor::{LocalPool, ThreadPool}; use futures::executor::{LocalPool, ThreadPool};
use futures::compat::Stream01CompatExt; use futures::compat::Stream01CompatExt;