def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend,))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError("Incorrect authentication " + "service")

            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                backend_name = backend.AUTH_BACKEND.name

                logger.error(unicode(e), exc_info=True, extra=dict(request=request))

                # Why!?
                msg = str(e)

                if "django.contrib.messages" in settings.INSTALLED_APPS:
                    from django.contrib.messages.api import error

                    error(request, msg, extra_tags=backend_name)
                else:
                    logger.warn("Messages framework not in place, some " + "errors have not been shown to the user.")
                return HttpResponseRedirect(BACKEND_ERROR_REDIRECT)
Example #2
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend,))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError('Incorrect authentication ' + \
                                               'service')

            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                if setting('DEBUG'):
                    raise
                backend_name = backend.AUTH_BACKEND.name

                log('error', unicode(e), exc_info=True,
                    extra=dict(request=request))

                if 'django.contrib.messages' in setting('INSTALLED_APPS'):
                    from django.contrib.messages.api import error
                    error(request, unicode(e), extra_tags=backend_name)
                else:
                    log('warn', 'Messages framework not in place, some '+
                                'errors have not been shown to the user.')

                url = setting('SOCIAL_AUTH_BACKEND_ERROR_URL', LOGIN_ERROR_URL)
                return HttpResponseRedirect(url)
Example #3
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend,))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError('Incorrect authentication ' + \
                                               'service')

            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                backend_name = backend.AUTH_BACKEND.name
                msg = str(e)

                if 'django.contrib.messages' in settings.INSTALLED_APPS:
                    from django.contrib.messages.api import error
                    error(request, msg, extra_tags=backend_name)
                else:
                    if ERROR_KEY:  # store error in session
                        request.session[ERROR_KEY] = msg
                    if NAME_KEY:  # store the backend name for convenience
                        request.session[NAME_KEY] = backend_name
                return HttpResponseRedirect(BACKEND_ERROR_REDIRECT)
Example #4
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend,))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError('Incorrect authentication ' + \
                                               'service')

            RAISE_EXCEPTIONS = backend_setting(backend, 'SOCIAL_AUTH_RAISE_EXCEPTIONS', setting('DEBUG'))
            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                if RAISE_EXCEPTIONS:
                    raise
                log('error', unicode(e), exc_info=True, extra={
                    'request': request
                })

                mod, func_name = PROCESS_EXCEPTIONS.rsplit('.', 1)
                try:
                    process = getattr(import_module(mod), func_name,
                                      lambda *args: None)
                except ImportError:
                    pass
                else:
                    process(request, backend, e)

                url = backend_setting(backend, 'SOCIAL_AUTH_BACKEND_ERROR_URL',
                                      LOGIN_ERROR_URL)
                return HttpResponseRedirect(url)
Example #5
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend, ))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError('Incorrect authentication ' + \
                                               'service')

            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                if RAISE_EXCEPTIONS:
                    raise
                log('error',
                    unicode(e),
                    exc_info=True,
                    extra={'request': request})

                mod, func_name = PROCESS_EXCEPTIONS.rsplit('.', 1)
                try:
                    process = getattr(import_module(mod), func_name,
                                      lambda *args: None)
                except ImportError:
                    pass
                else:
                    process(request, backend, e)

                url = backend_setting(backend, 'SOCIAL_AUTH_BACKEND_ERROR_URL',
                                      LOGIN_ERROR_URL)
                return HttpResponseRedirect(url)
Example #6
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend,))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError(
                    "Incorrect authentication " + "service or service API settings not available!"
                )

            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                if RAISE_EXCEPTIONS:
                    raise
                backend_name = backend.AUTH_BACKEND.name

                log("error", unicode(e), exc_info=True, extra=dict(request=request))

                if "django.contrib.messages" in setting("INSTALLED_APPS"):
                    from django.contrib.messages.api import error

                    error(request, unicode(e), extra_tags=backend_name)
                else:
                    log("warn", "Messages framework not in place, some " + "errors have not been shown to the user.")

                url = backend_setting(backend, "SOCIAL_AUTH_BACKEND_ERROR_URL", LOGIN_ERROR_URL)
                return HttpResponseRedirect(url)
Example #7
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend, ))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError('Incorrect authentication ' + \
                                               'service')

            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                backend_name = backend.AUTH_BACKEND.name

                logger.error(unicode(e),
                             exc_info=True,
                             extra=dict(request=request))

                if 'django.contrib.messages' in settings.INSTALLED_APPS:
                    from django.contrib.messages.api import error
                    error(request, unicode(e), extra_tags=backend_name)
                else:
                    logger.warn('Messages framework not in place, some ' +
                                'errors have not been shown to the user.')
                return HttpResponseRedirect(BACKEND_ERROR_REDIRECT)
Example #8
0
def disconnect(request, backend):
    """Disconnects given backend from current logged in user."""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError("Incorrect authentication service")
    backend.disconnect(request.user)
    url = request.REQUEST.get(REDIRECT_FIELD_NAME, "") or DEFAULT_REDIRECT
    return HttpResponseRedirect(url)
Example #9
0
def associate_complete(request, backend):
    """Authentication complete process"""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError("Incorrect authentication service")
    backend.auth_complete(user=request.user)
    url = request.session.pop(REDIRECT_FIELD_NAME, "") or getattr(settings, "LOGIN_REDIRECT_URL", "")
    return HttpResponseRedirect(url)
Example #10
0
def associate_complete(request, backend):
    """Authentication complete process"""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')
    backend.auth_complete(user=request.user)
    url = request.session.pop(REDIRECT_FIELD_NAME, '') or DEFAULT_REDIRECT
    return HttpResponseRedirect(url)
Example #11
0
def disconnect(request, backend):
    """Disconnects given backend from current logged in user."""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')
    backend.disconnect(request.user)
    url = request.REQUEST.get(REDIRECT_FIELD_NAME, '') or DEFAULT_REDIRECT
    return HttpResponseRedirect(url)
Example #12
0
def disconnect(request, backend):
    """Disconnects given backend from current logged in user."""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')
    backend.disconnect(request.user)
    url = request.REQUEST.get(REDIRECT_FIELD_NAME, '') or \
          getattr(settings, 'LOGIN_REDIRECT_URL', '')
    return HttpResponseRedirect(url)
Example #13
0
 def wrapper(request, backend, *args, **kwargs):
     if redirect_name:
         redirect = reverse(redirect_name, args=(backend,))
     else:
         redirect = request.path
     request.social_auth_backend = get_backend(backend, request, redirect)
     if request.social_auth_backend is None:
         raise WrongBackend(backend)
     return func(request, request.social_auth_backend, *args, **kwargs)
Example #14
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend,))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError("Incorrect authentication " + "service")
            return func(request, backend, *args, **kwargs)
Example #15
0
 def wrapper(request, backend, *args, **kwargs):
     if redirect_name:
         redirect = reverse(redirect_name, args=(backend,))
     else:
         redirect = request.path
     request.social_auth_backend = get_backend(backend, request,
                                               redirect)
     if request.social_auth_backend is None:
         raise WrongBackend(backend)
     return func(request, request.social_auth_backend, *args, **kwargs)
Example #16
0
def disconnect(request, backend, association_id=None):
    """Disconnects given backend from current logged in user."""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')
    backend.disconnect(request.user, association_id)
    url = request.REQUEST.get(REDIRECT_FIELD_NAME, '') or \
          DISCONNECT_REDIRECT_URL or \
          DEFAULT_REDIRECT
    return HttpResponseRedirect(url)
Example #17
0
    def obj_create(self, bundle, request=None, **kwargs):
        bundle.obj = Obj()
        bundle.obj.id = 1
        backend = get_backend('linkedin', bundle.request, bundle.request.path)
        backend.name = 'linkedin'
        access_token_url = 'https://www.linkedin.com/uas/oauth2/accessToken'
        names = getattr(settings, 'LINKEDIN_EXTRA_DATA')

        extra = ','.join(dict(names).keys())
        people_api_url = 'https://api.linkedin.com/v1/people/' \
                         '~:({})'.format(extra)

        payload = dict(client_id=bundle.data['clientId'],
                       redirect_uri=bundle.data['redirectUri'],
                       client_secret=backend.consumer.secret,
                       code=bundle.data['code'],
                       grant_type='authorization_code')

        # Step 1. Exchange authorization code for access token.
        r = requests.post(access_token_url, data=payload)
        response = json.loads(r.text)
        params = dict(oauth2_access_token=response['access_token'],
                      format='json')

        # Step 2. Retrieve information about the current user.
        r = requests.get(people_api_url, params=params)
        profile = json.loads(r.text)

        data = {}
        for key in profile.keys():
            value = profile.get(key)
            alias = self.convert(key)
            data[alias] = value

        uid = data.get('id')

        social_user = UserSocialAuth.get_social_auth('linkedin', uid)
        if social_user is None:
            social_user = UserSocialAuth.create_social_auth(
                bundle.request.user, uid, 'linkedin')
            social_user.extra_data = data
            social_user.save()
        else:
            raise ImmediateHttpResponse(
                HttpForbidden("Linkedin already associated"))

        extra_data = params

        if extra_data and social_user.extra_data != extra_data:
            if social_user.extra_data:
                social_user.extra_data.update(extra_data)
            else:
                social_user.extra_data = extra_data
            social_user.save()
        return bundle
Example #18
0
def auth_process(request, backend, complete_url_name, default_final_url):
    """Authenticate using social backend"""
    redirect = reverse(complete_url_name, args=(backend,))
    backend = get_backend(backend, request, redirect)
    if not backend:
        return HttpResponseServerError("Incorrect authentication service")
    request.session[REDIRECT_FIELD_NAME] = request.GET.get(REDIRECT_FIELD_NAME, default_final_url)
    if backend.uses_redirect:
        return HttpResponseRedirect(backend.auth_url())
    else:
        return HttpResponse(backend.auth_html(), content_type="text/html;charset=UTF-8")
Example #19
0
def complete(request, backend):
    """Authentication complete process"""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError("Incorrect authentication service")
    user = backend.auth_complete()
    if user and getattr(user, "is_active", True):
        login(request, user)
        url = request.session.pop(REDIRECT_FIELD_NAME, "") or getattr(settings, "LOGIN_REDIRECT_URL", "")
    else:
        url = getattr(settings, "LOGIN_ERROR_URL", settings.LOGIN_URL)
    return HttpResponseRedirect(url)
Example #20
0
def complete_process(request, backend):
    """Authentication complete process"""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')

    try:
        user = backend.auth_complete(request=request)
    except ValueError, e:  # some Authentication error ocurred
        user = None
        error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', None)
        if error_key:  # store error in session
            request.session[error_key] = str(e)
Example #21
0
def complete_process(request, backend):
    """Authentication complete process"""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError("Incorrect authentication service")

    try:
        user = backend.auth_complete()
    except ValueError, e:  # some Authentication error ocurred
        user = None
        error_key = getattr(settings, "SOCIAL_AUTH_ERROR_KEY", None)
        if error_key:  # store error in session
            request.session[error_key] = str(e)
Example #22
0
def auth_process(request, backend, complete_url_name):
    """Authenticate using social backend"""
    redirect = reverse(complete_url_name, args=(backend,))
    backend = get_backend(backend, request, redirect)
    if not backend:
        return HttpResponseServerError("Incorrect authentication service")
    data = request.REQUEST
    # Check and sanitize a user-defined GET/POST redirect_to field value.
    redirect = sanitize_redirect(request.get_host(), data.get(REDIRECT_FIELD_NAME))
    request.session[REDIRECT_FIELD_NAME] = redirect or DEFAULT_REDIRECT
    if backend.uses_redirect:
        return HttpResponseRedirect(backend.auth_url())
    else:
        return HttpResponse(backend.auth_html(), content_type="text/html;charset=UTF-8")
Example #23
0
def auth_complete(request, backend):
    """Complete auth process. Return authenticated user or None."""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')

    user = request.user if request.user.is_authenticated() else None

    try:
        user = backend.auth_complete(user=user)
    except ValueError, e:  # some Authentication error ocurred
        error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', None)
        if error_key:  # store error in session
            request.session[error_key] = str(e)
Example #24
0
def auth_complete(request, backend):
    """Complete auth process. Return authenticated user or None."""
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')

    user = request.user if request.user.is_authenticated() else None

    try:
        user = backend.auth_complete(user=user)
    except ValueError, e:  # some Authentication error ocurred
        error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', None)
        if error_key:  # store error in session
            request.session[error_key] = str(e)
Example #25
0
def auth_process(request, backend, complete_url_name):
    """Authenticate using social backend"""
    redirect = reverse(complete_url_name, args=(backend,))
    backend = get_backend(backend, request, redirect)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')
    # Check and sanitize a user-defined GET/POST redirect_to field value.
    redirect = sanitize_redirect(request.get_host(),
                                 request.REQUEST.get(REDIRECT_FIELD_NAME))
    request.session[REDIRECT_FIELD_NAME] = redirect or DEFAULT_REDIRECT
    if backend.uses_redirect:
        return HttpResponseRedirect(backend.auth_url())
    else:
        return HttpResponse(backend.auth_html(),
                            content_type='text/html;charset=UTF-8')
Example #26
0
def disconnect_identity(request, identity_id):
    if request.method != "POST":
        raise NotImplementedError

    try:
        auth = UserSocialAuth.objects.get(id=identity_id)
    except UserSocialAuth.DoesNotExist:
        return HttpResponseRedirect(
            reverse("sentry-account-settings-identities"))

    backend = get_backend(auth.provider, request, "/")
    if backend is None:
        raise Exception(u"Backend was not found for request: {}".format(
            auth.provider))

    # stop this from bubbling up errors to social-auth's middleware
    # XXX(dcramer): IM SO MAD ABOUT THIS
    try:
        backend.disconnect(request.user, identity_id)
    except Exception as exc:
        import sys

        exc_tb = sys.exc_info()[2]
        six.reraise(Exception, exc, exc_tb)
        del exc_tb

    # XXX(dcramer): we experienced an issue where the identity still existed,
    # and given that this is a cheap query, lets error hard in that case
    assert not UserSocialAuth.objects.filter(user=request.user,
                                             id=identity_id).exists()

    backend_name = backend.AUTH_BACKEND.name

    messages.add_message(
        request,
        messages.SUCCESS,
        u"Your {} identity has been disconnected.".format(
            settings.AUTH_PROVIDER_LABELS.get(backend_name, backend_name)),
    )
    logger.info(
        "user.identity.disconnect",
        extra={
            "user_id": request.user.id,
            "ip_address": request.META["REMOTE_ADDR"],
            "usersocialauth_id": identity_id,
        },
    )
    return HttpResponseRedirect(reverse("sentry-account-settings-identities"))
    def delete(self, request, user, identity_id):
        """
        Disconnect a Identity from Account
        ```````````````````````````````````````````````````````

        Disconnects a social auth identity from a sentry account

        :pparam string identity_id: identity id
        :auth: required
        """

        try:
            auth = UserSocialAuth.objects.get(id=identity_id)
        except UserSocialAuth.DoesNotExist:
            return Response(status=404)

        backend = get_backend(auth.provider, request, '/')
        if backend is None:
            raise Exception(u'Backend was not found for request: {}'.format(auth.provider))

        # stop this from bubbling up errors to social-auth's middleware
        # XXX(dcramer): IM SO MAD ABOUT THIS
        try:
            backend.disconnect(user, identity_id)
        except Exception as exc:
            import sys
            exc_tb = sys.exc_info()[2]
            six.reraise(Exception, exc, exc_tb)
            del exc_tb

        # XXX(dcramer): we experienced an issue where the identity still existed,
        # and given that this is a cheap query, lets error hard in that case
        assert not UserSocialAuth.objects.filter(
            user=user,
            id=identity_id,
        ).exists()

        logger.info(
            'user.identity.disconnect',
            extra={
                'user_id': user.id,
                'ip_address': request.META['REMOTE_ADDR'],
                'usersocialauth_id': identity_id,
            }
        )

        return Response(status=204)
Example #28
0
    def delete(self, request, user, identity_id):
        """
        Disconnect a Identity from Account
        ```````````````````````````````````````````````````````

        Disconnects a social auth identity from a sentry account

        :pparam string identity_id: identity id
        :auth: required
        """

        try:
            auth = UserSocialAuth.objects.get(id=identity_id)
        except UserSocialAuth.DoesNotExist:
            return Response(status=404)

        backend = get_backend(auth.provider, request, "/")
        if backend is None:
            raise Exception("Backend was not found for request: {}".format(
                auth.provider))

        # stop this from bubbling up errors to social-auth's middleware
        # XXX(dcramer): IM SO MAD ABOUT THIS
        try:
            backend.disconnect(user, identity_id)
        except Exception as exc:
            import sys

            exc_tb = sys.exc_info()[2]
            six.reraise(Exception, exc, exc_tb)
            del exc_tb

        # XXX(dcramer): we experienced an issue where the identity still existed,
        # and given that this is a cheap query, lets error hard in that case
        assert not UserSocialAuth.objects.filter(user=user,
                                                 id=identity_id).exists()

        logger.info(
            "user.identity.disconnect",
            extra={
                "user_id": user.id,
                "ip_address": request.META["REMOTE_ADDR"],
                "usersocialauth_id": identity_id,
            },
        )

        return Response(status=204)
Example #29
0
def disconnect_identity(request, identity_id):
    if request.method != 'POST':
        raise NotImplementedError

    try:
        auth = UserSocialAuth.objects.get(id=identity_id)
    except UserSocialAuth.DoesNotExist:
        return HttpResponseRedirect(reverse('sentry-account-settings-identities'))

    backend = get_backend(auth.provider, request, '/')
    if backend is None:
        raise Exception('Backend was not found for request: {}'.format(auth.provider))

    # stop this from bubbling up errors to social-auth's middleware
    # XXX(dcramer): IM SO MAD ABOUT THIS
    try:
        backend.disconnect(request.user, identity_id)
    except Exception as exc:
        import sys
        exc_tb = sys.exc_info()[2]
        six.reraise(Exception, exc, exc_tb)
        del exc_tb

    # XXX(dcramer): we experienced an issue where the identity still existed,
    # and given that this is a cheap query, lets error hard in that case
    assert not UserSocialAuth.objects.filter(
        user=request.user,
        id=identity_id,
    ).exists()

    backend_name = backend.AUTH_BACKEND.name

    messages.add_message(
        request, messages.SUCCESS, 'Your {} identity has been disconnected.'.format(
            settings.AUTH_PROVIDER_LABELS.get(backend_name, backend_name),
        )
    )
    logger.info(
        'user.identity.disconnect',
        extra={
            'user_id': request.user.id,
            'ip_address': request.META['REMOTE_ADDR'],
            'usersocialauth_id': identity_id,
        }
    )
    return HttpResponseRedirect(reverse('sentry-account-settings-identities'))
Example #30
0
def socialauth_complete(request, backend):
    """
       Authentication complete process -- override from the
       default in django-social-auth to:
        -- collect phone numbers on registration
        -- integrate with django-registration in order
           to confirm email for new users
    """
    backend = get_backend(backend, request, request.path)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')

    try:
        user = backend.auth_complete()
    except ValueError, e:  # some Authentication error ocurred
        user = None
        error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', 'error_msg')
        if error_key:  # store error in session
            request.session[error_key] = str(e)
Example #31
0
def new_user_social_auth(request, backend, username, email=None, template="registration/association.html",
                         form_class_login=AuthenticationForm, form_class_register=RegistrationForm, *args, **kwargs):
    """Complete auth process. Return authenticated user or None."""

    new_data = {}
    if request.user and request.user.is_authenticated():
        new_data['user'] = request.user

    if 'register' in request.POST:
        form_register = form_class_register(request.POST)
        form_login = form_class_login(request)
        if form_register.is_valid():
            new_data['username'] = form_register.cleaned_data['username']
            new_data['user'] = UserSocialAuth.create_user(form_register.cleaned_data['username'],
                                                          form_register.cleaned_data['email'],
                                                          form_register.cleaned_data['password1'])
    else:
        initial_data = { 'username': username }
        if email:
            initial_data.update({ 'email': email })
        form_register = form_class_register(initial=initial_data)
        form_login = form_class_login(request, request.POST or None)
        if form_login.is_valid():
            new_data['user'] = form_login.get_user()

    if new_data:
        if request.session.get(PIPELINE_KEY):
            data = request.session.pop(PIPELINE_KEY)
            backend = get_backend(backend, request, '/')
            idx, xargs, xkwargs = backend.from_session_dict(data, *args, **kwargs)
            xkwargs.update(new_data)
            data = backend.to_session_dict(idx, *xargs, **xkwargs)
            request.session[PIPELINE_KEY] = data
            return complete_process(request, backend, *args, **kwargs)

    context =  {
        'form_register': form_register,
        'form_login': form_login,
        'backend': backend,
    }
    
    return TemplateResponse(request, template, context)
Example #32
0
def do_twitter_registration(data):
    uid = data["twitter"]["id"]
    backend = get_backend("twitter")
    social_user = UserSocialAuth.get_social_auth(backend.name, uid)
    
    if social_user:
        social_user.extra_data = data["twitter"]
        social_user.save()
    
    else:
        
        user = UserSocialAuth.create_user(username=get_username(), email="")
        Profile.objects.create(user=user)
        social_user = UserSocialAuth.objects.create(user=user, provider="twitter", uid=uid, extra_data=data["twitter"])
        
    dd_user_id = social_user.user.id
    twitter_service = SocialServiceLocator.get_instane().build_service_by_name("twitter")
    twitter_service.pull_user_info(dd_user_id, {"access_token": data["twitter"]["access_token"], "twitter_id": uid})

    return dd_user_id 
Example #33
0
def auth_process(request, backend, complete_url_name):
    """Authenticate using social backend"""
    redirect = reverse(complete_url_name, args=(backend,))
    backend = get_backend(backend, request, redirect)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')

    # Save any defined redirect_to value into session
    if REDIRECT_FIELD_NAME in request.REQUEST:
        data = request.POST if request.method == 'POST' else request.GET
        if REDIRECT_FIELD_NAME in data:
            # Check and sanitize a user-defined GET/POST redirect_to field value.
            redirect = sanitize_redirect(request.get_host(),
                                         data[REDIRECT_FIELD_NAME])
            request.session[REDIRECT_FIELD_NAME] = redirect or DEFAULT_REDIRECT

    if backend.uses_redirect:
        return HttpResponseRedirect(backend.auth_url())
    else:
        return HttpResponse(backend.auth_html(),
                            content_type='text/html;charset=UTF-8')
Example #34
0
def disconnect_identity(request, identity_id):
    if request.method != 'POST':
        raise NotImplementedError

    try:
        auth = UserSocialAuth.objects.get(id=identity_id)
    except UserSocialAuth.DoesNotExist:
        return HttpResponseRedirect(
            reverse('sentry-account-settings-identities'))

    backend = get_backend(auth.provider, request, '/')
    if backend is None:
        raise Exception('Backend was not found for request: {}'.format(
            auth.provider))

    # stop this from bubbling up errors to social-auth's middleware
    # XXX(dcramer): IM SO MAD ABOUT THIS
    try:
        backend.disconnect(request.user, identity_id)
    except Exception as exc:
        import sys
        exc_tb = sys.exc_info()[2]
        six.reraise(Exception, exc, exc_tb)
        del exc_tb

    # XXX(dcramer): we experienced an issue where the identity still existed,
    # and given that this is a cheap query, lets error hard in that case
    assert not UserSocialAuth.objects.filter(
        user=request.user,
        id=identity_id,
    ).exists()

    backend_name = backend.AUTH_BACKEND.name

    messages.add_message(
        request, messages.SUCCESS,
        'Your {} association has been revoked.'.format(
            settings.AUTH_PROVIDER_LABELS.get(backend_name, backend_name), ))
    return HttpResponseRedirect(reverse('sentry-account-settings-identities'))
Example #35
0
def auth_process(request, backend, complete_url_name):
    """Authenticate using social backend"""
    redirect = reverse(complete_url_name, args=(backend,))
    backend = get_backend(backend, request, redirect)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')
    data = request.REQUEST
    # Check and sanitize a user-defined GET/POST redirect_to field value.
    redirect = sanitize_redirect(request.get_host(), data.get(REDIRECT_FIELD_NAME))
    try:
        request.session[REDIRECT_FIELD_NAME] = redirect or DEFAULT_REDIRECT
        if backend.uses_redirect:
            return HttpResponseRedirect(backend.auth_url())
        else:
            return HttpResponse(backend.auth_html(),
                            content_type='text/html;charset=UTF-8')
    except ValueError, e:
        error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', None)
        if error_key:  # store error in session
            request.session[error_key] = str(e)
        url = getattr(settings, 'LOGIN_ERROR_URL', settings.LOGIN_URL)
        return HttpResponseRedirect(url)
Example #36
0
        def wrapper(request, backend, *args, **kwargs):
            if redirect_name:
                redirect = reverse(redirect_name, args=(backend,))
            else:
                redirect = request.path
            backend = get_backend(backend, request, redirect)

            if not backend:
                return HttpResponseServerError('Incorrect authentication ' + \
                                               'service')

            try:
                return func(request, backend, *args, **kwargs)
            except Exception, e:  # some error ocurred
                backend_name = backend.AUTH_BACKEND.name

                logger.error(unicode(e), exc_info=True,
                             extra=dict(request=request))

                # Why!?
                msg = str(e)

                if 'django.contrib.messages' in settings.INSTALLED_APPS:
                    from django.contrib.messages.api import error
                    error(request, msg, extra_tags=backend_name)
                else:
                    logger.warn('Messages framework not in place, some '+
                                'errors have not been shown to the user.')
                # What's the use in this, having not both the messages
                # framework and decent logging in place?
                # Also: do we really want to share all and any errors back
                # to the user, in a security-wise sensitive application?
                #
                # else:
                #     if ERROR_KEY:  # store error in session
                #         request.session[ERROR_KEY] = msg
                #     if NAME_KEY:  # store the backend name for convenience
                #         request.session[NAME_KEY] = backend_name
                return HttpResponseRedirect(BACKEND_ERROR_REDIRECT)
Example #37
0
def auth_process(request, backend, complete_url_name):
    """Authenticate using social backend"""
    redirect = reverse(complete_url_name, args=(backend,))
    backend = get_backend(backend, request, redirect)
    if not backend:
        return HttpResponseServerError('Incorrect authentication service')

    # Check and sanitize a user-defined GET/POST redirect_to field value.
    redirect = sanitize_redirect(request.get_host(),
                                 request.REQUEST.get(REDIRECT_FIELD_NAME))

    request.session[REDIRECT_FIELD_NAME] = redirect

    # Store query parameters (if any). These will be tacked on to the end of
    # the login redirect url in complete_process().
    all_params = dict(parse_qsl(request.META['QUERY_STRING']))
    params = [(k, v) for k, v in all_params.items() if not k == REDIRECT_FIELD_NAME]
    request.session[REDIRECT_QUERY_STRING] = urlencode(params)

    if backend.uses_redirect:
        return HttpResponseRedirect(backend.auth_url())
    else:
        return HttpResponse(backend.auth_html(),
                            content_type='text/html;charset=UTF-8')
Example #38
0
                    return {
                        'action':
                        'login_or_register',
                        'result':
                        'failed',
                        'value':
                        'integrity_error',
                        'msg':
                        translation.ugettext(
                            'Erabiltzaile izen hau lehendik ere existitzen da. Mesedez, erabili beste izen bat.'
                        )
                    }

            access_token = ast.literal_eval(access_token)
            try:
                backend = get_backend(SOCIAL_ORIGIN[origin], request,
                                      request.path)
                user = backend.do_auth(access_token['access_token'])
            except Exception as e:
                logger.error("ERROR: " + str(e))
                return {
                    'action':
                    'login_or_register',
                    'result':
                    'failed',
                    'value':
                    'auth_error',
                    'msg':
                    translation.ugettext(
                        'Sare sozialetako autentikazioak huts egin du: ') +
                    str(e)
                }
Example #39
0
    def obj_create(self, bundle, request=None, **kwargs):
        bundle.obj = Obj()
        bundle.obj.id = 1
        oauth_token = bundle.data.get('oauth_token')
        oauth_verifier = bundle.data.get('oauth_verifier', '')

        backend = get_backend('twitter', bundle.request, bundle.request.path)
        backend.name = 'twitter'
        REQUEST_TOKEN_URL = 'https://api.twitter.com/oauth/request_token'
        ACCESS_TOKEN_URL = 'https://api.twitter.com/oauth/access_token'

        consumer_key = backend.consumer.key
        consumer_secret = backend.consumer.secret

        if oauth_token and oauth_verifier:
            oauth_client = OAuth1Session(
                consumer_key,
                client_secret=consumer_secret,
                resource_owner_key=oauth_token,
                verifier=oauth_verifier
            )
            response = oauth_client.fetch_access_token(ACCESS_TOKEN_URL)
            uid = response.get('user_id')

            social_user = UserSocialAuth.get_social_auth('twitter', uid)
            if social_user is None:
                social_user = UserSocialAuth.create_social_auth(
                    bundle.request.user, uid, 'twitter')
                social_user.extra_data = response
                social_user.save()
                load_twitter_user_friends(social_user)
            else:
                raise ImmediateHttpResponse(
                    HttpForbidden("Twitter already associated")
                )

            try:
                url = 'https://api.twitter.com/1.1/account/' \
                      'verify_credentials.json'
                consumer = oauth.Consumer(key=consumer_key,
                                          secret=consumer_secret)
                token = oauth.Token(key=response['oauth_token'],
                                    secret=response['oauth_token_secret'])
                client = oauth.Client(consumer, token)
                resp, content = client.request(url)
                extra_data = json.loads(content)
            except Exception as err:
                extra_data = None
                logger.error(err, err.message)

            if extra_data and social_user.extra_data != extra_data:
                if social_user.extra_data:
                    social_user.extra_data.update(extra_data)
                else:
                    social_user.extra_data = extra_data
                social_user.save()
        else:
            oauth_client = OAuth1Session(
                consumer_key,
                client_secret=consumer_secret,
            )
            bundle.data['oauth_token'] = oauth_client.fetch_request_token(
                REQUEST_TOKEN_URL
            ).get('oauth_token')
        return bundle
Example #40
0
            if not User.objects.filter(username=username).exists():
                try:
                    user = User()
                    user.username = username
                    user.is_active = True
                    user.save()
                    usa, created = UserSocialAuth.objects.get_or_create(user=user, provider = SOCIAL_ORIGIN[origin], uid=int(social_id))
                    usa.extra_data = access_token
                    usa.save()
                except IntegrityError, e:
                    logger.error("ERROR:"+str(e))
                    return {'action': 'login_or_register', 'result': 'failed', 'value': 'integrity_error', 'msg': translation.ugettext('Erabiltzaile izen hau lehendik ere existitzen da. Mesedez, erabili beste izen bat.')}

            access_token = ast.literal_eval(access_token)
            try:
                backend = get_backend(SOCIAL_ORIGIN[origin], request, request.path)
                user = backend.do_auth(access_token['access_token'])
            except Exception as e:
                logger.error("ERROR: "+str(e))
                return {'action': 'login_or_register', 'result': 'failed', 'value': 'auth_error', 'msg': translation.ugettext('Sare sozialetako autentikazioak huts egin du: ')+str(e)}
            if user and user.is_active:
                login(request, user)
                token = default_token_generator.make_token(user)
                # Redirect to a success page.
                return {'action': 'login_or_register', 'result': 'success', 'value': token, 'username': user.username}
            else:
                # Return a 'disabled account' error message
                logger.error("ERROR: User is not active!")
                return {'action': 'login_or_register', 'result': 'failed', 'value': 'user_not_active', 'msg': translation.ugettext('Erabiltzailea ez dago aktibatuta. Mesedez, begiratu zure epostara bidali dugun mezua eta jarraitu aktibazio pausoak.')}
        else:
            logger.error("ERROR: Wrong origin!")