mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-30 04:33:48 +08:00
392f1d70eb
If the password arg starts with htpasswd=, then the rest is treated as the file name of the htpasswd file, and used for md5 and sha1 hashes.
70 lines
1.6 KiB
Go
70 lines
1.6 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) {
|
|
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
|
|
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]); 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]); 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 string) (basicauth.PasswordMatcher, error) {
|
|
if !strings.HasPrefix(passw, "htpasswd=") {
|
|
return basicauth.PlainMatcher(passw), nil
|
|
}
|
|
|
|
return basicauth.GetHtpasswdMatcher(passw[9:], username)
|
|
}
|