5
5
import subprocess # nosec
6
6
import time
7
7
from tempfile import NamedTemporaryFile
8
- from typing import TYPE_CHECKING
8
+ from typing import TYPE_CHECKING , overload
9
9
10
10
import requests
11
11
import six
56
56
AnyCookiesType ,
57
57
AnyResolvedSettings ,
58
58
AnyResponseType ,
59
+ AnySettingsContainer ,
59
60
CombinedConfig ,
60
61
CookiesOrSessionType ,
61
62
GroupsConfig ,
62
63
GroupsSettings ,
64
+ Literal ,
63
65
MultiConfigs ,
64
66
PermissionConfigItem ,
65
67
PermissionsConfig ,
66
68
ServicesConfig ,
67
69
ServicesSettings ,
68
70
Str ,
69
71
UsersConfig ,
70
- UsersSettings
72
+ UsersSettings ,
73
+ WebhooksConfig
71
74
)
72
75
73
76
@@ -572,6 +575,36 @@ def _load_config(path_or_dict, section, allow_missing=False):
572
575
CONFIG_KNOWN_EXTENSIONS = frozenset ([".cfg" , ".json" , ".yml" , ".yaml" ])
573
576
574
577
578
+ @overload
579
+ def get_all_configs (path_or_dict , section , allow_missing = False ):
580
+ # type: (Union[Str, CombinedConfig], Literal["groups"], bool) -> GroupsConfig
581
+ ...
582
+
583
+
584
+ @overload
585
+ def get_all_configs (path_or_dict , section , allow_missing = False ):
586
+ # type: (Union[Str, CombinedConfig], Literal["users"], bool) -> UsersConfig
587
+ ...
588
+
589
+
590
+ @overload
591
+ def get_all_configs (path_or_dict , section , allow_missing = False ):
592
+ # type: (Union[Str, CombinedConfig], Literal["permissions"], bool) -> PermissionsConfig
593
+ ...
594
+
595
+
596
+ @overload
597
+ def get_all_configs (path_or_dict , section , allow_missing = False ):
598
+ # type: (Union[Str, CombinedConfig], Literal["services"], bool) -> ServicesConfig
599
+ ...
600
+
601
+
602
+ @overload
603
+ def get_all_configs (path_or_dict , section , allow_missing = False ):
604
+ # type: (Union[Str, CombinedConfig], Literal["webhooks"], bool) -> WebhooksConfig
605
+ ...
606
+
607
+
575
608
def get_all_configs (path_or_dict , section , allow_missing = False ):
576
609
# type: (Union[Str, CombinedConfig], Str, bool) -> MultiConfigs
577
610
"""
@@ -987,13 +1020,19 @@ def _validate_response(operation, is_create, item_type="Permission"):
987
1020
_validate_response (lambda : _apply_session (usr_name , None ), is_create = create_perm )
988
1021
989
1022
990
- def magpie_register_permissions_from_config (permissions_config , magpie_url = None , db_session = None , raise_errors = False ):
991
- # type: (Union[Str, PermissionsConfig], Optional[Str], Optional[Session], bool) -> None
1023
+ def magpie_register_permissions_from_config (
1024
+ permissions_config , # type: Union[Str, PermissionsConfig]
1025
+ settings = None , # type: Optional[AnySettingsContainer]
1026
+ db_session = None , # type: Optional[Session]
1027
+ raise_errors = False , # type: bool
1028
+ ): # type: (...) -> None
992
1029
"""
993
1030
Applies `permissions` specified in configuration(s) defined as file, directory with files or literal configuration.
994
1031
995
1032
:param permissions_config: file/dir path to `permissions` config or JSON/YAML equivalent pre-loaded.
996
- :param magpie_url: URL to magpie instance (when using requests; default: `magpie.url` from this app's config).
1033
+ :param settings: Magpie settings to resolve an instance session when using requests instead of DB session.
1034
+ Will look for ``magpie.url``, ``magpie.admin_user`` and ``magpie.admin_password`` by default, or any
1035
+ corresponding environment variable resolution if omitted in the settings.
997
1036
:param db_session: db session to use instead of requests to directly create/remove permissions with config.
998
1037
:param raise_errors: raises errors related to permissions, instead of just logging the info.
999
1038
@@ -1002,9 +1041,9 @@ def magpie_register_permissions_from_config(permissions_config, magpie_url=None,
1002
1041
"""
1003
1042
LOGGER .info ("Starting permissions processing." )
1004
1043
1044
+ magpie_url = None
1005
1045
if _use_request (db_session ):
1006
- magpie_url = magpie_url or get_magpie_url ()
1007
- settings = {"magpie.url" : magpie_url }
1046
+ magpie_url = get_magpie_url (settings )
1008
1047
LOGGER .debug ("Editing permissions using requests to [%s]..." , magpie_url )
1009
1048
err_msg = "Invalid credentials to register Magpie permissions."
1010
1049
cookies_or_session = get_admin_cookies (settings , raise_message = err_msg )
@@ -1013,19 +1052,36 @@ def magpie_register_permissions_from_config(permissions_config, magpie_url=None,
1013
1052
cookies_or_session = db_session
1014
1053
1015
1054
LOGGER .debug ("Loading configurations." )
1016
- permissions = get_all_configs (permissions_config , "permissions" ) # type: List[PermissionsConfig]
1055
+ if isinstance (permissions_config , list ):
1056
+ permissions = [permissions_config ]
1057
+ else :
1058
+ permissions = get_all_configs (permissions_config , "permissions" )
1017
1059
perms_cfg_count = len (permissions )
1018
1060
LOGGER .log (logging .INFO if perms_cfg_count else logging .WARNING ,
1019
1061
"Found %s permissions configurations." , perms_cfg_count )
1020
1062
users_settings = groups_settings = None
1021
1063
if perms_cfg_count :
1022
- users = get_all_configs (permissions_config , "users" , allow_missing = True ) # type: List[UsersConfig]
1023
- groups = get_all_configs (permissions_config , "groups" , allow_missing = True ) # type: List[GroupsConfig]
1064
+ if isinstance (permissions_config , str ):
1065
+ users = get_all_configs (permissions_config , "users" , allow_missing = True )
1066
+ else :
1067
+ users = []
1068
+ if isinstance (permissions_config , str ):
1069
+ groups = get_all_configs (permissions_config , "groups" , allow_missing = True )
1070
+ else :
1071
+ groups = []
1024
1072
users_settings = _resolve_config_registry (users , "username" ) or {}
1025
1073
groups_settings = _resolve_config_registry (groups , "name" ) or {}
1026
1074
for i , perms in enumerate (permissions ):
1027
1075
LOGGER .info ("Processing permissions from configuration (%s/%s)." , i + 1 , perms_cfg_count )
1028
- _process_permissions (perms , magpie_url , cookies_or_session , users_settings , groups_settings , raise_errors )
1076
+ _process_permissions (
1077
+ perms ,
1078
+ magpie_url ,
1079
+ cookies_or_session ,
1080
+ users_settings ,
1081
+ groups_settings ,
1082
+ settings ,
1083
+ raise_errors ,
1084
+ )
1029
1085
LOGGER .info ("All permissions processed." )
1030
1086
1031
1087
@@ -1054,16 +1110,23 @@ def _resolve_config_registry(config_files, key):
1054
1110
return config_map
1055
1111
1056
1112
1057
- def _process_permissions (permissions , magpie_url , cookies_or_session , users = None , groups = None , raise_errors = False ):
1058
- # type: (PermissionsConfig, Str, Session, Optional[UsersSettings], Optional[GroupsSettings], bool) -> None
1113
+ def _process_permissions (
1114
+ permissions , # type: PermissionsConfig
1115
+ magpie_url , # type: Str
1116
+ cookies_or_session , # type: Session
1117
+ users = None , # type: Optional[UsersSettings]
1118
+ groups = None , # type: Optional[GroupsSettings]
1119
+ settings = None , # type: Optional[AnySettingsContainer]
1120
+ raise_errors = False , # type: bool
1121
+ ): # type: (...) -> None
1059
1122
"""
1060
1123
Processes a single `permissions` configuration.
1061
1124
"""
1062
1125
if not permissions :
1063
1126
LOGGER .warning ("Permissions configuration are empty." )
1064
1127
return
1065
1128
1066
- anon_user = get_constant ("MAGPIE_ANONYMOUS_USER" )
1129
+ anon_user = get_constant ("MAGPIE_ANONYMOUS_USER" , settings )
1067
1130
perm_count = len (permissions )
1068
1131
LOGGER .log (logging .INFO if perm_count else logging .WARNING ,
1069
1132
"Found %s permissions to evaluate from configuration." , perm_count )
0 commit comments