Console OpenVPN, développée en Django Permet de gérer des instances, serveurs, et comptes OpenVPN
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.
 
 
 
 
 
 

344 lines
15 KiB

# -*- 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')