diff options
Diffstat (limited to 'internal/web')
-rw-r--r-- | internal/web/assets.go | 10 | ||||
-rw-r--r-- | internal/web/assetscache.go | 2 | ||||
-rw-r--r-- | internal/web/panels.go | 28 | ||||
-rw-r--r-- | internal/web/profile.go | 16 | ||||
-rw-r--r-- | internal/web/thread.go | 26 | ||||
-rw-r--r-- | internal/web/web.go | 73 |
6 files changed, 32 insertions, 123 deletions
diff --git a/internal/web/assets.go b/internal/web/assets.go index f67f38363..397870862 100644 --- a/internal/web/assets.go +++ b/internal/web/assets.go @@ -20,9 +20,12 @@ package web import ( "net/http" + "path/filepath" "strings" "github.com/gin-gonic/gin" + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/superseriousbusiness/gotosocial/internal/log" ) type fileSystem struct { @@ -49,7 +52,12 @@ func (fs fileSystem) Open(path string) (http.File, error) { } func (m *Module) mountAssetsFilesystem(group *gin.RouterGroup) { - fs := fileSystem{http.Dir(m.webAssetsAbsFilePath)} + webAssetsAbsFilePath, err := filepath.Abs(config.GetWebAssetBaseDir()) + if err != nil { + log.Panicf("mountAssetsFilesystem: error getting absolute path of assets dir: %s", err) + } + + fs := fileSystem{http.Dir(webAssetsAbsFilePath)} // use the cache middleware on all handlers in this group group.Use(m.cacheControlMiddleware(fs)) diff --git a/internal/web/assetscache.go b/internal/web/assetscache.go index 57a0ade0b..fccc95993 100644 --- a/internal/web/assetscache.go +++ b/internal/web/assetscache.go @@ -114,7 +114,7 @@ func (m *Module) cacheControlMiddleware(fs http.FileSystem) gin.HandlerFunc { if !strings.HasPrefix(upath, "/") { upath = "/" + upath } - assetFilePath := strings.TrimPrefix(path.Clean(upath), assetsPath) + assetFilePath := strings.TrimPrefix(path.Clean(upath), assetsPathPrefix) // either fetch etag from ttlcache or generate it eTag, err := m.getAssetETag(assetFilePath, fs) diff --git a/internal/web/panels.go b/internal/web/panels.go index dafd0abc7..fdec87a33 100644 --- a/internal/web/panels.go +++ b/internal/web/panels.go @@ -38,15 +38,15 @@ func (m *Module) UserPanelHandler(c *gin.Context) { c.HTML(http.StatusOK, "frontend.tmpl", gin.H{ "instance": instance, "stylesheets": []string{ - assetsPath + "/Fork-Awesome/css/fork-awesome.min.css", - assetsPath + "/dist/_colors.css", - assetsPath + "/dist/base.css", - assetsPath + "/dist/panels-base.css", - assetsPath + "/dist/panels-user-style.css", + assetsPathPrefix + "/Fork-Awesome/css/fork-awesome.min.css", + assetsPathPrefix + "/dist/_colors.css", + assetsPathPrefix + "/dist/base.css", + assetsPathPrefix + "/dist/panels-base.css", + assetsPathPrefix + "/dist/panels-user-style.css", }, "javascript": []string{ - assetsPath + "/dist/bundle.js", - assetsPath + "/dist/user-panel.js", + assetsPathPrefix + "/dist/bundle.js", + assetsPathPrefix + "/dist/user-panel.js", }, }) } @@ -63,15 +63,15 @@ func (m *Module) AdminPanelHandler(c *gin.Context) { c.HTML(http.StatusOK, "frontend.tmpl", gin.H{ "instance": instance, "stylesheets": []string{ - assetsPath + "/Fork-Awesome/css/fork-awesome.min.css", - assetsPath + "/dist/_colors.css", - assetsPath + "/dist/base.css", - assetsPath + "/dist/panels-base.css", - assetsPath + "/dist/panels-admin-style.css", + assetsPathPrefix + "/Fork-Awesome/css/fork-awesome.min.css", + assetsPathPrefix + "/dist/_colors.css", + assetsPathPrefix + "/dist/base.css", + assetsPathPrefix + "/dist/panels-base.css", + assetsPathPrefix + "/dist/panels-admin-style.css", }, "javascript": []string{ - assetsPath + "/dist/bundle.js", - assetsPath + "/dist/admin-panel.js", + assetsPathPrefix + "/dist/bundle.js", + assetsPathPrefix + "/dist/admin-panel.js", }, }) } diff --git a/internal/web/profile.go b/internal/web/profile.go index 542c015f1..61f7c57e7 100644 --- a/internal/web/profile.go +++ b/internal/web/profile.go @@ -23,7 +23,6 @@ import ( "encoding/json" "errors" "fmt" - "math/rand" "net/http" "strings" @@ -100,21 +99,6 @@ func (m *Module) profileGETHandler(c *gin.Context) { return } - // pick a random dummy avatar if this account avatar isn't set yet - if account.Avatar == "" && len(m.defaultAvatars) > 0 { - //nolint:gosec - randomIndex := rand.Intn(len(m.defaultAvatars)) - dummyAvatar := m.defaultAvatars[randomIndex] - account.Avatar = dummyAvatar - for _, i := range statusResp.Items { - s, ok := i.(*apimodel.Status) - if !ok { - panic("timelineable was not *apimodel.Status") - } - s.Account.Avatar = dummyAvatar - } - } - c.HTML(http.StatusOK, "profile.tmpl", gin.H{ "instance": instance, "account": account, diff --git a/internal/web/thread.go b/internal/web/thread.go index d3b92bde3..3db4952c7 100644 --- a/internal/web/thread.go +++ b/internal/web/thread.go @@ -23,7 +23,6 @@ import ( "encoding/json" "errors" "fmt" - "math/rand" "net/http" "strings" @@ -36,21 +35,6 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/oauth" ) -var randAvatars = make(map[string]string) - -func (m *Module) ensureAvatar(status apimodel.Status) { - if status.Account.Avatar == "" && len(m.defaultAvatars) > 0 { - avatar, ok := randAvatars[status.Account.ID] - if !ok { - //nolint:gosec - randomIndex := rand.Intn(len(m.defaultAvatars)) - avatar = m.defaultAvatars[randomIndex] - randAvatars[status.Account.ID] = avatar - } - status.Account.Avatar = avatar - } -} - func (m *Module) threadGETHandler(c *gin.Context) { ctx := c.Request.Context() @@ -120,16 +104,6 @@ func (m *Module) threadGETHandler(c *gin.Context) { return } - m.ensureAvatar(*status) - - for _, status := range context.Descendants { - m.ensureAvatar(status) - } - - for _, status := range context.Ancestors { - m.ensureAvatar(status) - } - c.HTML(http.StatusOK, "thread.tmpl", gin.H{ "instance": instance, "status": status, diff --git a/internal/web/web.go b/internal/web/web.go index fe270ac6c..336525938 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -20,17 +20,12 @@ package web import ( "errors" - "fmt" - "io/ioutil" "net/http" - "path/filepath" - "strings" "time" "codeberg.org/gruf/go-cache/v2" "github.com/gin-gonic/gin" "github.com/superseriousbusiness/gotosocial/internal/api" - "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/router" @@ -43,7 +38,7 @@ const ( statusPath = profilePath + "/statuses/:" + statusIDKey adminPanelPath = "/admin" userPanelpath = "/user" - assetsPath = "/assets" + assetsPathPrefix = "/assets" tokenParam = "token" usernameKey = "username" @@ -52,78 +47,26 @@ const ( // Module implements the api.ClientModule interface for web pages. type Module struct { - processor processing.Processor - webAssetsAbsFilePath string - assetsETagCache cache.Cache[string, eTagCacheEntry] - defaultAvatars []string + processor processing.Processor + assetsETagCache cache.Cache[string, eTagCacheEntry] } // New returns a new api.ClientModule for web pages. -func New(processor processing.Processor) (api.ClientModule, error) { - webAssetsBaseDir := config.GetWebAssetBaseDir() - if webAssetsBaseDir == "" { - return nil, fmt.Errorf("%s cannot be empty and must be a relative or absolute path", config.WebAssetBaseDirFlag()) - } - - webAssetsAbsFilePath, err := filepath.Abs(webAssetsBaseDir) - if err != nil { - return nil, fmt.Errorf("error getting absolute path of %s: %s", webAssetsBaseDir, err) - } - - defaultAvatarsAbsFilePath := filepath.Join(webAssetsAbsFilePath, "default_avatars") - defaultAvatarFiles, err := ioutil.ReadDir(defaultAvatarsAbsFilePath) - if err != nil { - return nil, fmt.Errorf("error reading default avatars at %s: %s", defaultAvatarsAbsFilePath, err) - } - - defaultAvatars := []string{} - for _, f := range defaultAvatarFiles { - // ignore directories - if f.IsDir() { - continue - } - - // ignore files bigger than 50kb - if f.Size() > 50000 { - continue - } - - // get the name of the file, eg avatar.jpeg - fileName := f.Name() - - // get just the .jpeg, for example, from avatar.jpeg - extensionWithDot := filepath.Ext(fileName) - - // remove the leading . to just get, eg, jpeg - extension := strings.TrimPrefix(extensionWithDot, ".") - - // take only files with simple extensions - // that we know will work OK as avatars - switch strings.ToLower(extension) { - case "svg", "jpeg", "jpg", "gif", "png": - avatar := fmt.Sprintf("%s/default_avatars/%s", assetsPath, f.Name()) - defaultAvatars = append(defaultAvatars, avatar) - default: - continue - } - } - +func New(processor processing.Processor) api.ClientModule { assetsETagCache := cache.New[string, eTagCacheEntry]() assetsETagCache.SetTTL(time.Hour, false) assetsETagCache.Start(time.Minute) return &Module{ - processor: processor, - webAssetsAbsFilePath: webAssetsAbsFilePath, - assetsETagCache: assetsETagCache, - defaultAvatars: defaultAvatars, - }, nil + processor: processor, + assetsETagCache: assetsETagCache, + } } // Route satisfies the RESTAPIModule interface func (m *Module) Route(s router.Router) error { // serve static files from assets dir at /assets - assetsGroup := s.AttachGroup(assetsPath) + assetsGroup := s.AttachGroup(assetsPathPrefix) m.mountAssetsFilesystem(assetsGroup) s.AttachHandler(http.MethodGet, adminPanelPath, m.AdminPanelHandler) |