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