Statistics
| Branch: | Tag: | Revision:

root / flowspec / views.py @ d50fd7b6

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