26
26
from __future__ import annotations
27
27
28
28
from datetime import date , datetime
29
- from typing import TYPE_CHECKING , List
29
+ from typing import TYPE_CHECKING , List , Tuple
30
30
31
31
from fabric_mb .message_bus .messages .reservation_mng import ReservationMng
32
32
from fabric_mb .message_bus .messages .reservation_state_avro import ReservationStateAvro
@@ -69,6 +69,23 @@ def __init__(self, *, actor: ABCActorMixin = None):
69
69
if actor is not None :
70
70
self .set_actor (actor = actor )
71
71
72
+ def validate_token (self , * , id_token : str , action_id : ActionId , resource_type : ResourceType ,
73
+ resource_id : str = None ) -> Tuple [str , str ]:
74
+ user_dn = None
75
+ user_email = None
76
+ fabric_token = AccessChecker .check_access (action_id = action_id ,
77
+ resource_type = resource_type ,
78
+ token = id_token , logger = self .logger ,
79
+ actor_type = self .actor .get_type (),
80
+ resource_id = resource_id )
81
+ if fabric_token is not None :
82
+ user_dn = fabric_token .get_decoded_token ().get (Constants .CLAIMS_SUB , None )
83
+ user_email = fabric_token .get_decoded_token ().get (Constants .CLAIMS_EMAIL , None )
84
+
85
+ if user_dn is None :
86
+ raise ManageException (ErrorCodes .ErrorInvalidToken )
87
+ return user_dn , user_email
88
+
72
89
def register_protocols (self ):
73
90
from fabric_cf .actor .core .manage .local .local_actor import LocalActor
74
91
local = ProxyProtocolDescriptor (protocol = Constants .PROTOCOL_LOCAL , proxy_class = LocalActor .__name__ ,
@@ -111,7 +128,7 @@ def set_actor(self, *, actor: ABCActorMixin):
111
128
self .id = actor .get_guid ()
112
129
113
130
def get_slices (self , * , slice_id : ID , caller : AuthToken , id_token : str = None ,
114
- slice_name : str = None , email : str = None ) -> ResultSliceAvro :
131
+ slice_name : str = None , email : str = None , state : List [ int ] = None ) -> ResultSliceAvro :
115
132
result = ResultSliceAvro ()
116
133
result .status = ResultAvro ()
117
134
@@ -120,21 +137,14 @@ def get_slices(self, *, slice_id: ID, caller: AuthToken, id_token: str = None,
120
137
result .status .set_message (ErrorCodes .ErrorInvalidArguments .interpret ())
121
138
else :
122
139
slice_list = None
123
- user_dn = None
124
- user_email = email
140
+
125
141
try :
126
- if id_token is not None :
127
- fabric_token = AccessChecker .check_access (action_id = ActionId .query , resource_type = ResourceType .slice ,
128
- token = id_token , logger = self .logger ,
129
- actor_type = self .actor .get_type (),
130
- resource_id = str (slice_id ))
131
- user_dn = fabric_token .get_decoded_token ().get (Constants .CLAIMS_SUB , None )
132
- user_email = fabric_token .get_decoded_token ().get (Constants .CLAIMS_EMAIL , None )
133
-
134
- if user_dn is None :
135
- result .status .set_code (ErrorCodes .ErrorInvalidToken .value )
136
- result .status .set_message (ErrorCodes .ErrorInvalidToken .interpret ())
137
- return result
142
+ user_dn , user_email = self .validate_token (id_token = id_token , action_id = ActionId .query ,
143
+ resource_type = ResourceType .slice ,
144
+ resource_id = str (slice_id ))
145
+
146
+ if user_email is None :
147
+ user_email = email
138
148
139
149
try :
140
150
slice_list = None
@@ -146,10 +156,13 @@ def get_slices(self, *, slice_id: ID, caller: AuthToken, id_token: str = None,
146
156
elif slice_name is not None :
147
157
slice_list = self .db .get_slice_by_name (slice_name = slice_name , oidc_claim_sub = user_dn ,
148
158
email = user_email )
159
+ elif user_email is not None :
160
+ if state is None :
161
+ slice_list = self .db .get_slice_by_email (email = user_email )
162
+ else :
163
+ slice_list = self .db .get_slice_by_email_state (email = user_email , state = state )
149
164
elif user_dn is not None :
150
165
slice_list = self .db .get_slice_by_oidc_claim_sub (oidc_claim_sub = user_dn )
151
- elif user_email is not None :
152
- slice_list = self .db .get_slice_by_email (email = user_email )
153
166
else :
154
167
slice_list = self .db .get_slices ()
155
168
@@ -180,21 +193,9 @@ def add_slice(self, *, slice_obj: SliceAvro, caller: AuthToken, id_token: str =
180
193
181
194
else :
182
195
try :
183
- user_dn = None
184
- user_email = None
185
- if id_token is not None :
186
- fabric_token = AccessChecker .check_access (action_id = ActionId .query ,
187
- resource_type = ResourceType .slice ,
188
- token = id_token , logger = self .logger ,
189
- actor_type = self .actor .get_type (),
190
- resource_id = str (slice_obj .slice_name ))
191
- user_dn = fabric_token .get_decoded_token ().get (Constants .CLAIMS_SUB , None )
192
- user_email = fabric_token .get_decoded_token ().get (Constants .CLAIMS_EMAIL , None )
193
-
194
- if user_dn is None :
195
- result .status .set_code (ErrorCodes .ErrorInvalidToken .value )
196
- result .status .set_message (ErrorCodes .ErrorInvalidToken .interpret ())
197
- return result
196
+ user_dn , user_email = self .validate_token (id_token = id_token , action_id = ActionId .query ,
197
+ resource_type = ResourceType .slice ,
198
+ resource_id = str (slice_obj .slice_name ))
198
199
199
200
slice_obj_new = SliceFactory .create (slice_id = ID (), name = slice_obj .get_slice_name ())
200
201
@@ -248,12 +249,9 @@ def remove_slice(self, *, slice_id: ID, caller: AuthToken, id_token: str = None)
248
249
return result
249
250
250
251
try :
251
- if id_token is not None :
252
- AccessChecker .check_access (action_id = ActionId .delete ,
253
- resource_type = ResourceType .slice ,
254
- token = id_token , logger = self .logger ,
255
- actor_type = self .actor .get_type (),
256
- resource_id = str (slice_id ))
252
+ self .validate_token (id_token = id_token , action_id = ActionId .delete ,
253
+ resource_type = ResourceType .slice ,
254
+ resource_id = str (slice_id ))
257
255
258
256
class Runner (ABCActorRunnable ):
259
257
def __init__ (self , * , actor : ABCActorMixin ):
@@ -317,10 +315,9 @@ def run(self):
317
315
def get_slice_by_guid (self , * , guid : str , id_token : str = None ) -> ABCSlice :
318
316
return self .db .get_slice (slice_id = guid )
319
317
320
- def get_reservations (self , * , caller : AuthToken , id_token : str = None , state : int = None ,
318
+ def get_reservations (self , * , caller : AuthToken , id_token : str = None , state : List [ int ] = None ,
321
319
slice_id : ID = None , rid : ID = None , oidc_claim_sub : str = None ,
322
- email : str = None , rid_list : List [str ] = None ,
323
- notices_as_dict : bool = False ) -> ResultReservationAvro :
320
+ email : str = None , rid_list : List [str ] = None ) -> ResultReservationAvro :
324
321
result = ResultReservationAvro ()
325
322
result .status = ResultAvro ()
326
323
@@ -330,20 +327,15 @@ def get_reservations(self, *, caller: AuthToken, id_token: str = None, state: in
330
327
return result
331
328
332
329
try :
333
- user_dn = oidc_claim_sub
334
- user_email = email
335
- if id_token is not None :
336
- fabric_token = AccessChecker .check_access (action_id = ActionId .query , resource_type = ResourceType .sliver ,
337
- token = id_token , logger = self .logger ,
338
- actor_type = self .actor .get_type (),
339
- resource_id = str (rid ))
340
- user_dn = fabric_token .get_decoded_token ().get (Constants .CLAIMS_SUB , None )
341
- user_email = fabric_token .get_decoded_token ().get (Constants .CLAIMS_EMAIL , None )
342
-
343
- if user_dn is None :
344
- result .status .set_code (ErrorCodes .ErrorInvalidToken .value )
345
- result .status .set_message (ErrorCodes .ErrorInvalidToken .interpret ())
346
- return result
330
+ user_dn , user_email = self .validate_token (id_token = id_token , action_id = ActionId .query ,
331
+ resource_type = ResourceType .sliver ,
332
+ resource_id = str (rid ))
333
+
334
+ if user_email is None :
335
+ user_email = email
336
+
337
+ if user_dn is None :
338
+ user_dn = oidc_claim_sub
347
339
348
340
res_list = None
349
341
try :
@@ -383,7 +375,7 @@ def get_reservations(self, *, caller: AuthToken, id_token: str = None, state: in
383
375
slice_id = r .get_slice_id ()
384
376
slice_obj = self .get_slice_by_guid (guid = slice_id )
385
377
r .restore (actor = self .actor , slice_obj = slice_obj )
386
- rr = Converter .fill_reservation (reservation = r , full = True , notices_as_dict = notices_as_dict )
378
+ rr = Converter .fill_reservation (reservation = r , full = True )
387
379
result .reservations .append (rr )
388
380
except ReservationNotFoundException as e :
389
381
self .logger .error ("getReservations: {}" .format (e ))
@@ -406,12 +398,9 @@ def remove_reservation(self, *, caller: AuthToken, rid: ID, id_token: str = None
406
398
return result
407
399
408
400
try :
409
- if id_token is not None :
410
- AccessChecker .check_access (action_id = ActionId .delete ,
411
- resource_type = ResourceType .sliver ,
412
- token = id_token , logger = self .logger ,
413
- actor_type = self .actor .get_type (),
414
- resource_id = str (rid ))
401
+ self .validate_token (id_token = id_token , action_id = ActionId .delete ,
402
+ resource_type = ResourceType .sliver ,
403
+ resource_id = str (rid ))
415
404
416
405
class Runner (ABCActorRunnable ):
417
406
def __init__ (self , * , actor : ABCActorMixin ):
@@ -443,12 +432,9 @@ def close_reservation(self, *, caller: AuthToken, rid: ID, id_token: str = None)
443
432
return result
444
433
445
434
try :
446
- if id_token is not None :
447
- AccessChecker .check_access (action_id = ActionId .close ,
448
- resource_type = ResourceType .sliver ,
449
- token = id_token , logger = self .logger ,
450
- actor_type = self .actor .get_type (),
451
- resource_id = str (rid ))
435
+ self .validate_token (id_token = id_token , action_id = ActionId .close ,
436
+ resource_type = ResourceType .sliver ,
437
+ resource_id = str (rid ))
452
438
453
439
class Runner (ABCActorRunnable ):
454
440
def __init__ (self , * , actor : ABCActorMixin ):
@@ -480,12 +466,9 @@ def close_slice_reservations(self, *, caller: AuthToken, slice_id: ID, id_token:
480
466
return result
481
467
482
468
try :
483
- if id_token is not None :
484
- AccessChecker .check_access (action_id = ActionId .close ,
485
- resource_type = ResourceType .slice ,
486
- token = id_token , logger = self .logger ,
487
- actor_type = self .actor .get_type (),
488
- resource_id = str (slice_id ))
469
+ self .validate_token (id_token = id_token , action_id = ActionId .close ,
470
+ resource_type = ResourceType .slice ,
471
+ resource_id = str (slice_id ))
489
472
490
473
class Runner (ABCActorRunnable ):
491
474
def __init__ (self , * , actor : ABCActorMixin ):
@@ -580,9 +563,8 @@ def get_reservation_state_for_reservations(self, *, caller: AuthToken, rids: Lis
580
563
return result
581
564
582
565
try :
583
- if id_token is not None :
584
- AccessChecker .check_access (action_id = ActionId .query , resource_type = ResourceType .sliver ,
585
- token = id_token , logger = self .logger , actor_type = self .actor .get_type ())
566
+ self .validate_token (id_token = id_token , action_id = ActionId .query ,
567
+ resource_type = ResourceType .sliver )
586
568
587
569
res_list = None
588
570
try :
@@ -621,9 +603,9 @@ def get_delegations(self, *, caller: AuthToken, id_token: str = None, slice_id:
621
603
return result
622
604
623
605
try :
624
- if id_token is not None :
625
- AccessChecker . check_access ( action_id = ActionId . query , resource_type = ResourceType .delegation ,
626
- token = id_token , logger = self . logger , actor_type = self . actor . get_type ())
606
+ self . validate_token ( id_token = id_token , action_id = ActionId . query ,
607
+ resource_type = ResourceType .delegation )
608
+
627
609
dlg_list = None
628
610
try :
629
611
if did is not None :
0 commit comments