git.iko.soy/typeable/oauth2-proxy
on master help sign in
Getting mail for Azure provider fix + tests
commit5acf96b75d2dc60656e9c99ac64b07565c2c8410 authorTomas Pramuka <tomas.pramuka@honeywell.com> dateWed 29 Jun 2016, 09:00 (10 years ago) parentf9e6494
2 files changed+107−4
providers/azure.go+40−2 providers/azure_test.go+67−2
providers/azure.go+40−2
@@ -7,6 +7,7 @@ import (
77 "log"
88 "net/http"
99 "net/url"
10+ "github.com/bitly/go-simplejson"
1011)
1112
1213type AzureProvider struct {
@@ -65,7 +66,27 @@ func getAzureHeader(access_token string) http.Header {
6566 return header
6667}
6768
69+func getEmailFromJSON(json *simplejson.Json) (string, error) {
70+ var email string
71+ var err error
72+
73+ email, err = json.Get("mail").String()
74+
75+ if err != nil || email == "" {
76+ otherMails, otherMailsErr := json.Get("otherMails").Array()
77+ if len(otherMails) > 0{
78+ email = otherMails[0].(string)
79+ }
80+ err = otherMailsErr
81+ }
82+
83+ return email, err
84+ }
85+
6886func (p *AzureProvider) GetEmailAddress(s *SessionState) (string, error) {
87+ var email string
88+ var err error
89+
6990 if s.AccessToken == "" {
7091 return "", errors.New("missing access token")
7192 }
@@ -78,9 +99,26 @@ func (p *AzureProvider) GetEmailAddress(s *SessionState) (string, error) {
7899 json, err := api.Request(req)
79100
80101 if err != nil {
81− log.Printf("failed making request %s", err)
82102 return "", err
83103 }
84104
85− return json.Get("mail").String()
105+ email, err = getEmailFromJSON(json)
106+
107+ if err == nil && email != "" {
108+ return email, err
109+ }
110+
111+ email, err = json.Get("userPrincipalName").String()
112+
113+ if err != nil {
114+ log.Printf("failed making request %s", err)
115+ return "", err
116+ }
117+
118+ if email == "" {
119+ log.Printf("failed to get email address")
120+ return "", err
121+ }
122+
123+ return email, err
86124}
providers/azure_test.go+67−2
@@ -125,11 +125,76 @@ func TestAzureProviderGetEmailAddress(t *testing.T) {
125125 b := testAzureBackend(`{ "mail": "user@windows.net" }`)
126126 defer b.Close()
127127
128− b_url, _ := url.Parse(b.URL)
129− p := testAzureProvider(b_url.Host)
128+ bURL, _ := url.Parse(b.URL)
129+ p := testAzureProvider(bURL.Host)
130130
131131 session := &SessionState{AccessToken: "imaginary_access_token"}
132132 email, err := p.GetEmailAddress(session)
133133 assert.Equal(t, nil, err)
134134 assert.Equal(t, "user@windows.net", email)
135135}
136+
137+func TestAzureProviderGetEmailAddressMailNull(t *testing.T) {
138+ b := testAzureBackend(`{ "mail": null, "otherMails": ["user@windows.net", "altuser@windows.net"] }`)
139+ defer b.Close()
140+
141+ bURL, _ := url.Parse(b.URL)
142+ p := testAzureProvider(bURL.Host)
143+
144+ session := &SessionState{AccessToken: "imaginary_access_token"}
145+ email, err := p.GetEmailAddress(session)
146+ assert.Equal(t, nil, err)
147+ assert.Equal(t, "user@windows.net", email)
148+}
149+
150+func TestAzureProviderGetEmailAddressGetUserPrincipalName(t *testing.T) {
151+ b := testAzureBackend(`{ "mail": null, "otherMails": [], "userPrincipalName": "user@windows.net" }`)
152+ defer b.Close()
153+
154+ bURL, _ := url.Parse(b.URL)
155+ p := testAzureProvider(bURL.Host)
156+
157+ session := &SessionState{AccessToken: "imaginary_access_token"}
158+ email, err := p.GetEmailAddress(session)
159+ assert.Equal(t, nil, err)
160+ assert.Equal(t, "user@windows.net", email)
161+}
162+
163+func TestAzureProviderGetEmailAddressFailToGetEmailAddress(t *testing.T) {
164+ b := testAzureBackend(`{ "mail": null, "otherMails": [], "userPrincipalName": null }`)
165+ defer b.Close()
166+
167+ bURL, _ := url.Parse(b.URL)
168+ p := testAzureProvider(bURL.Host)
169+
170+ session := &SessionState{AccessToken: "imaginary_access_token"}
171+ email, err := p.GetEmailAddress(session)
172+ assert.Equal(t, "type assertion to string failed", err.Error())
173+ assert.Equal(t, "", email)
174+}
175+
176+func TestAzureProviderGetEmailAddressEmptyUserPrincipalName(t *testing.T) {
177+ b := testAzureBackend(`{ "mail": null, "otherMails": [], "userPrincipalName": "" }`)
178+ defer b.Close()
179+
180+ bURL, _ := url.Parse(b.URL)
181+ p := testAzureProvider(bURL.Host)
182+
183+ session := &SessionState{AccessToken: "imaginary_access_token"}
184+ email, err := p.GetEmailAddress(session)
185+ assert.Equal(t, nil, err)
186+ assert.Equal(t, "", email)
187+}
188+
189+func TestAzureProviderGetEmailAddressIncorrectOtherMails(t *testing.T) {
190+ b := testAzureBackend(`{ "mail": null, "otherMails": "", "userPrincipalName": null }`)
191+ defer b.Close()
192+
193+ bURL, _ := url.Parse(b.URL)
194+ p := testAzureProvider(bURL.Host)
195+
196+ session := &SessionState{AccessToken: "imaginary_access_token"}
197+ email, err := p.GetEmailAddress(session)
198+ assert.Equal(t, "type assertion to string failed", err.Error())
199+ assert.Equal(t, "", email)
200+}