...
1 package device
2
3 import (
4 "errors"
5 "fmt"
6 "net/http"
7
8 "github.com/gin-gonic/gin"
9
10 "edge-infra.dev/pkg/edge/iam/apperror"
11 "edge-infra.dev/pkg/edge/iam/log"
12 "edge-infra.dev/pkg/edge/iam/util"
13 )
14
15
16
17 type selfServiceForm struct {
18 OldPassword string `json:"old_password" binding:"required"`
19 NewPassword string `json:"new_password" binding:"required"`
20 Action string `json:"action"`
21 }
22
23 func (dm *AuthMethod) selfService(c *gin.Context) error {
24 logger := log.Get(c.Request.Context()).WithName("device-selfservice")
25
26 var form selfServiceForm
27 if err := c.BindJSON(&form); err != nil {
28 dm.metrics.IncSignUpRequestsTotal(signUpPin, util.Failed)
29 return apperror.NewAbortError(
30 fmt.Errorf("failed to self service on bad request: %w", err),
31 http.StatusBadRequest)
32 }
33 session, _ := dm.sessionStore.Get(c.Request, "oauth2")
34 token, ok := session.Values["device_token"]
35 if !ok {
36 err := errors.New("no token_set found in session. need one to self serve")
37 return apperror.NewAbortError(err, http.StatusForbidden)
38 }
39 if form.Action == "cancel" {
40 delete(session.Values, "device_token")
41 if err := session.Save(c.Request, c.Writer); err != nil {
42 return apperror.NewAbortError(
43 fmt.Errorf("failed to save cookie session: %w", err),
44 http.StatusInternalServerError)
45 }
46
47 return nil
48 }
49
50 validationResult, err := dm.service.SelfService(token.(string), form.OldPassword, form.NewPassword)
51 if err != nil {
52
53 if err == ErrSelfServiceDenied {
54 return apperror.NewStatusError(err, http.StatusUnprocessableEntity)
55 }
56 if err == ErrSelfServiceBadRequest {
57
58 logger.Info("self service failed", "bad request", validationResult)
59
60 c.JSON(http.StatusUnprocessableEntity, validationResult)
61 return nil
62 }
63 return apperror.NewAbortError(
64 fmt.Errorf("failed to self service device password: %w", err),
65 http.StatusInternalServerError)
66 }
67
68 delete(session.Values, "device_token")
69 if err := session.Save(c.Request, c.Writer); err != nil {
70 return apperror.NewAbortError(
71 fmt.Errorf("failed to save cookie session: %w", err),
72 http.StatusInternalServerError)
73 }
74 dm.metrics.IncSignUpRequestsTotal(signUpPin, util.Succeeded)
75 return nil
76 }
77
View as plain text