From 8d660340cf3d10489337c634804c6fdaf7a21c0c Mon Sep 17 00:00:00 2001 From: Harold Alcala Date: Mon, 7 Dec 2020 15:29:30 +0800 Subject: [PATCH 1/4] Custom relayState generator --- samlsp/new.go | 3 +++ samlsp/request_tracker_cookie.go | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/samlsp/new.go b/samlsp/new.go index c89b1953..c254a44e 100644 --- a/samlsp/new.go +++ b/samlsp/new.go @@ -37,6 +37,8 @@ type Options struct { CookieName string // DEPRECATED: this field will be removed. Instead, assign a custom CookieRequestTracker or CookieSessionProvider CookieDomain string // DEPRECATED: this field will be removed. Instead, assign a custom CookieRequestTracker or CookieSessionProvider CookieSecure bool // DEPRECATED: this field will be removed, the Secure flag is set on cookies when the root URL uses the https scheme + + RelayStateFunc func(w http.ResponseWriter, r *http.Request) string } // DefaultSessionCodec returns the default SessionCodec for the provided options, @@ -115,6 +117,7 @@ func DefaultRequestTracker(opts Options, serviceProvider *saml.ServiceProvider) NamePrefix: "saml_", Codec: DefaultTrackedRequestCodec(opts), MaxAge: saml.MaxIssueDelay, + RelayStateFunc: opts.RelayStateFunc, } } diff --git a/samlsp/request_tracker_cookie.go b/samlsp/request_tracker_cookie.go index 69325e7d..ce0b91a4 100644 --- a/samlsp/request_tracker_cookie.go +++ b/samlsp/request_tracker_cookie.go @@ -19,6 +19,7 @@ type CookieRequestTracker struct { NamePrefix string Codec TrackedRequestCodec MaxAge time.Duration + RelayStateFunc func(w http.ResponseWriter, r *http.Request) string } // TrackRequest starts tracking the SAML request with the given ID. It returns an @@ -29,6 +30,15 @@ func (t CookieRequestTracker) TrackRequest(w http.ResponseWriter, r *http.Reques SAMLRequestID: samlRequestID, URI: r.URL.String(), } + + if t.RelayStateFunc != nil { + _relayState := t.RelayStateFunc(w, r) + + if _relayState != "" { + trackedRequest.Index = _relayState + } + } + signedTrackedRequest, err := t.Codec.Encode(trackedRequest) if err != nil { return "", err From 0006fcc403c02b85ccb2266aaf4c32788d671125 Mon Sep 17 00:00:00 2001 From: Ross Kinder Date: Thu, 25 Mar 2021 09:08:49 -0400 Subject: [PATCH 2/4] fmt --- samlsp/new.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/samlsp/new.go b/samlsp/new.go index 16c97e03..4492d221 100644 --- a/samlsp/new.go +++ b/samlsp/new.go @@ -24,8 +24,7 @@ type Options struct { SignRequest bool ForceAuthn bool // TODO(ross): this should be *bool CookieSameSite http.SameSite - - RelayStateFunc func(w http.ResponseWriter, r *http.Request) string + RelayStateFunc func(w http.ResponseWriter, r *http.Request) string } // DefaultSessionCodec returns the default SessionCodec for the provided options, From dde371386a2a899bf49b729ad4f604b31cfb3184 Mon Sep 17 00:00:00 2001 From: Ross Kinder Date: Thu, 25 Mar 2021 09:10:13 -0400 Subject: [PATCH 3/4] fmt --- samlsp/request_tracker_cookie.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/samlsp/request_tracker_cookie.go b/samlsp/request_tracker_cookie.go index 2ad0a51c..d9189f63 100644 --- a/samlsp/request_tracker_cookie.go +++ b/samlsp/request_tracker_cookie.go @@ -33,10 +33,9 @@ func (t CookieRequestTracker) TrackRequest(w http.ResponseWriter, r *http.Reques } if t.RelayStateFunc != nil { - _relayState := t.RelayStateFunc(w, r) - - if _relayState != "" { - trackedRequest.Index = _relayState + relayState := t.RelayStateFunc(w, r) + if relayState != "" { + trackedRequest.Index = relayState } } From cd29e9ef7f81d3e996a51477da6d7f8759fffc06 Mon Sep 17 00:00:00 2001 From: Ross Kinder Date: Thu, 25 Mar 2021 09:11:31 -0400 Subject: [PATCH 4/4] fmt --- samlsp/new.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samlsp/new.go b/samlsp/new.go index 4492d221..33397435 100644 --- a/samlsp/new.go +++ b/samlsp/new.go @@ -24,7 +24,7 @@ type Options struct { SignRequest bool ForceAuthn bool // TODO(ross): this should be *bool CookieSameSite http.SameSite - RelayStateFunc func(w http.ResponseWriter, r *http.Request) string + RelayStateFunc func(w http.ResponseWriter, r *http.Request) string } // DefaultSessionCodec returns the default SessionCodec for the provided options,