Skip to content

Commit 79785fe

Browse files
committed
Check if the user has permission to edit a liaison. See ietf-tools#577
- Legacy-Id: 2785
1 parent 31ae2ed commit 79785fe

3 files changed

Lines changed: 51 additions & 3 deletions

File tree

ietf/liaisons/accounts.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
LIAISON_EDIT_GROUPS = ['Secretariat']
55

6+
67
def get_ietf_chair():
78
person = PersonOrOrgInfo.objects.filter(role=Role.IETF_CHAIR)
89
return person and person[0] or None
@@ -96,3 +97,44 @@ def can_add_incoming_liaison(user):
9697

9798
def can_add_liaison(user):
9899
return can_add_incoming_liaison(user) or can_add_outgoing_liaison(user)
100+
101+
102+
def is_sdo_manager_for_outgoing_liaison(person, liaison):
103+
from ietf.liaisons.utils import IETFHM, SDOEntity
104+
from ietf.liaisons.models import SDOs
105+
from_entity = IETFHM.get_entity_by_key(liaison.from_raw_code)
106+
sdo = None
107+
if not from_entity:
108+
sdo = SDOs.objects.get(sdo_name=liaison.from_body())
109+
elif isinstance(from_entity, SDOEntity):
110+
sdo = from_entity.obj
111+
if sdo:
112+
return bool(sdo.liaisonmanagers_set.filter(person=person))
113+
return False
114+
115+
116+
def is_sdo_manager_for_incoming_liaison(person, liaison):
117+
from ietf.liaisons.utils import IETFHM, SDOEntity
118+
from ietf.liaisons.models import SDOs
119+
to_entity = IETFHM.get_entity_by_key(liaison.to_raw_code)
120+
sdo = None
121+
if not to_entity:
122+
try:
123+
sdo = SDOs.objects.get(sdo_name=liaison.to_body)
124+
except SDOs.DoesNotExist:
125+
pass
126+
elif isinstance(to_entity, SDOEntity):
127+
sdo = to_entity.obj
128+
if sdo:
129+
return bool(sdo.liaisonmanagers_set.filter(person=person))
130+
return False
131+
132+
133+
def can_edit_liaison(user, liaison):
134+
if is_secretariat(user):
135+
return True
136+
person = get_person_for_user(user)
137+
if is_sdo_liaison_manager(person):
138+
return (is_sdo_manager_for_outgoing_liaison(person, liaison) or
139+
is_sdo_manager_for_incoming_liaison(person, liaison))
140+
return False

ietf/liaisons/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,8 @@ def __init__(self):
321321
}
322322

323323
def get_entity_by_key(self, entity_id):
324+
if not entity_id:
325+
return None
324326
id_list = entity_id.split('_', 1)
325327
key = id_list[0]
326328
pk = None

ietf/liaisons/views.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66
from django.core.urlresolvers import reverse
77
from django.db.models import Q
88
from django.forms.fields import email_re
9-
from django.http import HttpResponse, HttpResponseRedirect
9+
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
1010
from django.shortcuts import render_to_response, get_object_or_404
1111
from django.template import RequestContext
1212
from django.utils import simplejson
1313
from django.views.generic.list_detail import object_list, object_detail
1414

1515
from ietf.liaisons.accounts import (get_person_for_user, can_add_outgoing_liaison,
1616
can_add_incoming_liaison, LIAISON_EDIT_GROUPS,
17-
is_ietfchair, is_iabchair, is_iab_executive_director)
17+
is_ietfchair, is_iabchair, is_iab_executive_director,
18+
can_edit_liaison)
1819
from ietf.liaisons.decorators import can_submit_liaison
1920
from ietf.liaisons.forms import liaison_form_factory
2021
from ietf.liaisons.models import LiaisonDetail, OutgoingLiaisonApproval
@@ -210,7 +211,7 @@ def liaison_detail(request, object_id):
210211
can_edit = False
211212
user = request.user
212213
can_take_care = _can_take_care(liaison, user)
213-
if user.is_authenticated() and user.groups.filter(name__in=LIAISON_EDIT_GROUPS):
214+
if user.is_authenticated() and can_edit_liaison(user, liaison):
214215
can_edit = True
215216
if request.method == 'POST' and request.POST.get('do_taken_care', None) and can_take_care:
216217
liaison.taken_care = True
@@ -227,6 +228,9 @@ def liaison_detail(request, object_id):
227228

228229
def liaison_edit(request, object_id):
229230
liaison = get_object_or_404(LiaisonDetail, pk=object_id)
231+
user = request.user
232+
if not (user.is_authenticated() and can_edit_liaison(user, liaison)):
233+
return HttpResponseForbidden('You have no permission to edit this liaison')
230234
return add_liaison(request, liaison=liaison)
231235

232236
def ajax_liaison_list(request):

0 commit comments

Comments
 (0)