cbmi/account/views.py

252 lines
9.1 KiB
Python
Raw Normal View History

2013-10-24 01:49:46 +02:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2013-10-26 20:06:42 +02:00
import os
import base64
2013-10-25 23:15:30 +02:00
import hashlib
2013-10-24 01:49:46 +02:00
2013-10-26 20:06:42 +02:00
from django.conf import settings
2013-10-19 00:47:24 +02:00
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import Group
from django.shortcuts import render
from django.utils.translation import ugettext as _
2013-10-19 00:47:24 +02:00
from forms import GastroPinForm, WlanPresenceForm, LoginForm, PasswordForm, \
2013-10-26 22:40:47 +02:00
RFIDForm, NRF24Form, SIPPinForm, CLabPinForm, AdminForm
2013-10-26 20:06:42 +02:00
from cbase_members import retrieve_member
from password_encryption import *
def landingpage(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/account')
form = LoginForm()
is_ceymaster = is_admin = False
if 'ceymaster' in [g.name for g in request.user.groups.all()]:
is_ceymaster = True
if 'ldap_admins' in [g.name for g in request.user.groups.all()]:
is_admin = True
groups = Group.objects.all()
try:
admins = Group.objects.get(name="ldap_admins").user_set.all()
except:
admins = []
return render(request, 'base.html', {'form': form, 'admins': admins})
2013-10-19 00:47:24 +02:00
def auth_login(request):
2013-10-24 01:49:46 +02:00
redirect_to = request.GET.get('next', '') or '/'
2013-10-19 00:47:24 +02:00
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = form.login(request)
2013-10-19 00:47:24 +02:00
if user is not None:
if user.is_active:
login(request, user)
2013-10-24 01:49:46 +02:00
member, created = \
User.objects.get_or_create(username=username)
2013-10-19 00:47:24 +02:00
if created:
member.save()
2013-10-24 01:49:46 +02:00
# save password in the session for later use with LDAP
key = store_ldap_password(request, password)
2013-10-24 01:49:46 +02:00
response = HttpResponseRedirect(redirect_to)
response.set_cookie('sessionkey', key)
2013-10-24 01:49:46 +02:00
return response
2013-10-19 00:47:24 +02:00
else:
return render(request, 'login.html', {'form': form})
2013-10-19 00:47:24 +02:00
else:
form = LoginForm()
2013-10-24 01:49:46 +02:00
return render_to_response('login.html',
RequestContext(request, locals()))
2013-10-19 00:47:24 +02:00
@login_required
def home(request):
member = retrieve_member(request)
2013-10-26 20:06:42 +02:00
context = {'member': member.to_dict(), 'groups': request.user.groups.all()}
return render(request, 'home.html', context)
@login_required
2013-10-19 00:47:24 +02:00
def auth_logout(request):
request.session.pop(ENCRYPTED_LDAP_PASSWORD)
2013-10-24 01:49:46 +02:00
redirect_to = request.GET.get('next', '') or '/'
2013-10-19 00:47:24 +02:00
logout(request)
2013-10-24 01:49:46 +02:00
response = HttpResponseRedirect(redirect_to)
response.delete_cookie('sessionkey')
return response
@login_required(redirect_field_name="/" ,login_url="/account/login/")
def groups_list(request, group_name):
group = get_object_or_404(Group, name=group_name)
groups = Group.objects.all()
if 'ceymaster' in [g.name for g in request.user.groups.all()]:
is_ceymaster = True
if 'ldap_admins' in [g.name for g in request.user.groups.all()]:
is_admin = True
return render_to_response("group_list.html", locals())
@login_required
def sippin(request):
return set_ldap_field(request, SIPPinForm, [('sippin', 'sippin')],
'sippin.html')
2013-10-25 23:15:30 +02:00
def set_hash_field(request, form_type, in_field, out_field, hash_func,
template_name):
"""
2013-10-26 20:06:42 +02:00
Abstract view for changing LDAP attributes that need to be hashed.
Takes a function that converts the value into the hashed_value.
2013-10-25 23:15:30 +02:00
"""
member = retrieve_member(request)
initial = {}
if request.method == 'POST':
form = form_type(request.POST)
if form.is_valid():
hashed_value = hash_func(form.cleaned_data[in_field])
2013-10-26 20:06:42 +02:00
print 'hashed value: ', hashed_value
2013-10-25 23:15:30 +02:00
member.set(out_field, hashed_value)
member.save()
new_form = form_type(initial=initial)
return render(request, template_name,
{'message': _('Your changes have been saved. Thank you!'),
'form': new_form, 'member': member.to_dict()})
else:
return render(request, template_name,
{'form': form, 'member': member.to_dict()})
else:
form = form_type(initial=initial)
return render(request, template_name,
{'form': form, 'member': member.to_dict()})
@login_required
def gastropin(request):
2013-10-26 20:06:42 +02:00
def calculate_gastro_hash(pin):
key = settings.CBASE_GASTRO_KEY
bla = '%s%s' % (key, pin)
return hashlib.sha256(bla).hexdigest()
2013-10-25 23:15:30 +02:00
return set_hash_field(request, GastroPinForm,
'gastropin1', 'gastroPIN', calculate_gastro_hash, 'gastropin.html')
2013-10-26 20:06:42 +02:00
@login_required
def clabpin(request):
if request.user.groups.filter(name='cey-c-lab').count() == 0:
2013-10-26 22:40:47 +02:00
return render(request, 'access_denied.html')
2013-10-26 20:06:42 +02:00
def calculate_clab_hash(pin):
salt = os.urandom(12)
digest = hashlib.sha1(bytearray(pin, 'UTF-8')+salt).digest()
return '{SSHA}' + base64.b64encode(digest + salt)
return set_hash_field(request, CLabPinForm, 'c_lab_pin1', 'c-labPIN',
calculate_clab_hash, 'clabpin.html')
2013-10-25 23:15:30 +02:00
@login_required
def password(request):
2013-10-26 20:06:42 +02:00
"""
View that changes the password on the LDAP server.
2013-10-26 20:06:42 +02:00
"""
member = retrieve_member(request)
2013-10-25 23:15:30 +02:00
2013-10-26 20:06:42 +02:00
if request.method == 'POST':
form = PasswordForm(request.POST, request=request)
if form.is_valid():
new_password = form.cleaned_data['password1']
member.change_password(new_password)
key = store_ldap_password(request, new_password)
2013-10-26 20:06:42 +02:00
request.session.save()
new_form = PasswordForm()
response = render(request, 'password.html',
2013-10-26 20:06:42 +02:00
{'message': _('Your password was changed. Thank you!'),
'form': new_form, 'member': member.to_dict()})
response.set_cookie('sessionkey', key)
2013-10-26 20:06:42 +02:00
else:
return render(request, 'password.html',
{'form': form, 'member': member.to_dict()})
else:
form = PasswordForm()
return render(request, 'password.html',
{'form': form, 'member': member.to_dict()})
2013-10-25 23:15:30 +02:00
def set_ldap_field(request, form_type, field_names, template_name):
"""
Abstract view for each of the different forms.
2013-10-26 20:06:42 +02:00
field_names contains the mapping of the field name in the form to
"""
member = retrieve_member(request)
initial = {}
if request.method == 'POST':
form = form_type(request.POST)
if form.is_valid():
for form_field, ldap_field in field_names:
member.set(ldap_field, form.cleaned_data[form_field])
initial[form_field] = member.get(ldap_field)
member.save()
new_form = form_type(initial=initial)
return render(request, template_name,
2013-10-25 04:24:26 +02:00
{'message': _('Your changes have been saved. Thank you!'),
'form': new_form, 'member': member.to_dict()})
else:
2013-10-25 04:24:26 +02:00
return render(request, template_name,
{'form': form, 'member': member.to_dict()})
else:
for form_field, ldap_field in field_names:
initial[form_field] = member.get(ldap_field)
form = form_type(initial=initial)
2013-10-25 04:24:26 +02:00
return render(request, template_name,
{'form': form, 'member': member.to_dict()})
@login_required
def wlan_presence(request):
return set_ldap_field(request, WlanPresenceForm,
[('presence', 'wlanPresence')], 'wlan_presence.html')
@login_required
def rfid(request):
return set_ldap_field(request, RFIDForm, [('rfid', 'rfid')], 'rfid.html')
@login_required
def nrf24(request):
return set_ldap_field(request, NRF24Form, [('nrf24', 'nrf24')], 'nrf24.html')
2013-10-26 22:40:47 +02:00
@login_required
def admin(request):
member = retrieve_member(request)
if request.user.groups.filter(name='ldap_admins').count() == 0:
return render(request, 'access_denied.html')
users = member.list_users()
if request.method == 'POST':
form = AdminForm(request.POST, request=request, users=users)
2013-10-25 23:15:30 +02:00
2013-10-26 22:40:47 +02:00
if form.is_valid():
new_password = form.cleaned_data['password1']
member.admin_change_password(form.cleaned_data['username'], new_password)
new_form = AdminForm(request=request, users=users)
return render(request, 'admin.html',
{'message': _('The password for %s was changed. Thank you!' % form.cleaned_data['username']),
'form': new_form})
else:
return render(request, 'admin.html',
{'form': form})
else:
form = AdminForm(request=request, users=users)
return render(request, 'admin.html',
{'form': form})
2013-10-25 04:24:26 +02:00
2013-10-26 22:40:47 +02:00
#username = cleaned_data.get('username')
#admin_username = self._request.user.username
#admin_password = self._request.session['ldap_password']