(w http.ResponseWriter, r *http.Request)
| 39 | ) |
| 40 | |
| 41 | func (s *server) ClientLogout(w http.ResponseWriter, r *http.Request) { |
| 42 | ctx := r.Context() |
| 43 | accessTokenID := r.URL.Query().Get("access_token_id") |
| 44 | redirectURI := s.config.UI.MountPath() |
| 45 | if accessTokenID == "" { |
| 46 | webhandlers.Error(w, r, errMissingAccessTokenIDParam.New()) |
| 47 | return |
| 48 | } |
| 49 | err := s.store.Transact(ctx, func(ctx context.Context, st store.Interface) error { |
| 50 | at, err := st.GetAccessToken(ctx, accessTokenID) |
| 51 | if err != nil && !errors.IsNotFound(err) { |
| 52 | return err |
| 53 | } |
| 54 | if at != nil { |
| 55 | client, err := st.GetClient(ctx, at.ClientIds, []string{"logout_redirect_uris"}) |
| 56 | if err != nil { |
| 57 | return err |
| 58 | } |
| 59 | if err = st.DeleteAccessToken(ctx, accessTokenID); err != nil { |
| 60 | return err |
| 61 | } |
| 62 | events.Publish(evtAccessTokenDeleted.NewWithIdentifiersAndData(ctx, at.UserIds, nil)) |
| 63 | err = st.DeleteSession(ctx, at.UserIds, at.UserSessionId) |
| 64 | if err != nil && !errors.IsNotFound(err) { |
| 65 | return err |
| 66 | } |
| 67 | events.Publish(EvtUserLogout.NewWithIdentifiersAndData(ctx, at.UserIds, nil)) |
| 68 | redirectParam := r.URL.Query().Get("post_logout_redirect_uri") |
| 69 | if redirectParam == "" { |
| 70 | if len(client.LogoutRedirectUris) != 0 { |
| 71 | redirectURI = client.LogoutRedirectUris[0] |
| 72 | } |
| 73 | } else { |
| 74 | for _, uri := range client.LogoutRedirectUris { |
| 75 | redirectURI, err = osin.ValidateUri(uri, redirectParam) |
| 76 | if err == nil { |
| 77 | break |
| 78 | } |
| 79 | } |
| 80 | if err != nil { |
| 81 | return errInvalidLogoutRedirectURI.WithCause(err) |
| 82 | } |
| 83 | } |
| 84 | } |
| 85 | var session *ttnpb.UserSession |
| 86 | r, session, err = s.session.Get(w, r) |
| 87 | if err != nil && !errors.IsUnauthenticated(err) && !errors.IsNotFound(err) { |
| 88 | return err |
| 89 | } |
| 90 | if session != nil { |
| 91 | events.Publish(evtUserSessionTerminated.NewWithIdentifiersAndData(ctx, session.GetUserIds(), nil)) |
| 92 | if session.GetSessionId() != at.GetUserSessionId() { |
| 93 | if err = st.DeleteSession(ctx, session.GetUserIds(), session.SessionId); err != nil { |
| 94 | return err |
| 95 | } |
| 96 | } |
| 97 | } |
| 98 | return nil |
nothing calls this directly
no test coverage detected