Merge branch 'master' of ssh://git.onelab.eu/git/plcapi
[plcapi.git] / PLC / AuthorizeHelpers.py
1 #
2 # Thierry Parmentelat - INRIA
3 #
4 from PLC.Faults import *
5 from PLC.Persons import Person
6 from PLC.Nodes import Node
7
8 class AuthorizeHelpers:
9
10     @staticmethod
11     def interface_belongs_to_person (api,interface, person):
12         try:
13             node=api.GetNodes(interface['node_id'])[0]
14             return node_belong_to_person (api, node, person)
15         except:
16             return False
17
18     @staticmethod
19     def node_belongs_to_person (api, node, person):
20         try:
21             site=api.GetSites(node['site_id'])[0]
22             return person_belongs_to_site (api, person, site)
23         except:
24             return False
25
26     @staticmethod
27     def person_belongs_to_site (api, person, site):
28         return site['site_id'] in person['site_ids']
29
30     @staticmethod
31     def caller_may_access_tag_type (api, caller, tag_type):
32         if isinstance(caller,Person):
33             return len(set(caller['roles']).intersection(set(tag_type['roles'])))!=0
34         elif isinstance(caller,Node):
35             return 'node' in tag_type['roles']
36         else:
37             raise PLCInvalidArgument, "caller_may_access_tag_type - unexpected arg"
38
39     @staticmethod
40     def person_access_person (api, caller_person, subject_person):
41         # keep it simple for now - could be a bit more advanced for PIs maybe
42         try:    return caller_person['person_id'] == subject_person['person_id']
43         except: return False
44
45     @staticmethod
46     def person_in_slice (api, caller_person, slice):
47         return caller_person['person_id'] in slice['person_ids']
48
49     @staticmethod
50     def node_in_slice (api, caller_node, slice):
51         return caller_node['node_id'] in slice['node_ids']
52
53     @staticmethod
54     def node_id_or_hostname_in_slice (api, node_id_or_hostname, slice):
55         if isinstance (node_id_or_hostname,int):
56             return node_id_or_hostname in slice['node_ids']
57         else:
58             try:   return GetNodes(node_id_or_hostname_in_slice)[0]['node_id'] in slice['node_ids']
59             except:return False
60
61