fabaccess-bffh/bffhd/capnp/user_system.rs

118 lines
3.8 KiB
Rust
Raw Normal View History

2022-11-04 17:25:17 +01:00
use api::users_capnp::users;
use capnp::capability::Promise;
2022-03-21 00:01:50 +01:00
use capnp_rpc::pry;
2022-06-24 13:57:47 +02:00
use tracing::Span;
2022-04-26 23:21:43 +02:00
use crate::capnp::user::User;
2022-03-15 20:00:43 +01:00
2022-03-12 17:31:53 +01:00
use crate::session::SessionHandle;
2022-04-28 20:33:46 +02:00
use crate::users::{db, UserRef};
2022-04-26 23:21:43 +02:00
2022-06-24 13:57:47 +02:00
const TARGET: &str = "bffh::api::usersystem";
2022-03-15 19:14:04 +01:00
#[derive(Clone)]
pub struct Users {
2022-06-24 13:57:47 +02:00
span: Span,
2022-03-12 17:31:53 +01:00
session: SessionHandle,
}
impl Users {
2022-03-12 17:31:53 +01:00
pub fn new(session: SessionHandle) -> Self {
2022-06-24 13:57:47 +02:00
let span = tracing::info_span!(target: TARGET, "UserSystem",);
Self { span, session }
}
}
2022-11-04 17:25:17 +01:00
impl users::Server for Users {
fn list(
&mut self,
2022-11-04 17:25:17 +01:00
_: users::ListParams,
mut result: users::ListResults,
) -> Promise<(), ::capnp::Error> {
2022-06-24 13:57:47 +02:00
let _guard = self.span.enter();
let _span = tracing::trace_span!(target: TARGET, "getUserList",).entered();
tracing::trace!("method call");
2022-03-21 00:01:50 +01:00
let userdb = self.session.users.into_inner();
2022-05-05 15:50:44 +02:00
let users = pry!(userdb
.get_all()
2022-03-21 00:01:50 +01:00
.map_err(|e| capnp::Error::failed(format!("UserDB error: {:?}", e))));
2022-11-04 17:25:17 +01:00
let mut builder = result.get().init_users(users.len() as u32);
2022-07-24 16:39:33 +02:00
for (i, (id, userdata)) in users.into_iter().enumerate() {
let user = db::User { id, userdata };
2022-11-04 17:25:17 +01:00
builder.reborrow().set(i as u32, User::fill(&self.session, user));
2022-03-21 00:01:50 +01:00
}
2022-06-24 13:57:47 +02:00
tracing::trace!("method return");
2022-03-21 00:01:50 +01:00
Promise::ok(())
}
2022-06-24 13:57:47 +02:00
2022-11-04 17:25:17 +01:00
fn add_user(
&mut self,
2022-11-04 17:25:17 +01:00
params: users::AddUserParams,
mut result: users::AddUserResults,
) -> Promise<(), ::capnp::Error> {
2022-06-24 13:57:47 +02:00
let _guard = self.span.enter();
let _span = tracing::trace_span!(target: TARGET, "addUserFallible").entered();
let params = pry!(params.get());
let username = pry!(params.get_username());
let password = pry!(params.get_password());
// FIXME: saslprep passwords & usernames before storing them
2022-06-24 13:57:47 +02:00
tracing::trace!(
params.username = username,
params.password = "<redacted>",
"method call"
);
let mut builder = result.get();
if !username.is_empty() && !password.is_empty() {
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);
2022-11-04 17:25:17 +01:00
builder.set_user(capnp_rpc::new_client(User::fill(&self.session, user)));
} else {
2022-11-04 17:25:17 +01:00
let mut builder = builder.init_error();
builder.set_exists();
tracing::warn!("Failed to add user: Username taken");
}
} else {
if username.is_empty() {
2022-11-04 17:25:17 +01:00
let mut builder = builder.init_error();
builder.set_username_invalid();
tracing::warn!("Failed to add user: Username empty");
} else if password.is_empty() {
2022-11-04 17:25:17 +01:00
let mut builder = builder.init_error();
builder.set_password_invalid();
tracing::warn!("Failed to add user: Password empty");
}
}
2022-06-24 13:57:47 +02:00
tracing::trace!("method return");
Promise::ok(())
}
2022-06-24 13:57:47 +02:00
fn remove_user(
&mut self,
2022-11-04 17:25:17 +01:00
params: users::RemoveUserParams,
_: users::RemoveUserResults,
) -> Promise<(), ::capnp::Error> {
2022-06-24 13:57:47 +02:00
let _guard = self.span.enter();
let _span = tracing::trace_span!(target: TARGET, "removeUser",).entered();
2022-04-27 20:27:14 +02:00
let who: &str = pry!(pry!(pry!(params.get()).get_user()).get_username());
2022-06-24 13:57:47 +02:00
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);
}
2022-06-24 13:57:47 +02:00
tracing::trace!("method return");
Promise::ok(())
}
2022-11-04 17:25:17 +01:00
}