From bd2c0ab009579c0289228bf560d2503c2e9f4d20 Mon Sep 17 00:00:00 2001 From: Felix Pojtinger Date: Sun, 13 Jun 2021 18:47:16 +0200 Subject: [PATCH] feat: Log HTTP GET requests like with TFTP --- cmd/bofied-backend/main.go | 2 +- pkg/eventing/http_logging.go | 15 +++++++++++++++ pkg/servers/extended_http.go | 18 +++++++++++++++--- pkg/servers/tftp.go | 12 ++++++------ 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 pkg/eventing/http_logging.go diff --git a/cmd/bofied-backend/main.go b/cmd/bofied-backend/main.go index 009d279..b1db668 100644 --- a/cmd/bofied-backend/main.go +++ b/cmd/bofied-backend/main.go @@ -96,7 +96,7 @@ For more information, please visit https://github.com/pojntfx/bofied.`, eventsHandler, ) grpcServer, grpcServerHandler := servers.NewGRPCServer(viper.GetString(grpcListenAddressKey), eventsService, metadataService) - extendedHTTPServer := servers.NewExtendedHTTPServer(viper.GetString(workingDirKey), viper.GetString(webDAVAndHTTPListenAddressKey), oidcValidator, grpcServerHandler) + extendedHTTPServer := servers.NewExtendedHTTPServer(viper.GetString(workingDirKey), viper.GetString(webDAVAndHTTPListenAddressKey), oidcValidator, grpcServerHandler, eventsHandler) // Start servers log.Printf( diff --git a/pkg/eventing/http_logging.go b/pkg/eventing/http_logging.go new file mode 100644 index 0000000..db099a3 --- /dev/null +++ b/pkg/eventing/http_logging.go @@ -0,0 +1,15 @@ +package eventing + +import ( + "net/http" +) + +func LogRequestHandler(h http.Handler, eventHandler *EventHandler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodGet { + eventHandler.Emit(`sending file "%v" to client "%v" with user agent "%v"`, r.URL.Path, r.RemoteAddr, r.UserAgent()) + } + + h.ServeHTTP(w, r) + }) +} diff --git a/pkg/servers/extended_http.go b/pkg/servers/extended_http.go index 44482fd..32e53c7 100644 --- a/pkg/servers/extended_http.go +++ b/pkg/servers/extended_http.go @@ -5,6 +5,7 @@ import ( "github.com/pojntfx/bofied/pkg/authorization" "github.com/pojntfx/bofied/pkg/constants" + "github.com/pojntfx/bofied/pkg/eventing" "github.com/pojntfx/liwasc/pkg/validators" "github.com/rs/cors" "golang.org/x/net/webdav" @@ -21,11 +22,18 @@ type ExtendedHTTPServer struct { FileServer eventsServerHandler http.Handler + eventHandler *eventing.EventHandler oidcValidator *validators.OIDCValidator } -func NewExtendedHTTPServer(workingDir string, listenAddress string, oidcValidator *validators.OIDCValidator, eventsServerHandler http.Handler) *ExtendedHTTPServer { +func NewExtendedHTTPServer( + workingDir string, + listenAddress string, + oidcValidator *validators.OIDCValidator, + eventsServerHandler http.Handler, + eventHandler *eventing.EventHandler, +) *ExtendedHTTPServer { return &ExtendedHTTPServer{ FileServer: FileServer{ workingDir: workingDir, @@ -33,6 +41,7 @@ func NewExtendedHTTPServer(workingDir string, listenAddress string, oidcValidato }, eventsServerHandler: eventsServerHandler, + eventHandler: eventHandler, oidcValidator: oidcValidator, } @@ -47,8 +56,11 @@ func (s *ExtendedHTTPServer) GetWebDAVHandler(prefix string) webdav.Handler { } func (s *ExtendedHTTPServer) GetHTTPHandler() http.Handler { - return http.FileServer( - http.Dir(s.workingDir), + return eventing.LogRequestHandler( + http.FileServer( + http.Dir(s.workingDir), + ), + s.eventHandler, ) } diff --git a/pkg/servers/tftp.go b/pkg/servers/tftp.go index d498afb..85a8940 100644 --- a/pkg/servers/tftp.go +++ b/pkg/servers/tftp.go @@ -14,7 +14,7 @@ import ( type TFTPServer struct { FileServer - EventHandler *eventing.EventHandler + eventHandler *eventing.EventHandler } func NewTFTPServer(workingDir string, listenAddress string, eventHandler *eventing.EventHandler) *TFTPServer { @@ -24,7 +24,7 @@ func NewTFTPServer(workingDir string, listenAddress string, eventHandler *eventi listenAddress: listenAddress, }, - EventHandler: eventHandler, + eventHandler: eventHandler, } } @@ -37,7 +37,7 @@ func (s *TFTPServer) ListenAndServe() error { // Prevent accessing any parent directories fullFilename := filepath.Join(s.workingDir, filename) if strings.Contains(filename, "..") { - s.EventHandler.Emit(`could not send file: get request to file "%v" by client "%v" blocked because it is located outside the working directory "%v"`, fullFilename, raddr.String(), s.workingDir) + s.eventHandler.Emit(`could not send file: get request to file "%v" by client "%v" blocked because it is located outside the working directory "%v"`, fullFilename, raddr.String(), s.workingDir) return errors.New("unauthorized: tried to access file outside working directory") } @@ -45,7 +45,7 @@ func (s *TFTPServer) ListenAndServe() error { // Open file to send file, err := os.Open(fullFilename) if err != nil { - s.EventHandler.Emit(`could not open file "%v" for client "%v": %v`, fullFilename, raddr.String(), err) + s.eventHandler.Emit(`could not open file "%v" for client "%v": %v`, fullFilename, raddr.String(), err) return err } @@ -53,12 +53,12 @@ func (s *TFTPServer) ListenAndServe() error { // Send the file to the client n, err := rf.ReadFrom(file) if err != nil { - s.EventHandler.Emit(`could not sent file "%v" to client "%v": %v`, fullFilename, raddr.String(), err) + s.eventHandler.Emit(`could not sent file "%v" to client "%v": %v`, fullFilename, raddr.String(), err) return err } - s.EventHandler.Emit(`sent file "%v" (%v bytes) to client "%v"`, fullFilename, n, raddr.String()) + s.eventHandler.Emit(`sent file "%v" (%v bytes) to client "%v"`, fullFilename, n, raddr.String()) return nil },