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