1package server
2
3import (
4 "time"
5
6 "github.com/haileyok/cocoon/oauth"
7 "github.com/haileyok/cocoon/oauth/constants"
8 "github.com/haileyok/cocoon/oauth/provider"
9 "github.com/labstack/echo/v4"
10)
11
12func (s *Server) handleAccount(e echo.Context) error {
13 repo, sess, err := s.getSessionRepoOrErr(e)
14 if err != nil {
15 return e.Redirect(303, "/account/signin")
16 }
17
18 oldestPossibleSession := time.Now().Add(constants.ConfidentialClientSessionLifetime)
19
20 var tokens []provider.OauthToken
21 if err := s.db.Raw("SELECT * FROM oauth_tokens WHERE sub = ? AND created_at < ? ORDER BY created_at ASC", nil, repo.Repo.Did, oldestPossibleSession).Scan(&tokens).Error; err != nil {
22 s.logger.Error("couldnt fetch oauth sessions for account", "did", repo.Repo.Did, "error", err)
23 sess.AddFlash("Unable to fetch sessions. See server logs for more details.", "error")
24 sess.Save(e.Request(), e.Response())
25 return e.Render(200, "account.html", map[string]any{
26 "flashes": getFlashesFromSession(e, sess),
27 })
28 }
29
30 var filtered []provider.OauthToken
31 for _, t := range tokens {
32 ageRes := oauth.GetSessionAgeFromToken(t)
33 if ageRes.SessionExpired {
34 continue
35 }
36 filtered = append(filtered, t)
37 }
38
39 tokenInfo := []map[string]string{}
40 for _, t := range tokens {
41 tokenInfo = append(tokenInfo, map[string]string{
42 "ClientId": t.ClientId,
43 "CreatedAt": t.CreatedAt.Format("02 Jan 06 15:04 MST"),
44 "UpdatedAt": t.CreatedAt.Format("02 Jan 06 15:04 MST"),
45 "ExpiresAt": t.CreatedAt.Format("02 Jan 06 15:04 MST"),
46 "Token": t.Token,
47 "Ip": t.Ip,
48 })
49 }
50
51 return e.Render(200, "account.html", map[string]any{
52 "Repo": repo,
53 "Tokens": tokenInfo,
54 "flashes": getFlashesFromSession(e, sess),
55 })
56}