Statistics
| Branch: | Tag: | Revision:

root / flowspec / views.py @ 33e8f0b8

History | View | Annotate | Download (10.8 kB)

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