Statistics
| Branch: | Tag: | Revision:

root / flowspec / views.py @ 94571d8d

History | View | Annotate | Download (21.2 kB)

1 a3af8464 Leonidas Poulopoulos
# Create your views here.
2 357d48dc Leonidas Poulopoulos
import urllib2
3 357d48dc Leonidas Poulopoulos
import socket
4 97e42c7d Leonidas Poulopoulos
import json
5 357d48dc Leonidas Poulopoulos
from django import forms
6 357d48dc Leonidas Poulopoulos
from django.views.decorators.csrf import csrf_exempt
7 9cad4715 Leonidas Poulopoulos
from django.core import urlresolvers
8 97e42c7d Leonidas Poulopoulos
from django.core import serializers
9 357d48dc Leonidas Poulopoulos
from django.contrib.auth.decorators import login_required
10 34cff057 Leonidas Poulopoulos
from django.contrib.auth import logout
11 357e5b54 Leonidas Poulopoulos
from django.contrib.sites.models import Site
12 357e5b54 Leonidas Poulopoulos
from django.contrib.auth.models import User
13 357d48dc Leonidas Poulopoulos
from django.http import HttpResponseRedirect, HttpResponseForbidden, HttpResponse
14 357d48dc Leonidas Poulopoulos
from django.shortcuts import get_object_or_404, render_to_response
15 357d48dc Leonidas Poulopoulos
from django.core.context_processors import request
16 357d48dc Leonidas Poulopoulos
from django.template.context import RequestContext
17 fd3870ee Leonidas Poulopoulos
from django.template.loader import get_template, render_to_string
18 357d48dc Leonidas Poulopoulos
from django.core.urlresolvers import reverse
19 357d48dc Leonidas Poulopoulos
from django.contrib import messages
20 6ee21ffd Leonidas Poulopoulos
from flowspy.accounts.models import *
21 c6c0a85f Leonidas Poulopoulos
from ipaddr import *
22 357d48dc Leonidas Poulopoulos
23 97e42c7d Leonidas Poulopoulos
from django.contrib.auth import authenticate, login
24 97e42c7d Leonidas Poulopoulos
25 3e99e2d1 Leonidas Poulopoulos
from django.forms.models import model_to_dict
26 3e99e2d1 Leonidas Poulopoulos
27 9cad4715 Leonidas Poulopoulos
from flowspy.flowspec.forms import * 
28 357d48dc Leonidas Poulopoulos
from flowspy.flowspec.models import *
29 b969de46 Leonidas Poulopoulos
from flowspy.peers.models import *
30 b969de46 Leonidas Poulopoulos
31 357e5b54 Leonidas Poulopoulos
from registration.models import RegistrationProfile
32 357d48dc Leonidas Poulopoulos
33 3e99e2d1 Leonidas Poulopoulos
from copy import deepcopy
34 97e42c7d Leonidas Poulopoulos
from flowspy.utils.decorators import shib_required
35 3e99e2d1 Leonidas Poulopoulos
36 6a946adf Leonidas Poulopoulos
from django.views.decorators.cache import never_cache
37 6a946adf Leonidas Poulopoulos
from django.conf import settings
38 fdb1f9ec Leonidas Poulopoulos
from django.core.mail.message import EmailMessage
39 fdc3d663 Leonidas Poulopoulos
import datetime
40 57de574d Leonidas Poulopoulos
import os
41 57de574d Leonidas Poulopoulos
42 b4401a0c Leonidas Poulopoulos
LOG_FILENAME = os.path.join(settings.LOG_FILE_LOCATION, 'celery_jobs.log')
43 57de574d Leonidas Poulopoulos
#FORMAT = '%(asctime)s %(levelname)s: %(message)s'
44 57de574d Leonidas Poulopoulos
#logging.basicConfig(format=FORMAT)
45 cb0e212e Leonidas Poulopoulos
formatter = logging.Formatter('%(asctime)s %(levelname)s %(clientip)s %(user)s: %(message)s')
46 57de574d Leonidas Poulopoulos
47 57de574d Leonidas Poulopoulos
logger = logging.getLogger(__name__)
48 57de574d Leonidas Poulopoulos
logger.setLevel(logging.DEBUG)
49 57de574d Leonidas Poulopoulos
handler = logging.FileHandler(LOG_FILENAME)
50 57de574d Leonidas Poulopoulos
handler.setFormatter(formatter)
51 57de574d Leonidas Poulopoulos
logger.addHandler(handler)
52 57de574d Leonidas Poulopoulos
53 3e99e2d1 Leonidas Poulopoulos
@login_required
54 357d48dc Leonidas Poulopoulos
def user_routes(request):
55 357d48dc Leonidas Poulopoulos
    user_routes = Route.objects.filter(applier=request.user)
56 357d48dc Leonidas Poulopoulos
    return render_to_response('user_routes.html', {'routes': user_routes},
57 357d48dc Leonidas Poulopoulos
                              context_instance=RequestContext(request))
58 357d48dc Leonidas Poulopoulos
59 049a5a10 Leonidas Poulopoulos
def welcome(request):
60 049a5a10 Leonidas Poulopoulos
    return render_to_response('welcome.html', context_instance=RequestContext(request))
61 049a5a10 Leonidas Poulopoulos
62 3e99e2d1 Leonidas Poulopoulos
@login_required
63 6a946adf Leonidas Poulopoulos
@never_cache
64 6ee21ffd Leonidas Poulopoulos
def group_routes(request):
65 97e42c7d Leonidas Poulopoulos
    group_routes = []
66 d60db93b Leonidas Poulopoulos
    try:
67 d60db93b Leonidas Poulopoulos
        peer = request.user.get_profile().peer
68 d60db93b Leonidas Poulopoulos
    except UserProfile.DoesNotExist:
69 d60db93b Leonidas Poulopoulos
        error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username
70 d60db93b Leonidas Poulopoulos
        return render_to_response('error.html', {'error': error})
71 6ee21ffd Leonidas Poulopoulos
    if peer:
72 6ee21ffd Leonidas Poulopoulos
       peer_members = UserProfile.objects.filter(peer=peer)
73 6ee21ffd Leonidas Poulopoulos
       users = [prof.user for prof in peer_members]
74 6ee21ffd Leonidas Poulopoulos
       group_routes = Route.objects.filter(applier__in=users)
75 88a6afb7 Leonidas Poulopoulos
       if request.user.is_superuser:
76 88a6afb7 Leonidas Poulopoulos
           group_routes = Route.objects.all()
77 d60db93b Leonidas Poulopoulos
       return render_to_response('user_routes.html', {'routes': group_routes},
78 6ee21ffd Leonidas Poulopoulos
                              context_instance=RequestContext(request))
79 6ee21ffd Leonidas Poulopoulos
80 6ee21ffd Leonidas Poulopoulos
81 6ee21ffd Leonidas Poulopoulos
@login_required
82 6a946adf Leonidas Poulopoulos
@never_cache
83 9cad4715 Leonidas Poulopoulos
def add_route(request):
84 97e42c7d Leonidas Poulopoulos
    applier = request.user.pk
85 6a946adf Leonidas Poulopoulos
    applier_peer_networks = request.user.get_profile().peer.networks.all()
86 6a946adf Leonidas Poulopoulos
    if not applier_peer_networks:
87 6a946adf Leonidas Poulopoulos
         messages.add_message(request, messages.WARNING,
88 33e8f0b8 Leonidas Poulopoulos
                             "Insufficient rights on administrative networks. Cannot add rule. Contact your administrator")
89 6a946adf Leonidas Poulopoulos
         return HttpResponseRedirect(reverse("group-routes"))
90 9cad4715 Leonidas Poulopoulos
    if request.method == "GET":
91 88a6afb7 Leonidas Poulopoulos
        form = RouteForm(initial={'applier': applier})
92 6d48c46c Leonidas Poulopoulos
        if not request.user.is_superuser:
93 6d48c46c Leonidas Poulopoulos
            form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True)
94 b4e7dff4 Leonidas Poulopoulos
            form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False)
95 97e42c7d Leonidas Poulopoulos
        return render_to_response('apply.html', {'form': form, 'applier': applier},
96 9cad4715 Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
97 9cad4715 Leonidas Poulopoulos
98 9cad4715 Leonidas Poulopoulos
    else:
99 88a6afb7 Leonidas Poulopoulos
        request_data = request.POST.copy()
100 88a6afb7 Leonidas Poulopoulos
        if request.user.is_superuser:
101 88a6afb7 Leonidas Poulopoulos
            request_data['issuperuser'] = request.user.username
102 88a6afb7 Leonidas Poulopoulos
        else:
103 94571d8d Leonidas Poulopoulos
            request_data['applier'] = applier
104 88a6afb7 Leonidas Poulopoulos
            try:
105 88a6afb7 Leonidas Poulopoulos
                del requset_data['issuperuser']
106 88a6afb7 Leonidas Poulopoulos
            except:
107 88a6afb7 Leonidas Poulopoulos
                pass
108 88a6afb7 Leonidas Poulopoulos
        form = RouteForm(request_data)
109 9cad4715 Leonidas Poulopoulos
        if form.is_valid():
110 9cad4715 Leonidas Poulopoulos
            route=form.save(commit=False)
111 88a6afb7 Leonidas Poulopoulos
            if not request.user.is_superuser:
112 88a6afb7 Leonidas Poulopoulos
                route.applier = request.user
113 97e42c7d Leonidas Poulopoulos
            route.status = "PENDING"
114 94571d8d Leonidas Poulopoulos
            route.response = "Applying..."
115 c6c0a85f Leonidas Poulopoulos
            route.source = IPNetwork("%s/%s" %(IPNetwork(route.source).network.compressed, IPNetwork(route.source).prefixlen)).compressed
116 c6c0a85f Leonidas Poulopoulos
            route.destination = IPNetwork("%s/%s" %(IPNetwork(route.destination).network.compressed, IPNetwork(route.destination).prefixlen)).compressed
117 9cad4715 Leonidas Poulopoulos
            route.save()
118 9cad4715 Leonidas Poulopoulos
            form.save_m2m()
119 9cad4715 Leonidas Poulopoulos
            route.commit_add()
120 cb0e212e Leonidas Poulopoulos
            requesters_address = request.META['HTTP_X_FORWARDED_FOR']
121 fd3870ee Leonidas Poulopoulos
            mail_body = render_to_string("rule_add_mail.txt",
122 cb0e212e Leonidas Poulopoulos
                                             {"route": route, "address": requesters_address})
123 fdb1f9ec Leonidas Poulopoulos
            user_mail = "%s" %route.applier.email
124 fdb1f9ec Leonidas Poulopoulos
            user_mail = user_mail.split(';')
125 fdb1f9ec Leonidas Poulopoulos
            send_new_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s creation request submitted by %s" %(route.name, route.applier.username),
126 fdb1f9ec Leonidas Poulopoulos
                              mail_body, settings.SERVER_EMAIL, user_mail,
127 fdb1f9ec Leonidas Poulopoulos
                              get_peer_techc_mails(route.applier))
128 cb0e212e Leonidas Poulopoulos
            d = { 'clientip' : "%s"%requesters_address, 'user' : route.applier.username }
129 cb0e212e Leonidas Poulopoulos
            logger.info(mail_body, extra=d)
130 97e42c7d Leonidas Poulopoulos
            return HttpResponseRedirect(reverse("group-routes"))
131 9cad4715 Leonidas Poulopoulos
        else:
132 88a6afb7 Leonidas Poulopoulos
            if not request.user.is_superuser:
133 88a6afb7 Leonidas Poulopoulos
                form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True)
134 88a6afb7 Leonidas Poulopoulos
                form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False)
135 97e42c7d Leonidas Poulopoulos
            return render_to_response('apply.html', {'form': form, 'applier':applier},
136 9cad4715 Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
137 97e42c7d Leonidas Poulopoulos
138 97e42c7d Leonidas Poulopoulos
@login_required
139 6a946adf Leonidas Poulopoulos
@never_cache
140 3e99e2d1 Leonidas Poulopoulos
def edit_route(request, route_slug):
141 97e42c7d Leonidas Poulopoulos
    applier = request.user.pk
142 5141cf4a Leonidas Poulopoulos
    applier_peer = request.user.get_profile().peer
143 3e99e2d1 Leonidas Poulopoulos
    route_edit = get_object_or_404(Route, name=route_slug)
144 5141cf4a Leonidas Poulopoulos
    route_edit_applier_peer = route_edit.applier.get_profile().peer
145 88a6afb7 Leonidas Poulopoulos
    if applier_peer != route_edit_applier_peer and (not request.user.is_superuser):
146 5141cf4a Leonidas Poulopoulos
        messages.add_message(request, messages.WARNING,
147 33e8f0b8 Leonidas Poulopoulos
                             "Insufficient rights to edit rule %s" %(route_slug))
148 5141cf4a Leonidas Poulopoulos
        return HttpResponseRedirect(reverse("group-routes"))
149 2e52e8a5 Leonidas Poulopoulos
#    if route_edit.status == "ADMININACTIVE" :
150 2e52e8a5 Leonidas Poulopoulos
#        messages.add_message(request, messages.WARNING,
151 2e52e8a5 Leonidas Poulopoulos
#                             "Administrator has disabled editing of rule %s" %(route_slug))
152 2e52e8a5 Leonidas Poulopoulos
#        return HttpResponseRedirect(reverse("group-routes"))
153 2e52e8a5 Leonidas Poulopoulos
#    if route_edit.status == "EXPIRED" :
154 2e52e8a5 Leonidas Poulopoulos
#        messages.add_message(request, messages.WARNING,
155 2e52e8a5 Leonidas Poulopoulos
#                             "Cannot edit the expired rule %s. Contact helpdesk to enable it" %(route_slug))
156 2e52e8a5 Leonidas Poulopoulos
#        return HttpResponseRedirect(reverse("group-routes"))
157 fd3870ee Leonidas Poulopoulos
    if route_edit.status == "PENDING" :
158 fd3870ee Leonidas Poulopoulos
        messages.add_message(request, messages.WARNING,
159 fd3870ee Leonidas Poulopoulos
                             "Cannot edit a pending rule: %s." %(route_slug))
160 fd3870ee Leonidas Poulopoulos
        return HttpResponseRedirect(reverse("group-routes"))
161 3e99e2d1 Leonidas Poulopoulos
    route_original = deepcopy(route_edit)
162 3e99e2d1 Leonidas Poulopoulos
    if request.POST:
163 88a6afb7 Leonidas Poulopoulos
        request_data = request.POST.copy()
164 88a6afb7 Leonidas Poulopoulos
        if request.user.is_superuser:
165 88a6afb7 Leonidas Poulopoulos
            request_data['issuperuser'] = request.user.username
166 88a6afb7 Leonidas Poulopoulos
        else:
167 94571d8d Leonidas Poulopoulos
            request_data['applier'] = applier
168 88a6afb7 Leonidas Poulopoulos
            try:
169 88a6afb7 Leonidas Poulopoulos
                del request_data['issuperuser']
170 88a6afb7 Leonidas Poulopoulos
            except:
171 88a6afb7 Leonidas Poulopoulos
                pass
172 88a6afb7 Leonidas Poulopoulos
        form = RouteForm(request_data, instance = route_edit)
173 3d81901c Leonidas Poulopoulos
        critical_changed_values = ['source', 'destination', 'sourceport', 'destinationport', 'port', 'protocol', 'then']
174 3e99e2d1 Leonidas Poulopoulos
        if form.is_valid():
175 3d81901c Leonidas Poulopoulos
            changed_data = form.changed_data
176 3e99e2d1 Leonidas Poulopoulos
            route=form.save(commit=False)
177 3e99e2d1 Leonidas Poulopoulos
            route.name = route_original.name
178 3d81901c Leonidas Poulopoulos
            route.status = route_original.status
179 3d81901c Leonidas Poulopoulos
            route.response = route_original.response
180 88a6afb7 Leonidas Poulopoulos
            if not request.user.is_superuser:
181 88a6afb7 Leonidas Poulopoulos
                route.applier = request.user
182 3d81901c Leonidas Poulopoulos
            if bool(set(changed_data) & set(critical_changed_values)) or (not route_original.status == 'ACTIVE'):
183 3d81901c Leonidas Poulopoulos
                route.status = "PENDING"
184 88a6afb7 Leonidas Poulopoulos
                route.response = "Applying..."
185 3d81901c Leonidas Poulopoulos
                route.source = IPNetwork("%s/%s" %(IPNetwork(route.source).network.compressed, IPNetwork(route.source).prefixlen)).compressed
186 3d81901c Leonidas Poulopoulos
                route.destination = IPNetwork("%s/%s" %(IPNetwork(route.destination).network.compressed, IPNetwork(route.destination).prefixlen)).compressed
187 3e99e2d1 Leonidas Poulopoulos
            route.save()
188 3d81901c Leonidas Poulopoulos
            if bool(set(changed_data) & set(critical_changed_values)) or (not route_original.status == 'ACTIVE'):
189 3d81901c Leonidas Poulopoulos
                form.save_m2m()
190 3d81901c Leonidas Poulopoulos
                route.commit_edit()
191 3d81901c Leonidas Poulopoulos
                requesters_address = request.META['HTTP_X_FORWARDED_FOR']
192 3d81901c Leonidas Poulopoulos
                mail_body = render_to_string("rule_edit_mail.txt",
193 cb0e212e Leonidas Poulopoulos
                                             {"route": route, "address": requesters_address})
194 3d81901c Leonidas Poulopoulos
                user_mail = "%s" %route.applier.email
195 3d81901c Leonidas Poulopoulos
                user_mail = user_mail.split(';')
196 3d81901c Leonidas Poulopoulos
                send_new_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s edit request submitted by %s" %(route.name, route.applier.username),
197 fdb1f9ec Leonidas Poulopoulos
                              mail_body, settings.SERVER_EMAIL, user_mail,
198 fdb1f9ec Leonidas Poulopoulos
                              get_peer_techc_mails(route.applier))
199 3d81901c Leonidas Poulopoulos
                d = { 'clientip' : requesters_address, 'user' : route.applier.username }
200 3d81901c Leonidas Poulopoulos
                logger.info(mail_body, extra=d)
201 97e42c7d Leonidas Poulopoulos
            return HttpResponseRedirect(reverse("group-routes"))
202 3e99e2d1 Leonidas Poulopoulos
        else:
203 88a6afb7 Leonidas Poulopoulos
            if not request.user.is_superuser:
204 88a6afb7 Leonidas Poulopoulos
                form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True)
205 88a6afb7 Leonidas Poulopoulos
                form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False)
206 97e42c7d Leonidas Poulopoulos
            return render_to_response('apply.html', {'form': form, 'edit':True, 'applier': applier},
207 3e99e2d1 Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
208 3e99e2d1 Leonidas Poulopoulos
    else:
209 88a6afb7 Leonidas Poulopoulos
        if (not route_original.status == 'ACTIVE'):
210 88a6afb7 Leonidas Poulopoulos
            route_edit.expires = datetime.date.today() + datetime.timedelta(days = settings.EXPIRATION_DAYS_OFFSET)
211 3e99e2d1 Leonidas Poulopoulos
        dictionary = model_to_dict(route_edit, fields=[], exclude=[])
212 88a6afb7 Leonidas Poulopoulos
        if request.user.is_superuser:
213 88a6afb7 Leonidas Poulopoulos
            dictionary['issuperuser'] = request.user.username
214 88a6afb7 Leonidas Poulopoulos
        else:
215 88a6afb7 Leonidas Poulopoulos
            try:
216 88a6afb7 Leonidas Poulopoulos
                del dictionary['issuperuser']
217 88a6afb7 Leonidas Poulopoulos
            except:
218 88a6afb7 Leonidas Poulopoulos
                pass
219 3e99e2d1 Leonidas Poulopoulos
        form = RouteForm(dictionary)
220 6d48c46c Leonidas Poulopoulos
        if not request.user.is_superuser:
221 6d48c46c Leonidas Poulopoulos
            form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True)
222 b4e7dff4 Leonidas Poulopoulos
            form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False)
223 97e42c7d Leonidas Poulopoulos
        return render_to_response('apply.html', {'form': form, 'edit':True, 'applier': applier},
224 3e99e2d1 Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
225 3e99e2d1 Leonidas Poulopoulos
226 3e99e2d1 Leonidas Poulopoulos
@login_required
227 6a946adf Leonidas Poulopoulos
@never_cache
228 3e99e2d1 Leonidas Poulopoulos
def delete_route(request, route_slug):
229 3e99e2d1 Leonidas Poulopoulos
    if request.is_ajax():
230 3e99e2d1 Leonidas Poulopoulos
        route = get_object_or_404(Route, name=route_slug)
231 97e42c7d Leonidas Poulopoulos
        applier_peer = route.applier.get_profile().peer
232 97e42c7d Leonidas Poulopoulos
        requester_peer = request.user.get_profile().peer
233 88a6afb7 Leonidas Poulopoulos
        if applier_peer == requester_peer or request.user.is_superuser:
234 6a946adf Leonidas Poulopoulos
            route.status = "PENDING"
235 fdc3d663 Leonidas Poulopoulos
            route.expires = datetime.date.today()
236 88a6afb7 Leonidas Poulopoulos
            if not request.user.is_superuser:
237 88a6afb7 Leonidas Poulopoulos
                route.applier = request.user
238 3d81901c Leonidas Poulopoulos
            route.response = "Suspending..."
239 22752ac0 Leonidas Poulopoulos
            route.save()
240 3e99e2d1 Leonidas Poulopoulos
            route.commit_delete()
241 cb0e212e Leonidas Poulopoulos
            requesters_address = request.META['HTTP_X_FORWARDED_FOR']
242 fd3870ee Leonidas Poulopoulos
            mail_body = render_to_string("rule_delete_mail.txt",
243 cb0e212e Leonidas Poulopoulos
                                             {"route": route, "address": requesters_address})
244 fdb1f9ec Leonidas Poulopoulos
            user_mail = "%s" %route.applier.email
245 fdb1f9ec Leonidas Poulopoulos
            user_mail = user_mail.split(';')
246 fdb1f9ec Leonidas Poulopoulos
            send_new_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s removal request submitted by %s" %(route.name, route.applier.username), 
247 fdb1f9ec Leonidas Poulopoulos
                              mail_body, settings.SERVER_EMAIL, user_mail,
248 fdb1f9ec Leonidas Poulopoulos
                             get_peer_techc_mails(route.applier))
249 cb0e212e Leonidas Poulopoulos
            d = { 'clientip' : requesters_address, 'user' : route.applier.username }
250 88a6afb7 Leonidas Poulopoulos
            logger.info(mail_body, extra=d)
251 97e42c7d Leonidas Poulopoulos
        html = "<html><body>Done</body></html>"
252 97e42c7d Leonidas Poulopoulos
        return HttpResponse(html)
253 97e42c7d Leonidas Poulopoulos
    else:
254 97e42c7d Leonidas Poulopoulos
        return HttpResponseRedirect(reverse("group-routes"))
255 97e42c7d Leonidas Poulopoulos
256 97e42c7d Leonidas Poulopoulos
@login_required
257 6a946adf Leonidas Poulopoulos
@never_cache
258 97e42c7d Leonidas Poulopoulos
def user_profile(request):
259 97e42c7d Leonidas Poulopoulos
    user = request.user
260 d60db93b Leonidas Poulopoulos
    try:
261 d60db93b Leonidas Poulopoulos
        peer = request.user.get_profile().peer
262 3d81901c Leonidas Poulopoulos
        peers = Peer.objects.filter(pk=peer.pk)
263 3d81901c Leonidas Poulopoulos
        if user.is_superuser:
264 3d81901c Leonidas Poulopoulos
            peers = Peer.objects.all()
265 d60db93b Leonidas Poulopoulos
    except UserProfile.DoesNotExist:
266 d60db93b Leonidas Poulopoulos
        error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % user.username
267 d60db93b Leonidas Poulopoulos
        return render_to_response('error.html', {'error': error})
268 3d81901c Leonidas Poulopoulos
    return render_to_response('profile.html', {'user': user, 'peers':peers},
269 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
270 97e42c7d Leonidas Poulopoulos
271 6a946adf Leonidas Poulopoulos
@never_cache
272 97e42c7d Leonidas Poulopoulos
def user_login(request):
273 97e42c7d Leonidas Poulopoulos
    try:
274 26d25791 Leonidas Poulopoulos
        error_username = False
275 26d25791 Leonidas Poulopoulos
        error_orgname = False
276 b969de46 Leonidas Poulopoulos
        error_entitlement = False
277 26d25791 Leonidas Poulopoulos
        error_mail = False
278 b969de46 Leonidas Poulopoulos
        has_entitlement = False
279 6a946adf Leonidas Poulopoulos
        error = ''
280 97e42c7d Leonidas Poulopoulos
        username = request.META['HTTP_EPPN']
281 97e42c7d Leonidas Poulopoulos
        if not username:
282 97e42c7d Leonidas Poulopoulos
            error_username = True
283 97e42c7d Leonidas Poulopoulos
        firstname = request.META['HTTP_SHIB_INETORGPERSON_GIVENNAME']
284 97e42c7d Leonidas Poulopoulos
        lastname = request.META['HTTP_SHIB_PERSON_SURNAME']
285 97e42c7d Leonidas Poulopoulos
        mail = request.META['HTTP_SHIB_INETORGPERSON_MAIL']
286 97e42c7d Leonidas Poulopoulos
        organization = request.META['HTTP_SHIB_HOMEORGANIZATION']
287 b969de46 Leonidas Poulopoulos
        entitlement = request.META['HTTP_SHIB_EP_ENTITLEMENT']
288 b969de46 Leonidas Poulopoulos
        if settings.SHIB_AUTH_ENTITLEMENT in entitlement.split(";"):
289 b969de46 Leonidas Poulopoulos
            has_entitlement = True
290 b969de46 Leonidas Poulopoulos
        if not has_entitlement:
291 b969de46 Leonidas Poulopoulos
            error_entitlement = True
292 97e42c7d Leonidas Poulopoulos
        if not organization:
293 97e42c7d Leonidas Poulopoulos
            error_orgname = True
294 26d25791 Leonidas Poulopoulos
        if not mail:
295 26d25791 Leonidas Poulopoulos
            error_mail = True
296 6a946adf Leonidas Poulopoulos
        if error_username:
297 26d25791 Leonidas Poulopoulos
            error = "Your idP should release the HTTP_EPPN attribute towards this service<br>"
298 6a946adf Leonidas Poulopoulos
        if error_orgname:
299 26d25791 Leonidas Poulopoulos
            error = error + "Your idP should release the HTTP_SHIB_HOMEORGANIZATION attribute towards this service<br>"
300 b969de46 Leonidas Poulopoulos
        if error_entitlement:
301 26d25791 Leonidas Poulopoulos
            error = error + "Your idP should release an appropriate HTTP_SHIB_EP_ENTITLEMENT attribute towards this service<br>"
302 26d25791 Leonidas Poulopoulos
        if error_mail:
303 26d25791 Leonidas Poulopoulos
            error = error + "Your idP should release the HTTP_SHIB_INETORGPERSON_MAIL attribute towards this service"
304 b969de46 Leonidas Poulopoulos
        if error_username or error_orgname or error_entitlement or error_mail:
305 f9634455 Leonidas Poulopoulos
            return render_to_response('error.html', {'error': error, "missing_attributes": True},
306 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
307 357e5b54 Leonidas Poulopoulos
        try:
308 357e5b54 Leonidas Poulopoulos
            user = User.objects.get(username__exact=username)
309 d60db93b Leonidas Poulopoulos
            user.email = mail
310 d60db93b Leonidas Poulopoulos
            user.first_name = firstname
311 d60db93b Leonidas Poulopoulos
            user.last_name = lastname
312 d60db93b Leonidas Poulopoulos
            user.save()
313 357e5b54 Leonidas Poulopoulos
            user_exists = True
314 357e5b54 Leonidas Poulopoulos
        except:
315 357e5b54 Leonidas Poulopoulos
            user_exists = False
316 d60db93b Leonidas Poulopoulos
        user = authenticate(username=username, firstname=firstname, lastname=lastname, mail=mail, authsource='shibboleth')
317 97e42c7d Leonidas Poulopoulos
        if user is not None:
318 b969de46 Leonidas Poulopoulos
            try:
319 b969de46 Leonidas Poulopoulos
                peer = Peer.objects.get(domain_name=organization)
320 b969de46 Leonidas Poulopoulos
                up = UserProfile.objects.get_or_create(user=user,peer=peer)
321 b969de46 Leonidas Poulopoulos
            except:
322 b969de46 Leonidas Poulopoulos
                error = "Your organization's domain name does not match our peers' domain names<br>Please contact Helpdesk to resolve this issue"
323 b969de46 Leonidas Poulopoulos
                return render_to_response('error.html', {'error': error})
324 357e5b54 Leonidas Poulopoulos
            if not user_exists:
325 357e5b54 Leonidas Poulopoulos
                user_activation_notify(user)
326 357e5b54 Leonidas Poulopoulos
            if user.is_active:
327 357e5b54 Leonidas Poulopoulos
               login(request, user)
328 357e5b54 Leonidas Poulopoulos
               return HttpResponseRedirect(reverse("group-routes"))
329 357e5b54 Leonidas Poulopoulos
            else:
330 1381e2d4 Leonidas Poulopoulos
                error = "User account <strong>%s</strong> is pending activation. Administrators have been notified and will activate this account within the next days. <br>If this account has remained inactive for a long time contact your technical coordinator or GRNET Helpdesk" %user.username
331 357e5b54 Leonidas Poulopoulos
                return render_to_response('error.html', {'error': error, 'inactive': True},
332 357e5b54 Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
333 97e42c7d Leonidas Poulopoulos
        else:
334 6a946adf Leonidas Poulopoulos
            error = "Something went wrong during user authentication. Contact your administrator"
335 6a946adf Leonidas Poulopoulos
            return render_to_response('error.html', {'error': error,},
336 6a946adf Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
337 357e5b54 Leonidas Poulopoulos
    except Exception:
338 6a946adf Leonidas Poulopoulos
        error = "Invalid login procedure"
339 6a946adf Leonidas Poulopoulos
        return render_to_response('error.html', {'error': error,},
340 6a946adf Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
341 97e42c7d Leonidas Poulopoulos
        # Return an 'invalid login' error message.
342 97e42c7d Leonidas Poulopoulos
#    return HttpResponseRedirect(reverse("user-routes"))
343 97e42c7d Leonidas Poulopoulos
344 357e5b54 Leonidas Poulopoulos
def user_activation_notify(user):
345 357e5b54 Leonidas Poulopoulos
    current_site = Site.objects.get_current()
346 357e5b54 Leonidas Poulopoulos
    subject = render_to_string('registration/activation_email_subject.txt',
347 357e5b54 Leonidas Poulopoulos
                                   { 'site': current_site })
348 357e5b54 Leonidas Poulopoulos
    # Email subject *must not* contain newlines
349 357e5b54 Leonidas Poulopoulos
    subject = ''.join(subject.splitlines())
350 357e5b54 Leonidas Poulopoulos
    registration_profile = RegistrationProfile.objects.create_profile(user)
351 357e5b54 Leonidas Poulopoulos
    message = render_to_string('registration/activation_email.txt',
352 357e5b54 Leonidas Poulopoulos
                                   { 'activation_key': registration_profile.activation_key,
353 357e5b54 Leonidas Poulopoulos
                                     'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
354 357e5b54 Leonidas Poulopoulos
                                     'site': current_site,
355 357e5b54 Leonidas Poulopoulos
                                     'user': user })
356 357e5b54 Leonidas Poulopoulos
    send_new_mail(settings.EMAIL_SUBJECT_PREFIX + subject, 
357 357e5b54 Leonidas Poulopoulos
                              message, settings.SERVER_EMAIL,
358 357e5b54 Leonidas Poulopoulos
                             get_peer_techc_mails(user), [])
359 b969de46 Leonidas Poulopoulos
360 97e42c7d Leonidas Poulopoulos
@login_required
361 6a946adf Leonidas Poulopoulos
@never_cache
362 97e42c7d Leonidas Poulopoulos
def add_rate_limit(request):
363 97e42c7d Leonidas Poulopoulos
    if request.method == "GET":
364 97e42c7d Leonidas Poulopoulos
        form = ThenPlainForm()
365 97e42c7d Leonidas Poulopoulos
        return render_to_response('add_rate_limit.html', {'form': form,},
366 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
367 97e42c7d Leonidas Poulopoulos
368 97e42c7d Leonidas Poulopoulos
    else:
369 97e42c7d Leonidas Poulopoulos
        form = ThenPlainForm(request.POST)
370 97e42c7d Leonidas Poulopoulos
        if form.is_valid():
371 97e42c7d Leonidas Poulopoulos
            then=form.save(commit=False)
372 97e42c7d Leonidas Poulopoulos
            then.action_value = "%sk"%then.action_value
373 97e42c7d Leonidas Poulopoulos
            then.save()
374 97e42c7d Leonidas Poulopoulos
            response_data = {}
375 97e42c7d Leonidas Poulopoulos
            response_data['pk'] = "%s" %then.pk
376 97e42c7d Leonidas Poulopoulos
            response_data['value'] = "%s:%s" %(then.action, then.action_value)
377 c00eba1c Leonidas Poulopoulos
            return HttpResponse(json.dumps(response_data), mimetype='application/json')
378 97e42c7d Leonidas Poulopoulos
        else:
379 97e42c7d Leonidas Poulopoulos
            return render_to_response('add_rate_limit.html', {'form': form,},
380 97e42c7d Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
381 97e42c7d Leonidas Poulopoulos
382 97e42c7d Leonidas Poulopoulos
@login_required
383 6a946adf Leonidas Poulopoulos
@never_cache
384 97e42c7d Leonidas Poulopoulos
def add_port(request):
385 97e42c7d Leonidas Poulopoulos
    if request.method == "GET":
386 97e42c7d Leonidas Poulopoulos
        form = PortPlainForm()
387 97e42c7d Leonidas Poulopoulos
        return render_to_response('add_port.html', {'form': form,},
388 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
389 97e42c7d Leonidas Poulopoulos
390 97e42c7d Leonidas Poulopoulos
    else:
391 97e42c7d Leonidas Poulopoulos
        form = PortPlainForm(request.POST)
392 97e42c7d Leonidas Poulopoulos
        if form.is_valid():
393 97e42c7d Leonidas Poulopoulos
            port=form.save()
394 97e42c7d Leonidas Poulopoulos
            response_data = {}
395 97e42c7d Leonidas Poulopoulos
            response_data['value'] = "%s" %port.pk
396 97e42c7d Leonidas Poulopoulos
            response_data['text'] = "%s" %port.port
397 c00eba1c Leonidas Poulopoulos
            return HttpResponse(json.dumps(response_data), mimetype='application/json')
398 97e42c7d Leonidas Poulopoulos
        else:
399 97e42c7d Leonidas Poulopoulos
            return render_to_response('add_port.html', {'form': form,},
400 97e42c7d Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
401 97e42c7d Leonidas Poulopoulos
402 97e42c7d Leonidas Poulopoulos
@login_required
403 6a946adf Leonidas Poulopoulos
@never_cache
404 97e42c7d Leonidas Poulopoulos
def user_logout(request):
405 34cff057 Leonidas Poulopoulos
    logout(request)
406 34cff057 Leonidas Poulopoulos
    return HttpResponseRedirect(reverse('group-routes'))
407 97e42c7d Leonidas Poulopoulos
    
408 049a5a10 Leonidas Poulopoulos
@never_cache
409 97e42c7d Leonidas Poulopoulos
def load_jscript(request, file):
410 bec1a51b Leonidas Poulopoulos
    long_polling_timeout = int(settings.POLL_SESSION_UPDATE)*1000 + 10000
411 bec1a51b Leonidas Poulopoulos
    return render_to_response('%s.js' % file, {'timeout': long_polling_timeout}, context_instance=RequestContext(request), mimetype="text/javascript")
412 a2f464f0 Leonidas Poulopoulos
413 a2f464f0 Leonidas Poulopoulos
414 a2f464f0 Leonidas Poulopoulos
def get_peer_techc_mails(user):
415 86da41f0 Leonidas Poulopoulos
    mail = []
416 86da41f0 Leonidas Poulopoulos
    additional_mail = []
417 86da41f0 Leonidas Poulopoulos
    techmails_list = []
418 86da41f0 Leonidas Poulopoulos
    user_mail = "%s" %user.email
419 86da41f0 Leonidas Poulopoulos
    user_mail = user_mail.split(';')
420 b36bd381 Leonidas Poulopoulos
    techmails = user.get_profile().peer.techc_emails.all()
421 a2f464f0 Leonidas Poulopoulos
    if techmails:
422 b36bd381 Leonidas Poulopoulos
        for techmail in techmails:
423 b36bd381 Leonidas Poulopoulos
            techmails_list.append(techmail.email)
424 86da41f0 Leonidas Poulopoulos
    if settings.NOTIFY_ADMIN_MAILS:
425 86da41f0 Leonidas Poulopoulos
        additional_mail = settings.NOTIFY_ADMIN_MAILS
426 fdb1f9ec Leonidas Poulopoulos
#    mail.extend(user_mail)
427 86da41f0 Leonidas Poulopoulos
    mail.extend(additional_mail)
428 86da41f0 Leonidas Poulopoulos
    mail.extend(techmails_list)
429 a2f464f0 Leonidas Poulopoulos
    return mail
430 fdb1f9ec Leonidas Poulopoulos
431 fdb1f9ec Leonidas Poulopoulos
432 fdb1f9ec Leonidas Poulopoulos
def send_new_mail(subject, message, from_email, recipient_list, bcc_list):
433 fdb1f9ec Leonidas Poulopoulos
    return EmailMessage(subject, message, from_email, recipient_list, bcc_list).send()