From 6c8a3f7c1569d172cf3b181613f749bb78251286 Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Thu, 22 Nov 2012 13:52:40 +0200 Subject: [PATCH] Enable inactive shibboleth users to change email Refs: #3041 --- snf-astakos-app/astakos/im/forms.py | 16 +++++-- snf-astakos-app/astakos/im/target/local.py | 2 +- snf-astakos-app/astakos/im/target/shibboleth.py | 51 +++++++++++------------ snf-astakos-app/astakos/im/views.py | 22 ++++++++-- 4 files changed, 56 insertions(+), 35 deletions(-) diff --git a/snf-astakos-app/astakos/im/forms.py b/snf-astakos-app/astakos/im/forms.py index ce2997c..23ce1ff 100644 --- a/snf-astakos-app/astakos/im/forms.py +++ b/snf-astakos-app/astakos/im/forms.py @@ -187,13 +187,18 @@ class InvitedLocalUserCreationForm(LocalUserCreationForm): return user class ThirdPartyUserCreationForm(forms.ModelForm): + id = forms.CharField( + widget=forms.HiddenInput(), + label='', + required=False + ) third_party_identifier = forms.CharField( widget=forms.HiddenInput(), label='' ) class Meta: model = AstakosUser - fields = ['email', 'third_party_identifier', 'first_name', 'last_name'] + fields = ['id', 'email', 'third_party_identifier', 'first_name', 'last_name'] def __init__(self, *args, **kwargs): """ @@ -280,11 +285,14 @@ class ShibbolethUserCreationForm(ThirdPartyUserCreationForm): def clean_email(self): email = self.cleaned_data['email'] - for user in AstakosUser.objects.filter(email = email): + if self.instance: + if self.instance.email == email: + raise forms.ValidationError(_("This is your current email.")) + for user in AstakosUser.objects.filter(email=email): if user.provider == 'shibboleth': raise forms.ValidationError(_( - "This email is already associated with another shibboleth \ - account." + "This email is already associated with another \ + shibboleth account." ) ) else: diff --git a/snf-astakos-app/astakos/im/target/local.py b/snf-astakos-app/astakos/im/target/local.py index be01455..48204aa 100644 --- a/snf-astakos-app/astakos/im/target/local.py +++ b/snf-astakos-app/astakos/im/target/local.py @@ -86,7 +86,7 @@ def login(request, on_failure='im/login.html'): else: url = reverse('send_activation', kwargs={'user_id':user.id}) message = _('You have not followed the activation link. \ - Provide new email?' % url) + Resend activation email?' % url) elif user.provider not in ('local', ''): message = _( 'Local login is not the current authentication method for this account.' diff --git a/snf-astakos-app/astakos/im/target/shibboleth.py b/snf-astakos-app/astakos/im/target/shibboleth.py index 05f86c5..02adb95 100644 --- a/snf-astakos-app/astakos/im/target/shibboleth.py +++ b/snf-astakos-app/astakos/im/target/shibboleth.py @@ -78,30 +78,28 @@ def login( tokens = request.META -# try: -# eppn = tokens.get(Tokens.SHIB_EPPN) -# if not eppn: -# raise KeyError(_('Missing unique token in request')) -# if Tokens.SHIB_DISPLAYNAME in tokens: -# realname = tokens[Tokens.SHIB_DISPLAYNAME] -# elif Tokens.SHIB_CN in tokens: -# realname = tokens[Tokens.SHIB_CN] -# elif Tokens.SHIB_NAME in tokens and Tokens.SHIB_SURNAME in tokens: -# realname = tokens[Tokens.SHIB_NAME] + ' ' + tokens[Tokens.SHIB_SURNAME] -# else: -# raise KeyError(_('Missing user name in request')) -# except KeyError, e: -# extra_context['login_form'] = LoginForm(request=request) -# messages.error(request, e) -# return render_response( -# login_template, -# context_instance=get_context(request, extra_context) -# ) -# -# affiliation = tokens.get(Tokens.SHIB_EP_AFFILIATION, '') -# email = tokens.get(Tokens.SHIB_MAIL, '') + try: + eppn = tokens.get(Tokens.SHIB_EPPN) + if not eppn: + raise KeyError(_('Missing unique token in request')) + if Tokens.SHIB_DISPLAYNAME in tokens: + realname = tokens[Tokens.SHIB_DISPLAYNAME] + elif Tokens.SHIB_CN in tokens: + realname = tokens[Tokens.SHIB_CN] + elif Tokens.SHIB_NAME in tokens and Tokens.SHIB_SURNAME in tokens: + realname = tokens[Tokens.SHIB_NAME] + ' ' + tokens[Tokens.SHIB_SURNAME] + else: + raise KeyError(_('Missing user name in request')) + except KeyError, e: + extra_context['login_form'] = LoginForm(request=request) + messages.error(request, e) + return render_response( + login_template, + context_instance=get_context(request, extra_context) + ) - eppn, realname, affiliation, email = 'shibboleth1', 'shib Boleth', '', '' + affiliation = tokens.get(Tokens.SHIB_EP_AFFILIATION, '') + email = tokens.get(Tokens.SHIB_MAIL, '') try: user = AstakosUser.objects.get( @@ -180,13 +178,14 @@ def signup( extra_context=None ): extra_context = extra_context or {} + if not username: + return HttpResponseBadRequest(_('Missing key parameter.')) try: pending = PendingThirdPartyUser.objects.get(username=username) - except BaseException, e: + except PendingThirdPartyUser.DoesNotExist: try: user = AstakosUser.objects.get(username=username) - except BaseException, e: - logger.exception(e) + except AstakosUser.DoesNotExist: return HttpResponseBadRequest(_('Invalid key.')) else: d = pending.__dict__ diff --git a/snf-astakos-app/astakos/im/views.py b/snf-astakos-app/astakos/im/views.py index 12997ae..a79132c 100644 --- a/snf-astakos-app/astakos/im/views.py +++ b/snf-astakos-app/astakos/im/views.py @@ -334,10 +334,16 @@ def signup(request, template_name='im/signup.html', on_success='im/signup_comple return HttpResponseRedirect(reverse('astakos.im.views.edit_profile')) provider = get_query(request).get('provider', 'local') + id = get_query(request).get('id') + try: + instance = AstakosUser.objects.get(id=id) if id else None + except AstakosUser.DoesNotExist: + instance = None + try: if not backend: backend = get_backend(request) - form = backend.get_signup_form(provider) + form = backend.get_signup_form(provider, instance) except Exception, e: form = SimpleBackend(request).get_signup_form(provider) messages.add_message(request, messages.ERROR, e) @@ -353,14 +359,22 @@ def signup(request, template_name='im/signup.html', on_success='im/signup_comple additional_email = form.cleaned_data['additional_email'] if additional_email != user.email: user.additionalmail_set.create(email=additional_email) - msg = 'Additional email: %s saved for user %s.' % (additional_email, user.email) + msg = 'Additional email: %s saved for user %s.' % ( + additional_email, + user.email + ) logger._log(LOGGING_LEVEL, msg, []) if user and user.is_active: next = request.POST.get('next', '') return prepare_response(request, user, next=next) messages.add_message(request, status, message) - return render_response(on_success, - context_instance=get_context(request, extra_context)) + return render_response( + on_success, + context_instance=get_context( + request, + extra_context + ) + ) except SendMailError, e: logger.exception(e) status = messages.ERROR -- 1.7.10.4