Commit 82929b12 authored by Matthew Holt's avatar Matthew Holt

Ensure active Caddyfile, if in site, is hidden no matter the cwd

parent 38c76647
...@@ -245,16 +245,17 @@ func directoryListing(files []os.FileInfo, canGoUp bool, urlPath string, config ...@@ -245,16 +245,17 @@ func directoryListing(files []os.FileInfo, canGoUp bool, urlPath string, config
// ServeHTTP determines if the request is for this plugin, and if all prerequisites are met. // ServeHTTP determines if the request is for this plugin, and if all prerequisites are met.
// If so, control is handed over to ServeListing. // If so, control is handed over to ServeListing.
func (b Browse) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { func (b Browse) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
var bc *Config
// See if there's a browse configuration to match the path // See if there's a browse configuration to match the path
var bc *Config
for i := range b.Configs { for i := range b.Configs {
if httpserver.Path(r.URL.Path).Matches(b.Configs[i].PathScope) { if httpserver.Path(r.URL.Path).Matches(b.Configs[i].PathScope) {
bc = &b.Configs[i] bc = &b.Configs[i]
goto inScope break
} }
} }
if bc == nil {
return b.Next.ServeHTTP(w, r) return b.Next.ServeHTTP(w, r)
inScope: }
// Browse works on existing directories; delegate everything else // Browse works on existing directories; delegate everything else
requestedFilepath, err := bc.Fs.Root.Open(r.URL.Path) requestedFilepath, err := bc.Fs.Root.Open(r.URL.Path)
......
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"net" "net"
"net/url" "net/url"
"os" "os"
"path/filepath"
"strings" "strings"
"time" "time"
...@@ -21,7 +22,7 @@ func init() { ...@@ -21,7 +22,7 @@ func init() {
flag.StringVar(&Host, "host", DefaultHost, "Default host") flag.StringVar(&Host, "host", DefaultHost, "Default host")
flag.StringVar(&Port, "port", DefaultPort, "Default port") flag.StringVar(&Port, "port", DefaultPort, "Default port")
flag.StringVar(&Root, "root", DefaultRoot, "Root path of default site") flag.StringVar(&Root, "root", DefaultRoot, "Root path of default site")
flag.DurationVar(&GracefulTimeout, "grace", 5*time.Second, "Maximum duration of graceful shutdown") // TODO flag.DurationVar(&GracefulTimeout, "grace", 5*time.Second, "Maximum duration of graceful shutdown")
flag.BoolVar(&HTTP2, "http2", true, "Use HTTP/2") flag.BoolVar(&HTTP2, "http2", true, "Use HTTP/2")
flag.BoolVar(&QUIC, "quic", false, "Use experimental QUIC") flag.BoolVar(&QUIC, "quic", false, "Use experimental QUIC")
...@@ -44,10 +45,31 @@ func init() { ...@@ -44,10 +45,31 @@ func init() {
NewContext: newContext, NewContext: newContext,
}) })
caddy.RegisterCaddyfileLoader("short", caddy.LoaderFunc(shortCaddyfileLoader)) caddy.RegisterCaddyfileLoader("short", caddy.LoaderFunc(shortCaddyfileLoader))
caddy.RegisterParsingCallback(serverType, "root", hideCaddyfile)
caddy.RegisterParsingCallback(serverType, "tls", activateHTTPS) caddy.RegisterParsingCallback(serverType, "tls", activateHTTPS)
caddytls.RegisterConfigGetter(serverType, func(c *caddy.Controller) *caddytls.Config { return GetConfig(c).TLS }) caddytls.RegisterConfigGetter(serverType, func(c *caddy.Controller) *caddytls.Config { return GetConfig(c).TLS })
} }
// hideCaddyfile hides the source/origin Caddyfile if it is within the
// site root. This function should be run after parsing the root directive.
func hideCaddyfile(cctx caddy.Context) error {
ctx := cctx.(*httpContext)
for _, cfg := range ctx.siteConfigs {
absRoot, err := filepath.Abs(cfg.Root)
if err != nil {
return err
}
absOriginCaddyfile, err := filepath.Abs(cfg.originCaddyfile)
if err != nil {
return err
}
if strings.HasPrefix(absOriginCaddyfile, absRoot) {
cfg.HiddenFiles = append(cfg.HiddenFiles, strings.TrimPrefix(absOriginCaddyfile, absRoot))
}
}
return nil
}
func newContext() caddy.Context { func newContext() caddy.Context {
return &httpContext{keysToSiteConfigs: make(map[string]*SiteConfig)} return &httpContext{keysToSiteConfigs: make(map[string]*SiteConfig)}
} }
...@@ -98,7 +120,7 @@ func (h *httpContext) InspectServerBlocks(sourceFile string, serverBlocks []cadd ...@@ -98,7 +120,7 @@ func (h *httpContext) InspectServerBlocks(sourceFile string, serverBlocks []cadd
Addr: addr, Addr: addr,
Root: Root, Root: Root,
TLS: &caddytls.Config{Hostname: addr.Host}, TLS: &caddytls.Config{Hostname: addr.Host},
HiddenFiles: []string{sourceFile}, originCaddyfile: sourceFile,
} }
h.saveConfig(key, cfg) h.saveConfig(key, cfg)
} }
......
...@@ -33,6 +33,9 @@ type SiteConfig struct { ...@@ -33,6 +33,9 @@ type SiteConfig struct {
// Max amount of bytes a request can send on a given path // Max amount of bytes a request can send on a given path
MaxRequestBodySizes []PathLimit MaxRequestBodySizes []PathLimit
// The path to the Caddyfile used to generate this site config
originCaddyfile string
} }
// PathLimit is a mapping from a site's path to its corresponding // PathLimit is a mapping from a site's path to its corresponding
......
...@@ -23,6 +23,10 @@ func setupRoot(c *caddy.Controller) error { ...@@ -23,6 +23,10 @@ func setupRoot(c *caddy.Controller) error {
return c.ArgErr() return c.ArgErr()
} }
config.Root = c.Val() config.Root = c.Val()
if c.NextArg() {
// only one argument allowed
return c.ArgErr()
}
} }
// Check if root path exists // Check if root path exists
......
...@@ -52,6 +52,9 @@ func TestRoot(t *testing.T) { ...@@ -52,6 +52,9 @@ func TestRoot(t *testing.T) {
{ {
`root `, true, "", parseErrContent, `root `, true, "", parseErrContent,
}, },
{
`root /a /b`, true, "", parseErrContent,
},
{ {
fmt.Sprintf(`root %s`, inaccessiblePath), true, "", unableToAccessErrContent, fmt.Sprintf(`root %s`, inaccessiblePath), true, "", unableToAccessErrContent,
}, },
...@@ -68,7 +71,7 @@ func TestRoot(t *testing.T) { ...@@ -68,7 +71,7 @@ func TestRoot(t *testing.T) {
cfg := httpserver.GetConfig(c) cfg := httpserver.GetConfig(c)
if test.shouldErr && err == nil { if test.shouldErr && err == nil {
t.Errorf("Test %d: Expected error but found %s for input %s", i, err, test.input) t.Errorf("Test %d: Expected error but got nil for input '%s'", i, test.input)
} }
if err != nil { if err != nil {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment