(w http.ResponseWriter, r *http.Request, params *VerifyParams)
| 227 | } |
| 228 | |
| 229 | func (a *API) verifyPost(w http.ResponseWriter, r *http.Request, params *VerifyParams) error { |
| 230 | ctx := r.Context() |
| 231 | db := a.db.WithContext(ctx) |
| 232 | |
| 233 | var ( |
| 234 | user *models.User |
| 235 | grantParams models.GrantParams |
| 236 | token *AccessTokenResponse |
| 237 | ) |
| 238 | var isSingleConfirmationResponse = false |
| 239 | |
| 240 | grantParams.FillGrantParams(r) |
| 241 | |
| 242 | err := db.Transaction(func(tx *storage.Connection) error { |
| 243 | var terr error |
| 244 | aud := a.requestAud(ctx, r) |
| 245 | |
| 246 | if isUsingTokenHash(params) { |
| 247 | user, terr = a.verifyTokenHash(tx, params) |
| 248 | } else { |
| 249 | user, terr = a.verifyUserAndToken(tx, params, aud) |
| 250 | } |
| 251 | if terr != nil { |
| 252 | return terr |
| 253 | } |
| 254 | |
| 255 | switch params.Type { |
| 256 | case mail.SignupVerification, mail.InviteVerification: |
| 257 | user, terr = a.signupVerify(r, ctx, tx, user) |
| 258 | case mail.RecoveryVerification, mail.MagicLinkVerification: |
| 259 | user, terr = a.recoverVerify(r, tx, user) |
| 260 | case mail.EmailChangeVerification: |
| 261 | user, terr = a.emailChangeVerify(r, tx, params, user) |
| 262 | if user == nil && terr == nil { |
| 263 | isSingleConfirmationResponse = true |
| 264 | return nil |
| 265 | } |
| 266 | case smsVerification, phoneChangeVerification: |
| 267 | user, terr = a.smsVerify(r, tx, user, params) |
| 268 | default: |
| 269 | return apierrors.NewBadRequestError(apierrors.ErrorCodeValidationFailed, "Unsupported verification type") |
| 270 | } |
| 271 | |
| 272 | if terr != nil { |
| 273 | return terr |
| 274 | } |
| 275 | |
| 276 | if terr := user.UpdateAppMetaDataProviders(tx); terr != nil { |
| 277 | return terr |
| 278 | } |
| 279 | |
| 280 | // Reload user model from db. |
| 281 | // This is important for refreshing the data in any generated columns like IsAnonymous. |
| 282 | if terr := tx.Reload(user); terr != nil { |
| 283 | return terr |
| 284 | } |
| 285 | token, terr = a.issueRefreshToken(r, w.Header(), tx, user, models.OTP, grantParams) |
| 286 | if terr != nil { |
no test coverage detected