| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -4,7 +4,7 @@ use crate::db::models::*; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use crate::db::DbConn; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use crate::api::{EmptyResult, JsonResult, JsonUpcase, NumberOrString, PasswordData, UpdateType, WebSocketUsers}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use crate::auth::Headers; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use crate::auth::{Headers, decode_invite_jwt, InviteJWTClaims}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use crate::mail; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use crate::CONFIG; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -44,6 +44,8 @@ struct RegisterData { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    MasterPasswordHash: String, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    MasterPasswordHint: Option<String>, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Name: Option<String>, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Token: Option<String>, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    OrganizationUserId: Option<String>, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[derive(Deserialize, Debug)] | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -59,22 +61,37 @@ fn register(data: JsonUpcase<RegisterData>, conn: DbConn) -> EmptyResult { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let mut user = match User::find_by_mail(&data.Email, &conn) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Some(user) => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if CONFIG.mail.is_none() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if Invitation::take(&data.Email, &conn) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if Invitation::find_by_mail(&data.Email, &conn).is_some() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if CONFIG.mail.is_none() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    for mut user_org in UserOrganization::find_invited_by_user(&user.uuid, &conn).iter_mut() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        user_org.status = UserOrgStatus::Accepted as i32; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        if user_org.save(&conn).is_err() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            err!("Failed to accept user to organization") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if !Invitation::take(&data.Email, &conn) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        err!("Error accepting invitation") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    user | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else if CONFIG.signups_allowed { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    err!("Account with this email already exists") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    err!("Registration not allowed") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    let token = match &data.Token { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        Some(token) => token, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        None => err!("No valid invite token") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    let claims: InviteJWTClaims = match decode_invite_jwt(&token) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        Ok(claims) => claims, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        Err(msg) => err!("Invalid claim: {:#?}", msg), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if &claims.email == &data.Email { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        user | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        err!("Registration email does not match invite email") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else if CONFIG.signups_allowed { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    err!("Account with this email already exists") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                user | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                err!("Registration not allowed") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        None => { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |