@@ -311,17 +311,6 @@ func (u *User) OrganisationLink() string {
311311 return setting .AppSubURL + "/org/" + url .PathEscape (u .Name )
312312}
313313
314- // GenerateEmailActivateCode generates an activate code based on user information and given e-mail.
315- func (u * User ) GenerateEmailActivateCode (email string ) string {
316- code := base .CreateTimeLimitCode (
317- fmt .Sprintf ("%d%s%s%s%s" , u .ID , email , u .LowerName , u .Passwd , u .Rands ),
318- setting .Service .ActiveCodeLives , time .Now (), nil )
319-
320- // Add tail hex username
321- code += hex .EncodeToString ([]byte (u .LowerName ))
322- return code
323- }
324-
325314// GetUserFollowers returns range of user's followers.
326315func GetUserFollowers (ctx context.Context , u , viewer * User , listOptions db.ListOptions ) ([]* User , int64 , error ) {
327316 sess := db .GetEngine (ctx ).
@@ -864,12 +853,35 @@ func GetVerifyUser(ctx context.Context, code string) (user *User) {
864853 return nil
865854}
866855
867- // VerifyUserActiveCode verifies active code when active account
868- func VerifyUserActiveCode (ctx context.Context , code string ) (user * User ) {
856+ type TimeLimitCodePurpose string
857+
858+ const TimeLimitCodeActivateAccount TimeLimitCodePurpose = "activate_account"
859+ const TimeLimitCodeActivateEmail TimeLimitCodePurpose = "activate_email"
860+ const TimeLimitCodeResetPassword TimeLimitCodePurpose = "reset_password"
861+
862+ type TimeLimitCodeOptions struct {
863+ Purpose TimeLimitCodePurpose
864+ NewEmail string
865+ }
866+
867+ func makeTimeLimitCodeHashData (opts * TimeLimitCodeOptions , u * User ) string {
868+ return fmt .Sprintf ("%s|%d|%s|%s|%s|%s" , opts .Purpose , u .ID , strings .ToLower (util .IfZero (opts .NewEmail , u .Email )), u .LowerName , u .Passwd , u .Rands )
869+ }
870+
871+ // GenerateUserTimeLimitCode generates an activate code based on user information and given e-mail.
872+ func GenerateUserTimeLimitCode (opts * TimeLimitCodeOptions , u * User ) string {
873+ data := makeTimeLimitCodeHashData (opts , u )
874+ code := base .CreateTimeLimitCode (data , setting .Service .ActiveCodeLives , time .Now (), nil )
875+ code += hex .EncodeToString ([]byte (u .LowerName )) // Add tail hex username
876+ return code
877+ }
878+
879+ // VerifyUserTimeLimitCode verifies active code when active account
880+ func VerifyUserTimeLimitCode (ctx context.Context , opts * TimeLimitCodeOptions , code string ) (user * User ) {
869881 if user = GetVerifyUser (ctx , code ); user != nil {
870882 // time limit code
871883 prefix := code [:base .TimeLimitCodeLength ]
872- data := fmt . Sprintf ( "%d%s%s%s%s" , user . ID , user . Email , user . LowerName , user . Passwd , user . Rands )
884+ data := makeTimeLimitCodeHashData ( opts , user )
873885 if base .VerifyTimeLimitCode (time .Now (), data , setting .Service .ActiveCodeLives , prefix ) {
874886 return user
875887 }
0 commit comments