Skip to content

Commit 3b25f7c

Browse files
committed
fix(control-plane): fail explicitly on OAUTHBEARER without tokenProvider
1 parent 856fc27 commit 3b25f7c

3 files changed

Lines changed: 32 additions & 2 deletions

File tree

‎control-plane/pkg/security/oauth/token_provider.go‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,22 @@ func NewTokenProvider(data map[string][]byte) (*TokenProvider, error) {
6565
tokenIssuer: tokenIssuer,
6666
}, nil
6767
}
68+
69+
// errorTokenProvider is a sarama.AccessTokenProvider that always fails with a
70+
// descriptive error. It is used when an OAUTHBEARER secret has no tokenProvider
71+
// (the sasl.jaas.config / sasl.login.callback.handler.class keys are consumed by
72+
// the Java data plane only). Setting this instead of leaving TokenProvider nil
73+
// prevents a nil-pointer panic in sarama's OAUTHBEARER auth path when the Go
74+
// control plane attempts an admin connection, turning it into a clear reconciler
75+
// error instead.
76+
type errorTokenProvider struct{ msg string }
77+
78+
func (e *errorTokenProvider) Token() (*sarama.AccessToken, error) {
79+
return nil, fmt.Errorf("%s", e.msg)
80+
}
81+
82+
// UnsupportedTokenProvider returns an AccessTokenProvider that always fails with
83+
// the given message. See errorTokenProvider for rationale.
84+
func UnsupportedTokenProvider(msg string) sarama.AccessTokenProvider {
85+
return &errorTokenProvider{msg: msg}
86+
}

‎control-plane/pkg/security/secret.go‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ func saslConfig(protocol string, data map[string][]byte) kafka.ConfigOption {
133133
return fmt.Errorf("[protocol %s] failed to create OAUTHBEARER token provider: %w", protocol, err)
134134
}
135135
config.Net.SASL.TokenProvider = tokenProvider
136+
} else {
137+
config.Net.SASL.TokenProvider = oauth.UnsupportedTokenProvider(
138+
"OAUTHBEARER without tokenProvider is not supported by the Go control plane " +
139+
"(sasl.jaas.config/sasl.login.callback.handler.class are consumed by the Java data plane only); " +
140+
"topic and consumer group management will fail")
136141
}
137142
return nil
138143
}

‎control-plane/pkg/security/secret_test.go‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,10 @@ func TestSASLOAuthMissingTokenProvider(t *testing.T) {
223223
assert.Nil(t, err)
224224
assert.True(t, config.Net.SASL.Enable)
225225
assert.Equal(t, sarama.SASLMechanism(sarama.SASLTypeOAuth), config.Net.SASL.Mechanism)
226-
assert.Nil(t, config.Net.SASL.TokenProvider)
226+
assert.NotNil(t, config.Net.SASL.TokenProvider)
227+
_, tokenErr := config.Net.SASL.TokenProvider.Token()
228+
assert.NotNil(t, tokenErr)
229+
assert.Contains(t, tokenErr.Error(), "not supported by the Go control plane")
227230
}
228231

229232
func TestSASLOAuthInvalidTokenProvider(t *testing.T) {
@@ -257,7 +260,10 @@ func TestSASLOAuthWithJavaPassthroughKeys(t *testing.T) {
257260
assert.Nil(t, err)
258261
assert.True(t, config.Net.SASL.Enable)
259262
assert.Equal(t, sarama.SASLMechanism(sarama.SASLTypeOAuth), config.Net.SASL.Mechanism)
260-
assert.Nil(t, config.Net.SASL.TokenProvider)
263+
assert.NotNil(t, config.Net.SASL.TokenProvider)
264+
_, tokenErr := config.Net.SASL.TokenProvider.Token()
265+
assert.NotNil(t, tokenErr)
266+
assert.Contains(t, tokenErr.Error(), "not supported by the Go control plane")
261267
assert.True(t, config.Net.TLS.Enable)
262268
}
263269

0 commit comments

Comments
 (0)