You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
345 lines
15 KiB
345 lines
15 KiB
|
13 years ago
|
# -*- coding: utf-8 -*-
|
||
|
|
#
|
||
|
|
# vim:syntax=python:sw=4:ts=4:expandtab
|
||
|
|
|
||
|
|
#
|
||
|
|
# Copyright (C) Adelux - 2009
|
||
|
|
#
|
||
|
|
|
||
|
|
from django.shortcuts import render_to_response
|
||
|
|
from django.template import RequestContext
|
||
|
|
from django.core.urlresolvers import reverse
|
||
|
|
from django.http import HttpResponseRedirect
|
||
|
|
from django.contrib.auth import authenticate,login, logout
|
||
|
|
from django.contrib.auth.forms import UserCreationForm
|
||
|
|
from django.contrib.auth.decorators import login_required
|
||
|
|
from django.db.models import Q
|
||
|
|
|
||
|
|
import django.views.generic.create_update
|
||
|
|
from ovpnmanager.ovpnconsole.models import *
|
||
|
|
|
||
|
|
## Globales
|
||
|
|
def index(request):
|
||
|
|
object_list = OVPNSite.objects.all()
|
||
|
|
return render_to_response('ovpnconsole/index.html', context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def search(request):
|
||
|
|
return render_to_response('ovpnconsole/search.html', context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def keypress(request):
|
||
|
|
content = request.POST['inputText']
|
||
|
|
if content is not None:
|
||
|
|
results = OVPNUser.objects.filter(Q(name__istartswith = content) | Q(email__icontains = content) | Q(ovpnserver__name__icontains = content) | Q(ovpnserver__ovpnauthority__name__icontains = content)).order_by( 'name' )
|
||
|
|
|
||
|
|
return render_to_response( 'ovpnconsole/search_result.html', {'search' : 'user', 'results' : results}, context_instance = RequestContext( request ) )
|
||
|
|
|
||
|
|
## Sites
|
||
|
|
def ovpnsite_list(request):
|
||
|
|
object_list = OVPNSite.objects.all()
|
||
|
|
return render_to_response('ovpnconsole/ovpnsite_list.html',{'object_list' : object_list}, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def modify_site(request, object_id):
|
||
|
|
ovpnsite_object = OVPNSite.objects.get(pk=object_id)
|
||
|
|
if request.user.is_superuser == False:
|
||
|
|
return render_to_response('ovpnconsole/access_denied.html',{ 'ovpnsite_object':ovpnsite_object }, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
if request.method == 'POST':
|
||
|
|
form = OVPNSiteForm(request.POST, instance=ovpnsite_object)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/site/' + object_id)
|
||
|
|
else:
|
||
|
|
form = OVPNSiteForm(instance=ovpnsite_object)
|
||
|
|
return render_to_response('ovpnconsole/ovpnsite_form.html', { 'form': form, 'ovpnsite_object' : ovpnsite_object },context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
#Authority
|
||
|
|
def ovpnauthority_detail(request, object_id):
|
||
|
|
ovpnauthority_object = OVPNAuthority.objects.get(id=object_id)
|
||
|
|
return django.views.generic.list_detail.object_detail(
|
||
|
|
request,
|
||
|
|
queryset = OVPNAuthority.objects.all(),
|
||
|
|
object_id = object_id,
|
||
|
|
extra_context={'detail':'0'},
|
||
|
|
)
|
||
|
|
|
||
|
|
def modify_ovpnauthority(request,object_id):
|
||
|
|
ovpnauthority_object = OVPNAuthority.objects.get(pk=object_id)
|
||
|
|
return HttpResponseRedirect(reverse('modify_authority', args=(ovpnauthority_object.id,)))
|
||
|
|
|
||
|
|
|
||
|
|
def create_ovpnauthority(request, site_id):
|
||
|
|
ovpnsite_object = OVPNSite.objects.get(id=site_id)
|
||
|
|
if request.method == "POST":
|
||
|
|
form = OVPNAuthorityForm(request.POST)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/site/' + str(site_id))
|
||
|
|
else:
|
||
|
|
form = OVPNAuthorityForm()
|
||
|
|
return render_to_response('ovpnconsole/ovpnauthority_form.html', { 'form': form, 'ovpnsite_object': ovpnsite_object}, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
|
||
|
|
# Server
|
||
|
|
def ovpnserver_detail(request, object_id):
|
||
|
|
ovpnserver_object = OVPNServer.objects.get(id=object_id)
|
||
|
|
return django.views.generic.list_detail.object_detail(
|
||
|
|
request,
|
||
|
|
queryset = OVPNServer.objects.all(),
|
||
|
|
object_id = object_id,
|
||
|
|
extra_context={'detail':'0' },
|
||
|
|
)
|
||
|
|
|
||
|
|
def ovpnserverconnhist_detail(request, object_id):
|
||
|
|
ovpnserver_object = OVPNServer.objects.get(id=object_id)
|
||
|
|
return django.views.generic.list_detail.object_list(
|
||
|
|
request,
|
||
|
|
queryset = OVPNServerConnHist.objects.filter(ovpnserver__exact=ovpnserver_object).order_by('-conn_date', '-disc_date'),
|
||
|
|
paginate_by = 25,
|
||
|
|
extra_context={'object':ovpnserver_object}
|
||
|
|
)
|
||
|
|
|
||
|
|
def ovpnserverconnhist_search(request, object_id):
|
||
|
|
ovpnserver_object = OVPNServer.objects.get(id=object_id)
|
||
|
|
content = request.POST['inputText']
|
||
|
|
if content is not None:
|
||
|
|
results = OVPNServerConnHist.objects.filter(Q( Q(user_name__istartswith = content) | Q(virt_ip__contains = content) | Q(real_ip__contains = content)) & Q(ovpnserver__exact=ovpnserver_object) ).order_by('-conn_date', '-disc_date')
|
||
|
|
return render_to_response( 'ovpnconsole/search_result.html', {'search' : 'server_connhist', 'results' : results}, context_instance = RequestContext( request ) )
|
||
|
|
|
||
|
|
def create_ovpnserver(request, authority_id):
|
||
|
|
ovpnauthority_object = OVPNAuthority.objects.get(id=authority_id)
|
||
|
|
if request.method == "POST":
|
||
|
|
form = OVPNServerForm(request.POST)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/authority/' + str(authority_id))
|
||
|
|
else:
|
||
|
|
form = OVPNServerForm()
|
||
|
|
return render_to_response('ovpnconsole/ovpnserver_form.html', { 'form': form, 'ovpnauthority_object': ovpnauthority_object}, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def modify_ovpnserver(request, object_id):
|
||
|
|
ovpnserver_object = OVPNServer.objects.get(id=object_id)
|
||
|
|
if request.method == "POST":
|
||
|
|
form = OVPNServerForm(request.POST, instance=ovpnserver_object)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/server/' + str(ovpnserver_object.id))
|
||
|
|
else:
|
||
|
|
form = OVPNServerForm(instance=ovpnserver_object)
|
||
|
|
return render_to_response('ovpnconsole/ovpnserver_form.html', { 'form': form, 'ovpnserver_object': ovpnserver_object},context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def ovpnserver_restart(request, object_id):
|
||
|
|
ovpnserver_object = OVPNServer.objects.get(id=object_id)
|
||
|
|
# verify if server is correctly configured
|
||
|
|
if ovpnserver_object:
|
||
|
|
# try to call restart function
|
||
|
|
output = ovpnserver_object.restart_server()
|
||
|
|
result = int(output[0])
|
||
|
|
if result == 0:
|
||
|
|
message = 'Server successfully restarted : \n\n ' + output[1]
|
||
|
|
else:
|
||
|
|
message = 'Error during server restart : \n\n ' + output[2]
|
||
|
|
return render_to_response('ovpnconsole/ovpnserver_result.html', { 'action' : 'restart', 'result': result, 'message': message, 'object': ovpnserver_object },context_instance=RequestContext(request))
|
||
|
|
else:
|
||
|
|
return HttpResponseRedirect(reverse('server_settings', args=(ovpnserver_object.id,)))
|
||
|
|
|
||
|
|
## user
|
||
|
|
def ovpnuser_detail(request, object_id):
|
||
|
|
ovpnuser_object = OVPNUser.objects.get(id=object_id)
|
||
|
|
## get connexions history
|
||
|
|
ovpnserver_connhist = OVPNServerConnHist.objects.filter(user_name = ovpnuser_object.name)
|
||
|
|
return django.views.generic.list_detail.object_detail(
|
||
|
|
request,
|
||
|
|
queryset = OVPNUser.objects.all(),
|
||
|
|
object_id = object_id,
|
||
|
|
extra_context={'detail':'0', 'ovpnserver_connhist' : ovpnserver_connhist },
|
||
|
|
)
|
||
|
|
|
||
|
|
def create_ovpnuser(request, server_id):
|
||
|
|
ovpnserver_object = OVPNServer.objects.get(id=server_id)
|
||
|
|
if request.method == "POST":
|
||
|
|
form = OVPNUserForm(request.POST)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/server/' + str(server_id))
|
||
|
|
else:
|
||
|
|
form = OVPNUserForm()
|
||
|
|
return render_to_response('ovpnconsole/ovpnuser_form.html', { 'form': form, 'ovpnserver_object': ovpnserver_object},context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def modify_ovpnuser(request, object_id):
|
||
|
|
ovpnuser_object = OVPNUser.objects.get(id=object_id)
|
||
|
|
if request.method == "POST":
|
||
|
|
# preserve password
|
||
|
|
newrequest = request.POST.copy()
|
||
|
|
newrequest['password'] = ovpnuser_object.password
|
||
|
|
newrequest['password_validation'] = ovpnuser_object.password_validation
|
||
|
|
# pass the form data
|
||
|
|
form = OVPNUserParamForm(newrequest, instance=ovpnuser_object)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/server/' + str(ovpnuser_object.ovpnserver.id))
|
||
|
|
else:
|
||
|
|
form = OVPNUserParamForm(instance=ovpnuser_object, initial={'password':ovpnuser_object.password, 'password_validation':ovpnuser_object.password})
|
||
|
|
return render_to_response('ovpnconsole/ovpnuser_form.html', { 'form': form, 'ovpnuser_object': ovpnuser_object },context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def delete_ovpnuser(request, object_id):
|
||
|
|
ovpnuser_object = OVPNUser.objects.get(id=object_id)
|
||
|
|
postredirect = '/ovpnconsole/server/' + str(ovpnuser_object.ovpnserver.id)
|
||
|
|
#return django.views.generic.create_update.delete_object(request, dict(model=OVPNUser,post_delete_redirect=postredirect, object_id=object_id))
|
||
|
|
return django.views.generic.create_update.delete_object(request, OVPNUser,postredirect, object_id)
|
||
|
|
|
||
|
|
def change_user_passwd(request, object_id):
|
||
|
|
ovpnuser_object = OVPNUser.objects.get(id=object_id)
|
||
|
|
if request.method == "POST":
|
||
|
|
form = OVPNUserPasswdForm(request.POST, instance=ovpnuser_object)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/server/' + str(ovpnuser_object.ovpnserver.id))
|
||
|
|
else:
|
||
|
|
form = OVPNUserPasswdForm(instance=ovpnuser_object)
|
||
|
|
return render_to_response('ovpnconsole/ovpnuser_form.html', { 'form': form, 'ovpnuser_object': ovpnuser_object, 'action' : 'changepasswd'},context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def revoke_ovpnuser(request, object_id):
|
||
|
|
ovpnuser_object = OVPNUser.objects.get(id=object_id)
|
||
|
|
ovpnuser_object.revoke_user()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/server/' + str(ovpnuser_object.ovpnserver.id))
|
||
|
|
|
||
|
|
def notify_ovpnuser(request, object_id):
|
||
|
|
ovpnuser_object = OVPNUser.objects.get(id=object_id)
|
||
|
|
#ovpnserver_settings = ovpnuser_object.ovpnserver.ovpnserversettings_set.all()[0]
|
||
|
|
ovpnserver_settings = ovpnuser_object.ovpnserver.ovpnserversettings
|
||
|
|
if request.method == "POST":
|
||
|
|
mail_from = 'ovpnmanager@arrive.fr'
|
||
|
|
reply_to = 'noreply@noresponse.com'
|
||
|
|
copy_to = request.POST['copy_to']
|
||
|
|
subject = request.POST['subject']
|
||
|
|
message = request.POST['message']
|
||
|
|
send_to = ['']
|
||
|
|
send_to.append(ovpnuser_object.email)
|
||
|
|
if copy_to:
|
||
|
|
send_to.append(copy_to)
|
||
|
|
from django.core.mail import send_mail, EmailMessage
|
||
|
|
import base64
|
||
|
|
|
||
|
|
# create mail object
|
||
|
|
email = EmailMessage(subject,message,mail_from,send_to,headers = {'Reply-To': reply_to})
|
||
|
|
|
||
|
|
# generate user p12 content
|
||
|
|
basedir = ovpnuser_object.ovpnserver.ovpnauthority.work_dir
|
||
|
|
ovpnuser_object.ovpnserver.ovpnauthority.write_authority_files()
|
||
|
|
ovpntools = ovpnuser_object.ovpnserver.ovpnauthority.create_ovpntools_object()
|
||
|
|
ovpntools.commonName = ovpnuser_object.ovpnserver.ovpnauthority.name
|
||
|
|
ovpntools.email = ovpnuser_object.email
|
||
|
|
f = open(basedir + '/' + ovpnuser_object.name + '.crt', 'w')
|
||
|
|
print >> f, ovpnuser_object.user_crt_content
|
||
|
|
f.close()
|
||
|
|
f = open(basedir + '/' + ovpnuser_object.name + '.key', 'w')
|
||
|
|
print >> f, ovpnuser_object.user_key_content
|
||
|
|
f.close()
|
||
|
|
ovpntools.generate_user_pkcs(ovpnuser_object.name,ovpnuser_object.password,basedir)
|
||
|
|
userp12 = ovpntools.read_user_pkcs(ovpnuser_object.name,basedir).rstrip('\n')
|
||
|
|
|
||
|
|
# encode userp12 to base64 encoding
|
||
|
|
#userp12_b64 = base64.b64encode(str(userp12))
|
||
|
|
#userp12_b64 = base64.b64encode(userp12)
|
||
|
|
|
||
|
|
# attach user p12 content to email
|
||
|
|
email.attach(ovpnuser_object.name + '-' + ovpnuser_object.ovpnserver.ovpnauthority.ovpnsite.name + '-' + ovpnuser_object.ovpnserver.ovpnauthority.name + '-' + ovpnuser_object.ovpnserver.name + '.p12',userp12,'application/x-pkcs12')
|
||
|
|
|
||
|
|
# generate user config
|
||
|
|
ovpnuser_object.generate_user_config()
|
||
|
|
ovpnuser_object.save()
|
||
|
|
|
||
|
|
# attach user config to email
|
||
|
|
email.attach(ovpnuser_object.name + '-' + ovpnuser_object.ovpnserver.ovpnauthority.ovpnsite.name + '-' + ovpnuser_object.ovpnserver.ovpnauthority.name + '-' + ovpnuser_object.ovpnserver.name + '.ovpn',ovpnuser_object.config_content,'application/x-ovpn')
|
||
|
|
|
||
|
|
email.send()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/server/' + str(ovpnuser_object.ovpnserver.id))
|
||
|
|
|
||
|
|
return render_to_response('ovpnconsole/sendmail.html',{'ovpnuser_object' : ovpnuser_object, 'ovpnserver_settings': ovpnserver_settings},context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
|
||
|
|
# Apply Server Config
|
||
|
|
def apply_ovpnserver_config(request, object_id):
|
||
|
|
ovpnserver = OVPNServer.objects.get(pk=object_id)
|
||
|
|
(result,output) = ovpnserver.submit_server_config()
|
||
|
|
if result == 'OK':
|
||
|
|
message = 'Server configuration apply successful : \n '
|
||
|
|
else:
|
||
|
|
message = 'Error during server configuration apply : \n '
|
||
|
|
|
||
|
|
message += output
|
||
|
|
return render_to_response('ovpnconsole/ovpnserver_result.html', { 'result': result, 'message': message, 'object': ovpnserver},context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
|
||
|
|
# Server settings
|
||
|
|
def ovpnserver_settings(request, object_id):
|
||
|
|
ovpnserver_object = OVPNServer.objects.get(id=object_id)
|
||
|
|
# creates ovpnserversettings object if not exists
|
||
|
|
try:
|
||
|
|
ovpnserver_object.ovpnserversettings
|
||
|
|
except:
|
||
|
|
import string
|
||
|
|
import random
|
||
|
|
|
||
|
|
LENGTH=24
|
||
|
|
agent_key = "".join(random.sample(string.letters+string.digits, LENGTH))
|
||
|
|
ovpnserversettings = OVPNServerSettings(ovpnserver=ovpnserver_object, ovpnserver_type='loc', connection_address='127.0.0.1',ovpnagent_key=agent_key)
|
||
|
|
super(OVPNServerSettings, ovpnserversettings).save()
|
||
|
|
|
||
|
|
ovpnserversettings_object = ovpnserver_object.ovpnserversettings
|
||
|
|
if request.method == "POST":
|
||
|
|
form = OVPNServerSettingsForm(request.POST, instance=ovpnserversettings_object)
|
||
|
|
if form.is_valid():
|
||
|
|
form.save()
|
||
|
|
return HttpResponseRedirect('/ovpnconsole/server/' + str(object_id))
|
||
|
|
else:
|
||
|
|
form = OVPNServerSettingsForm(instance=ovpnserversettings_object)
|
||
|
|
return render_to_response('ovpnconsole/ovpnserversettings_form.html', { 'form': form, 'ovpnserversettings_object': ovpnserversettings_object, 'ovpnserver_object':ovpnserver_object},context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
# Authentification
|
||
|
|
def logout_view(request):
|
||
|
|
if request.user.is_authenticated():
|
||
|
|
logout(request)
|
||
|
|
return render_to_response('ovpnconsole/logged_off.html', context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
### Admin
|
||
|
|
def admin_page(request):
|
||
|
|
if request.user.is_superuser == False:
|
||
|
|
return render_to_response('ovpnconsole/access_denied.html',{ 'return':'/ovpnconsole/' }, context_instance=RequestContext(request))
|
||
|
|
return render_to_response('ovpnconsole/admin/index.html', { 'user_list': User.objects.all(), }, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def add_user(request):
|
||
|
|
if request.user.is_superuser == False:
|
||
|
|
return render_to_response('ovpnconsole/access_denied.html',{ 'return':'/ovpnconsole/' }, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
if request.method == 'POST':
|
||
|
|
form = UserForm(request.POST)
|
||
|
|
if form.is_valid():
|
||
|
|
new_user = form.save()
|
||
|
|
return HttpResponseRedirect("/ovpnconsole/admin/")
|
||
|
|
else:
|
||
|
|
form = UserForm()
|
||
|
|
return render_to_response("ovpnconsole/admin/user_form.html", { 'form': form, }, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
def change_user(request,user_id):
|
||
|
|
if request.user.is_superuser == False:
|
||
|
|
return render_to_response('ovpnconsole/access_denied.html',{ 'return':'/ovpnconsole/' }, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
user_object = User.objects.get(id=user_id)
|
||
|
|
if request.method == 'POST':
|
||
|
|
form = UserForm(request.POST,instance=user_object)
|
||
|
|
if form.is_valid():
|
||
|
|
change_user = form.save()
|
||
|
|
return HttpResponseRedirect("/ovpnconsole/admin/")
|
||
|
|
else:
|
||
|
|
form = UserForm(instance=user_object)
|
||
|
|
return render_to_response("ovpnconsole/admin/user_form.html", { 'user_object': user_object, 'form': form, }, context_instance=RequestContext(request))
|
||
|
|
|
||
|
|
|
||
|
|
def delete_user(request, user_id):
|
||
|
|
if request.user.is_superuser == False:
|
||
|
|
return render_to_response('ovpnconsole/access_denied.html',{ 'return':'/ovpnconsole/' }, context_instance=RequestContext(request))
|
||
|
|
postredirect = '/ovpnconsole/admin/'
|
||
|
|
return django.views.generic.create_update.delete_object(request, User, postredirect, user_id, template_name = 'ovpnconsole/admin/user_confirm_delete.html')
|
||
|
|
|