type SAMLListener struct {
*SAMLServiceProvider `yaml:"saml"`
+ Addr string `yaml:"listen"`
+ InsecureAddr string `yaml:"listen_insecure"`
Certificate string `yaml:"cert"`
VirtualHosts map[string]*SAMLVirtualHost `yaml:"virtual_hosts"`
}
return nil, err
}
+ addr := sp.Listener.Addr
+ if addr == "" {
+ addr = "[::]:8443"
+ }
+
lm := log.NewLoggingMiddlewareWithLogger(handler, sp.logger)
server := &http.Server{
+ Addr: addr,
Handler: lm.HandlerFunc(),
}
return server, nil
}
+func (sp *SAMLProxy) NewHTTPSRedirectorWithContext(ctx context.Context) *http.Server {
+ addr := sp.Listener.InsecureAddr
+ if addr == "" {
+ addr = "[::]:8080"
+ }
+
+ server := &http.Server{
+ Addr: addr,
+ Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ host := r.Host
+ if host == "" {
+ w.WriteHeader(http.StatusBadRequest)
+ return
+ }
+
+ if _, ok := sp.Listener.VirtualHosts[host]; !ok {
+ w.WriteHeader(http.StatusMisdirectedRequest)
+ return
+ }
+
+ newUrl := *r.URL
+ newUrl.Scheme = "https"
+ newUrl.Host = host
+ w.Header().Set("location", newUrl.String())
+ w.WriteHeader(http.StatusFound)
+ }),
+ }
+
+ return server
+}
+
func (sp *SAMLServiceProvider) Metadata() (*saml.EntityDescriptor, error) {
var err error
sp.metadataOnce.Do(func() {
flag.StringVar(&vhost.Backend.Host, "backend.host", "127.0.0.1", "backend host")
flag.IntVar(&vhost.Backend.Port, "backend.port", 0, "backend port")
flag.StringVar(&vhost.Backend.Identity, "backend.mtls-id", "", "backend mTLS identity; omit to disable TLS to backend")
- listen := flag.String("listen", "[::]:8443", "address for auth proxy to listen on")
+ flag.StringVar(&sp.Listener.Addr, "listen", "[::]:8443", "address for auth proxy to listen on")
+ flag.StringVar(&sp.Listener.InsecureAddr, "listen.http", "[::]:8080", "address for http-to-https redirector")
flag.Parse()
if err != nil {
log.Panic(err)
}
- server.Addr = *listen
go server.ListenAndServeTLS("", "")
+ unsecureServer := sp.NewHTTPSRedirectorWithContext(ctx)
+ go unsecureServer.ListenAndServe()
+
daemon.SdNotify(false, daemon.SdNotifyReady)
<-ctx.Done()