Exemple #1
0
 def test_parseExtensionArgs_requiredEmpty(self):
     req = sreg.SRegRequest()
     req.parseExtensionArgs({'required': ''}, strict=True)
     self.failUnlessEqual([], req.required)
Exemple #2
0
 def test_parseExtensionArgs_optionalEmpty(self):
     req = sreg.SRegRequest()
     req.parseExtensionArgs({'optional': ''}, strict=True)
     self.failUnlessEqual([], req.optional)
Exemple #3
0
 def test_parseExtensionArgs_strict(self):
     req = sreg.SRegRequest()
     self.failUnlessRaises(ValueError,
                           req.parseExtensionArgs, {'required': 'beans'},
                           strict=True)
Exemple #4
0
 def test_parseExtensionArgs_policy(self):
     req = sreg.SRegRequest()
     req.parseExtensionArgs({'policy_url': 'http://policy'}, strict=True)
     self.failUnlessEqual('http://policy', req.policy_url)
Exemple #5
0
 def test_parseExtensionArgs_nonStrict(self):
     req = sreg.SRegRequest()
     req.parseExtensionArgs({'required': 'beans'})
     self.failUnlessEqual([], req.required)
Exemple #6
0
 def test_parseExtensionArgs_extraIgnored(self):
     req = sreg.SRegRequest()
     req.parseExtensionArgs({'janrain': 'inc'})
Exemple #7
0
 def test_parseExtensionArgs_empty(self):
     req = sreg.SRegRequest()
     results = req.parseExtensionArgs({})
     self.failUnlessEqual(None, results)
Exemple #8
0
 def test_constructEmpty(self):
     req = sreg.SRegRequest()
     self.failUnlessEqual([], req.optional)
     self.failUnlessEqual([], req.required)
     self.failUnlessEqual(None, req.policy_url)
     self.failUnlessEqual(sreg.ns_uri, req.ns_uri)
Exemple #9
0
def signin(
        request,
        newquestion=False,  #todo: not needed
        newanswer=False,  #todo: not needed
):
    """
    signin page. It manages the legacy authentification (user/password) 
    and openid authentification
    
    url: /signin/
    
    template : authopenid/signin.htm
    """
    logging.debug('in signin view')
    on_failure = signin_failure
    email_feeds_form = askbot_forms.SimpleEmailSubscribeForm()

    next_url = get_next_url(request)
    logging.debug('next url is %s' % next_url)

    if next_url == reverse('user_signin'):
        next_url = '%(next)s?next=%(next)s' % {'next': next_url}

    login_form = forms.LoginForm(initial={'next': next_url})

    #todo: get next url make it sticky if next is 'user_signin'
    if request.method == 'POST':

        login_form = forms.LoginForm(request.POST)
        if login_form.is_valid():

            provider_name = login_form.cleaned_data['login_provider_name']
            if login_form.cleaned_data['login_type'] == 'password':

                password_action = login_form.cleaned_data['password_action']
                if askbot_settings.USE_LDAP_FOR_PASSWORD_LOGIN:
                    assert (password_action == 'login')
                    ldap_provider_name = askbot_settings.LDAP_PROVIDER_NAME
                    username = login_form.cleaned_data['username']
                    if util.ldap_check_password(
                            username, login_form.cleaned_data['password']):
                        user = authenticate(ldap_user_id=username,
                                            provider_name=ldap_provider_name,
                                            method='ldap')
                        if user is not None:
                            login(request, user)
                            return HttpResponseRedirect(next_url)
                        else:
                            return finalize_generic_signin(
                                request=request,
                                user=user,
                                user_identifier=username,
                                login_provider_name=ldap_provider_name,
                                redirect_url=next_url)
                    else:
                        login_form.set_password_login_error()
                else:
                    if password_action == 'login':
                        user = authenticate(
                            username=login_form.cleaned_data['username'],
                            password=login_form.cleaned_data['password'],
                            provider_name=provider_name,
                            method='password')
                        if user is None:
                            login_form.set_password_login_error()
                        else:
                            login(request, user)
                            #todo: here we might need to set cookies
                            #for external login sites
                            return HttpResponseRedirect(next_url)
                    elif password_action == 'change_password':
                        if request.user.is_authenticated():
                            new_password = \
                                login_form.cleaned_data['new_password']
                            AuthBackend.set_password(
                                user=request.user,
                                password=new_password,
                                provider_name=provider_name)
                            request.user.message_set.create(
                                message=_('Your new password saved'))
                            return HttpResponseRedirect(next_url)
                    else:
                        logging.critical('unknown password action %s' %
                                         password_action)
                        raise Http404

            elif login_form.cleaned_data['login_type'] == 'openid':
                #initiate communication process
                logging.debug('processing signin with openid submission')

                #todo: make a simple-use wrapper for openid protocol

                sreg_req = sreg.SRegRequest(optional=['nickname', 'email'])
                redirect_to = "%s%s?%s" % (
                    get_url_host(request), reverse('user_complete_signin'),
                    urllib.urlencode({'next': next_url}))
                return ask_openid(request,
                                  login_form.cleaned_data['openid_url'],
                                  redirect_to,
                                  on_failure=signin_failure,
                                  sreg_request=sreg_req)

            elif login_form.cleaned_data['login_type'] == 'oauth':
                try:
                    #this url may need to have "next" piggibacked onto
                    callback_url = reverse('user_complete_oauth_signin')

                    connection = util.OAuthConnection(
                        provider_name, callback_url=callback_url)

                    connection.start()

                    request.session['oauth_token'] = connection.get_token()
                    request.session['oauth_provider_name'] = provider_name
                    request.session[
                        'next_url'] = next_url  #special case for oauth

                    oauth_url = connection.get_auth_url(login_only=False)
                    return HttpResponseRedirect(oauth_url)

                except util.OAuthError, e:
                    logging.critical(unicode(e))
                    msg = _('Unfortunately, there was some problem when '
                            'connecting to %(provider)s, please try again '
                            'or use another provider') % {
                                'provider': provider_name
                            }
                    request.user.message_set.create(message=msg)

            elif login_form.cleaned_data['login_type'] == 'facebook':
                #have to redirect for consistency
                #there is a requirement that 'complete_signin'
                try:
                    #this call may raise FacebookError
                    user_id = util.get_facebook_user_id(request)

                    user = authenticate(method='facebook',
                                        facebook_user_id=user_id)

                    return finalize_generic_signin(
                        request=request,
                        user=user,
                        user_identifier=user_id,
                        login_provider_name=provider_name,
                        redirect_url=next_url)

                except util.FacebookError, e:
                    logging.critical(unicode(e))
                    msg = _('Unfortunately, there was some problem when '
                            'connecting to %(provider)s, please try again '
                            'or use another provider') % {
                                'provider': 'Facebook'
                            }
                    request.user.message_set.create(message=msg)

            else:
                #raise 500 error - unknown login type
                pass