diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/router/router.go | 7 | ||||
| -rw-r--r-- | internal/web/base.go | 11 | ||||
| -rw-r--r-- | internal/web/fileserver.go | 47 | 
3 files changed, 59 insertions, 6 deletions
diff --git a/internal/router/router.go b/internal/router/router.go index 87a84922c..100e0b38e 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -46,6 +46,8 @@ type Router interface {  	AttachMiddleware(handler gin.HandlerFunc)  	// Attach 404 NoRoute handler  	AttachNoRouteHandler(handler gin.HandlerFunc) +	// Add Gin StaticFile handler +	AttachStaticFS(relativePath string, fs http.FileSystem)  	// Start the router  	Start()  	// Stop the router @@ -61,6 +63,11 @@ type router struct {  	certManager *autocert.Manager  } +// Add Gin StaticFile handler +func (r *router) AttachStaticFS(relativePath string, fs http.FileSystem) { +	r.engine.StaticFS(relativePath, fs) +} +  // Start starts the router nicely.  //  // Different ports and handlers will be served depending on whether letsencrypt is enabled or not. diff --git a/internal/web/base.go b/internal/web/base.go index 9eea4a6ef..c0b85b613 100644 --- a/internal/web/base.go +++ b/internal/web/base.go @@ -24,7 +24,6 @@ import (  	"os"  	"path/filepath" -	"github.com/gin-contrib/static"  	"github.com/gin-gonic/gin"  	"github.com/sirupsen/logrus"  	"github.com/superseriousbusiness/gotosocial/internal/api" @@ -93,7 +92,11 @@ func (m *Module) Route(s router.Router) error {  		return fmt.Errorf("error getting current working directory: %s", err)  	}  	assetPath := filepath.Join(cwd, m.config.TemplateConfig.AssetBaseDir) -	s.AttachMiddleware(static.Serve("/assets", static.LocalFile(assetPath, false))) +	s.AttachStaticFS("/assets", FileSystem{http.Dir(assetPath)}) + +	// Admin panel route, if it exists +	adminPath := filepath.Join(cwd, m.config.TemplateConfig.AssetBaseDir, "/admin") +	s.AttachStaticFS("/admin", FileSystem{http.Dir(adminPath)})  	// serve front-page  	s.AttachHandler(http.MethodGet, "/", m.baseHandler) @@ -101,9 +104,5 @@ func (m *Module) Route(s router.Router) error {  	// 404 handler  	s.AttachNoRouteHandler(m.NotFoundHandler) -	if err != nil { -		return fmt.Errorf("error setting router FuncMap: %s", err) -	} -  	return nil  } diff --git a/internal/web/fileserver.go b/internal/web/fileserver.go new file mode 100644 index 000000000..247bf0dc8 --- /dev/null +++ b/internal/web/fileserver.go @@ -0,0 +1,47 @@ +/* +   GoToSocial +   Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU Affero General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU Affero General Public License for more details. + +   You should have received a copy of the GNU Affero General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +package web + +import ( +	"net/http" +	"strings" +) + +type FileSystem struct { +	fs http.FileSystem +} + +// FileSystem server that only accepts directory listings when an index.html is available +// from https://gist.github.com/hauxe/f2ea1901216177ccf9550a1b8bd59178 +func (fs FileSystem) Open(path string) (http.File, error) { +	f, err := fs.fs.Open(path) +	if err != nil { +		return nil, err +	} + +	s, _ := f.Stat() +	if s.IsDir() { +		index := strings.TrimSuffix(path, "/") + "/index.html" +		if _, err := fs.fs.Open(index); err != nil { +			return nil, err +		} +	} + +	return f, nil +}  | 
