diff --git a/go.mod b/go.mod index 40aef54..ff547fb 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module git.giftfish.de/ston1th/gowiki require ( git.giftfish.de/ston1th/godrop/v2 v2.1.0 - git.giftfish.de/ston1th/jwt/v3 v3.1.0 + git.giftfish.de/ston1th/jwt/v3 v3.2.0 github.com/RoaringBitmap/roaring v0.4.16 // indirect github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1 // indirect github.com/blevesearch/bleve v0.7.0 diff --git a/go.sum b/go.sum index 51cae3d..3297e59 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ git.giftfish.de/ston1th/godrop/v2 v2.1.0 h1:vR4aWVeMGJ+tHQH0p44esZrSl5dYJzuCmZqhKWP/vwI= git.giftfish.de/ston1th/godrop/v2 v2.1.0/go.mod h1:z8KA3HP/vB04wddLXZfYVKURYDxBGau9hlHtV61x9mM= -git.giftfish.de/ston1th/jwt/v3 v3.1.0 h1:SaSpVyl98iqnsRIh9tA8/XJpU6nCYIGa4L85rLvQWC0= -git.giftfish.de/ston1th/jwt/v3 v3.1.0/go.mod h1:jDALrW7OKeIaqYuMxs3GWyPRnQZmk/R+Lu9p/Em3Ziw= +git.giftfish.de/ston1th/jwt/v3 v3.2.0 h1:V6Lh7OjXn4D3HPd/LoDf7w5N7cyiSXEPAQCIfSVZ05c= +git.giftfish.de/ston1th/jwt/v3 v3.2.0/go.mod h1:jDALrW7OKeIaqYuMxs3GWyPRnQZmk/R+Lu9p/Em3Ziw= github.com/RoaringBitmap/roaring v0.4.16 h1:NholfewybRLOwACgfqfzn/N5xa6keKNs4fP00t0cwLo= github.com/RoaringBitmap/roaring v0.4.16/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w= github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1 h1:G/NOANWMQev0CftoyxQwtRakdyNNNMB3qxkt/tj1HGs= diff --git a/pkg/server/context.go b/pkg/server/context.go index f711b9e..deb264d 100644 --- a/pkg/server/context.go +++ b/pkg/server/context.go @@ -14,14 +14,15 @@ import ( ) const ( - userClaim = "user" - adminClaim = "admin" - createdClaim = "created" - sharedClaim = "shared" - sectionClaim = "section" - titleClaim = "title" - totpClaim = "totp" - rememberClaim = "remember" + userClaim = "user" + adminClaim = "admin" + userCreatedClaim = "user_created" + pageCreatedClaim = "page_created" + sharedClaim = "shared" + sectionClaim = "section" + titleClaim = "title" + totpClaim = "totp" + rememberClaim = "remember" ) func newContext(w http.ResponseWriter, r *http.Request, s *HTTPServer) (ctx *Context) { @@ -60,7 +61,7 @@ func newContext(w http.ResponseWriter, r *http.Request, s *HTTPServer) (ctx *Con return nil } - if !s.DB.LockedOut(t.Claims.GetString(userClaim), t.Claims.GetString(createdClaim)) { + if !s.DB.LockedOut(t.Claims.GetString(userClaim), t.Claims.GetString(userCreatedClaim)) { ctx.Token = *t return } @@ -239,7 +240,7 @@ func (c *Context) Login(u core.User, remember string) { if remember != "" { d = day * 7 } - c.SetCookie(jwt.Claims{userClaim: u.Username, createdClaim: u.Created, adminClaim: u.Admin}, d) + c.SetCookie(jwt.Claims{userClaim: u.Username, userCreatedClaim: u.Created, adminClaim: u.Admin}, d) } func (c *Context) SetCookie(claims jwt.Claims, d time.Duration) { diff --git a/pkg/server/handler.go b/pkg/server/handler.go index 68d6bc4..f4718f5 100644 --- a/pkg/server/handler.go +++ b/pkg/server/handler.go @@ -251,13 +251,15 @@ func pageNewHandler(ctx *Context) { } func pageHandler(ctx *Context) { + var pageCreated string ctx.Data = webData{ Admin: ctx.Admin(), } section := ctx.Var("section") title := ctx.Var("title") user := ctx.User() - if key := ctx.Var("key"); key != "" { + key := ctx.Var("key") + if key != "" { t, err := jwt.DecodeToken(key) if err != nil { log.Println("share: DecodeToken:", err) @@ -270,7 +272,7 @@ func pageHandler(ctx *Context) { return } user = t.Claims.GetString(sharedClaim) - if ctx.Srv.DB.LockedOut(user, t.Claims.GetString(createdClaim)) { + if ctx.Srv.DB.LockedOut(user, t.Claims.GetString(userCreatedClaim)) { if err = ctx.Srv.JWT.Invalidate(t); err != nil { log.Println("share: Invalidate:", err) } @@ -279,6 +281,7 @@ func pageHandler(ctx *Context) { } section = t.Claims.GetString(sectionClaim) title = t.Claims.GetString(titleClaim) + pageCreated = t.Claims.GetString(pageCreatedClaim) ctx.Data.Key = key if ctx.T == nil { ctx.Template("pageViewHandler") @@ -294,6 +297,10 @@ func pageHandler(ctx *Context) { ctx.NotFound() return } + if key != "" && page.Created != pageCreated { + ctx.NotFound() + return + } ctx.Data.Data = page ctx.Data.Title = page.Title ctx.Data.BodyTitle = page.Title @@ -339,11 +346,12 @@ func pageShareHandler(ctx *Context) { return } t := jwt.NewToken(map[string]interface{}{ - sharedClaim: user, - createdClaim: ctx.Token.Claims.GetString(createdClaim), - sectionClaim: section, - titleClaim: title, - jwt.ExpClaim: jwt.NewExp(d), + sharedClaim: user, + userCreatedClaim: ctx.Token.Claims.GetString(userCreatedClaim), + pageCreatedClaim: page.Created, + sectionClaim: section, + titleClaim: title, + jwt.ExpClaim: jwt.NewExp(d), }, nil) if err = ctx.Srv.JWT.Sign(t); err != nil { diff --git a/pkg/server/templates.go b/pkg/server/templates.go index 417cd81..972c6cd 100644 --- a/pkg/server/templates.go +++ b/pkg/server/templates.go @@ -396,7 +396,7 @@ const (