First maybe working version
This commit is contained in:
1 parent
ae89f1ac4e
commit
f7de6a81fe
13 files changed
+144
-34
No files matched your search
+12
-3
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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.'
|
||||
|
||||
Executable
+25
@@ -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 |
@@ -16,6 +16,14 @@ html {
|
||||
article {
|
||||
}
|
||||
footer {
|
||||
position:relative;
|
||||
top: 100px;
|
||||
}
|
||||
}
|
||||
}
|
||||
img.list {
|
||||
vertical-align:middle;
|
||||
}
|
||||
ul {
|
||||
list-style:none;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in new issue
Block a user