示例#1
0
def register(request):
    if request.method == 'POST':
        form = ClassicRegisterForm(request.POST)
        email_feeds_form = SimpleEmailSubscribeForm(request.POST)

        if form.is_valid() and email_feeds_form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password1']
            email = form.cleaned_data['email']

            user_ = User(username=username, email=email)
            user_.set_password(password)

            if User.objects.all().count() == 0:
                user_.is_superuser = True
                user_.is_staff = True

            user_.save()
            UserJoinsAction(user=user_, ip=request.META['REMOTE_ADDR']).save()

            if email_feeds_form.cleaned_data['subscribe'] == 'n':
                user_.subscription_settings.enable_notifications = False
                user_.subscription_settings.save()

            return login_and_forward(request, user_, None, _("A welcome email has been sent to your email address. "))
    else:
        form = ClassicRegisterForm(initial={'next':'/'})
        email_feeds_form = SimpleEmailSubscribeForm()

    return render_to_response('auth/complete.html', {
        'form1': form,
        'email_feeds_form': email_feeds_form
        }, context_instance=RequestContext(request))
示例#2
0
def signup(request):
    """
    signup page. Create a legacy account
    
    url : /signup/"
    
    templates: authopenid/signup.html, authopenid/confirm_email.txt
    """
    logging.debug('')
    if settings.USE_EXTERNAL_LEGACY_LOGIN == True:
        logging.debug('handling external legacy login registration')
        return HttpResponseRedirect(reverse('user_external_legacy_login_signup'))
    next = get_next_url(request)
    logging.debug('request method was %s' % request.method)
    if request.method == 'POST':
        form = ClassicRegisterForm(request.POST)
        email_feeds_form = SimpleEmailSubscribeForm(request.POST)
        
        #validation outside if to remember form values
        form1_is_valid = form.is_valid()
        form2_is_valid = email_feeds_form.is_valid()
        if form1_is_valid and form2_is_valid:
            next = form.cleaned_data['next']
            username = form.cleaned_data['username']
            password = form.cleaned_data['password1']
            email = form.cleaned_data['email']
            
            user_ = User.objects.create_user( username,email,password )
            if settings.USE_EXTERNAL_LEGACY_LOGIN == True:
                EXTERNAL_LOGIN_APP.api.create_user(username,email,password)
            
            user_.backend = "django.contrib.auth.backends.ModelBackend"
            login(request, user_)
            email_feeds_form.save(user_)
            
            # send email
            subject = _("Welcome email subject line")
            message_template = loader.get_template(
                    'authopenid/confirm_email.txt'
            )
            message_context = Context({ 
                'signup_url': settings.APP_URL + reverse('user_signin'),
                'username': username,
                'password': password,
            })
            message = message_template.render(message_context)
            send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, 
                    [user_.email])
            logging.debug('new user with login and password created!')
            return HttpResponseRedirect(next)
        else:
            logging.debug('create classic account forms were invalid')
    else:
        form = ClassicRegisterForm(initial={'next':next})
        email_feeds_form = SimpleEmailSubscribeForm()
    logging.debug('printing legacy signup form')
    return render_to_response('authopenid/signup.html', {
        'form': form, 
        'email_feeds_form': email_feeds_form 
        }, context_instance=RequestContext(request))
示例#3
0
def external_register(request):
    if request.method == 'POST' and 'bnewaccount' in request.POST:
        form1 = SimpleRegistrationForm(request.POST)
        email_feeds_form = SimpleEmailSubscribeForm(request.POST)

        if (form1.is_valid() and email_feeds_form.is_valid()):
            user_ = User(username=form1.cleaned_data['username'],
                         email=form1.cleaned_data['email'])
            user_.email_isvalid = request.session.get(
                'auth_validated_email', '') == form1.cleaned_data['email']
            user_.set_unusable_password()

            if User.objects.all().count() == 0:
                user_.is_superuser = True
                user_.is_staff = True

            user_.save()

            UserJoinsAction(user=user_, ip=request.META['REMOTE_ADDR']).save()

            try:
                assoc_key = request.session['assoc_key']
                auth_provider = request.session['auth_provider']
            except:
                request.session['auth_error'] = _(
                    "Oops, something went wrong in the middle of this process. Please try again. Note that you need to have cookies enabled for the authentication to work."
                )
                logging.error(
                    "Missing session data when trying to complete user registration: %s"
                    % ", ".join(
                        ["%s: %s" % (k, v) for k, v in request.META.items()]))
                return HttpResponseRedirect(reverse('auth_signin'))

            uassoc = AuthKeyUserAssociation(user=user_,
                                            key=assoc_key,
                                            provider=auth_provider)
            uassoc.save()

            if email_feeds_form.cleaned_data['subscribe'] == 'n':
                user_.subscription_settings.enable_notifications = False
                user_.subscription_settings.save()

            del request.session['assoc_key']
            del request.session['auth_provider']

            return login_and_forward(
                request,
                user_,
                message=_(
                    "A welcome email has been sent to your email address. "))
    else:
        auth_provider = request.session.get('auth_provider', None)
        if not auth_provider:
            request.session['auth_error'] = _(
                "Oops, something went wrong in the middle of this process. Please try again."
            )
            logging.error(
                "Missing session data when trying to complete user registration: %s"
                %
                ", ".join(["%s: %s" % (k, v)
                           for k, v in request.META.items()]))
            return HttpResponseRedirect(reverse('auth_signin'))

        provider_class = AUTH_PROVIDERS[auth_provider].consumer
        user_data = provider_class.get_user_data(request.session['assoc_key'])

        if not user_data:
            user_data = request.session.get('auth_consumer_data', {})

        username = user_data.get('username', '')
        email = user_data.get('email', '')

        if email:
            request.session['auth_validated_email'] = email

        form1 = SimpleRegistrationForm(initial={
            'next': '/',
            'username': username,
            'email': email,
        })
        email_feeds_form = SimpleEmailSubscribeForm()

    provider_context = AUTH_PROVIDERS[request.session['auth_provider']].context

    return render_to_response(
        'auth/complete.html', {
            'form1': form1,
            'email_feeds_form': email_feeds_form,
            'provider': mark_safe(provider_context.human_name),
            'login_type': provider_context.id,
            'gravatar_faq_url': reverse('faq') + '#gravatar',
        },
        context_instance=RequestContext(request))
示例#4
0
def register(request):
    """
    register an openid.
    
    If user is already a member he can associate its openid with 
    its account.
    
    A new account could also be created and automaticaly associated
    to the openid.
    
    url : /complete/
    
    template : authopenid/complete.html
    """
    
    logging.debug('')
    openid_ = request.session.get('openid', None)
    next = get_next_url(request)
    if not openid_:
        logging.debug('oops, no openid in session --> go back to signin')
        return HttpResponseRedirect(reverse('user_signin') + '?next=%s' % next)
    
    nickname = openid_.sreg.get('nickname', '')
    email = openid_.sreg.get('email', '')
    form1 = OpenidRegisterForm(initial={
        'next': next,
        'username': nickname,
        'email': email,
    }) 
    form2 = OpenidVerifyForm(initial={
        'next': next,
        'username': nickname,
    })
    email_feeds_form = SimpleEmailSubscribeForm()
    
    user_ = None
    is_redirect = False
    logging.debug('request method is %s' % request.method)
    if request.method == 'POST':
        if 'bnewaccount' in request.POST.keys():
            logging.debug('trying to create new account associated with openid')
            form1 = OpenidRegisterForm(request.POST)
            email_feeds_form = SimpleEmailSubscribeForm(request.POST)
            if not form1.is_valid():
                logging.debug('OpenidRegisterForm is INVALID')
            elif not email_feeds_form.is_valid():
                logging.debug('SimpleEmailSubscribeForm is INVALID')
            else:
                logging.debug('OpenidRegisterForm and SimpleEmailSubscribeForm are valid')
                next = form1.cleaned_data['next']
                is_redirect = True
                logging.debug('creatng new django user %s ...' % form1.cleaned_data['username'])
                tmp_pwd = User.objects.make_random_password()
                user_ = User.objects.create_user(form1.cleaned_data['username'],
                         form1.cleaned_data['email'], tmp_pwd)
                
                user_.set_unusable_password()
                # make association with openid
                logging.debug('creating new openid user association %s <--> %s' \
                            % (user_.username, str(openid_)))
                uassoc = UserAssociation(openid_url=str(openid_), user_id=user_.id)
                uassoc.save()
                
                # login 
                user_.backend = "django.contrib.auth.backends.ModelBackend"
                logging.debug('logging the user in')
                login(request, user_)
                logging.debug('saving email feed settings')
                email_feeds_form.save(user_)
        elif 'bverify' in request.POST.keys():
            logging.debug('processing OpenidVerify form')
            form2 = OpenidVerifyForm(request.POST)
            if form2.is_valid():
                logging.debug('form is valid')
                is_redirect = True
                next = form2.cleaned_data['next']
                user_ = form2.get_user()
                logging.debug('creating new openid user association %s <--> %s' \
                            % (user_.username, str(openid_)))
                uassoc = UserAssociation(openid_url=str(openid_),
                        user_id=user_.id)
                uassoc.save()
                logging.debug('logging the user in')
                login(request, user_)
        
        #check if we need to post a question that was added anonymously
        #this needs to be a function call becase this is also done
        #if user just logged in and did not need to create the new account
        
        if user_ != None:
            if settings.EMAIL_VALIDATION == 'on':
                logging.debug('sending email validation')
                send_new_email_key(user_,nomessage=True)
                output = validation_email_sent(request)
                set_email_validation_message(user_) #message set after generating view
                return output
            if user_.is_authenticated():
                logging.debug('success, send user to main page')
                return HttpResponseRedirect(reverse('index'))
            else:
                logging.debug('have really strange error')
                raise Exception('openid login failed')#should not ever get here
    
    openid_str = str(openid_)
    bits = openid_str.split('/')
    base_url = bits[2] #assume this is base url
    url_bits = base_url.split('.')
    provider_name = url_bits[-2].lower()
    
    providers = {'yahoo':'<font color="purple">Yahoo!</font>',
                'flickr':'<font color="#0063dc">flick</font><font color="#ff0084">r</font>&trade;',
                'google':'Google&trade;',
                'aol':'<font color="#31658e">AOL</font>',
                'myopenid':'MyOpenID',
                }
    if provider_name not in providers:
        provider_logo = provider_name
        logging.error('openid provider named "%s" has no pretty customized logo' % provider_name)
    else:
        provider_logo = providers[provider_name]
    
    logging.debug('printing authopenid/complete.html output')
    return render_to_response('authopenid/complete.html', {
        'form1': form1,
        'form2': form2,
        'email_feeds_form': email_feeds_form,
        'provider':mark_safe(provider_logo),
        'username': nickname,
        'email': email,
        'login_type':'openid',
        'gravatar_faq_url':reverse('faq') + '#gravatar',
    }, context_instance=RequestContext(request))
示例#5
0
def signin(request,newquestion=False,newanswer=False):
    """
    signin page. It manages the legacy authentification (user/password) 
    and openid authentification
    
    url: /signin/
    
    template : authopenid/signin.htm
    """
    logging.debug('in signin view')
    request.encoding = 'UTF-8'
    on_failure = signin_failure
    email_feeds_form = SimpleEmailSubscribeForm()
    next = get_next_url(request)
    form_signin = OpenidSigninForm(initial={'next':next})
    form_auth = ClassicLoginForm(initial={'next':next})
    
    if request.method == 'POST':
        #'blogin' - password login
        if 'blogin' in request.POST.keys():
            logging.debug('processing classic login form submission')
            form_auth = ClassicLoginForm(request.POST)
            if form_auth.is_valid():
                #have login and password and need to login through external website
                if settings.USE_EXTERNAL_LEGACY_LOGIN == True:
                    username = form_auth.cleaned_data['username']
                    password = form_auth.cleaned_data['password']
                    next = form_auth.cleaned_data['next']
                    if form_auth.get_user() == None:
                        #need to create internal user
                        
                        #1) save login and password temporarily in session
                        request.session['external_username'] = username
                        request.session['external_password'] = password
                        
                        #2) try to extract user email and nickname from external service
                        email = EXTERNAL_LOGIN_APP.api.get_email(username,password)
                        screen_name = EXTERNAL_LOGIN_APP.api.get_screen_name(username,password)
                        
                        #3) see if username clashes with some existing user
                        #if so, we have to prompt the user to pick a different name
                        username_taken = User.is_username_taken(screen_name)
                        
                        email_feeds_form = SimpleEmailSubscribeForm()
                        form_data = {'username':screen_name,'email':email,'next':next}
                        form = OpenidRegisterForm(initial=form_data)
                        template_data = {'form1':form,'username':screen_name,\
                                        'email_feeds_form':email_feeds_form,\
                                        'provider':mark_safe(settings.EXTERNAL_LEGACY_LOGIN_PROVIDER_NAME),\
                                        'login_type':'legacy',\
                                        'gravatar_faq_url':reverse('faq') + '#gravatar',\
                                        'external_login_name_is_taken':username_taken}
                        return render_to_response('authopenid/complete.html',template_data,\
                                context_instance=RequestContext(request))
                    else:
                        #user existed, external password is ok
                        user = form_auth.get_user()
                        login(request,user)
                        response = HttpResponseRedirect(get_next_url(request))
                        EXTERNAL_LOGIN_APP.api.set_login_cookies(response,user)
                        return response
                else:
                    #regular password authentication
                    user = form_auth.get_user()
                    login(request, user)
                    return HttpResponseRedirect(get_next_url(request))
        
        elif 'bnewaccount' in request.POST.keys():
            logging.debug('processing classic (login/password) create account form submission')
            #register externally logged in password user with a new local account
            if settings.USE_EXTERNAL_LEGACY_LOGIN == True:
                form = OpenidRegisterForm(request.POST) 
                email_feeds_form = SimpleEmailSubscribeForm(request.POST)
                form1_is_valid = form.is_valid()
                form2_is_valid = email_feeds_form.is_valid()
                if form1_is_valid and form2_is_valid:
                    #create the user
                    username = form.cleaned_data['username']
                    password = request.session.get('external_password',None)
                    email = form.cleaned_data['email']
                    if password and username:
                        User.objects.create_user(username,email,password)
                        user = authenticate(username=username,password=password)
                        EXTERNAL_LOGIN_APP.api.connect_local_user_to_external_user(user,username,password)
                        external_username = request.session['external_username']
                        eld = ExternalLoginData.objects.get(external_username=external_username)
                        eld.user = user
                        eld.save()
                        login(request,user)
                        email_feeds_form.save(user)
                        del request.session['external_username']
                        del request.session['external_password']
                        response = HttpResponseRedirect(reverse('index'))
                        EXTERNAL_LOGIN_APP.api.set_login_cookies(response, user)
                        return response
                    else:
                        if password:
                            del request.session['external_username']
                        if username:
                            del request.session['external_password']
                        return HttpResponseServerError()
                else:
                    username = request.POST.get('username',None)
                    provider = mark_safe(settings.EXTERNAL_LEGACY_LOGIN_PROVIDER_NAME)
                    username_taken = User.is_username_taken(username)
                    data = {'login_type':'legacy','form1':form,'username':username,\
                        'email_feeds_form':email_feeds_form,'provider':provider,\
                        'gravatar_faq_url':reverse('faq') + '#gravatar',\
                        'external_login_name_is_taken':username_taken}
                    return render_to_response('authopenid/complete.html',data,
                            context_instance=RequestContext(request))
            else:
                raise Http404
        
        elif 'bsignin' in request.POST.keys() or 'openid_username' in request.POST.keys():
            logging.debug('processing signin with openid submission')
            form_signin = OpenidSigninForm(request.POST)
            if form_signin.is_valid():
                logging.debug('OpenidSigninForm is valid')
                next = form_signin.cleaned_data['next']
                sreg_req = sreg.SRegRequest(optional=['nickname', 'email'])
                redirect_to = "%s%s?%s" % (
                        get_url_host(request),
                        reverse('user_complete_signin'), 
                        urllib.urlencode({'next':next})
                )
                return ask_openid(request, 
                        form_signin.cleaned_data['openid_url'], 
                        redirect_to, 
                        on_failure=signin_failure, 
                        sreg_request=sreg_req)
            else:
                logging.debug('OpenidSigninForm is NOT valid! -> redisplay login view')
    
    #if request is GET
    if request.method == 'GET':
        logging.debug('request method was GET')
    question = None
    if newquestion == True:
        from forum.models import AnonymousQuestion as AQ
        session_key = request.session.session_key
        logging.debug('retrieving anonymously posted question associated with session %s' % session_key)
        qlist = AQ.objects.filter(session_key=session_key).order_by('-added_at')
        if len(qlist) > 0:
            question = qlist[0]
    answer = None
    if newanswer == True:
        from forum.models import AnonymousAnswer as AA
        session_key = request.session.session_key
        logging.debug('retrieving posted answer associated with session %s' % session_key)
        alist = AA.objects.filter(session_key=session_key).order_by('-added_at')
        if len(alist) > 0:
            answer = alist[0]
    
    logging.debug('showing signin view')
    return render_to_response('authopenid/signin.html', {
        'question':question,
        'answer':answer,
        'form1': form_auth,
        'form2': form_signin,
        'msg':  request.GET.get('msg',''),
        'sendpw_url': reverse('user_sendpw'),
        'fb_api_key': settings.FB_API_KEY, 
    }, context_instance=RequestContext(request))