diff --git a/main/forms.py b/main/forms.py index c08d43b..12047b8 100644 --- a/main/forms.py +++ b/main/forms.py @@ -1,8 +1,7 @@ from django import forms -from django.forms.widgets import RadioSelect +from django.forms.widgets import RadioSelect, Textarea class TempUserForm(forms.Form): - who = forms.CharField(label='Hvem', required=True) RANGE_CHOICES = ( ('1', '1 dag'), ('2', '2 dager'), @@ -14,4 +13,14 @@ class TempUserForm(forms.Form): choices=RANGE_CHOICES, widget=RadioSelect, required=True) - why = forms.CharField(label='Hvorfor', required=True) + description = forms.CharField( + label='Hvem og hvorfor', + widget=Textarea, + max_length=255, + required=True) + count = forms.IntegerField( + label='Hvor mange', + initial=1, + required=True, + min_value=1, + max_value=30) diff --git a/main/models.py b/main/models.py index 013b6ac..4b291ae 100644 --- a/main/models.py +++ b/main/models.py @@ -2,9 +2,15 @@ from django.db import models from django.contrib.auth.models import User class TempUserLog(models.Model): - who = models.CharField(max_length=255) - why = models.CharField(max_length=255) - expires = models.DateTimeField() issued_by = models.ForeignKey(User) + description = models.TextField(max_length=255) + expires = models.DateTimeField() + count = models.IntegerField() + deleted = models.BooleanField(default=False) created = models.DateTimeField(auto_now_add=True) - # TODO username and pass + +class UserPass(models.Model): + username = models.CharField(max_length=50) + password = models.CharField(max_length=50) + log = models.ForeignKey(TempUserLog) + diff --git a/main/pdf.py b/main/pdf.py index 1d900ad..418c5df 100644 --- a/main/pdf.py +++ b/main/pdf.py @@ -3,6 +3,7 @@ # Ref: # - http://stackoverflow.com/questions/1377446/html-to-pdf-for-a-django-site # - http://stackoverflow.com/questions/2179958/django-pisa-adding-images-to-pdf-output ? +# - http://web.archive.org/web/20090413054650/http://www.xhtml2pdf.com/doc/pisa-en.html import cStringIO as StringIO import ho.pisa as pisa diff --git a/main/templates/pdf/new_temp_user.html b/main/templates/pdf/new_temp_user.html index 4c32080..cee5127 100644 --- a/main/templates/pdf/new_temp_user.html +++ b/main/templates/pdf/new_temp_user.html @@ -3,6 +3,9 @@ Midlertidig Bruker For Trådløst Nettverk på Chateau Neuf - {{log.id}} + {% for userpass in log.userpass_set.all %}

Midlertidig Bruker For Trådløst Nettverk på Chateau Neuf

- Brukernavn: {{log.username}}
- Passord: {{ log.password }}
- Utstedt: {{ log.created }}
- Gyldig til: {{ log.expires }}
- + Brukernavn: {{ userpass.username }}
+ Passord: {{ userpass.password }}
+ Utstedt: {{ log.created }}
+ Gyldig til: {{ log.expires }}
+
+
{% block page_foot %} Page {% endblock %}
+ + {% endfor %} diff --git a/main/templates/private/list.html b/main/templates/private/list.html index cae1974..0bdc84d 100644 --- a/main/templates/private/list.html +++ b/main/templates/private/list.html @@ -3,21 +3,23 @@ {% block content %}

Liste over midlertidige brukere

- +
- + - + + {% for user in object_list %} - + - + + {%endfor %}
Produsert Produsert avFor hvemFor hvem/Hvorfor UtgårPDFAntallSkriv ut
{{ user.created }} {{ user.issued_by }}{{ user.who }}{{ user.description }} {{ user.expires|timeuntil}}PDF-icon{{ user.count }}
diff --git a/main/utils.py b/main/utils.py new file mode 100644 index 0000000..ffea68d --- /dev/null +++ b/main/utils.py @@ -0,0 +1,25 @@ +import random, string +import hashlib + +from main.models import UserPass + +def generate_username(): + length = 4 + username = "guest{0}".format(''.join(random.choice(string.digits) for x in range(length))) + # unique + if len(UserPass.objects.filter(username=username)) == 0: + return username + else: + return generate_username() + +def generate_password(): + myrg = random.SystemRandom() + length = 8 + alphabet = string.letters[0:52] + string.digits + pw = str().join(myrg.choice(alphabet) for _ in range(length)) + return pw + +def ntpass_hash(raw_password): + # found in the wild. + nt_password = hashlib.new('md4', raw_password.encode('utf-16le')).hexdigest() + return nt_password diff --git a/main/views.py b/main/views.py index 5075269..4987cb1 100644 --- a/main/views.py +++ b/main/views.py @@ -17,7 +17,9 @@ from django.contrib import messages from models import * +from radius.models import * from forms import * +import utils from pdf import render_to_pdf @@ -43,14 +45,19 @@ def new(request): duration = datetime.timedelta(days=form.cleaned_data['duration']) expires = datetime.datetime.now() + duration log = TempUserLog( - who=form.cleaned_data['who'], - why=form.cleaned_data['why'], + description=form.cleaned_data['description'], expires=expires, - issued_by=request.user) - #TODO : generate username and pasword - #TODO : save in radiusdb + issued_by=request.user, + count=form.cleaned_data['count']) log.save() + for i in range(form.cleaned_data['count']): + up = UserPass.objects.create( + username=utils.generate_username(), + password=utils.generate_password(), + log=log) messages.success(request, log.id) # Store the id in session, since we are redirecting + + messages.success(request, save_to_radius(log)) # Store in Radius return HttpResponseRedirect( reverse('main.views.new_created') ) else: form = TempUserForm(request.POST) @@ -64,16 +71,12 @@ def new_created(request): # Retrieve the last id from session storage = messages.get_messages(request) msgs = [message for message in storage] - tempuserlog_id = msgs[0].message + if len(msgs) > 0: + tempuserlog_id = msgs[0].message + else: + tempuserlog_id = 0 return render_to_response('private/new_created.html', locals(), context_instance=RequestContext(request)) - -@login_required -def list_users(request): - # generic view? - users = TempUserLog.objects.all() - return render_to_response('private/list.html', locals(), context_instance=RequestContext(request)) - @login_required def system(request): return render_to_response('private/system.html', locals(), context_instance=RequestContext(request)) @@ -91,8 +94,12 @@ def download_pdf(request, tempuserlog_id=-1): } ) -def client_status(request): - # example json view - data = { 'example' : 'json_view' } - return HttpResponse(json.dumps(data), content_type='application/javascript; charset=utf8') +def save_to_radius(log): + for up in log.userpass_set.all(): + Radcheck.objects.create( + username=up.username, + attribute='NT-Password', + op=':=', + value=utils.ntpass_hash(up.password)) + return 'Successfully created user(s) in radius database.' diff --git a/scripts/delete_expired.py b/scripts/delete_expired.py new file mode 100755 index 0000000..7965908 --- /dev/null +++ b/scripts/delete_expired.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# coding: utf-8 +import os +import sys +from datetime import datetime + +project_path = '/home/nikolark/dev/edb/mbftns/' +if project_path not in sys.path: + sys.path.append(project_path) + +from django.core.management import setup_environ +from django.core.mail import mail_admins +import settings + +setup_environ(settings) + +from main.models import * +from radius.models import * +logs = TempUserLog.objects.filter(expires__lt=datetime.now(), deleted=False) + +for log in logs: + for up in log.userpass_set.all(): + Radcheck.objects.filter(username=up.username).delete() + log.deleted = True + log.save() diff --git a/static/standard/images/DNSlogo.jpg b/static/standard/images/DNSlogo.jpg new file mode 100644 index 0000000..d25af1a Binary files /dev/null and b/static/standard/images/DNSlogo.jpg differ diff --git a/static/standard/images/edb_brick.jpg b/static/standard/images/edb_brick.jpg new file mode 100644 index 0000000..b0664e7 Binary files /dev/null and b/static/standard/images/edb_brick.jpg differ diff --git a/static/standard/images/printer.png b/static/standard/images/printer.png new file mode 100644 index 0000000..1992148 Binary files /dev/null and b/static/standard/images/printer.png differ diff --git a/static/standard/sass/screen.scss b/static/standard/sass/screen.scss index 0de2c89..7b8bdcd 100644 --- a/static/standard/sass/screen.scss +++ b/static/standard/sass/screen.scss @@ -16,6 +16,14 @@ html { article { } footer { + position:relative; + top: 100px; } } } +img.list { + vertical-align:middle; +} +ul { + list-style:none; +} diff --git a/static/standard/stylesheets/screen.css b/static/standard/stylesheets/screen.css index 176e717..476c7fd 100644 --- a/static/standard/stylesheets/screen.css +++ b/static/standard/stylesheets/screen.css @@ -2822,3 +2822,16 @@ input[type=submit].btn::-moz-focus-inner { -o-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); } + +html body footer { + position: relative; + top: 100px; +} + +img.list { + vertical-align: middle; +} + +ul { + list-style: none; +}