Skip to content
Snippets Groups Projects
Verified Commit c729b68e authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Add change password.

parent ce91e4ff
No related branches found
No related tags found
No related merge requests found
...@@ -5,7 +5,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) ...@@ -5,7 +5,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))
setup( setup(
name='ticdesk', name='ticdesk',
version='0.5.1', version='0.6',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
author='Teckids e.V.', author='Teckids e.V.',
...@@ -16,6 +16,7 @@ setup( ...@@ -16,6 +16,7 @@ setup(
'django-bootstrap3', 'django-bootstrap3',
'django-ldapdb', 'django-ldapdb',
'django-tables2', 'django-tables2',
'pexpect',
'python-dateutil', 'python-dateutil',
'python-pam' 'python-pam'
], ],
......
...@@ -45,6 +45,20 @@ class LoginForm(forms.Form): ...@@ -45,6 +45,20 @@ class LoginForm(forms.Form):
uid = forms.CharField(label=_('Benutzername'), max_length=20) uid = forms.CharField(label=_('Benutzername'), max_length=20)
password = forms.CharField(label=_('Passwort'), widget=forms.widgets.PasswordInput) password = forms.CharField(label=_('Passwort'), widget=forms.widgets.PasswordInput)
class ChPwForm(forms.Form):
password_old = forms.CharField(label=_('Aktuelles Passwort'), widget=forms.widgets.PasswordInput)
password_new = forms.CharField(label=_('Neues Passwort'), widget=forms.widgets.PasswordInput)
password_new_repeat = forms.CharField(label=_('Neues Passwort wiederholen'), widget=forms.widgets.PasswordInput)
def clean(self):
# Ensure both passwords are identical
password_new = self.cleaned_data.get('password_new')
password_new_repeat = self.cleaned_data.get('password_new_repeat')
if password_new and password_new != password_new_repeat:
self.add_error('password_new_repeat', _('Passwörter stimmen nicht überein!'))
super(ChPwForm, self).clean()
class RegisterForm(forms.Form): class RegisterForm(forms.Form):
# Name and identity fields # Name and identity fields
given_name = forms.CharField(label=_('Vorname'), max_length=100) given_name = forms.CharField(label=_('Vorname'), max_length=100)
......
{% extends "ticdesk/base.html" %}
{% load bootstrap3 i18n %}
{% block inner_content %}
<h1>{% blocktrans %}Teckids-Passwort ändern}% endblocktrans %}</h1>
{% if error %}
<div class="alert alert-danger" role="alert">
<p><strong>{% blocktrans %}Fehler{% endblocktrans %}</strong></p>
<p>
{{ error }}
</p>
</div>
{% endif %}
{% if success %}
<div class="alert alert-success" role="alert">
<p><strong>{% blocktrans %}Erfolg{% endblocktrans %}</strong></p>
<p>
Das Passwort wurde erfolgreich geändert.
</p>
</div>
{% endif %}
<form method="post">
{% csrf_token %}
{% bootstrap_form chpw_form %}
<input type="submit" value="{% blocktrans %}Passwort ändern{% endblocktrans %}" />
</form>
{% endblock %}
from django.contrib import auth from django.contrib import auth
from django.core.mail import mail_admins, send_mail from django.core.mail import mail_admins, send_mail
from django.http import HttpResponse
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from pam import pam from pam import pam
import pexpect
from .forms import LoginForm, RegisterForm from .forms import ChPwForm, LoginForm, RegisterForm
from .models import TeckidsGroup, TeckidsPerson from .models import TeckidsGroup, TeckidsPerson
def login(request): def login(request):
...@@ -38,6 +40,50 @@ def logout(request): ...@@ -38,6 +40,50 @@ def logout(request):
auth.logout(request) auth.logout(request)
return redirect('/') return redirect('/')
def change_password(request):
context = {}
chpw_form = ChPwForm()
if request.user.is_anonymous():
return HttpResponse(status=403)
if request.method == 'POST':
chpw_form = ChPwForm(request.POST)
if chpw_form.is_valid():
# Trigger PAM once to ensure password is correct
ret = pam().authenticate(request.user.username,
chpw_form.cleaned_data['password_old'], service='ticdesk')
if ret:
# Do expect conversation with passwd as logged-in user
child = pexpect.spawn('su -c passwd %s' % request.user.username)
# Password prompt from su
child.expect('[Pp]assword: ')
child.sendline(chpw_form.cleaned_data['password_old'])
# Old password prompt from pam_krb5
child.expect('[Cc]urrent [Kk]erberos [Pp]assword: ')
child.sendline(chpw_form.cleaned_data['password_old'])
# New password prompt from pam_krb5
child.expect('[Ee]nter new [Kk]erberos [Pp]assword: ')
child.sendline(chpw_form.cleaned_data['password_new'])
# Confirm new password prompt from pam_krb5
child.expect('[Rr]etype new [Kk]erberos [Pp]assword: ')
child.sendline(chpw_form.cleaned_data['password_new'])
# Try new password
ret = pam().authenticate(request.user.username,
chpw_form.cleaned_data['password_new'], service='ticdesk')
if ret:
context['success'] = True
else:
context]'error'] = _('Fehler beim Ändern des Passworts.')
else:
context['error'] = _('Das angegebene alte Passwort ist falsch!')
context['chpw_form'] = chpw_form
return render(request, 'ticdesk_account/change_password.html', context)
def register(request): def register(request):
context = {} context = {}
register_form = RegisterForm(initial={'newsletter': 'none'}) register_form = RegisterForm(initial={'newsletter': 'none'})
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment