Make compile by deleting functionality that doesn't

This commit is contained in:
Nadja Reitzenstein 2022-11-07 11:58:38 +01:00
parent 06b8e19805
commit e2b9d2a306
9 changed files with 441 additions and 363 deletions

649
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -80,8 +80,8 @@ tracing-futures = { version = "0.2", features = ["futures-03"] }
# API
api = { path = "api", features = ["generated"] }
capnp = "0.14"
capnp-rpc = "0.14.1"
capnp = "0.15.0"
capnp-rpc = "0.15.0"
# API Authentication
desfire = "0.2.0-alpha3"

View File

@ -10,10 +10,10 @@ generated = []
gen_static = []
[dependencies]
capnp = "0.14.3"
capnpc = "0.14.4"
capnp = "0.15.0"
capnpc = "0.15.0"
[build-dependencies]
capnpc = "0.14.4"
capnpc = "0.15.0"
# Used in build.rs to iterate over all files in schema/
walkdir = "2.3.2"

View File

@ -98,7 +98,8 @@ enum State {
}
impl AuthenticationSystem for Authentication {
fn step(&mut self, params: StepParams, mut results: StepResults) -> Promise<(), Error> {
fn step(&mut self, params: StepParams, mut results: StepResults) -> Promise<(),
Error> {
let _guard = self.span.enter();
let _span = tracing::trace_span!(target: TARGET, "step",).entered();

View File

@ -28,6 +28,7 @@ mod permissionsystem;
mod session;
mod user;
mod user_system;
mod role;
pub struct APIServer {
executor: Executor<'static>,

16
bffhd/capnp/role.rs Normal file
View File

@ -0,0 +1,16 @@
use api::role_capnp::role;
use crate::session::SessionHandle;
pub struct Role {
session: SessionHandle,
id: String,
}
impl Role {
pub fn new(session: SessionHandle, id: String) -> Self {
Self { session, id }
}
}
impl role::Server for Role {
}

View File

@ -1,12 +1,14 @@
use capnp_rpc::CapabilityServerSet;
use crate::authorization::permissions::Permission;
use api::auth_capnp::response::successful::Builder;
use api::role_capnp;
use crate::capnp::machinesystem::Machines;
use crate::capnp::permissionsystem::Permissions;
use crate::capnp::role::Role;
use crate::capnp::user_system::Users;
use crate::session::SessionHandle;
#[derive(Debug, Clone)]
pub struct APISession;
impl APISession {

View File

@ -2,8 +2,10 @@ use crate::authorization::permissions::Permission;
use crate::session::SessionHandle;
use crate::users::{db, UserRef};
use api::user_capnp::user::{self, self_service, manage, admin};
use capnp::capability::Promise;
use capnp::capability::{Promise, FromClientHook};
use capnp_rpc::pry;
use api::role_capnp;
use crate::capnp::role::Role;
#[derive(Clone)]
pub struct User {
@ -21,28 +23,10 @@ impl User {
Self::new(session, user)
}
pub fn build(session: SessionHandle, builder: user::Builder) {
let this = Self::new_self(session);
let user = this.session.get_user();
Self::fill(&this.session, user, builder);
}
pub fn fill(session: &SessionHandle, user: db::User) -> Self {
builder.set_username(user.id.as_str());
// We have permissions on ourself
let is_me = &session.get_user_ref().id == &user.id;
let client = Self::new(session.clone(), UserRef::new(user.id));
if is_me || session.has_perm(Permission::new("bffh.users.info")) {
builder.set_info(capnp_rpc::new_client(client.clone()));
}
if is_me {
builder.set_manage(capnp_rpc::new_client(client.clone()));
}
if session.has_perm(Permission::new("bffh.users.admin")) {
builder.set_admin(capnp_rpc::new_client(client.clone()));
pub fn fill(session: SessionHandle, user: db::User) -> Self {
Self {
user: UserRef::new(user.id),
session,
}
}
}
@ -56,8 +40,9 @@ impl user::Server for User {
if let Some(user) = self.session.users.get_user(self.user.get_username()) {
let mut builder = result.get().init_roles(user.userdata.roles.len() as u32);
for (i, role) in user.userdata.roles.into_iter().enumerate() {
let mut b = builder.reborrow().get(i as u32);
b.set_name(role.as_str());
let role = Role::new(self.session.clone(), role);
let cap: role_capnp::role::Client = capnp_rpc::new_client(role);
builder.reborrow().set(i as u32, cap.into_client_hook());
}
}
Promise::ok(())
@ -65,56 +50,7 @@ impl user::Server for User {
}
impl manage::Server for User {
fn add_role(
&mut self,
param: manage::AddRoleParams,
_: manage::AddRoleResults,
) -> Promise<(), ::capnp::Error> {
let rolename = pry!(pry!(pry!(param.get()).get_role()).get_name());
if let Some(_role) = self.session.roles.get(rolename) {
let mut target = self
.session
.users
.get_user(self.user.get_username())
.unwrap();
// Only update if needed
if !target.userdata.roles.iter().any(|r| r.as_str() == rolename) {
target.userdata.roles.push(rolename.to_string());
self.session
.users
.put_user(self.user.get_username(), &target);
}
}
Promise::ok(())
}
fn remove_role(
&mut self,
param: manage::RemoveRoleParams,
_: manage::RemoveRoleResults,
) -> Promise<(), ::capnp::Error> {
let rolename = pry!(pry!(pry!(param.get()).get_role()).get_name());
if let Some(_role) = self.session.roles.get(rolename) {
let mut target = self
.session
.users
.get_user(self.user.get_username())
.unwrap();
// Only update if needed
if target.userdata.roles.iter().any(|r| r.as_str() == rolename) {
target.userdata.roles.retain(|r| r.as_str() != rolename);
self.session
.users
.put_user(self.user.get_username(), &target);
}
}
Promise::ok(())
}
}
impl admin::Server for User {
@ -123,7 +59,7 @@ impl admin::Server for User {
param: admin::SetpwParams,
_: admin::SetpwResults,
) -> Promise<(), ::capnp::Error> {
let new_pw = pry!(pry!(param.get()).get_new_pwd());
let new_pw = pry!(pry!(param.get()).get_new());
let uid = self.user.get_username();
if let Some(mut user) = self.session.users.get_user(uid) {
user.set_pw(new_pw.as_bytes());

View File

@ -1,7 +1,8 @@
use api::users_capnp::users;
use capnp::capability::Promise;
use capnp::capability::{Promise, FromClientHook};
use capnp_rpc::pry;
use tracing::Span;
use api::user_capnp;
use crate::capnp::user::User;
@ -40,7 +41,8 @@ impl users::Server for Users {
let mut builder = result.get().init_users(users.len() as u32);
for (i, (id, userdata)) in users.into_iter().enumerate() {
let user = db::User { id, userdata };
builder.reborrow().set(i as u32, User::fill(&self.session, user));
let cap: user_capnp::user::Client = capnp_rpc::new_client(User::fill(self.session.clone(), user));
builder.reborrow().set(i as u32, cap.into_client_hook());
}
tracing::trace!("method return");
@ -72,20 +74,20 @@ impl users::Server for Users {
if self.session.users.get_user(username).is_none() {
let user = db::User::new_with_plain_pw(username, password);
self.session.users.put_user(username, &user);
builder.set_user(capnp_rpc::new_client(User::fill(&self.session, user)));
builder.set_user(capnp_rpc::new_client(User::fill(self.session.clone(), user)));
} else {
let mut builder = builder.init_error();
builder.set_exists();
builder.set_exists(());
tracing::warn!("Failed to add user: Username taken");
}
} else {
if username.is_empty() {
let mut builder = builder.init_error();
builder.set_username_invalid();
builder.set_username_invalid(());
tracing::warn!("Failed to add user: Username empty");
} else if password.is_empty() {
let mut builder = builder.init_error();
builder.set_password_invalid();
builder.set_password_invalid(());
tracing::warn!("Failed to add user: Password empty");
}
}
@ -94,25 +96,4 @@ impl users::Server for Users {
Promise::ok(())
}
fn remove_user(
&mut self,
params: users::RemoveUserParams,
_: users::RemoveUserResults,
) -> Promise<(), ::capnp::Error> {
let _guard = self.span.enter();
let _span = tracing::trace_span!(target: TARGET, "removeUser",).entered();
let who: &str = pry!(pry!(pry!(params.get()).get_user()).get_username());
tracing::trace!(params.user = who, "method call");
if let Err(e) = self.session.users.del_user(who) {
tracing::warn!("Failed to delete user: {:?}", e);
} else {
tracing::info!("Deleted user {}", who);
}
tracing::trace!("method return");
Promise::ok(())
}
}