Statistics
| Branch: | Tag: | Revision:

root / flowspec / views.py @ 2e52e8a5

History | View | Annotate | Download (11.7 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 357d48dc Leonidas Poulopoulos
from django.http import HttpResponseRedirect, HttpResponseForbidden, HttpResponse
12 357d48dc Leonidas Poulopoulos
from django.shortcuts import get_object_or_404, render_to_response
13 357d48dc Leonidas Poulopoulos
from django.core.context_processors import request
14 357d48dc Leonidas Poulopoulos
from django.template.context import RequestContext
15 fd3870ee Leonidas Poulopoulos
from django.template.loader import get_template, render_to_string
16 357d48dc Leonidas Poulopoulos
from django.utils import simplejson
17 357d48dc Leonidas Poulopoulos
from django.core.urlresolvers import reverse
18 357d48dc Leonidas Poulopoulos
from django.contrib import messages
19 6ee21ffd Leonidas Poulopoulos
from flowspy.accounts.models import *
20 357d48dc Leonidas Poulopoulos
21 97e42c7d Leonidas Poulopoulos
from django.contrib.auth import authenticate, login
22 97e42c7d Leonidas Poulopoulos
23 3e99e2d1 Leonidas Poulopoulos
from django.forms.models import model_to_dict
24 3e99e2d1 Leonidas Poulopoulos
25 9cad4715 Leonidas Poulopoulos
from flowspy.flowspec.forms import * 
26 357d48dc Leonidas Poulopoulos
from flowspy.flowspec.models import *
27 357d48dc Leonidas Poulopoulos
28 3e99e2d1 Leonidas Poulopoulos
from copy import deepcopy
29 97e42c7d Leonidas Poulopoulos
from flowspy.utils.decorators import shib_required
30 3e99e2d1 Leonidas Poulopoulos
31 6a946adf Leonidas Poulopoulos
from django.views.decorators.cache import never_cache
32 6a946adf Leonidas Poulopoulos
from django.conf import settings
33 fd3870ee Leonidas Poulopoulos
from django.core.mail import mail_admins, mail_managers, send_mail
34 6a946adf Leonidas Poulopoulos
35 6a946adf Leonidas Poulopoulos
36 3e99e2d1 Leonidas Poulopoulos
@login_required
37 357d48dc Leonidas Poulopoulos
def user_routes(request):
38 357d48dc Leonidas Poulopoulos
    user_routes = Route.objects.filter(applier=request.user)
39 357d48dc Leonidas Poulopoulos
    return render_to_response('user_routes.html', {'routes': user_routes},
40 357d48dc Leonidas Poulopoulos
                              context_instance=RequestContext(request))
41 357d48dc Leonidas Poulopoulos
42 049a5a10 Leonidas Poulopoulos
def welcome(request):
43 049a5a10 Leonidas Poulopoulos
    return render_to_response('welcome.html', context_instance=RequestContext(request))
44 049a5a10 Leonidas Poulopoulos
45 3e99e2d1 Leonidas Poulopoulos
@login_required
46 6a946adf Leonidas Poulopoulos
@never_cache
47 6ee21ffd Leonidas Poulopoulos
def group_routes(request):
48 97e42c7d Leonidas Poulopoulos
    group_routes = []
49 6ee21ffd Leonidas Poulopoulos
    peer = request.user.get_profile().peer
50 6ee21ffd Leonidas Poulopoulos
    if peer:
51 6ee21ffd Leonidas Poulopoulos
       peer_members = UserProfile.objects.filter(peer=peer)
52 6ee21ffd Leonidas Poulopoulos
       users = [prof.user for prof in peer_members]
53 6ee21ffd Leonidas Poulopoulos
       group_routes = Route.objects.filter(applier__in=users)
54 6ee21ffd Leonidas Poulopoulos
    return render_to_response('user_routes.html', {'routes': group_routes},
55 6ee21ffd Leonidas Poulopoulos
                              context_instance=RequestContext(request))
56 6ee21ffd Leonidas Poulopoulos
57 6ee21ffd Leonidas Poulopoulos
58 6ee21ffd Leonidas Poulopoulos
@login_required
59 6a946adf Leonidas Poulopoulos
@never_cache
60 9cad4715 Leonidas Poulopoulos
def add_route(request):
61 97e42c7d Leonidas Poulopoulos
    applier = request.user.pk
62 6a946adf Leonidas Poulopoulos
    applier_peer_networks = request.user.get_profile().peer.networks.all()
63 6a946adf Leonidas Poulopoulos
    if not applier_peer_networks:
64 6a946adf Leonidas Poulopoulos
         messages.add_message(request, messages.WARNING,
65 33e8f0b8 Leonidas Poulopoulos
                             "Insufficient rights on administrative networks. Cannot add rule. Contact your administrator")
66 6a946adf Leonidas Poulopoulos
         return HttpResponseRedirect(reverse("group-routes"))
67 9cad4715 Leonidas Poulopoulos
    if request.method == "GET":
68 9cad4715 Leonidas Poulopoulos
        form = RouteForm()
69 97e42c7d Leonidas Poulopoulos
        return render_to_response('apply.html', {'form': form, 'applier': applier},
70 9cad4715 Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
71 9cad4715 Leonidas Poulopoulos
72 9cad4715 Leonidas Poulopoulos
    else:
73 9cad4715 Leonidas Poulopoulos
        form = RouteForm(request.POST)
74 9cad4715 Leonidas Poulopoulos
        if form.is_valid():
75 9cad4715 Leonidas Poulopoulos
            route=form.save(commit=False)
76 9cad4715 Leonidas Poulopoulos
            route.applier = request.user
77 97e42c7d Leonidas Poulopoulos
            route.status = "PENDING"
78 9cad4715 Leonidas Poulopoulos
            route.save()
79 9cad4715 Leonidas Poulopoulos
            form.save_m2m()
80 9cad4715 Leonidas Poulopoulos
            route.commit_add()
81 fd3870ee Leonidas Poulopoulos
            mail_body = render_to_string("rule_add_mail.txt",
82 fd3870ee Leonidas Poulopoulos
                                             {"route": route})
83 fd3870ee Leonidas Poulopoulos
            mail_admins("Rule %s creation request submitted by %s" %(route.name, route.applier.username),
84 fd3870ee Leonidas Poulopoulos
                          mail_body, fail_silently=True)
85 97e42c7d Leonidas Poulopoulos
            return HttpResponseRedirect(reverse("group-routes"))
86 9cad4715 Leonidas Poulopoulos
        else:
87 97e42c7d Leonidas Poulopoulos
            return render_to_response('apply.html', {'form': form, 'applier':applier},
88 9cad4715 Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
89 97e42c7d Leonidas Poulopoulos
90 97e42c7d Leonidas Poulopoulos
@login_required
91 6a946adf Leonidas Poulopoulos
@never_cache
92 3e99e2d1 Leonidas Poulopoulos
def edit_route(request, route_slug):
93 97e42c7d Leonidas Poulopoulos
    applier = request.user.pk
94 5141cf4a Leonidas Poulopoulos
    applier_peer = request.user.get_profile().peer
95 3e99e2d1 Leonidas Poulopoulos
    route_edit = get_object_or_404(Route, name=route_slug)
96 5141cf4a Leonidas Poulopoulos
    route_edit_applier_peer = route_edit.applier.get_profile().peer
97 5141cf4a Leonidas Poulopoulos
    if applier_peer != route_edit_applier_peer:
98 5141cf4a Leonidas Poulopoulos
        messages.add_message(request, messages.WARNING,
99 33e8f0b8 Leonidas Poulopoulos
                             "Insufficient rights to edit rule %s" %(route_slug))
100 5141cf4a Leonidas Poulopoulos
        return HttpResponseRedirect(reverse("group-routes"))
101 2e52e8a5 Leonidas Poulopoulos
#    if route_edit.status == "ADMININACTIVE" :
102 2e52e8a5 Leonidas Poulopoulos
#        messages.add_message(request, messages.WARNING,
103 2e52e8a5 Leonidas Poulopoulos
#                             "Administrator has disabled editing of rule %s" %(route_slug))
104 2e52e8a5 Leonidas Poulopoulos
#        return HttpResponseRedirect(reverse("group-routes"))
105 2e52e8a5 Leonidas Poulopoulos
#    if route_edit.status == "EXPIRED" :
106 2e52e8a5 Leonidas Poulopoulos
#        messages.add_message(request, messages.WARNING,
107 2e52e8a5 Leonidas Poulopoulos
#                             "Cannot edit the expired rule %s. Contact helpdesk to enable it" %(route_slug))
108 2e52e8a5 Leonidas Poulopoulos
#        return HttpResponseRedirect(reverse("group-routes"))
109 fd3870ee Leonidas Poulopoulos
    if route_edit.status == "PENDING" :
110 fd3870ee Leonidas Poulopoulos
        messages.add_message(request, messages.WARNING,
111 fd3870ee Leonidas Poulopoulos
                             "Cannot edit a pending rule: %s." %(route_slug))
112 fd3870ee Leonidas Poulopoulos
        return HttpResponseRedirect(reverse("group-routes"))
113 3e99e2d1 Leonidas Poulopoulos
    route_original = deepcopy(route_edit)
114 3e99e2d1 Leonidas Poulopoulos
    if request.POST:
115 3e99e2d1 Leonidas Poulopoulos
        form = RouteForm(request.POST, instance = route_edit)
116 3e99e2d1 Leonidas Poulopoulos
        if form.is_valid():
117 3e99e2d1 Leonidas Poulopoulos
            route=form.save(commit=False)
118 3e99e2d1 Leonidas Poulopoulos
            route.name = route_original.name
119 97e42c7d Leonidas Poulopoulos
            route.applier = request.user
120 97e42c7d Leonidas Poulopoulos
            route.status = "PENDING"
121 3e99e2d1 Leonidas Poulopoulos
            route.save()
122 3e99e2d1 Leonidas Poulopoulos
            form.save_m2m()
123 3e99e2d1 Leonidas Poulopoulos
            route.commit_edit()
124 fd3870ee Leonidas Poulopoulos
            mail_body = render_to_string("rule_edit_mail.txt",
125 fd3870ee Leonidas Poulopoulos
                                             {"route": route})
126 fd3870ee Leonidas Poulopoulos
            mail_admins("Rule %s edit request submitted by %s" %(route.name, route.applier.username),
127 fd3870ee Leonidas Poulopoulos
                          mail_body, fail_silently=True)
128 97e42c7d Leonidas Poulopoulos
            return HttpResponseRedirect(reverse("group-routes"))
129 3e99e2d1 Leonidas Poulopoulos
        else:
130 97e42c7d Leonidas Poulopoulos
            return render_to_response('apply.html', {'form': form, 'edit':True, 'applier': applier},
131 3e99e2d1 Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
132 3e99e2d1 Leonidas Poulopoulos
    else:
133 3e99e2d1 Leonidas Poulopoulos
        dictionary = model_to_dict(route_edit, fields=[], exclude=[])
134 97e42c7d Leonidas Poulopoulos
        #form = RouteForm(instance=route_edit)
135 3e99e2d1 Leonidas Poulopoulos
        form = RouteForm(dictionary)
136 97e42c7d Leonidas Poulopoulos
        return render_to_response('apply.html', {'form': form, 'edit':True, 'applier': applier},
137 3e99e2d1 Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
138 3e99e2d1 Leonidas Poulopoulos
139 3e99e2d1 Leonidas Poulopoulos
@login_required
140 6a946adf Leonidas Poulopoulos
@never_cache
141 3e99e2d1 Leonidas Poulopoulos
def delete_route(request, route_slug):
142 3e99e2d1 Leonidas Poulopoulos
    if request.is_ajax():
143 3e99e2d1 Leonidas Poulopoulos
        route = get_object_or_404(Route, name=route_slug)
144 97e42c7d Leonidas Poulopoulos
        applier_peer = route.applier.get_profile().peer
145 97e42c7d Leonidas Poulopoulos
        requester_peer = request.user.get_profile().peer
146 97e42c7d Leonidas Poulopoulos
        if applier_peer == requester_peer:
147 6a946adf Leonidas Poulopoulos
            route.status = "PENDING"
148 22752ac0 Leonidas Poulopoulos
            route.save()
149 3e99e2d1 Leonidas Poulopoulos
            route.commit_delete()
150 fd3870ee Leonidas Poulopoulos
            mail_body = render_to_string("rule_delete_mail.txt",
151 fd3870ee Leonidas Poulopoulos
                                             {"route": route})
152 fd3870ee Leonidas Poulopoulos
            mail_admins("Rule %s removal request submitted by %s" %(route.name, route.applier.username),
153 fd3870ee Leonidas Poulopoulos
                          mail_body, fail_silently=True)
154 97e42c7d Leonidas Poulopoulos
        html = "<html><body>Done</body></html>"
155 97e42c7d Leonidas Poulopoulos
        return HttpResponse(html)
156 97e42c7d Leonidas Poulopoulos
    else:
157 97e42c7d Leonidas Poulopoulos
        return HttpResponseRedirect(reverse("group-routes"))
158 97e42c7d Leonidas Poulopoulos
159 97e42c7d Leonidas Poulopoulos
@login_required
160 6a946adf Leonidas Poulopoulos
@never_cache
161 97e42c7d Leonidas Poulopoulos
def user_profile(request):
162 97e42c7d Leonidas Poulopoulos
    user = request.user
163 97e42c7d Leonidas Poulopoulos
    peer = request.user.get_profile().peer
164 97e42c7d Leonidas Poulopoulos
    
165 97e42c7d Leonidas Poulopoulos
    return render_to_response('profile.html', {'user': user, 'peer':peer},
166 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
167 97e42c7d Leonidas Poulopoulos
168 6a946adf Leonidas Poulopoulos
@never_cache
169 97e42c7d Leonidas Poulopoulos
def user_login(request):
170 97e42c7d Leonidas Poulopoulos
    try:
171 97e42c7d Leonidas Poulopoulos
        error_username = None
172 97e42c7d Leonidas Poulopoulos
        error_orgname = None
173 6a946adf Leonidas Poulopoulos
        error_affiliation = None
174 6a946adf Leonidas Poulopoulos
        error = ''
175 97e42c7d Leonidas Poulopoulos
        username = request.META['HTTP_EPPN']
176 97e42c7d Leonidas Poulopoulos
        if not username:
177 97e42c7d Leonidas Poulopoulos
            error_username = True
178 97e42c7d Leonidas Poulopoulos
        firstname = request.META['HTTP_SHIB_INETORGPERSON_GIVENNAME']
179 97e42c7d Leonidas Poulopoulos
        lastname = request.META['HTTP_SHIB_PERSON_SURNAME']
180 97e42c7d Leonidas Poulopoulos
        mail = request.META['HTTP_SHIB_INETORGPERSON_MAIL']
181 97e42c7d Leonidas Poulopoulos
        organization = request.META['HTTP_SHIB_HOMEORGANIZATION']
182 6a946adf Leonidas Poulopoulos
        affiliation = request.META['HTTP_SHIB_EP_ENTITLEMENT']
183 b27537d5 Leonidas Poulopoulos
        if settings.SHIB_AUTH_AFFILIATION in affiliation.split(";"):
184 b27537d5 Leonidas Poulopoulos
            has_affiliation = True
185 6a946adf Leonidas Poulopoulos
        if not has_affiliation:
186 6a946adf Leonidas Poulopoulos
            error_affiliation = True
187 97e42c7d Leonidas Poulopoulos
        if not organization:
188 97e42c7d Leonidas Poulopoulos
            error_orgname = True
189 6a946adf Leonidas Poulopoulos
        if error_username:
190 6a946adf Leonidas Poulopoulos
            error = "Your idP should release the HTTP_EPPN attribute towards this service\n"
191 6a946adf Leonidas Poulopoulos
        if error_orgname:
192 6a946adf Leonidas Poulopoulos
            error = error + "Your idP should release the HTTP_SHIB_HOMEORGANIZATION attribute towards this service\n"
193 6a946adf Leonidas Poulopoulos
        if error_affiliation:
194 6a946adf Leonidas Poulopoulos
            error = error + "Your idP should release an appropriate HTTP_SHIB_EP_ENTITLEMENT attribute towards this service"
195 6a946adf Leonidas Poulopoulos
        if error_username or error_orgname or error_affiliation:
196 97e42c7d Leonidas Poulopoulos
            return render_to_response('error.html', {'error': error,},
197 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
198 049a5a10 Leonidas Poulopoulos
        user = authenticate(username=username, firstname=firstname, lastname=lastname, mail=mail, organization=organization, affiliation=affiliation)
199 97e42c7d Leonidas Poulopoulos
        if user is not None:
200 97e42c7d Leonidas Poulopoulos
            login(request, user)
201 049a5a10 Leonidas Poulopoulos
            update_user_attributes(user, firstname=firstname, lastname=lastname, mail=mail)
202 97e42c7d Leonidas Poulopoulos
            return HttpResponseRedirect(reverse("group-routes"))
203 97e42c7d Leonidas Poulopoulos
                # Redirect to a success page.
204 97e42c7d Leonidas Poulopoulos
                # Return a 'disabled account' error message
205 97e42c7d Leonidas Poulopoulos
        else:
206 6a946adf Leonidas Poulopoulos
            error = "Something went wrong during user authentication. Contact your administrator"
207 6a946adf Leonidas Poulopoulos
            return render_to_response('error.html', {'error': error,},
208 6a946adf Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
209 97e42c7d Leonidas Poulopoulos
    except Exception as e:
210 6a946adf Leonidas Poulopoulos
        error = "Invalid login procedure"
211 6a946adf Leonidas Poulopoulos
        return render_to_response('error.html', {'error': error,},
212 6a946adf Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
213 97e42c7d Leonidas Poulopoulos
        # Return an 'invalid login' error message.
214 97e42c7d Leonidas Poulopoulos
#    return HttpResponseRedirect(reverse("user-routes"))
215 97e42c7d Leonidas Poulopoulos
216 97e42c7d Leonidas Poulopoulos
@login_required
217 6a946adf Leonidas Poulopoulos
@never_cache
218 97e42c7d Leonidas Poulopoulos
def add_rate_limit(request):
219 97e42c7d Leonidas Poulopoulos
    if request.method == "GET":
220 97e42c7d Leonidas Poulopoulos
        form = ThenPlainForm()
221 97e42c7d Leonidas Poulopoulos
        return render_to_response('add_rate_limit.html', {'form': form,},
222 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
223 97e42c7d Leonidas Poulopoulos
224 97e42c7d Leonidas Poulopoulos
    else:
225 97e42c7d Leonidas Poulopoulos
        form = ThenPlainForm(request.POST)
226 97e42c7d Leonidas Poulopoulos
        if form.is_valid():
227 97e42c7d Leonidas Poulopoulos
            then=form.save(commit=False)
228 97e42c7d Leonidas Poulopoulos
            then.action_value = "%sk"%then.action_value
229 97e42c7d Leonidas Poulopoulos
            then.save()
230 97e42c7d Leonidas Poulopoulos
            response_data = {}
231 97e42c7d Leonidas Poulopoulos
            response_data['pk'] = "%s" %then.pk
232 97e42c7d Leonidas Poulopoulos
            response_data['value'] = "%s:%s" %(then.action, then.action_value)
233 97e42c7d Leonidas Poulopoulos
            return HttpResponse(simplejson.dumps(response_data), mimetype='application/json')
234 97e42c7d Leonidas Poulopoulos
        else:
235 97e42c7d Leonidas Poulopoulos
            return render_to_response('add_rate_limit.html', {'form': form,},
236 97e42c7d Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
237 049a5a10 Leonidas Poulopoulos
            
238 049a5a10 Leonidas Poulopoulos
def update_user_attributes(user, firstname, lastname, mail):
239 049a5a10 Leonidas Poulopoulos
    user.first_name = firstname
240 049a5a10 Leonidas Poulopoulos
    user.last_name = lastname
241 049a5a10 Leonidas Poulopoulos
    user.email = mail
242 049a5a10 Leonidas Poulopoulos
    user.save()
243 97e42c7d Leonidas Poulopoulos
244 97e42c7d Leonidas Poulopoulos
@login_required
245 6a946adf Leonidas Poulopoulos
@never_cache
246 97e42c7d Leonidas Poulopoulos
def add_port(request):
247 97e42c7d Leonidas Poulopoulos
    if request.method == "GET":
248 97e42c7d Leonidas Poulopoulos
        form = PortPlainForm()
249 97e42c7d Leonidas Poulopoulos
        return render_to_response('add_port.html', {'form': form,},
250 97e42c7d Leonidas Poulopoulos
                                  context_instance=RequestContext(request))
251 97e42c7d Leonidas Poulopoulos
252 97e42c7d Leonidas Poulopoulos
    else:
253 97e42c7d Leonidas Poulopoulos
        form = PortPlainForm(request.POST)
254 97e42c7d Leonidas Poulopoulos
        if form.is_valid():
255 97e42c7d Leonidas Poulopoulos
            port=form.save()
256 97e42c7d Leonidas Poulopoulos
            response_data = {}
257 97e42c7d Leonidas Poulopoulos
            response_data['value'] = "%s" %port.pk
258 97e42c7d Leonidas Poulopoulos
            response_data['text'] = "%s" %port.port
259 97e42c7d Leonidas Poulopoulos
            return HttpResponse(simplejson.dumps(response_data), mimetype='application/json')
260 97e42c7d Leonidas Poulopoulos
        else:
261 97e42c7d Leonidas Poulopoulos
            return render_to_response('add_port.html', {'form': form,},
262 97e42c7d Leonidas Poulopoulos
                                      context_instance=RequestContext(request))
263 97e42c7d Leonidas Poulopoulos
264 97e42c7d Leonidas Poulopoulos
@login_required
265 6a946adf Leonidas Poulopoulos
@never_cache
266 97e42c7d Leonidas Poulopoulos
def user_logout(request):
267 34cff057 Leonidas Poulopoulos
    logout(request)
268 34cff057 Leonidas Poulopoulos
    return HttpResponseRedirect(reverse('group-routes'))
269 97e42c7d Leonidas Poulopoulos
    
270 049a5a10 Leonidas Poulopoulos
@never_cache
271 97e42c7d Leonidas Poulopoulos
def load_jscript(request, file):
272 bec1a51b Leonidas Poulopoulos
    long_polling_timeout = int(settings.POLL_SESSION_UPDATE)*1000 + 10000
273 bec1a51b Leonidas Poulopoulos
    return render_to_response('%s.js' % file, {'timeout': long_polling_timeout}, context_instance=RequestContext(request), mimetype="text/javascript")