forked from
willdot.net/cocoon
A fork of the Cocoon PDS but being made more distributed.
1package server
2
3import (
4 "errors"
5
6 "github.com/haileyok/cocoon/internal/helpers"
7 "github.com/labstack/echo/v4"
8)
9
10type AccountRevokeInput struct {
11 Token string `form:"token"`
12}
13
14func (s *Server) handleAccountRevoke(e echo.Context) error {
15 ctx := e.Request().Context()
16 logger := s.logger.With("name", "handleAcocuntRevoke")
17
18 var req AccountRevokeInput
19 if err := e.Bind(&req); err != nil {
20 logger.Error("could not bind account revoke request", "error", err)
21 return helpers.ServerError(e, nil)
22 }
23
24 repo, sess, err := s.getSessionRepoOrErr(e)
25 if err != nil {
26 if !errors.Is(err, ErrSessionUnauthenticated) {
27 return helpers.ServerError(e, nil)
28 }
29 return e.Redirect(303, "/account/signin")
30 }
31
32 if err := s.db.Exec(ctx, "DELETE FROM oauth_tokens WHERE sub = ? AND token = ?", nil, repo.Repo.Did, req.Token).Error; err != nil {
33 logger.Error("couldnt delete oauth session for account", "did", repo.Repo.Did, "token", req.Token, "error", err)
34 sess.AddFlash("Unable to revoke session. See server logs for more details.", "error")
35 sess.Save(e.Request(), e.Response())
36 return e.Redirect(303, "/account")
37 }
38
39 sess.AddFlash("Session successfully revoked!", "success")
40 sess.Save(e.Request(), e.Response())
41 return e.Redirect(303, "/account")
42}