2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   GoToSocial 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-05 12:43:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								   Copyright  ( C )  2021 - 2023  GoToSocial  Authors  admin @ gotosocial . org 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   This  program  is  free  software :  you  can  redistribute  it  and / or  modify 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   it  under  the  terms  of  the  GNU  Affero  General  Public  License  as  published  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   the  Free  Software  Foundation ,  either  version  3  of  the  License ,  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   ( at  your  option )  any  later  version . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   This  program  is  distributed  in  the  hope  that  it  will  be  useful , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   but  WITHOUT  ANY  WARRANTY ;  without  even  the  implied  warranty  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE .   See  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   GNU  Affero  General  Public  License  for  more  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   You  should  have  received  a  copy  of  the  GNU  Affero  General  Public  License 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   along  with  this  program .   If  not ,  see  < http : //www.gnu.org/licenses/>. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								* /  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								package  user_test  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"context" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"testing" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"time" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/stretchr/testify/suite" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  EmailConfirmTestSuite  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									UserStandardTestSuite 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * EmailConfirmTestSuite )  TestSendConfirmEmail ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user  :=  suite . testUsers [ "local_account_1" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// set a bunch of stuff on the user as though zork hasn't been confirmed (perish the thought) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . UnconfirmedEmail  =  "some.email@example.org" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . Email  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmedAt  =  time . Time { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmationSentAt  =  time . Time { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmationToken  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  :=  suite . user . EmailSendConfirmation ( context . Background ( ) ,  user ,  "the_mighty_zork" ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . NoError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// zork should have an email now 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Len ( suite . sentEmails ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									email ,  ok  :=  suite . sentEmails [ "some.email@example.org" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . True ( ok ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// a token should be set on zork 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									token  :=  user . ConfirmationToken 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . NotEmpty ( token ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// email should contain the token 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-31 10:46:20 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									emailShould  :=  fmt . Sprintf ( "To: some.email@example.org\r\nSubject: GoToSocial Email Confirmation\r\n\r\nHello the_mighty_zork!\r\n\r\nYou are receiving this mail because you've requested an account on http://localhost:8080.\r\n\r\nWe just need to confirm that this is your email address. To confirm your email, paste the following in your browser's address bar:\r\n\r\nhttp://localhost:8080/confirm_email?token=%s\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of http://localhost:8080\r\n\r\n" ,  token ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . Equal ( emailShould ,  email ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// confirmationSentAt should be recent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . WithinDuration ( time . Now ( ) ,  user . ConfirmationSentAt ,  1 * time . Minute ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * EmailConfirmTestSuite )  TestConfirmEmail ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx  :=  context . Background ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user  :=  suite . testUsers [ "local_account_1" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// set a bunch of stuff on the user as though zork hasn't been confirmed yet, but has had an email sent 5 minutes ago 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updatingColumns  :=  [ ] string { "unconfirmed_email" ,  "email" ,  "confirmed_at" ,  "confirmation_sent_at" ,  "confirmation_token" } 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									user . UnconfirmedEmail  =  "some.email@example.org" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . Email  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmedAt  =  time . Time { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmationSentAt  =  time . Now ( ) . Add ( - 5  *  time . Minute ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmationToken  =  "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 13:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  :=  suite . db . UpdateByID ( ctx ,  user ,  user . ID ,  updatingColumns ... ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . NoError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// confirm with the token set above 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updatedUser ,  errWithCode  :=  suite . user . EmailConfirm ( ctx ,  "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6" ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . NoError ( errWithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// email should now be confirmed and token cleared 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Equal ( "some.email@example.org" ,  updatedUser . Email ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Empty ( updatedUser . UnconfirmedEmail ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Empty ( updatedUser . ConfirmationToken ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . WithinDuration ( updatedUser . ConfirmedAt ,  time . Now ( ) ,  1 * time . Minute ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . WithinDuration ( updatedUser . UpdatedAt ,  time . Now ( ) ,  1 * time . Minute ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * EmailConfirmTestSuite )  TestConfirmEmailOldToken ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx  :=  context . Background ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user  :=  suite . testUsers [ "local_account_1" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// set a bunch of stuff on the user as though zork hasn't been confirmed yet, but has had an email sent 8 days ago 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updatingColumns  :=  [ ] string { "unconfirmed_email" ,  "email" ,  "confirmed_at" ,  "confirmation_sent_at" ,  "confirmation_token" } 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									user . UnconfirmedEmail  =  "some.email@example.org" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . Email  =  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmedAt  =  time . Time { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmationSentAt  =  time . Now ( ) . Add ( - 192  *  time . Hour ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									user . ConfirmationToken  =  "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 13:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  :=  suite . db . UpdateByID ( ctx ,  user ,  user . ID ,  updatingColumns ... ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . NoError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// confirm with the token set above 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updatedUser ,  errWithCode  :=  suite . user . EmailConfirm ( ctx ,  "1d1aa44b-afa4-49c8-ac4b-eceb61715cc6" ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-31 15:46:23 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . Nil ( updatedUser ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . EqualError ( errWithCode ,  "ConfirmEmail: confirmation token expired" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestEmailConfirmTestSuite ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Run ( t ,  & EmailConfirmTestSuite { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}