Added symlink handling
This commit is contained in:
parent
c52ace1fdb
commit
0434d87b3e
35
cmd/files.go
35
cmd/files.go
|
@ -23,6 +23,7 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrNoImagesFound = fmt.Errorf("no supported image formats found")
|
ErrNoImagesFound = fmt.Errorf("no supported image formats found")
|
||||||
|
extensions = [5]string{".jpg", ".jpeg", ".png", ".gif", ".webp"}
|
||||||
)
|
)
|
||||||
|
|
||||||
type Files struct {
|
type Files struct {
|
||||||
|
@ -79,8 +80,6 @@ func (p *Path) Decrement() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func preparePath(path string) string {
|
func preparePath(path string) string {
|
||||||
path = filepath.Clean(path)
|
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
path = fmt.Sprintf("/%v", filepath.ToSlash(path))
|
path = fmt.Sprintf("/%v", filepath.ToSlash(path))
|
||||||
}
|
}
|
||||||
|
@ -227,12 +226,10 @@ func splitPath(path string, re regexp.Regexp) (*Path, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func tryExtensions(p *Path) (string, error) {
|
func tryExtensions(p *Path) (string, error) {
|
||||||
extensions := [6]string{p.Extension, ".jpg", ".jpeg", ".png", ".gif", ".webp"}
|
|
||||||
|
|
||||||
var fileName string
|
var fileName string
|
||||||
|
|
||||||
for _, i := range extensions {
|
for _, extension := range extensions {
|
||||||
fileName = fmt.Sprintf("%v%.3d%v", p.Base, p.Number, i)
|
fileName = fmt.Sprintf("%v%.3d%v", p.Base, p.Number, extension)
|
||||||
|
|
||||||
exists, err := fileExists(fileName)
|
exists, err := fileExists(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -268,17 +265,20 @@ func pathIsValid(filePath string, paths []string) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if Verbose && !matchesPrefix {
|
switch {
|
||||||
|
case Verbose && !matchesPrefix:
|
||||||
fmt.Printf("%v | Error: Failed to serve file outside specified path(s): %v\n",
|
fmt.Printf("%v | Error: Failed to serve file outside specified path(s): %v\n",
|
||||||
time.Now().Format(LOGDATE),
|
time.Now().Format(LOGDATE),
|
||||||
filePath,
|
filePath,
|
||||||
)
|
)
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
case !matchesPrefix:
|
||||||
|
return false
|
||||||
|
default:
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func isImage(path string) (bool, error) {
|
func isImage(path string) (bool, error) {
|
||||||
file, err := os.Open(path)
|
file, err := os.Open(path)
|
||||||
|
@ -447,14 +447,29 @@ func pickFile(args []string, filters *Filters, sort string) (string, error) {
|
||||||
func normalizePaths(args []string) ([]string, error) {
|
func normalizePaths(args []string) ([]string, error) {
|
||||||
var paths []string
|
var paths []string
|
||||||
|
|
||||||
|
fmt.Println("Paths:")
|
||||||
|
|
||||||
for i := 0; i < len(args); i++ {
|
for i := 0; i < len(args); i++ {
|
||||||
absolutePath, err := filepath.Abs(args[i])
|
path, err := filepath.EvalSymlinks(args[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
absolutePath, err := filepath.Abs(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[i]) != absolutePath {
|
||||||
|
fmt.Printf("%v (resolved to %v)\n", args[i], absolutePath)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("%v\n", args[i])
|
||||||
|
}
|
||||||
|
|
||||||
paths = append(paths, absolutePath)
|
paths = append(paths, absolutePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
return paths, nil
|
return paths, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Version = "0.18.2"
|
var Version = "0.18.3"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(versionCmd)
|
rootCmd.AddCommand(versionCmd)
|
||||||
|
|
11
cmd/web.go
11
cmd/web.go
|
@ -188,7 +188,10 @@ func serveStaticFile(w http.ResponseWriter, r *http.Request, paths []string) err
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
filePath := filepath.Clean(strings.TrimPrefix(prefixedFilePath, PREFIX))
|
filePath, err := filepath.EvalSymlinks(strings.TrimPrefix(prefixedFilePath, PREFIX))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if !pathIsValid(filePath, paths) {
|
if !pathIsValid(filePath, paths) {
|
||||||
http.NotFound(w, r)
|
http.NotFound(w, r)
|
||||||
|
@ -456,17 +459,13 @@ func serveHtmlHandler(paths []string, re regexp.Regexp) appHandler {
|
||||||
func doNothing(http.ResponseWriter, *http.Request) {}
|
func doNothing(http.ResponseWriter, *http.Request) {}
|
||||||
|
|
||||||
func ServePage(args []string) error {
|
func ServePage(args []string) error {
|
||||||
fmt.Printf("roulette v%v\n", Version)
|
fmt.Printf("roulette v%v\n\n", Version)
|
||||||
|
|
||||||
paths, err := normalizePaths(args)
|
paths, err := normalizePaths(args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, i := range paths {
|
|
||||||
fmt.Println("Paths: " + i)
|
|
||||||
}
|
|
||||||
|
|
||||||
re := regexp.MustCompile(`(.+)([0-9]{3})(\..+)`)
|
re := regexp.MustCompile(`(.+)([0-9]{3})(\..+)`)
|
||||||
|
|
||||||
http.Handle("/", serveHtmlHandler(paths, *re))
|
http.Handle("/", serveHtmlHandler(paths, *re))
|
||||||
|
|
Loading…
Reference in New Issue