proxy-pool/internal/platform/httpsecurity/config.go

59 lines
2.1 KiB
Go

package httpsecurity
import (
"fmt"
"time"
"proxy-pool/internal/config"
platformAdmission "proxy-pool/internal/platform/admission"
)
func BuildFromListener(listener config.Listener, clientIdentification string, semantics Semantics) (*Protection, error) {
var admitter Admitter
if listener.Limits.RequestsPerMinute > 0 || listener.Limits.RequestsPerMinutePerClient > 0 {
limiter, err := platformAdmission.NewFixedWindow(platformAdmission.FixedWindowConfig{
Window: time.Minute,
Global: listener.Limits.RequestsPerMinute,
PerKey: listener.Limits.RequestsPerMinutePerClient,
})
if err != nil {
return nil, fmt.Errorf("build HTTP security admission: %w", err)
}
admitter = limiter
}
return NewFromListener(listener, clientIdentification, semantics, admitter)
}
func NewFromListener(listener config.Listener, clientIdentification string, semantics Semantics, admitter Admitter) (*Protection, error) {
methods := make([]Method, 0, len(listener.Auth.Methods))
for _, method := range listener.Auth.Methods {
methods = append(methods, Method{
Mode: method.Mode,
Permissions: append([]string(nil), method.Permissions...),
ClientPolicy: method.ClientPolicy.Clone(),
Username: method.Username,
Password: method.Password,
Header: method.Header,
Value: method.Value,
CIDRs: append([]string(nil), method.CIDRs...),
})
}
return New(Config{
TrustedProxies: append([]string(nil), listener.Access.TrustedProxies...),
AllowCIDRs: append([]string(nil), listener.Access.AllowCIDRs...),
Authentication: Authentication{
Mode: listener.Auth.Mode,
Permissions: append([]string(nil), listener.Auth.Permissions...),
ClientPolicy: listener.Auth.ClientPolicy.Clone(),
Username: listener.Auth.Username,
Password: listener.Auth.Password,
Header: listener.Auth.Header,
Token: listener.Auth.Token,
CIDRs: append([]string(nil), listener.Auth.CIDRs...),
Methods: methods,
},
ClientIdentification: clientIdentification,
Semantics: semantics,
}, admitter)
}