fix: Prevent nil errors on creating FileInfo structs
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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{}{
|
||||
|
||||
@@ -158,6 +158,7 @@ var serveHTTPCmd = &cobra.Command{
|
||||
http.FileServer(
|
||||
afero.NewHttpFs(fs),
|
||||
),
|
||||
jsonLogger,
|
||||
),
|
||||
)
|
||||
},
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
}()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user