...
1 package server
2
3 import (
4 "context"
5 "fmt"
6 "net/http"
7
8 "edge-infra.dev/pkg/lib/fog"
9 "edge-infra.dev/pkg/sds/emergencyaccess/apierror"
10 errorhandler "edge-infra.dev/pkg/sds/emergencyaccess/apierror/handler"
11 "edge-infra.dev/pkg/sds/emergencyaccess/types"
12
13 "github.com/gin-gonic/gin"
14 )
15
16 func (server *GatewayServer) EndSession(c *gin.Context) {
17 log := fog.FromContext(c)
18
19 var payload types.EndSessionPayload
20 if err := c.ShouldBindJSON(&payload); err != nil {
21 errorhandler.ErrorHandler(c, apierror.E(apierror.ErrPayloadStructure, err))
22 return
23 }
24
25 if err := payload.Validate(); err != nil {
26 errorhandler.ErrorHandler(c, apierror.E(apierror.ErrPayloadProperties, err))
27 return
28 }
29 log = log.WithValues("sessionID", payload.SessionID)
30 c.Request = c.Request.Clone(fog.IntoContext(c.Request.Context(), log))
31
32
33 if err := server.authorizeUser(c); err != nil {
34 errorhandler.ErrorHandler(c, apierror.E(
35 apierror.ErrEndSessionFailure,
36 err,
37 ))
38 return
39 }
40
41 user, ok := types.UserFromContext(c)
42 if !ok {
43 errorhandler.ErrorHandler(c, apierror.E(apierror.ErrEndSessionFailure, fmt.Errorf("error retrieving user details")))
44 return
45 }
46
47 log.Info("Ending Session",
48 "userID", user.Username,
49 )
50
51 err := server.rcli.EndSession(c, payload.SessionID)
52 if err != nil {
53 errorhandler.ErrorHandler(c, apierror.E(apierror.ErrEndSessionFailure, err))
54 return
55 }
56 c.Status(http.StatusOK)
57 }
58
59 func (server *GatewayServer) authorizeUser(ctx context.Context) error {
60 log := fog.FromContext(ctx)
61
62 url := server.authorizeUserURL.String()
63 req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, nil)
64 if err != nil {
65 return fmt.Errorf("creating http request: %w", err)
66 }
67
68 log.Info("Invoking auth service", "url", url)
69 resp, err := server.client.Do(req)
70 if err != nil {
71 return fmt.Errorf("request error: %w", err)
72 }
73 defer resp.Body.Close()
74
75 log.Info("Auth service response received", "url", url)
76 if resp.StatusCode != http.StatusOK {
77 return apierror.E(
78 apierror.ErrEndSessionFailure,
79 errorhandler.ParseJSONAPIError(resp.Body),
80 fmt.Errorf("non-ok status from auth service authorizeUser(%d)", resp.StatusCode),
81 )
82 }
83
84 return nil
85 }
86
View as plain text