summaryrefslogtreecommitdiff
path: root/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'views.py')
-rw-r--r--views.py61
1 files changed, 48 insertions, 13 deletions
diff --git a/views.py b/views.py
index 8399f0c..2f09b8e 100644
--- a/views.py
+++ b/views.py
@@ -1,33 +1,68 @@
from django.contrib.auth.decorators import login_required
from apps.changepw.models import ChangePasswordForm
-from django import forms
from django.shortcuts import render_to_response
from django.template import RequestContext
-from django.http import HttpResponseRedirect
-import subprocess
-@login_required(login_url='/nordunet/accounts/login/')
-def change_password(request):
+def _get_username(request):
+ '''
+ Returns the actual username from the Shibboleth uid.
+ request.user.username == username@domain.com
+ '''
+ return request.user.username.split('@')[0]
+
+def _generate_password(n):
+ '''
+ Returns a psudo random string of lenght n.
+ http://code.activestate.com/recipes/576722-pseudo-random-string/
+ '''
+ import os, math
+ from base64 import b64encode
+ return b64encode(os.urandom(int(math.ceil(0.75*n))),'-_')[:n]
+
+@login_required(login_url='/sso/accounts/login/')
+def index(request):
+ '''
+ Greets the user and presents the choices available.
+ '''
+ full_name = '%s %s' % (request.user.firstname, request.user.lastname)
+ username = _get_username(request)
+ return render_to_response('changepw/index.html',
+ {'full_name': full_name, 'username': username},
+ context_instance=RequestContext(request))
+
+@login_required(login_url='/sso/accounts/login/')
+def change_password(request, func):
'''
If the user is authenticated and the form is valid the password
changing script will be run with the username and new password.
+ The function that changes the password has to be provided as func.
'''
if request.method == 'POST':
form = ChangePasswordForm(request.POST)
if form.is_valid():
new_password = form.cleaned_data['new_password']
-
- # Magic for actually changing the password happens here
- return_value = subprocess.call(['echo',
- request.user.username,
- new_password])
-
+ return_value = func(request.user, new_password)
return render_to_response('changepw/change_password.html',
{'return_value': return_value},
context_instance=RequestContext(request))
else:
form = ChangePasswordForm()
-
+ username = _get_username(request)
return render_to_response('changepw/change_password.html',
- {'form': form, 'user': request.user},
+ {'form': form, 'username': username},
context_instance=RequestContext(request))
+
+@login_required(login_url='/sso/accounts/login/')
+def reset_password(request, func):
+ '''
+ Resets password for the authenticated user to a random string.
+ The function that actually sets the new password has to be provided as func.
+ '''
+ password_length = 8 # chars
+ username = _get_username(request)
+ new_password = _generate_password(password_length)
+ return_value = func(request.user, new_password)
+ return render_to_response('changepw/reset_password.html',
+ {'username': username, 'new_password': new_password,
+ 'return_value': return_value},
+ context_instance=RequestContext(request)) \ No newline at end of file