diff --git a/admin.go b/admin.go index 11af4f8..4d8d1d6 100644 --- a/admin.go +++ b/admin.go @@ -328,6 +328,9 @@ func handleAdminToggleUserStatus(app *App, u *User, w http.ResponseWriter, r *ht err = app.db.SetUserStatus(user.ID, UserActive) } else { err = app.db.SetUserStatus(user.ID, UserSilenced) + + // reset the cache to removed silence user posts + updateTimelineCache(app.timeline, true) } if err != nil { log.Error("toggle user silenced: %v", err) diff --git a/posts.go b/posts.go index e07bb80..107f0c1 100644 --- a/posts.go +++ b/posts.go @@ -1430,13 +1430,17 @@ Are you sure it was ever here?`, return err } } - p.IsOwner = owner != nil && p.OwnerID.Valid && owner.ID == p.OwnerID.Int64 + + // Check if the authenticated user is the post owner + p.IsOwner = u != nil && u.ID == p.OwnerID.Int64 p.Collection = coll p.IsTopLevel = app.cfg.App.SingleUser - if !p.IsOwner && silenced { + // Only allow a post owner or admin to view a post for silenced collections + if silenced && !p.IsOwner && (u == nil || !u.IsAdmin()) { return ErrPostNotFound } + // Check if post has been unpublished if p.Content == "" && p.Title.String == "" { return impart.HTTPError{http.StatusGone, "Post was unpublished."} diff --git a/read.go b/read.go index f6808b4..b11e657 100644 --- a/read.go +++ b/read.go @@ -128,7 +128,7 @@ func (app *App) FetchPublicPosts() (interface{}, error) { } func viewLocalTimelineAPI(app *App, w http.ResponseWriter, r *http.Request) error { - updateTimelineCache(app.timeline) + updateTimelineCache(app.timeline, false) skip, _ := strconv.Atoi(r.FormValue("skip")) @@ -156,13 +156,19 @@ func viewLocalTimeline(app *App, w http.ResponseWriter, r *http.Request) error { return showLocalTimeline(app, w, r, page, vars["author"], vars["tag"]) } -func updateTimelineCache(tl *localTimeline) { - // Fetch posts if enough time has passed since last cache - if tl.posts == nil || tl.m.Invalidate() { +// updateTimelineCache will reset and update the cache if it is stale or +// the boolean passed in is true. +func updateTimelineCache(tl *localTimeline, reset bool) { + if reset { + tl.m.Reset() + } + + // Fetch posts if the cache is empty, has been reset or enough time has + // passed since last cache. + if tl.posts == nil || reset || tl.m.Invalidate() { log.Info("[READ] Updating post cache") - var err error - var postsInterfaces interface{} - postsInterfaces, err = tl.m.Get() + + postsInterfaces, err := tl.m.Get() if err != nil { log.Error("[READ] Unable to cache posts: %v", err) } else { @@ -170,10 +176,11 @@ func updateTimelineCache(tl *localTimeline) { tl.posts = &castPosts } } + } func showLocalTimeline(app *App, w http.ResponseWriter, r *http.Request, page int, author, tag string) error { - updateTimelineCache(app.timeline) + updateTimelineCache(app.timeline, false) pl := len(*(app.timeline.posts)) ttlPages := int(math.Ceil(float64(pl) / float64(app.timeline.postsPerPage))) @@ -286,7 +293,7 @@ func viewLocalTimelineFeed(app *App, w http.ResponseWriter, req *http.Request) e return impart.HTTPError{http.StatusNotFound, "Page doesn't exist."} } - updateTimelineCache(app.timeline) + updateTimelineCache(app.timeline, false) feed := &Feed{ Title: app.cfg.App.SiteName + " Reader",