Remove session details on signout
authorr <r@freesoftwareextremist.com>
Wed, 4 Mar 2020 15:59:59 +0000 (15:59 +0000)
committerr <r@freesoftwareextremist.com>
Wed, 4 Mar 2020 15:59:59 +0000 (15:59 +0000)
go.mod
model/session.go
repo/sessionRepo.go
service/auth.go
service/logging.go
service/service.go
service/transport.go
static/style.css
templates/nav.tmpl

diff --git a/go.mod b/go.mod
index 6c5c642377246333925af4fd797cf3c0d709e650..508d0bee44e7d3928935f7475bad5ecacb0836a1 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -4,3 +4,5 @@ require (
        github.com/gorilla/mux v1.7.3
        github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80
 )
+
+go 1.13
index c18225c1b72e7738345b37cf714e3ea3570b1f4a..5ff079b09dd8144b58086fa8adc7d652647703f6 100644 (file)
@@ -20,6 +20,7 @@ type Session struct {
 type SessionRepo interface {
        Add(session Session) (err error)
        Get(sessionID string) (session Session, err error)
+       Remove(sessionID string)
 }
 
 func (s Session) IsLoggedIn() bool {
index ce923b10d5b0704618a580bb2acb63f590076ce6..15e3d317e2f6a9de8d70c6248bb2ae74a3d098de 100644 (file)
@@ -40,3 +40,8 @@ func (repo *sessionRepo) Get(id string) (s model.Session, err error) {
 
        return
 }
+
+func (repo *sessionRepo) Remove(id string) {
+       repo.db.Remove(id)
+       return
+}
index 9e6f709d248b67059c7681ce293600736fe6f4d0..7fd238bae24229843f2c2c8db429f3290418c4da 100644 (file)
@@ -204,6 +204,19 @@ func (s *as) Signin(ctx context.Context, c *model.Client, sessionID string,
        return
 }
 
+func (s *as) Signout(ctx context.Context, c *model.Client) (err error) {
+       err = s.authenticateClient(ctx, c)
+       if err != nil {
+               return
+       }
+       err = checkCSRF(ctx, c)
+       if err != nil {
+               return
+       }
+       s.Service.Signout(ctx, c)
+       return
+}
+
 func (s *as) Post(ctx context.Context, c *model.Client, content string,
        replyToID string, format string, visibility string, isNSFW bool,
        files []*multipart.FileHeader) (id string, err error) {
index 795f329cc41dc87960498d5011e0d6d36cdb5996..295595931aef4f6e17f81a12184db8e103e38085 100644 (file)
@@ -162,6 +162,14 @@ func (s *ls) Signin(ctx context.Context, c *model.Client, sessionID string,
        return s.Service.Signin(ctx, c, sessionID, code)
 }
 
+func (s *ls) Signout(ctx context.Context, c *model.Client) (err error) {
+       defer func(begin time.Time) {
+               s.logger.Printf("method=%v, took=%v, err=%v\n",
+                       "Signout", time.Since(begin), err)
+       }(time.Now())
+       return s.Service.Signout(ctx, c)
+}
+
 func (s *ls) Post(ctx context.Context, c *model.Client, content string,
        replyToID string, format string, visibility string, isNSFW bool,
        files []*multipart.FileHeader) (id string, err error) {
index e81e0073bfc27c00f51f2e84db5f3c9e8add3bbc..b039849d1d26f7f76ad28ffd9ea5afed2f1f2dc1 100644 (file)
@@ -38,6 +38,7 @@ type Service interface {
        NewSession(ctx context.Context, instance string) (redirectUrl string, sessionID string, err error)
        Signin(ctx context.Context, c *model.Client, sessionID string,
                code string) (token string, userID string, err error)
+       Signout(ctx context.Context, c *model.Client) (err error)
        Post(ctx context.Context, c *model.Client, content string, replyToID string, format string,
                visibility string, isNSFW bool, files []*multipart.FileHeader) (id string, err error)
        Like(ctx context.Context, c *model.Client, id string) (count int64, err error)
@@ -722,6 +723,11 @@ func (svc *service) Signin(ctx context.Context, c *model.Client,
        return
 }
 
+func (svc *service) Signout(ctx context.Context, c *model.Client) (err error) {
+       svc.sessionRepo.Remove(c.Session.ID)
+       return
+}
+
 func (svc *service) Post(ctx context.Context, c *model.Client, content string,
        replyToID string, format string, visibility string, isNSFW bool,
        files []*multipart.FileHeader) (id string, err error) {
index 48e2ee26c418137a7974332209faecbb761effe7..6540333135211be253772f736d9bc3f863b5cc84 100644 (file)
@@ -646,12 +646,16 @@ func NewHandler(s Service, staticDir string) http.Handler {
        }
 
        signout := func(w http.ResponseWriter, req *http.Request) {
-               // TODO remove session from database
+               c := newClient(w)
+               ctx := newCtxWithSesionCSRF(req, req.FormValue("csrf_token"))
+
+               s.Signout(ctx, c)
                http.SetCookie(w, &http.Cookie{
                        Name:    "session_id",
                        Value:   "",
                        Expires: time.Now(),
                })
+
                w.Header().Add("Location", "/")
                w.WriteHeader(http.StatusFound)
        }
@@ -763,7 +767,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
        r.HandleFunc("/unmuteconv/{id}", unMuteConversation).Methods(http.MethodPost)
        r.HandleFunc("/delete/{id}", delete).Methods(http.MethodPost)
        r.HandleFunc("/notifications/read", readNotifications).Methods(http.MethodPost)
-       r.HandleFunc("/signout", signout).Methods(http.MethodGet)
+       r.HandleFunc("/signout", signout).Methods(http.MethodPost)
        r.HandleFunc("/fluoride/like/{id}", fLike).Methods(http.MethodPost)
        r.HandleFunc("/fluoride/unlike/{id}", fUnlike).Methods(http.MethodPost)
        r.HandleFunc("/fluoride/retweet/{id}", fRetweet).Methods(http.MethodPost)
index 83250afa3cc2561f8672708ee4c6833912df463b..26b8d466cf36fa0e57cc1f2740b9f8b29443efa9 100644 (file)
@@ -477,6 +477,10 @@ a:hover,
        margin: 12px 0;
 }
 
+.signout {
+       display: inline;
+}
+
 .dark {
        background-color: #222222;
        background-image: none;
index 8922ba7157de13f855bd48c3d05f1d072d711dd6..3386a7be1bc22618344f16745aa23532a9667c89 100644 (file)
                </div>
                <div>
                        <a class="nav-link" href="/settings" target="_top">settings</a>
-                       <a class="nav-link" href="/signout" target="_top">sign out</a>
+                       <form class="signout" action="/signout" method="post" target="_top">
+                               <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+                               <input type="submit" value="signout" class="btn-link nav-link">
+                       </form>
                </div>
        </div>
 </div>