76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
|
from __future__ import absolute_import, print_function
|
||
|
|
||
|
from django import forms
|
||
|
|
||
|
from sentry.auth.view import AuthView, ConfigureView
|
||
|
from sentry.models import AuthIdentity
|
||
|
|
||
|
from .client import PassbookClient
|
||
|
|
||
|
|
||
|
def _get_name_from_email(email):
|
||
|
"""
|
||
|
Given an email return a capitalized name. Ex. john.smith@example.com would return John Smith.
|
||
|
"""
|
||
|
name = email.rsplit('@', 1)[0]
|
||
|
name = ' '.join([n_part.capitalize() for n_part in name.split('.')])
|
||
|
return name
|
||
|
|
||
|
|
||
|
class FetchUser(AuthView):
|
||
|
def __init__(self, client_id, client_secret, *args, **kwargs):
|
||
|
self.client = PassbookClient(client_id, client_secret)
|
||
|
super(FetchUser, self).__init__(*args, **kwargs)
|
||
|
|
||
|
def handle(self, request, helper):
|
||
|
access_token = helper.fetch_state('data')['access_token']
|
||
|
|
||
|
user = self.client.get_user(access_token)
|
||
|
|
||
|
# A user hasn't set their name in their Passbook profile so it isn't
|
||
|
# populated in the response
|
||
|
if not user.get('name'):
|
||
|
user['name'] = _get_name_from_email(user['email'])
|
||
|
|
||
|
helper.bind_state('user', user)
|
||
|
|
||
|
return helper.next_step()
|
||
|
|
||
|
|
||
|
class ConfirmEmailForm(forms.Form):
|
||
|
email = forms.EmailField(label='Email')
|
||
|
|
||
|
|
||
|
class ConfirmEmail(AuthView):
|
||
|
def handle(self, request, helper):
|
||
|
user = helper.fetch_state('user')
|
||
|
|
||
|
# TODO(dcramer): this isnt ideal, but our current flow doesnt really
|
||
|
# support this behavior;
|
||
|
try:
|
||
|
auth_identity = AuthIdentity.objects.select_related('user').get(
|
||
|
auth_provider=helper.auth_provider,
|
||
|
ident=user['id'],
|
||
|
)
|
||
|
except AuthIdentity.DoesNotExist:
|
||
|
pass
|
||
|
else:
|
||
|
user['email'] = auth_identity.user.email
|
||
|
|
||
|
if user.get('email'):
|
||
|
return helper.next_step()
|
||
|
|
||
|
form = ConfirmEmailForm(request.POST or None)
|
||
|
if form.is_valid():
|
||
|
user['email'] = form.cleaned_data['email']
|
||
|
helper.bind_state('user', user)
|
||
|
return helper.next_step()
|
||
|
|
||
|
return self.respond('sentry_auth_passbook/enter-email.html', {
|
||
|
'form': form,
|
||
|
})
|
||
|
|
||
|
class PassbookConfigureView(ConfigureView):
|
||
|
def dispatch(self, request, organization, auth_provider):
|
||
|
return self.render('sentry_auth_passbook/configure.html')
|