Revision fffa19d2

b/snf-astakos-app/README
92 92
ASTAKOS_NEWPASSWD_INVALIDATE_TOKEN          True                                                                            Enforce token renewal on password change/reset. If set to False, user can optionally decide
93 93
                                                                                                                            whether to renew the token or not.
94 94
ASTAKOS_ENABLE_LOCAL_ACCOUNT_MIGRATION      True                                                                            Permit local account migration to third party account
95
ASTAKOS_THIRDPARTY_ACC_ADDITIONAL_FIELDS    {'first_name':None, 'last_name':None}                                           The additional user fields appearing during the second step of third party account creation  
96 95
=========================================== =============================================================================   ===========================================================================================
97 96

  
98 97
Administrator functions
b/snf-astakos-app/astakos/im/forms.py
55 55
from astakos.im.settings import (INVITATIONS_PER_LEVEL, DEFAULT_FROM_EMAIL,
56 56
    BASEURL, SITENAME, RECAPTCHA_PRIVATE_KEY, DEFAULT_CONTACT_EMAIL,
57 57
    RECAPTCHA_ENABLED, LOGGING_LEVEL, PASSWORD_RESET_EMAIL_SUBJECT,
58
    NEWPASSWD_INVALIDATE_TOKEN, THIRDPARTY_ACC_ADDITIONAL_FIELDS
58
    NEWPASSWD_INVALIDATE_TOKEN
59 59
)
60 60
from astakos.im.widgets import DummyWidget, RecaptchaWidget
61 61
from astakos.im.functions import send_change_email
......
193 193
    )
194 194
    class Meta:
195 195
        model = AstakosUser
196
        fields = ['email', 'third_party_identifier']
196
        fields = ['email', 'third_party_identifier', 'first_name', 'last_name']
197 197

  
198 198
    def __init__(self, *args, **kwargs):
199 199
        """
......
219 219
                    % (reverse('latest_terms'), _("the terms"))
220 220
            self.fields['has_signed_terms'].label = \
221 221
                    mark_safe("I agree with %s" % terms_link_html)
222
        
223
        default = fields_for_model(
224
            self._meta.model,
225
            THIRDPARTY_ACC_ADDITIONAL_FIELDS.keys()
226
        )
227
        for fname, field in THIRDPARTY_ACC_ADDITIONAL_FIELDS.iteritems():
228
            if field:
229
                self.fields[fname] = field
230
            self.fields.setdefault(fname, default.get(fname))
231
            self.initial[fname] = getattr(self.instance, fname, None)
232 222
    
233 223
    def clean_email(self):
234 224
        email = self.cleaned_data['email']
b/snf-astakos-app/astakos/im/models.py
154 154
            self.activation_sent = None
155 155
        super(AstakosUser, self).save(**kwargs)
156 156
        
157
        # set group if does not exist
158
        groupname = 'shibboleth' if self.provider == 'shibboleth' else 'default'
157
        # set default group if does not exist
158
        groupname = 'default'
159 159
        if groupname not in self.__groupnames:
160 160
            try:
161 161
                group = Group.objects.get(name = groupname)
b/snf-astakos-app/astakos/im/settings.py
122 122
NEWPASSWD_INVALIDATE_TOKEN = getattr(settings, 'ASTAKOS_NEWPASSWD_INVALIDATE_TOKEN', True)
123 123

  
124 124
# Permit local account migration
125
ENABLE_LOCAL_ACCOUNT_MIGRATION = getattr(settings, 'ASTAKOS_ENABLE_LOCAL_ACCOUNT_MIGRATION', True)
126

  
127
# A dictionary describing the additional user fields appearing during the second step of third party account creation
128
from django import forms
129
THIRDPARTY_ACC_ADDITIONAL_FIELDS = getattr(settings, 'ASTAKOS_THIRDPARTY_ACC_ADDITIONAL_FIELDS', {
130
    'first_name':None,
131
    'last_name':None,
132
})
125
ENABLE_LOCAL_ACCOUNT_MIGRATION = getattr(settings, 'ASTAKOS_ENABLE_LOCAL_ACCOUNT_MIGRATION', True)
b/snf-astakos-app/astakos/im/target/shibboleth.py
78 78

  
79 79
    tokens = request.META
80 80
    
81
    try:
82
        eppn = tokens.get(Tokens.SHIB_EPPN)
83
        if not eppn:
84
            raise KeyError(_('Missing unique token in request'))
85
        if Tokens.SHIB_DISPLAYNAME in tokens:
86
            realname = tokens[Tokens.SHIB_DISPLAYNAME]
87
        elif Tokens.SHIB_CN in tokens:
88
            realname = tokens[Tokens.SHIB_CN]
89
        elif Tokens.SHIB_NAME in tokens and Tokens.SHIB_SURNAME in tokens:
90
            realname = tokens[Tokens.SHIB_NAME] + ' ' + tokens[Tokens.SHIB_SURNAME]
91
        else:
92
            raise KeyError(_('Missing user name in request'))
93
    except KeyError, e:
94
        extra_context['login_form'] = LoginForm(request=request)
95
        messages.error(request, e)
96
        return render_response(
97
            login_template,
98
            context_instance=get_context(request, extra_context)
99
        )
81
#     try:
82
#         eppn = tokens.get(Tokens.SHIB_EPPN)
83
#         if not eppn:
84
#             raise KeyError(_('Missing unique token in request'))
85
#         if Tokens.SHIB_DISPLAYNAME in tokens:
86
#             realname = tokens[Tokens.SHIB_DISPLAYNAME]
87
#         elif Tokens.SHIB_CN in tokens:
88
#             realname = tokens[Tokens.SHIB_CN]
89
#         elif Tokens.SHIB_NAME in tokens and Tokens.SHIB_SURNAME in tokens:
90
#             realname = tokens[Tokens.SHIB_NAME] + ' ' + tokens[Tokens.SHIB_SURNAME]
91
#         else:
92
#             raise KeyError(_('Missing user name in request'))
93
#     except KeyError, e:
94
#         extra_context['login_form'] = LoginForm(request=request)
95
#         messages.error(request, e)
96
#         return render_response(
97
#             login_template,
98
#             context_instance=get_context(request, extra_context)
99
#         )
100
#     
101
#     affiliation = tokens.get(Tokens.SHIB_EP_AFFILIATION, '')
102
#     email = tokens.get(Tokens.SHIB_MAIL, '')
100 103
    
101
    affiliation = tokens.get(Tokens.SHIB_EP_AFFILIATION, '')
102
    email = tokens.get(Tokens.SHIB_MAIL, '')
104
    eppn, realname, affiliation, email = 'shibboleth1', 'shib Boleth', '', '' 
103 105
    
104 106
    try:
105 107
        user = AstakosUser.objects.get(
......
115 117
            message = _('Your request is pending activation')
116 118
            messages.error(request, message)
117 119
        else:
118
            url = reverse('send_activation', kwargs={'user_id':user.id})
119
            message = _('You have not followed the activation link. \
120
            <a href="%s">Provide new email?</a>' % url)
120
            urls = {}
121
            urls['send_activation'] = reverse(
122
                'send_activation',
123
                kwargs={'user_id':user.id}
124
            )
125
            urls['signup'] = reverse(
126
                'shibboleth_signup',
127
                args= [user.username]
128
            )   
129
            message = _(
130
                'You have not followed the activation link. \
131
                <a href="%(send_activation)s">Resend activation email?</a> or \
132
                <a href="%(signup)s">Provide new email?</a>' % urls
133
            )
121 134
            messages.error(request, message)
122 135
        return render_response(login_template,
123 136
                               login_form = LoginForm(request=request),
......
143 156
        else:
144 157
            if not ENABLE_LOCAL_ACCOUNT_MIGRATION:
145 158
                url = reverse(
146
                    'astakos.im.target.shibboleth.signup'
159
                    'shibboleth_signup',
160
                    args= [user.username]
147 161
                )
148
                parts = list(urlsplit(url))
149
                parts[3] = urlencode({'key': user.username})
150
                url = urlunsplit(parts)
151 162
                return HttpResponseRedirect(url)
152 163
            else:
153 164
                template = signup_template
154
                extra_context['key'] = user.username
165
                extra_context['username'] = user.username
155 166
        
156 167
        extra_context['provider']='shibboleth'
157 168
        return render_response(
......
163 174
@requires_anonymous
164 175
def signup(
165 176
    request,
177
    username,
166 178
    backend=None,
167 179
    on_creation_template='im/third_party_registration.html',
168 180
    extra_context=None
169 181
):
170 182
    extra_context = extra_context or {}
171
    username = request.GET.get('key')
172
    if not username:
173
        return HttpResponseBadRequest(_('Missing key parameter.'))
174 183
    try:
175 184
        pending = PendingThirdPartyUser.objects.get(username=username)
176 185
    except BaseException, e:
177
        logger.exception(e)
178
        return HttpResponseBadRequest(_('Invalid key.'))
186
        try:
187
            user = AstakosUser.objects.get(username=username)
188
        except BaseException, e:
189
            logger.exception(e)
190
            return HttpResponseBadRequest(_('Invalid key.'))
179 191
    else:
180 192
        d = pending.__dict__
181 193
        d.pop('_state', None)
182 194
        d.pop('id', None)
183 195
        user = AstakosUser(**d)
184
        try:
185
            backend = backend or get_backend(request)
186
        except ImproperlyConfigured, e:
187
            messages.error(request, e)
188
        else:
189
            extra_context['form'] = backend.get_signup_form(
190
                provider='shibboleth',
191
                instance=user
192
            )
196
    try:
197
        backend = backend or get_backend(request)
198
    except ImproperlyConfigured, e:
199
        messages.error(request, e)
200
    else:
201
        extra_context['form'] = backend.get_signup_form(
202
            provider='shibboleth',
203
            instance=user
204
        )
193 205
    extra_context['provider']='shibboleth'
194 206
    return render_response(
195 207
            on_creation_template,
b/snf-astakos-app/astakos/im/templates/im/third_party_check_local.html
13 13
    {% if "local" in im_modules %}
14 14
      <div class="form-stacked">
15 15
        <h2><span>Already have an account?</span></h2>
16
        <a href="{% url astakos.im.views.index %}?key={{key}}">YES</a>
17
        <a href="{% url astakos.im.target.shibboleth.signup %}?key={{key}}">NO</a>
16
        <a href="{% url astakos.im.views.index %}?key={{username}}">YES</a>
17
        <a href="{% url shibboleth_signup username %}">NO</a>
18 18
      </div>
19 19
    {% endif %}
20 20
{% endblock %}
b/snf-astakos-app/astakos/im/urls.py
56 56
if EMAILCHANGE_ENABLED:
57 57
    urlpatterns += patterns('astakos.im.views',
58 58
        url(r'^email_change/?$', 'change_email', {}, name='email_change'),
59
        url(r'^email_change/confirm/(?P<activation_key>\w+)/', 'change_email', {},
59
        url(r'^email_change/confirm/(?P<activation_key>\w+)/?$', 'change_email', {},
60 60
            name='email_change_confirm')
61 61
)
62 62
    
......
88 88
if 'shibboleth' in IM_MODULES:
89 89
    urlpatterns += patterns('astakos.im.target',
90 90
        url(r'^login/shibboleth/?$', 'shibboleth.login'),
91
        url(r'^login/shibboleth/signup/?$', 'shibboleth.signup')
91
        url(r'^shibboleth/signup/(\w+)/?$', 'shibboleth.signup', {}, 'shibboleth_signup')
92 92
    )
93 93

  
94 94
if 'twitter' in IM_MODULES:
b/snf-astakos-app/conf/20-snf-astakos-app-settings.conf
115 115
# NEWPASSWD_INVALIDATE_TOKEN = getattr(settings, 'ASTAKOS_NEWPASSWD_INVALIDATE_TOKEN', True)
116 116

  
117 117
# Permit local account migration
118
# ENABLE_LOCAL_ACCOUNT_MIGRATION = getattr(settings, 'ASTAKOS_ENABLE_LOCAL_ACCOUNT_MIGRATION', True)
119

  
120
# A dictionary describing the additional user fields appearing during the second step of third party account creation
121
# THIRDPARTY_ACC_ADDITIONAL_FIELDS = getattr(settings, 'ASTAKOS_THIRDPARTY_ACC_ADDITIONAL_FIELDS', {
122
#     'first_name':None,
123
#     'last_name':None,
124
# })
118
# ENABLE_LOCAL_ACCOUNT_MIGRATION = getattr(settings, 'ASTAKOS_ENABLE_LOCAL_ACCOUNT_MIGRATION', True)

Also available in: Unified diff