def is_authenticated(self, request): if request.user and request.user.is_authenticated(): return True # To avoid patching django-piston, use a partial to cope with # piston not sending in request when called later. self.challenge = partial(self._challenge, request=request) # Authenticate the user using Piston, rv will be True or False # depending upon how it went. rv = super(AMOOAuthAuthentication, self).is_authenticated(request) if rv and request.user: # The user is there, but we need to alter the user to be # a user specified in the request. Specifically chose this # term to avoid conflict with user, which could be used elsewhere. if self.two_legged and 'authenticate_as' in request.REQUEST: pk = request.REQUEST.get('authenticate_as') try: profile = UserProfile.objects.get(pk=pk) except UserProfile.DoesNotExist: log.warning('Cannot find user: %s' % pk) return False if profile.deleted or profile.confirmationcode: log.warning( 'Tried to use deleted or unconfirmed user: %s' % pk) return False log.info('Authenticating as: %s' % pk) request.user = profile # If that worked and request.user got set, setup AMO specific bits. ACLMiddleware().process_request(request) else: # The piston middleware could find a consumer, but no # user on that consumer. If it does it returns True, but # request.user is None, which then blows up other things. request.user = AnonymousUser() return False return rv
def _login(request, template=None, data=None, dont_redirect=False): data = data or {} # In case we need it later. See below. get_copy = request.GET.copy() if 'to' in request.GET: request = _clean_next_url(request) if request.user.is_authenticated(): return http.HttpResponseRedirect( request.GET.get('to', settings.LOGIN_REDIRECT_URL)) data['login_source_form'] = (waffle.switch_is_active('fxa-auth') and not request.POST) limited = getattr(request, 'limited', 'recaptcha_shown' in request.POST) user = None login_status = None if 'username' in request.POST: try: # We are doing all this before we try and validate the form. user = UserProfile.objects.get(email=request.POST['username']) limited = ( (user.failed_login_attempts >= settings.LOGIN_RATELIMIT_USER) or limited) login_status = False except UserProfile.DoesNotExist: log.info('Authentication failure, username invalid (%s)' % request.POST['username']) pass partial_form = partial(forms.AuthenticationForm, use_recaptcha=limited) r = auth.views.login(request, template_name=template, redirect_field_name='to', authentication_form=partial_form, extra_context=data) if isinstance(r, http.HttpResponseRedirect): # Django's auth.views.login has security checks to prevent someone from # redirecting to another domain. Since we want to allow this in # certain cases, we have to make a new response object here to replace # the above. request.GET = get_copy request = _clean_next_url(request) next_path = request.GET['to'] if waffle.switch_is_active('fxa-auth'): if next_path == '/': next_path = None next_path = urlparams(reverse('users.migrate'), to=next_path) r = http.HttpResponseRedirect(next_path) # Succsesful log in according to django. Now we do our checks. I do # the checks here instead of the form's clean() because I want to use # the messages framework and it's not available in the request there. if user.deleted: logout(request) log.warning(u'Attempt to log in with deleted account (%s)' % user) messages.error(request, _('Wrong email address or password!')) data.update({'form': partial_form()}) user.log_login_attempt(False) log.info('Authentication Failure, account is deactivated (%s)' % request.user) return render(request, template, data) if user.confirmationcode: logout(request) log.info(u'Attempt to log in with unconfirmed account (%s)' % user) msg1 = _(u'A link to activate your user account was sent by email ' u'to your address {0}. You have to click it before you ' u'can log in.').format(user.email) url = "%s%s" % (settings.SITE_URL, reverse('users.confirm.resend', args=[user.id])) msg2 = _('If you did not receive the confirmation email, make ' 'sure your email service did not mark it as "junk ' 'mail" or "spam". If you need to, you can have us ' '<a href="%s">resend the confirmation message</a> ' 'to your email address mentioned above.') % url messages.error(request, _('Activation Email Sent'), msg1) messages.info(request, _('Having Trouble?'), msg2, title_safe=True, message_safe=True) data.update({'form': partial_form()}) user.log_login_attempt(False) return render(request, template, data) rememberme = request.POST.get('rememberme', None) if rememberme: request.session.set_expiry(settings.SESSION_COOKIE_AGE) log.debug( u'User (%s) logged in successfully with "remember me" set' % user) login_status = True if dont_redirect: # We're recalling the middleware to re-initialize user ACLMiddleware().process_request(request) r = render(request, template, data) if login_status is not None: user.log_login_attempt(login_status) log.info('Authentication Failure, incorrect password (%s)' % request.POST['username']) return r