Skip to content

Commit 3b439f6

Browse files
committed
Relocate provider specific validation logic
1 parent cb40882 commit 3b439f6

File tree

5 files changed

+55
-20
lines changed

5 files changed

+55
-20
lines changed

internal/auth/authenticator_test.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1635,8 +1635,9 @@ func TestHostHeader(t *testing.T) {
16351635
}
16361636
}
16371637

1638-
func TestDefaultProviderApiSettings(t *testing.T) {
1638+
func TestGoogleProviderApiSettings(t *testing.T) {
16391639
opts := testOpts("abced", "testtest")
1640+
opts.Provider = "google"
16401641
opts.Validate()
16411642
proxy, _ := NewAuthenticator(opts, AssignProvider(opts), func(p *Authenticator) error {
16421643
p.Validator = func(string) bool { return true }
@@ -1653,6 +1654,7 @@ func TestDefaultProviderApiSettings(t *testing.T) {
16531654

16541655
func TestGoogleGroupInvalidFile(t *testing.T) {
16551656
opts := testOpts("abced", "testtest")
1657+
opts.Provider = "google"
16561658
opts.GoogleAdminEmail = "[email protected]"
16571659
opts.GoogleServiceAccountJSON = "file_doesnt_exist.json"
16581660
opts.Validate()
@@ -1663,3 +1665,14 @@ func TestGoogleGroupInvalidFile(t *testing.T) {
16631665
testutil.NotEqual(t, nil, err)
16641666
testutil.Equal(t, "invalid Google credentials file: file_doesnt_exist.json", err.Error())
16651667
}
1668+
1669+
func TestUnimplementedProvider(t *testing.T) {
1670+
opts := testOpts("abced", "testtest")
1671+
opts.Validate()
1672+
_, err := NewAuthenticator(opts, AssignProvider(opts), func(p *Authenticator) error {
1673+
p.Validator = func(string) bool { return true }
1674+
return nil
1675+
})
1676+
testutil.NotEqual(t, nil, err)
1677+
testutil.Equal(t, "unimplemented provider: \"\"", err.Error())
1678+
}

internal/auth/options.go

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package auth
33
import (
44
"crypto"
55
"encoding/base64"
6-
"errors"
76
"fmt"
87
"net/http"
98
"net/url"
@@ -170,7 +169,7 @@ func (o *Options) Validate() error {
170169

171170
o.redirectURL, msgs = parseURL(o.RedirectURL, "redirect", msgs)
172171

173-
msgs = parseProviderInfo(o, msgs)
172+
msgs = validateEndpoints(o, msgs)
174173

175174
decodedCookieSecret, err := base64.StdEncoding.DecodeString(o.CookieSecret)
176175
if err != nil {
@@ -198,15 +197,6 @@ func (o *Options) Validate() error {
198197
o.CookieExpire.String()))
199198
}
200199

201-
if o.GoogleAdminEmail != "" || o.GoogleServiceAccountJSON != "" {
202-
if o.GoogleAdminEmail == "" {
203-
msgs = append(msgs, "missing setting: google-admin-email")
204-
}
205-
if o.GoogleServiceAccountJSON == "" {
206-
msgs = append(msgs, "missing setting: google-service-account-json")
207-
}
208-
}
209-
210200
msgs = validateCookieName(o, msgs)
211201

212202
if o.StatsdHost == "" {
@@ -224,7 +214,7 @@ func (o *Options) Validate() error {
224214
return nil
225215
}
226216

227-
func parseProviderInfo(o *Options, msgs []string) []string {
217+
func validateEndpoints(o *Options, msgs []string) []string {
228218
_, msgs = parseURL(o.SignInURL, "signin", msgs)
229219
_, msgs = parseURL(o.RedeemURL, "redeem", msgs)
230220
_, msgs = parseURL(o.ProfileURL, "profile", msgs)
@@ -267,18 +257,23 @@ func newProvider(o *Options) (providers.Provider, error) {
267257

268258
var singleFlightProvider providers.Provider
269259
switch o.Provider {
270-
default: // Google
260+
case providers.GoogleProviderName: // Google
271261
if o.GoogleServiceAccountJSON != "" {
272262
_, err := os.Open(o.GoogleServiceAccountJSON)
273263
if err != nil {
274-
return nil, errors.New("invalid Google credentials file: " + o.GoogleServiceAccountJSON)
264+
return nil, fmt.Errorf("invalid Google credentials file: %s", o.GoogleServiceAccountJSON)
275265
}
276266
}
277-
googleProvider := providers.NewGoogleProvider(p, o.GoogleAdminEmail, o.GoogleServiceAccountJSON)
267+
googleProvider, err := providers.NewGoogleProvider(p, o.GoogleAdminEmail, o.GoogleServiceAccountJSON)
268+
if err != nil {
269+
return nil, err
270+
}
278271
cache := groups.NewFillCache(googleProvider.PopulateMembers, o.GroupsCacheRefreshTTL)
279272
googleProvider.GroupsCache = cache
280273
o.GroupsCacheStopFunc = cache.Stop
281274
singleFlightProvider = providers.NewSingleFlightProvider(googleProvider)
275+
default:
276+
return nil, fmt.Errorf("unimplemented provider: %q", o.Provider)
282277
}
283278

284279
return singleFlightProvider, nil

internal/auth/providers/google.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,16 @@ type GoogleProvider struct {
3131
}
3232

3333
// NewGoogleProvider returns a new GoogleProvider and sets the provider url endpoints.
34-
func NewGoogleProvider(p *ProviderData, adminEmail, credsFilePath string) *GoogleProvider {
34+
func NewGoogleProvider(p *ProviderData, adminEmail, credsFilePath string) (*GoogleProvider, error) {
35+
if adminEmail != "" || credsFilePath != "" {
36+
if adminEmail == "" {
37+
return nil, errors.New("missing setting: google-admin-email")
38+
}
39+
if credsFilePath == "" {
40+
return nil, errors.New("missing setting: google-service-account-json")
41+
}
42+
}
43+
3544
p.ProviderName = "Google"
3645
if p.SignInURL.String() == "" {
3746
p.SignInURL = &url.URL{Scheme: "https",
@@ -77,14 +86,14 @@ func NewGoogleProvider(p *ProviderData, adminEmail, credsFilePath string) *Googl
7786
if credsFilePath != "" {
7887
credsReader, err := os.Open(credsFilePath)
7988
if err != nil {
80-
panic("could not read google credentials file")
89+
return nil, errors.New("could not read google credentials file")
8190
}
8291
googleProvider.AdminService = &GoogleAdminService{
8392
adminService: getAdminService(adminEmail, credsReader),
8493
cb: googleProvider.cb,
8594
}
8695
}
87-
return googleProvider
96+
return googleProvider, nil
8897
}
8998

9099
// SetStatsdClient sets the google provider and admin service statsd client

internal/auth/providers/google_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ func newGoogleProvider(providerData *ProviderData) *GoogleProvider {
3737
ValidateURL: &url.URL{},
3838
Scope: ""}
3939
}
40-
return NewGoogleProvider(providerData, "", "")
40+
provider, _ := NewGoogleProvider(providerData, "", "")
41+
return provider
4142
}
4243

4344
func TestGoogleProviderDefaults(t *testing.T) {

internal/auth/providers/providers.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,23 @@ var (
2424
ErrServiceUnavailable = errors.New("SERVICE_UNAVAILABLE")
2525
)
2626

27+
const (
28+
// AzureProviderName identifies the Azure AD provider
29+
AzureProviderName = "azure"
30+
// FacebookProviderName identifies the Facebook provider
31+
FacebookProviderName = "facebook"
32+
// GitHubProviderName identifies the GitHub provider
33+
GitHubProviderName = "github"
34+
// GitLabProviderName identifies the GitLab provider
35+
GitLabProviderName = "gitlab"
36+
// GoogleProviderName identifies the Google provider
37+
GoogleProviderName = "google"
38+
// LinkedInProviderName identifies the LinkedIn provider
39+
LinkedInProviderName = "linkedin"
40+
// OIDCProviderName identifies the generic OpenID Connect provider
41+
OIDCProviderName = "oidc"
42+
)
43+
2744
// Provider is an interface exposing functions necessary to authenticate with a given provider.
2845
type Provider interface {
2946
Data() *ProviderData

0 commit comments

Comments
 (0)