mirror of
https://github.com/caddyserver/caddy.git
synced 2025-06-01 04:34:21 -04:00
Ensure active Caddyfile, if in site, is hidden no matter the cwd
This commit is contained in:
parent
38c76647c9
commit
82929b122a
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return b.Next.ServeHTTP(w, r)
|
if bc == nil {
|
||||||
inScope:
|
return b.Next.ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
|
||||||
// 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 (
|
|||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -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() {
|
|||||||
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)}
|
||||||
}
|
}
|
||||||
@ -95,10 +117,10 @@ func (h *httpContext) InspectServerBlocks(sourceFile string, serverBlocks []cadd
|
|||||||
|
|
||||||
// Save the config to our master list, and key it for lookups
|
// Save the config to our master list, and key it for lookups
|
||||||
cfg := &SiteConfig{
|
cfg := &SiteConfig{
|
||||||
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 {
|
|||||||
|
|
||||||
// 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 {
|
|||||||
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) {
|
|||||||
{
|
{
|
||||||
`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) {
|
|||||||
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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user