First maybe working version

This commit is contained in:
nikolark committed 2012-02-02 10:32:58 +01:00
1 parent ae89f1ac4e
commit f7de6a81fe
13 files changed
+144 -34

No files matched your search

+12 -3
View File
@@ -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)
+10 -4
View File
@@ -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)
+1
View File
@@ -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
+19 -5
View File
@@ -3,6 +3,9 @@
<head>
<title>Midlertidig Bruker For Trådløst Nettverk på Chateau Neuf - {{log.id}}</title>
<style type="text/css">
body {
font-size:1.7em;
}
@page {
size: {{ pagesize }};
margin: 1cm;
@@ -14,21 +17,32 @@
height: 1cm;
}
}
.monospace {
font-family: monospace;
}
#logo {
margin-top: 1cm;
}
</style>
</head>
<body>
{% for userpass in log.userpass_set.all %}
<div>
<h1>Midlertidig Bruker For Trådløst Nettverk på Chateau Neuf</h1>
Brukernavn: {{log.username}}<br />
Passord: {{ log.password }}<br />
Utstedt: {{ log.created }}<br />
Gyldig til: {{ log.expires }}<br />
<!-- LOGO -->
Brukernavn: <span class="monospace">{{ userpass.username }}</span><br />
Passord: <span class="monospace">{{ userpass.password }}</span><br />
Utstedt: {{ log.created }}<br />
Gyldig til: {{ log.expires }}<br />
</div>
<div id="logo">
<img src="/home/nikolark/dev/edb/mbftns/static/standard/images/DNSlogo.jpg" />
</div>
<div id="footerContent">
{% block page_foot %}
Page <pdf:pagenumber>
{% endblock %}
</div>
<pdf:nextpage>
{% endfor %}
</body>
</html>
+7 -5
View File
@@ -3,21 +3,23 @@
{% block content %}
<h2>Liste over midlertidige brukere</h2>
<p>
<table>
<table id="user_list">
<tr>
<th>Produsert</th>
<th>Produsert av</th>
<th>For hvem</th>
<th>For hvem/Hvorfor</th>
<th>Utgår</th>
<th>PDF</th>
<th>Antall</th>
<th>Skriv ut</th>
</tr>
{% for user in object_list %}
<tr>
<td>{{ user.created }}</td>
<td>{{ user.issued_by }}</td>
<td>{{ user.who }}</td>
<td>{{ user.description }}</td>
<td>{{ user.expires|timeuntil}}</td>
<td><a href="{% url download_pdf tempuserlog_id=user.id %}">PDF-icon</a></td>
<td>{{ user.count }}</td>
<td><a href="{% url download_pdf tempuserlog_id=user.id %}"><img src="{{STATIC_URL}}standard/images/printer.png" class="list" /></a></td>
</tr>
{%endfor %}
</table>
+25
View File
@@ -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
+24 -17
View File
@@ -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.'
+25
View File
@@ -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()
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

+8
View File
@@ -16,6 +16,14 @@ html {
article {
}
footer {
position:relative;
top: 100px;
}
}
}
img.list {
vertical-align:middle;
}
ul {
list-style:none;
}
+13
View File
@@ -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;
}