login: Remove social auth code from login controller.

This code will be moved to the EE edition.
This commit is contained in:
Johannes Bornhold 2016-05-24 15:32:39 +02:00
parent ce2aa59dea
commit efe2b61b49

View file

@ -42,7 +42,7 @@ from rhodecode.authentication.base import loadplugin
from rhodecode.lib.base import BaseController, render
from rhodecode.lib.exceptions import UserCreationError
from rhodecode.lib.utils2 import safe_str
from rhodecode.model.db import User, ExternalIdentity
from rhodecode.model.db import User
from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
from rhodecode.model.login_session import LoginSession
from rhodecode.model.meta import Session
@ -122,7 +122,6 @@ class LoginController(BaseController):
not_default = c.rhodecode_user.username != User.DEFAULT_USER
ip_allowed = c.rhodecode_user.ip_allowed
c.social_plugins = self._get_active_social_plugins()
# redirect if already logged in
if c.rhodecode_user.is_authenticated and not_default and ip_allowed:
@ -176,17 +175,6 @@ class LoginController(BaseController):
location=c.came_from, headers=headers)
return render('/login.html')
# TODO: Move this to a better place.
def _get_active_social_plugins(self):
from rhodecode.authentication.base import AuthomaticBase
activated_plugins = SettingsModel().get_auth_plugins()
social_plugins = []
for plugin_id in activated_plugins:
plugin = loadplugin(plugin_id)
if isinstance(plugin, AuthomaticBase) and plugin.is_active():
social_plugins.append(plugin)
return social_plugins
@HasPermissionAnyDecorator('hg.admin', 'hg.register.auto_activate',
'hg.register.manual_activate')
def register(self):
@ -198,16 +186,7 @@ class LoginController(BaseController):
c.captcha_active = bool(captcha_private_key)
c.captcha_public_key = settings.get('rhodecode_captcha_public_key')
c.register_message = settings.get('rhodecode_register_message') or ''
c.social_plugins = self._get_active_social_plugins()
social_data = session.get('rhodecode.social_auth')
c.form_data = {}
if social_data:
c.form_data = {'username': social_data['user'].get('user_name'),
'password': str(uuid.uuid4()),
'email': social_data['user'].get('email')
}
if request.POST:
register_form = RegisterForm()()
@ -228,15 +207,7 @@ class LoginController(BaseController):
raise formencode.Invalid(_msg, _value, None,
error_dict=error_dict)
new_user = UserModel().create_registration(form_result)
if social_data:
plugin_name = 'egg:rhodecode-enterprise-ee#{}'.format(
social_data['credentials.provider']
)
auth_plugin = loadplugin(plugin_name)
if auth_plugin:
auth_plugin.handle_social_data(
session, new_user.user_id, social_data)
UserModel().create_registration(form_result)
h.flash(_('You have successfully registered with RhodeCode'),
category='success')
Session().commit()
@ -317,93 +288,3 @@ class LoginController(BaseController):
def logout(self):
LoginSession().destroy_user_session()
return redirect(url('home'))
def social_auth(self, provider_name):
plugin_name = 'egg:rhodecode-enterprise-ee#{}'.format(
provider_name
)
auth_plugin = loadplugin(plugin_name)
if not auth_plugin:
return self._handle_social_auth_error(request, 'No auth plugin')
result, response = auth_plugin.get_provider_result(request)
if result:
if result.error:
return self._handle_social_auth_error(request, result.error)
elif result.user:
return self._handle_social_auth_success(request, result)
return response
def _handle_social_auth_error(self, request, result):
log.error(result)
h.flash(_('There was an error during OAuth processing.'),
category='error')
return redirect(url('home'))
def _normalize_social_data(self, result):
social_data = {
'user': {'data': result.user.data},
'credentials.provider': result.user.credentials.provider_name,
'credentials.token': result.user.credentials.token,
'credentials.token_secret': result.user.credentials.token_secret,
'credentials.refresh_token': result.user.credentials.refresh_token
}
# normalize data
social_data['user']['id'] = result.user.id
user_name = result.user.username or ''
# use email name as username for google
if (social_data['credentials.provider'] == 'google' and
result.user.email):
user_name = result.user.email
social_data['user']['user_name'] = user_name
social_data['user']['email'] = result.user.email or ''
return social_data
def _handle_social_auth_success(self, request, result):
self._set_came_from()
# Hooray, we have the user!
# OAuth 2.0 and OAuth 1.0a provide only limited user data on login,
# We need to update the user to get more info.
if result.user:
result.user.update()
social_data = self._normalize_social_data(result)
session['rhodecode.social_auth'] = social_data
plugin_name = 'egg:rhodecode-enterprise-ee#{}'.format(
social_data['credentials.provider']
)
auth_plugin = loadplugin(plugin_name)
# user is logged so bind his external identity with account
if request.user and request.user.username != User.DEFAULT_USER:
if auth_plugin:
auth_plugin.handle_social_data(
session, request.user.user_id, social_data)
session.pop('rhodecode.social_auth', None)
Session().commit()
return redirect(url('my_account_oauth'))
else:
user = ExternalIdentity.user_by_external_id_and_provider(
social_data['user']['id'],
social_data['credentials.provider']
)
# user tokens are already found in our db
if user:
if auth_plugin:
auth_plugin.handle_social_data(
session, user.user_id, social_data)
session.pop('rhodecode.social_auth', None)
headers = self._store_user_in_session(user.username)
raise self._redirect_to_origin(
location=c.came_from, headers=headers)
else:
msg = _('You need to finish registration '
'process to bind your external identity to your '
'account or sign in to existing account')
h.flash(msg, category='success')
return redirect(url('register'))