Browse Source
			 
			
			Merge pull request #1137  from BlackDex/smtp-multi-auth-mechanism 
 
 
			
				Allow multiple SMTP Auth meganisms. 
			
			
				 pull/1141/head 
			
			
		 
		
			
				
					
						 
						Daniel García 
					
					5 years ago  
					
						
							 committed by 
							
								 
								GitHub 
							
						 
					
				 
				
			 
		 
		
			
				
					 
					No known key found for this signature in database
					
						
							GPG Key ID:   4AEE18F83AFDEB23 
						
					
				
			
		
		
		
	
		
			
				 3 changed files  with 
25 additions  and 
12 deletions 
			 
			
		 
		
			
				
					
					
					  
					.env.template 
				 
			
				
					
					
					  
					src/config.rs 
				 
			
				
					
					
					  
					src/mail.rs 
				 
			
		 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
		
			
				
					
						
						
							
								 
							 
						
						
					 
					@ -210,6 +210,9 @@ 
				
			 
			
		
	
		
		
			
				
					 
					 
					# SMTP_EXPLICIT_TLS=true # N.B. This variable configures Implicit TLS. It's currently mislabelled (see bug #851) 
					 
					 
					# SMTP_EXPLICIT_TLS=true # N.B. This variable configures Implicit TLS. It's currently mislabelled (see bug #851) 
				
			 
			
		
	
		
		
			
				
					 
					 
					# SMTP_USERNAME=username 
					 
					 
					# SMTP_USERNAME=username 
				
			 
			
		
	
		
		
			
				
					 
					 
					# SMTP_PASSWORD=password 
					 
					 
					# SMTP_PASSWORD=password 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					## Defaults for SSL is "Plain" and "Login" and nothing for Non-SSL connections. 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					## Possible values: ["Plain", "Login", "Xoauth2"]. 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					## Multiple options need to be separated by a comma ','. 
				
			 
			
		
	
		
		
			
				
					 
					 
					# SMTP_AUTH_MECHANISM="Plain" 
					 
					 
					# SMTP_AUTH_MECHANISM="Plain" 
				
			 
			
		
	
		
		
			
				
					 
					 
					# SMTP_TIMEOUT=15 
					 
					 
					# SMTP_TIMEOUT=15 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
						
					 
					 
				
			 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
		
			
				
					
						
						
							
								 
							 
						
						
					 
					@ -400,7 +400,7 @@ make_config! { 
				
			 
			
		
	
		
		
			
				
					 
					 
					         smtp_username :          String ,   true ,     option ;  
					 
					 
					         smtp_username :          String ,   true ,     option ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					         /// Password
  
					 
					 
					         /// Password
  
				
			 
			
		
	
		
		
			
				
					 
					 
					         smtp_password :          Pass ,     true ,     option ;  
					 
					 
					         smtp_password :          Pass ,     true ,     option ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					         /// Json form auth mechanism |> Defaults for ssl is "Plain" and "Login" and nothing for non-ssl connections. Possible values: ["Plain", "Login", "Xoauth2"]
  
					 
					 
					         /// Json form auth mechanism |> Defaults for ssl is "Plain" and "Login" and nothing for non-ssl connections. Possible values: ["Plain", "Login", "Xoauth2"]. Multiple options need to be separated by a comma. 
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					         smtp_auth_mechanism :    String ,   true ,     option ;  
					 
					 
					         smtp_auth_mechanism :    String ,   true ,     option ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					         /// SMTP connection timeout |> Number of seconds when to stop trying to connect to the SMTP server
  
					 
					 
					         /// SMTP connection timeout |> Number of seconds when to stop trying to connect to the SMTP server
  
				
			 
			
		
	
		
		
			
				
					 
					 
					         smtp_timeout :           u64 ,      true ,     def ,       15 ;  
					 
					 
					         smtp_timeout :           u64 ,      true ,     def ,       15 ;  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
						
					 
					 
				
			 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
		
			
				
					
						
						
							
								 
							 
						
						
					 
					@ -49,12 +49,22 @@ fn mailer() -> SmtpTransport { 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					     let   smtp_client   =   match   CONFIG . smtp_auth_mechanism ( )   {  
					 
					 
					     let   smtp_client   =   match   CONFIG . smtp_auth_mechanism ( )   {  
				
			 
			
		
	
		
		
			
				
					 
					 
					         Some ( mechanism )   = >   {  
					 
					 
					         Some ( mechanism )   = >   {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					             let   correct_mechanism   =   format ! ( "\"{}\"" ,   crate ::util ::upcase_first ( mechanism . trim_matches ( '"' ) ) ) ;  
					 
					 
					             let   allowed_mechanisms   =   vec ! [ SmtpAuthMechanism ::Plain ,   SmtpAuthMechanism ::Login ,   SmtpAuthMechanism ::Xoauth2 ] ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					             let   mut   selected_mechanisms   =   vec ! [ ] ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					             for   wanted_mechanism   in   mechanism . split ( ',' )   {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                 for   m   in   & allowed_mechanisms   {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                     if   m . to_string ( ) . to_lowercase ( )   = =   wanted_mechanism . trim_matches ( | c |   c   = =   '"'   | |   c   = =   '\''   | |   c   = =   ' ' ) . to_lowercase ( )   {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                         selected_mechanisms . push ( m . clone ( ) ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                     }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                 }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					             } ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					             // TODO: Allow more than one mechanism
  
					 
					 
					             if   ! selected_mechanisms . is_empty ( )   {  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					             match   serde_json ::from_str ::< SmtpAuthMechanism > ( & correct_mechanism )   {  
					 
					 
					                 smtp_client . authentication ( selected_mechanisms )  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                 Ok ( auth_mechanism )   = >   smtp_client . authentication ( vec ! [ auth_mechanism ] ) ,  
					 
					 
					             }   else   {  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					                 _   = >   panic ! ( "Failure to parse mechanism. Is it proper Json? Eg. `\"Plain\"` not `Plain`" ) ,  
					 
					 
					                 // Only show a warning, and return without setting an actual authentication mechanism
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                 warn ! ( "No valid SMTP Auth mechanism found for '{}', using default values" ,   mechanism ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                 smtp_client  
				
			 
			
		
	
		
		
			
				
					 
					 
					             }  
					 
					 
					             }  
				
			 
			
		
	
		
		
			
				
					 
					 
					         }  
					 
					 
					         }  
				
			 
			
		
	
		
		
			
				
					 
					 
					         _   = >   smtp_client ,  
					 
					 
					         _   = >   smtp_client ,