diff options
Diffstat (limited to 'views.py')
-rw-r--r-- | views.py | 61 |
1 files changed, 48 insertions, 13 deletions
@@ -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 |