An atproto PDS written in Go
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}