Skip to content

Commit c874e34

Browse files
committed
Fix nil pointer dereference
This fixes a regression introduced in #1502, which can cause a panic on non-desktop environments with browser-based login flows other than auth0. https://jira.mesosphere.com/browse/DCOS-60349
1 parent 253a400 commit c874e34

File tree

4 files changed

+57
-23
lines changed

4 files changed

+57
-23
lines changed

.golangci.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ enable = [
3535
line-length = 150
3636

3737
[linters-settings.gocyclo]
38-
min-complexity = 22
38+
min-complexity = 23
3939

4040
[linters-settings.govet]
4141
check-shadowing = false

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## Next
44

5+
## 1.1.1
6+
7+
* Fixes
8+
9+
* Fix panic on non-desktop environments with browser login flows other than auth0
10+
511
## 1.1.0
612

713
* Features

pkg/login/flow.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@ func (f *Flow) triggerMethod(provider *Provider) (acsToken string, err error) {
185185
// Falling back to reading from STDIN is safer here.
186186
//
187187
// See https://jira.mesosphere.com/browse/DCOS_OSS-5591
188-
loginServer.Close()
188+
if loginServer != nil {
189+
loginServer.Close()
190+
}
189191
} else if loginServer != nil {
190192
token = <-loginServer.Token()
191193

pkg/login/flow_test.go

+47-21
Original file line numberDiff line numberDiff line change
@@ -97,34 +97,49 @@ func TestTriggerMethodOIDCWithLoginServer(t *testing.T) {
9797

9898
func TestTriggerMethodOIDCWithoutLoginServer(t *testing.T) {
9999

100-
// We're simulating a container environment where the browser can't be opened.
101-
// See https://jira.mesosphere.com/browse/DCOS_OSS-5591
102-
opener := open.OpenerFunc(func(_ string) error {
103-
return errors.New("couldn't open browser, I'm just a container")
104-
})
100+
testCases := []struct {
101+
provider *Provider
102+
}{
103+
{
104+
// We're simulating a container environment where the browser can't be opened.
105+
// See https://jira.mesosphere.com/browse/DCOS_OSS-5591
106+
defaultOIDCImplicitFlowProvider(),
107+
},
108+
{
109+
// Non-regression test for a panic on browser login flows other than auth0.
110+
// https://jira.mesosphere.com/browse/DCOS-60349
111+
shibbolethLoginProvider(),
112+
},
113+
}
105114

106-
expectedLoginToken := "dummy_login_token"
107-
expectedACSToken := "dummy_acs_token"
115+
for _, tc := range testCases {
116+
expectedLoginToken := "dummy_login_token"
117+
expectedACSToken := "dummy_acs_token"
108118

109-
ts := httptest.NewServer(mockLoginEndpoint(t, expectedLoginToken, expectedACSToken))
110-
defer ts.Close()
119+
ts := httptest.NewServer(mockLoginEndpoint(t, expectedLoginToken, expectedACSToken))
120+
defer ts.Close()
111121

112-
logger := &logrus.Logger{Out: ioutil.Discard}
122+
logger := &logrus.Logger{Out: ioutil.Discard}
113123

114-
var in bytes.Buffer
115-
in.WriteString(expectedLoginToken)
124+
var in bytes.Buffer
125+
in.WriteString(expectedLoginToken)
116126

117-
flow := NewFlow(FlowOpts{
118-
Prompt: prompt.New(&in, ioutil.Discard),
119-
Logger: logger,
120-
Opener: opener,
121-
})
127+
opener := open.OpenerFunc(func(_ string) error {
128+
return errors.New("couldn't open browser, I'm just a container")
129+
})
122130

123-
flow.client = NewClient(httpclient.New(ts.URL), logger)
131+
flow := NewFlow(FlowOpts{
132+
Prompt: prompt.New(&in, ioutil.Discard),
133+
Logger: logger,
134+
Opener: opener,
135+
})
124136

125-
acsToken, err := flow.triggerMethod(defaultOIDCImplicitFlowProvider())
126-
require.NoError(t, err)
127-
require.Equal(t, expectedACSToken, acsToken)
137+
flow.client = NewClient(httpclient.New(ts.URL), logger)
138+
139+
acsToken, err := flow.triggerMethod(tc.provider)
140+
require.NoError(t, err)
141+
require.Equal(t, expectedACSToken, acsToken)
142+
}
128143
}
129144

130145
func mockLoginEndpoint(t *testing.T, expectedLoginToken, acsToken string) http.Handler {
@@ -148,3 +163,14 @@ func mockLoginEndpoint(t *testing.T, expectedLoginToken, acsToken string) http.H
148163
})
149164
return mux
150165
}
166+
167+
func shibbolethLoginProvider() *Provider {
168+
return &Provider{
169+
ID: "shib-integration-test",
170+
Type: OIDCImplicitFlow,
171+
ClientMethod: methodBrowserOIDCToken,
172+
Config: ProviderConfig{
173+
StartFlowURL: "/login?redirect_uri=urn:ietf:wg:oauth:2.0:oob",
174+
},
175+
}
176+
}

0 commit comments

Comments
 (0)