From f7de6a81fea13467815f518430250fce55f3e96c Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Thu, 2 Feb 2012 10:32:58 +0100 Subject: [PATCH] First maybe working version --- main/forms.py | 15 +++++++-- main/models.py | 14 ++++++--- main/pdf.py | 1 + main/templates/pdf/new_temp_user.html | 24 ++++++++++++--- main/templates/private/list.html | 12 +++++--- main/utils.py | 25 +++++++++++++++ main/views.py | 41 +++++++++++++++---------- scripts/delete_expired.py | 25 +++++++++++++++ static/standard/images/DNSlogo.jpg | Bin 0 -> 5629 bytes static/standard/images/edb_brick.jpg | Bin 0 -> 664 bytes static/standard/images/printer.png | Bin 0 -> 824 bytes static/standard/sass/screen.scss | 8 +++++ static/standard/stylesheets/screen.css | 13 ++++++++ 13 files changed, 144 insertions(+), 34 deletions(-) create mode 100644 main/utils.py create mode 100755 scripts/delete_expired.py create mode 100644 static/standard/images/DNSlogo.jpg create mode 100644 static/standard/images/edb_brick.jpg create mode 100644 static/standard/images/printer.png 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 0000000000000000000000000000000000000000..d25af1a1591f3c010dbc627db0ef4ac51f637d1f GIT binary patch literal 5629 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