- if user.(db.User).Status != db.Confirmed {
- return &Error{UserNotConfirmed, "user awaiting admin validation", fmt.Errorf("user '%v' not confirmed", user)}
+ return nil
+}
+
+func (q ConfirmEmailQuery) Run() (interface{}, *Error) {
+ var user *db.User
+
+ email, err := passwordreset.VerifyToken(q.In.Token, func(email string) ([]byte, error) {
+ var err error
+ user, err = db.GetUserByEmail(email)
+ if err != nil {
+ return nil, err
+ }
+
+ if user == nil {
+ return nil, fmt.Errorf("'%v' is not registered", email)
+ }
+
+ return []byte(strconv.FormatUint(uint64(user.Status), 10)), nil
+
+ }, PASSWORD_RESET_SECRET)
+
+ if err != nil && (err == passwordreset.ErrExpiredToken) {
+ return nil, &Error{BadRequest, "expired token", fmt.Errorf("expired token")}
+ } else if err != nil && (err == passwordreset.ErrMalformedToken || err == passwordreset.ErrWrongSignature) {
+ return nil, &Error{BadRequest, "wrong token", fmt.Errorf("wrong token")}
+ } else if err != nil {
+ return nil, NewInternalError(err)
+ }
+
+ if user == nil {
+ return nil, &Error{BadRequest, "bad request", fmt.Errorf("no user found for email '%v'", email)}
+ }
+
+ err = db.SetUserStatus(user, db.Confirmed)
+ if err != nil {
+ return nil, NewInternalError(err)