|
|
@ -218,7 +218,10 @@ func runAPIServerProxy(s *tsnet.Server, rt http.RoundTripper, log *zap.SugaredLo
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const capabilityName = "https://tailscale.com/cap/kubernetes"
|
|
|
|
const (
|
|
|
|
|
|
|
|
capabilityName = "tailscale.com/cap/kubernetes"
|
|
|
|
|
|
|
|
oldCapabilityName = "https://" + capabilityName
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type capRule struct {
|
|
|
|
type capRule struct {
|
|
|
|
// Impersonate is a list of rules that specify how to impersonate the caller
|
|
|
|
// Impersonate is a list of rules that specify how to impersonate the caller
|
|
|
@ -239,6 +242,10 @@ func addImpersonationHeaders(r *http.Request, log *zap.SugaredLogger) error {
|
|
|
|
log = log.With("remote", r.RemoteAddr)
|
|
|
|
log = log.With("remote", r.RemoteAddr)
|
|
|
|
who := whoIsFromRequest(r)
|
|
|
|
who := whoIsFromRequest(r)
|
|
|
|
rules, err := tailcfg.UnmarshalCapJSON[capRule](who.CapMap, capabilityName)
|
|
|
|
rules, err := tailcfg.UnmarshalCapJSON[capRule](who.CapMap, capabilityName)
|
|
|
|
|
|
|
|
if len(rules) == 0 && err == nil {
|
|
|
|
|
|
|
|
// Try the old capability name for backwards compatibility.
|
|
|
|
|
|
|
|
rules, err = tailcfg.UnmarshalCapJSON[capRule](who.CapMap, oldCapabilityName)
|
|
|
|
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("failed to unmarshal capability: %v", err)
|
|
|
|
return fmt.Errorf("failed to unmarshal capability: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|