fix: Prevent nil errors on creating FileInfo structs

This commit is contained in:
Felicitas Pojtinger
2021-12-28 21:59:36 +01:00
parent 928289b9a0
commit 40a5b9608f
8 changed files with 55 additions and 31 deletions

View File

@@ -55,11 +55,11 @@ https://github.com/pojntfx/stfs`,
},
}
func Execute() {
func Execute() error {
// Get default working dir
home, err := os.UserHomeDir()
if err != nil {
panic(err)
return err
}
metadataPath := filepath.Join(home, ".local", "share", "stfs", "var", "lib", "stfs", "metadata.sqlite")
@@ -71,12 +71,10 @@ func Execute() {
rootCmd.PersistentFlags().StringP(signatureFlag, "s", config.NoneKey, fmt.Sprintf("Signature format to use (default %v, available are %v)", config.NoneKey, config.KnownSignatureFormats))
if err := viper.BindPFlags(rootCmd.PersistentFlags()); err != nil {
panic(err)
return err
}
viper.AutomaticEnv()
if err := rootCmd.Execute(); err != nil {
panic(err)
}
return rootCmd.Execute()
}

View File

@@ -236,7 +236,7 @@ var serveFTPCmd = &cobra.Command{
)
if viper.GetBool(verboseFlag) {
srv.Logger = &logging.JSONLogger{}
srv.Logger = jsonLogger
}
jsonLogger.Info("FTP server listening", map[string]interface{}{

View File

@@ -158,6 +158,7 @@ var serveHTTPCmd = &cobra.Command{
http.FileServer(
afero.NewHttpFs(fs),
),
jsonLogger,
),
)
},

View File

@@ -3,5 +3,7 @@ package main
import "github.com/pojntfx/stfs/cmd/stfs/cmd"
func main() {
cmd.Execute()
if err := cmd.Execute(); err != nil {
panic(err)
}
}

View File

@@ -136,13 +136,14 @@ func (f *File) syncWithoutLocking() error {
return config.FileConfig{}, err
}
f.info = &FileInfo{
name: f.info.Name(),
size: size,
mode: f.info.Mode(),
modTime: f.info.ModTime(),
isDir: f.info.IsDir(),
}
f.info = NewFileInfo(
f.info.Name(),
size,
f.info.Mode(),
f.info.ModTime(),
f.info.IsDir(),
f.log,
)
return config.FileConfig{
GetFile: func() (io.ReadSeekCloser, error) {
@@ -392,7 +393,7 @@ func (f *File) Readdir(count int) ([]os.FileInfo, error) {
fileInfos := []os.FileInfo{}
for _, hdr := range hdrs {
fileInfos = append(fileInfos, NewFileInfo(hdr, f.log))
fileInfos = append(fileInfos, NewFileInfoFromTarHeader(hdr, f.log))
}
return fileInfos, nil

View File

@@ -22,6 +22,26 @@ type FileInfo struct {
}
func NewFileInfo(
name string,
size int64,
mode fs.FileMode,
modTime time.Time,
isDir bool,
log *logging.JSONLogger,
) *FileInfo {
return &FileInfo{
name: name,
size: size,
mode: mode,
modTime: modTime,
isDir: isDir,
log: log,
}
}
func NewFileInfoFromTarHeader(
hdr *tar.Header,
log *logging.JSONLogger,

View File

@@ -285,7 +285,7 @@ func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.Fi
f.getFileBuffer,
path.Base(hdr.Name),
NewFileInfo(hdr, f.log),
NewFileInfoFromTarHeader(hdr, f.log),
f.onHeader,
f.log,
@@ -334,10 +334,10 @@ func (f *FileSystem) Stat(name string) (os.FileInfo, error) {
return nil, os.ErrNotExist
}
panic(err)
return nil, err
}
return NewFileInfo(hdr, f.log), nil
return NewFileInfoFromTarHeader(hdr, f.log), nil
}
func (f *FileSystem) updateMetadata(hdr *tar.Header) error {
@@ -384,7 +384,7 @@ func (f *FileSystem) Chmod(name string, mode os.FileMode) error {
return os.ErrNotExist
}
panic(err)
return err
}
hdr.Mode = int64(mode)
@@ -411,7 +411,7 @@ func (f *FileSystem) Chown(name string, uid, gid int) error {
return os.ErrNotExist
}
panic(err)
return err
}
hdr.Uid = uid
@@ -439,7 +439,7 @@ func (f *FileSystem) Chtimes(name string, atime time.Time, mtime time.Time) erro
return os.ErrNotExist
}
panic(err)
return err
}
hdr.AccessTime = atime
@@ -453,7 +453,7 @@ func (f *FileSystem) LstatIfPossible(name string) (os.FileInfo, bool, error) {
"name": name,
})
panic(ErrNotImplemented)
return nil, false, ErrNotImplemented
}
func (f *FileSystem) SymlinkIfPossible(oldname, newname string) error {
@@ -462,7 +462,7 @@ func (f *FileSystem) SymlinkIfPossible(oldname, newname string) error {
"newname": newname,
})
panic(ErrNotImplemented)
return ErrNotImplemented
}
func (f *FileSystem) ReadlinkIfPossible(name string) (string, error) {
@@ -470,5 +470,5 @@ func (f *FileSystem) ReadlinkIfPossible(name string) (string, error) {
"name": name,
})
panic(ErrNotImplemented)
return "", ErrNotImplemented
}

View File

@@ -2,18 +2,20 @@ package handlers
import (
"fmt"
"log"
"net/http"
"runtime/debug"
"github.com/pojntfx/stfs/internal/logging"
)
func PanicHandler(h http.Handler) http.Handler {
func PanicHandler(h http.Handler, log *logging.JSONLogger) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if r := recover(); r != nil {
http.Error(w, fmt.Sprintf("%v", r), http.StatusInternalServerError)
if err := recover(); err != nil {
http.Error(w, fmt.Sprintf("%v", err), http.StatusInternalServerError)
log.Println("Error:", r, "\nStack:", string(debug.Stack()))
log.Error("Error during HTTP request", map[string]interface{}{
"err": err,
})
}
}()