Browse Source

to_be_squashed, clippy and fmt changes

pull/2907/head
Daniele Andrei 3 years ago
parent
commit
2a0a9ebf10
  1. 2
      src/api/core/mod.rs
  2. 72
      src/api/core/public.rs
  3. 4
      src/api/identity.rs

2
src/api/core/mod.rs

@ -3,9 +3,9 @@ mod ciphers;
mod emergency_access; mod emergency_access;
mod folders; mod folders;
mod organizations; mod organizations;
mod public;
mod sends; mod sends;
pub mod two_factor; pub mod two_factor;
mod public;
pub use ciphers::purge_trashed_ciphers; pub use ciphers::purge_trashed_ciphers;
pub use ciphers::{CipherSyncData, CipherSyncType}; pub use ciphers::{CipherSyncData, CipherSyncType};

72
src/api/core/public.rs

@ -1,38 +1,33 @@
use chrono::Utc;
use rocket::{ use rocket::{
Route,
Request,
request::{self, FromRequest, Outcome}, request::{self, FromRequest, Outcome},
Request, Route,
}; };
use chrono::Utc;
use crate::{ use crate::{
api::{EmptyResult, JsonUpcase},
auth, auth,
db::{models::*, DbConn}, db::{models::*, DbConn},
api::{JsonUpcase, EmptyResult}, mail, CONFIG,
mail,
CONFIG
}; };
pub fn routes() -> Vec<Route> { pub fn routes() -> Vec<Route> {
routes![ routes![ldap_import]
ldap_import,
]
} }
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
struct OrgImportGroupData { struct OrgImportGroupData {
Name: String, // "GroupName" Name: String,
ExternalId: String, // "cn=GroupName,ou=Groups,dc=example,dc=com" ExternalId: String,
MemberExternalIds: Vec<String>, // ["uid=user,ou=People,dc=example,dc=com"] MemberExternalIds: Vec<String>,
} }
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
struct OrgImportUserData { struct OrgImportUserData {
Email: String, // "user@maildomain.net" Email: String,
ExternalId: String, // "uid=user,ou=People,dc=example,dc=com" ExternalId: String,
Deleted: bool, Deleted: bool,
} }
@ -49,29 +44,33 @@ struct OrgImportData {
#[post("/public/organization/import", data = "<data>")] #[post("/public/organization/import", data = "<data>")]
async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut conn: DbConn) -> EmptyResult { async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut conn: DbConn) -> EmptyResult {
let _ = &conn; let _ = &conn;
let org_id = token.0 ; let org_id = token.0;
let data = data.into_inner().data; let data = data.into_inner().data;
for user_data in &data.Members { for user_data in &data.Members {
if user_data.Deleted { if user_data.Deleted {
// If user is marked for deletion and it exists, revoke it // If user is marked for deletion and it exists, revoke it
if let Some(mut user_org) = UserOrganization::find_by_email_and_org(&user_data.Email, &org_id, &mut conn).await if let Some(mut user_org) =
UserOrganization::find_by_email_and_org(&user_data.Email, &org_id, &mut conn).await
{ {
user_org.revoke(); user_org.revoke();
user_org.save(&mut conn).await?; user_org.save(&mut conn).await?;
} }
// If user is part of the organization, restore it // If user is part of the organization, restore it
} else if let Some(mut user_org) = UserOrganization::find_by_email_and_org(&user_data.Email, &org_id, &mut conn).await { } else if let Some(mut user_org) =
if user_org.status < UserOrgStatus::Revoked as i32 UserOrganization::find_by_email_and_org(&user_data.Email, &org_id, &mut conn).await
{ {
if user_org.status < UserOrgStatus::Revoked as i32 {
user_org.restore(); user_org.restore();
user_org.save(&mut conn).await?; user_org.save(&mut conn).await?;
} }
}else{ // If user is not part of the organization } else {
// If user is not part of the organization
let user = match User::find_by_mail(&user_data.Email, &mut conn).await { let user = match User::find_by_mail(&user_data.Email, &mut conn).await {
Some(user) => user, // exists in vaultwarden Some(user) => user, // exists in vaultwarden
None => { // doesn't exist in vaultwarden None => {
// doesn't exist in vaultwarden
let mut new_user = User::new(user_data.Email.clone()); let mut new_user = User::new(user_data.Email.clone());
new_user.set_external_id(Some(user_data.ExternalId.clone())); new_user.set_external_id(Some(user_data.ExternalId.clone()));
new_user.save(&mut conn).await?; new_user.save(&mut conn).await?;
@ -81,7 +80,7 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
invitation.save(&mut conn).await?; invitation.save(&mut conn).await?;
} }
new_user new_user
}, }
}; };
let user_org_status = if CONFIG.mail_enabled() { let user_org_status = if CONFIG.mail_enabled() {
UserOrgStatus::Invited as i32 UserOrgStatus::Invited as i32
@ -109,26 +108,28 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
Some(new_org_user.uuid), Some(new_org_user.uuid),
&org_name, &org_name,
Some(org_email), Some(org_email),
).await?; )
.await?;
} }
} }
} }
for group_data in &data.Groups { for group_data in &data.Groups {
let group_uuid = match Group::find_by_external_id(&group_data.ExternalId, &mut conn).await { let group_uuid = match Group::find_by_external_id(&group_data.ExternalId, &mut conn).await {
Some(group) => group, Some(group) => group,
None => { None => {
let mut group = Group::new( org_id.clone(), group_data.Name.clone(), false, Some(group_data.ExternalId.clone())); let mut group =
Group::new(org_id.clone(), group_data.Name.clone(), false, Some(group_data.ExternalId.clone()));
group.save(&mut conn).await?; group.save(&mut conn).await?;
group group
} }
}.uuid; }
.uuid;
GroupUser::delete_all_by_group(&group_uuid, &mut conn).await?; GroupUser::delete_all_by_group(&group_uuid, &mut conn).await?;
for ext_id in &group_data.MemberExternalIds { for ext_id in &group_data.MemberExternalIds {
if let Some(user) = User::find_by_external_id(&ext_id, &mut conn).await { if let Some(user) = User::find_by_external_id(ext_id, &mut conn).await {
if let Some(user_org) = UserOrganization::find_by_user_and_org(&user.uuid, &org_id, &mut conn).await { if let Some(user_org) = UserOrganization::find_by_user_and_org(&user.uuid, &org_id, &mut conn).await {
let mut group_user = GroupUser::new(group_uuid.clone(), user_org.uuid.clone()); let mut group_user = GroupUser::new(group_uuid.clone(), user_org.uuid.clone());
group_user.save(&mut conn).await?; group_user.save(&mut conn).await?;
@ -140,13 +141,20 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
// If this flag is enabled, any user that isn't provided in the Users list will be removed (by default they will be kept unless they have Deleted == true) // If this flag is enabled, any user that isn't provided in the Users list will be removed (by default they will be kept unless they have Deleted == true)
if data.OverwriteExisting { if data.OverwriteExisting {
for user_org in UserOrganization::find_by_org(&org_id, &mut conn).await { for user_org in UserOrganization::find_by_org(&org_id, &mut conn).await {
if let Some(user_external_id) = User::find_by_uuid(&user_org.user_uuid, &mut conn).await.map(|u| u.external_id) { if let Some(user_external_id) =
if user_external_id.is_some() && !data.Members.iter().any(|u| u.ExternalId == *user_external_id.as_ref().unwrap()) { User::find_by_uuid(&user_org.user_uuid, &mut conn).await.map(|u| u.external_id)
{
if user_external_id.is_some()
&& !data.Members.iter().any(|u| u.ExternalId == *user_external_id.as_ref().unwrap())
{
if user_org.atype == UserOrgType::Owner && user_org.status == UserOrgStatus::Confirmed as i32 { if user_org.atype == UserOrgType::Owner && user_org.status == UserOrgStatus::Confirmed as i32 {
// Removing owner, check that there is at least one other confirmed owner // Removing owner, check that there is at least one other confirmed owner
if UserOrganization::count_confirmed_by_org_and_type(&org_id, UserOrgType::Owner, &mut conn).await <= 1 { if UserOrganization::count_confirmed_by_org_and_type(&org_id, UserOrgType::Owner, &mut conn)
.await
<= 1
{
warn!("Can't delete the last owner"); warn!("Can't delete the last owner");
continue continue;
} }
} }
user_org.delete(&mut conn).await?; user_org.delete(&mut conn).await?;
@ -159,7 +167,7 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
} }
#[derive(Debug)] #[derive(Debug)]
pub struct PublicToken (String); pub struct PublicToken(String);
#[rocket::async_trait] #[rocket::async_trait]
impl<'r> FromRequest<'r> for PublicToken { impl<'r> FromRequest<'r> for PublicToken {

4
src/api/identity.rs

@ -13,7 +13,7 @@ use crate::{
core::two_factor::{duo, email, email::EmailTokenData, yubikey}, core::two_factor::{duo, email, email::EmailTokenData, yubikey},
ApiResult, EmptyResult, JsonResult, JsonUpcase, ApiResult, EmptyResult, JsonResult, JsonUpcase,
}, },
auth::{generate_organization_api_key_login_claims, ClientIp}, auth::{self, ClientIp},
db::{models::*, DbConn}, db::{models::*, DbConn},
error::MapResult, error::MapResult,
mail, util, CONFIG, mail, util, CONFIG,
@ -279,7 +279,7 @@ async fn _organization_api_key_login(data: ConnectData, conn: DbConn, ip: &Clien
err!("Incorrect client_secret", format!("IP: {}. Organization: {}.", ip.ip, org_api_key.org_uuid)) err!("Incorrect client_secret", format!("IP: {}. Organization: {}.", ip.ip, org_api_key.org_uuid))
} }
let claim = generate_organization_api_key_login_claims(org_api_key.uuid, org_api_key.org_uuid); let claim = auth::generate_organization_api_key_login_claims(org_api_key.uuid, org_api_key.org_uuid);
let access_token = crate::auth::encode_jwt(&claim); let access_token = crate::auth::encode_jwt(&claim);
//dbg!(&access_token); //dbg!(&access_token);

Loading…
Cancel
Save