func updateInitPassword(userID int, password string) error { queryUser := models.User{UserID: userID} user, err := dao.GetUser(queryUser) if err != nil { return fmt.Errorf("Failed to get user, userID: %d %v", userID, err) } if user == nil { return fmt.Errorf("user id: %d does not exist", userID) } if user.Salt == "" { salt := utils.GenerateRandomString() user.Salt = salt user.Password = password err = dao.ChangeUserPassword(*user) if err != nil { return fmt.Errorf("Failed to update user encrypted password, userID: %d, err: %v", userID, err) } log.Infof("User id: %d updated its encypted password successfully.", userID) } else { log.Infof("User id: %d already has its encrypted password.", userID) } return nil }
// ChangeUserPassword ... func ChangeUserPassword(u models.User, oldPassword ...string) (err error) { if len(oldPassword) > 1 { return errors.New("Wrong numbers of params.") } o := GetOrmer() var r sql.Result salt := utils.GenerateRandomString() if len(oldPassword) == 0 { //In some cases, it may no need to check old password, just as Linux change password policies. r, err = o.Raw(`update user set password=?, salt=? where user_id=?`, utils.Encrypt(u.Password, salt), salt, u.UserID).Exec() } else { r, err = o.Raw(`update user set password=?, salt=? where user_id=? and password = ?`, utils.Encrypt(u.Password, salt), salt, u.UserID, utils.Encrypt(oldPassword[0], u.Salt)).Exec() } if err != nil { return err } c, err := r.RowsAffected() if err != nil { return err } if c == 0 { return errors.New("No record has been modified, change password failed.") } return nil }
func updateInitPassword(userID int, password string) error { queryUser := models.User{UserID: userID} user, err := dao.GetUser(queryUser) if err != nil { return fmt.Errorf("Failed to get user, userID: %d %v", userID, err) } if user == nil { return fmt.Errorf("User id: %d does not exist.", userID) } if user.Salt == "" { user.Salt = utils.GenerateRandomString() user.Password = password err = dao.ChangeUserPassword(*user) if err != nil { return fmt.Errorf("Failed to update user encrypted password, userID: %d, err: %v", userID, err) } } else { } return nil }
func TestResetUserPassword(t *testing.T) { uuid := utils.GenerateRandomString() err := UpdateUserResetUUID(models.User{ResetUUID: uuid, Email: currentUser.Email}) if err != nil { t.Errorf("Error occurred in UpdateUserResetUuid: %v", err) } err = ResetUserPassword(models.User{UserID: currentUser.UserID, Password: "******", ResetUUID: uuid, Salt: currentUser.Salt}) if err != nil { t.Errorf("Error occurred in ResetUserPassword: %v", err) } loginedUser, err := LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "******"}) if err != nil { t.Errorf("Error occurred in LoginByDb: %v", err) } if loginedUser.Username != username { t.Errorf("The username returned by Login does not match, expected: %s, acutal: %s", username, loginedUser.Username) } }
// Register is used for user to register, the password is encrypted before the record is inserted into database. func Register(user models.User) (int64, error) { o := GetOrmer() p, err := o.Raw("insert into user (username, password, realname, email, comment, salt, sysadmin_flag, creation_time, update_time) values (?, ?, ?, ?, ?, ?, ?, ?, ?)").Prepare() if err != nil { return 0, err } defer p.Close() salt := utils.GenerateRandomString() now := time.Now() r, err := p.Exec(user.Username, utils.Encrypt(user.Password, salt), user.Realname, user.Email, user.Comment, salt, user.HasAdminRole, now, now) if err != nil { return 0, err } userID, err := r.LastInsertId() if err != nil { return 0, err } return userID, nil }
// SendEmail verifies the Email address and contact SMTP server to send reset password Email. func (cc *CommonController) SendEmail() { email := cc.GetString("email") pass, _ := regexp.MatchString(`^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$`, email) if !pass { cc.CustomAbort(http.StatusBadRequest, "email_content_illegal") } else { queryUser := models.User{Email: email} exist, err := dao.UserExists(queryUser, "email") if err != nil { log.Errorf("Error occurred in UserExists: %v", err) cc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if !exist { cc.CustomAbort(http.StatusNotFound, "email_does_not_exist") } messageTemplate, err := template.ParseFiles("views/reset-password-mail.tpl") if err != nil { log.Errorf("Parse email template file failed: %v", err) cc.CustomAbort(http.StatusInternalServerError, err.Error()) } message := new(bytes.Buffer) harborURL := os.Getenv("HARBOR_URL") if harborURL == "" { harborURL = "localhost" } uuid := utils.GenerateRandomString() err = messageTemplate.Execute(message, messageDetail{ Hint: cc.Tr("reset_email_hint"), URL: harborURL, UUID: uuid, }) if err != nil { log.Errorf("Message template error: %v", err) cc.CustomAbort(http.StatusInternalServerError, "internal_error") } config, err := beego.AppConfig.GetSection("mail") if err != nil { log.Errorf("Can not load app.conf: %v", err) cc.CustomAbort(http.StatusInternalServerError, "internal_error") } mail := utils.Mail{ From: config["from"], To: []string{email}, Subject: cc.Tr("reset_email_subject"), Message: message.String()} err = mail.SendMail() if err != nil { log.Errorf("Send email failed: %v", err) cc.CustomAbort(http.StatusInternalServerError, "send_email_failed") } user := models.User{ResetUUID: uuid, Email: email} dao.UpdateUserResetUUID(user) } }