mirror of
https://github.com/caddyserver/caddy.git
synced 2025-01-10 04:48:50 +03:00
4ebff9a130
Merged config and app packages into one called caddy. Abstracted away caddy startup functionality making it easier to embed Caddy in any Go application and use it as a library. Graceful restart (should) now ensure child starts properly. Now piping a gob bundle to child process so that the child can match up inherited listeners to server address. Much cleanup still to do.
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package setup
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/mholt/caddy/middleware"
|
|
"github.com/mholt/caddy/middleware/basicauth"
|
|
)
|
|
|
|
// BasicAuth configures a new BasicAuth middleware instance.
|
|
func BasicAuth(c *Controller) (middleware.Middleware, error) {
|
|
root := c.Root
|
|
|
|
rules, err := basicAuthParse(c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
basic := basicauth.BasicAuth{Rules: rules}
|
|
|
|
return func(next middleware.Handler) middleware.Handler {
|
|
basic.Next = next
|
|
basic.SiteRoot = root
|
|
return basic
|
|
}, nil
|
|
}
|
|
|
|
func basicAuthParse(c *Controller) ([]basicauth.Rule, error) {
|
|
var rules []basicauth.Rule
|
|
|
|
var err error
|
|
for c.Next() {
|
|
var rule basicauth.Rule
|
|
|
|
args := c.RemainingArgs()
|
|
|
|
switch len(args) {
|
|
case 2:
|
|
rule.Username = args[0]
|
|
if rule.Password, err = passwordMatcher(rule.Username, args[1], c.Root); err != nil {
|
|
return rules, c.Errf("Get password matcher from %s: %v", c.Val(), err)
|
|
}
|
|
|
|
for c.NextBlock() {
|
|
rule.Resources = append(rule.Resources, c.Val())
|
|
if c.NextArg() {
|
|
return rules, c.Errf("Expecting only one resource per line (extra '%s')", c.Val())
|
|
}
|
|
}
|
|
case 3:
|
|
rule.Resources = append(rule.Resources, args[0])
|
|
rule.Username = args[1]
|
|
if rule.Password, err = passwordMatcher(rule.Username, args[2], c.Root); err != nil {
|
|
return rules, c.Errf("Get password matcher from %s: %v", c.Val(), err)
|
|
}
|
|
default:
|
|
return rules, c.ArgErr()
|
|
}
|
|
|
|
rules = append(rules, rule)
|
|
}
|
|
|
|
return rules, nil
|
|
}
|
|
|
|
func passwordMatcher(username, passw, siteRoot string) (basicauth.PasswordMatcher, error) {
|
|
if !strings.HasPrefix(passw, "htpasswd=") {
|
|
return basicauth.PlainMatcher(passw), nil
|
|
}
|
|
|
|
return basicauth.GetHtpasswdMatcher(passw[9:], username, siteRoot)
|
|
}
|