@@ -154,6 +154,7 @@ def my_command(
154
154
"""
155
155
156
156
import argparse
157
+ import enum
157
158
import io
158
159
import logging .config
159
160
import os
@@ -172,6 +173,7 @@ def my_command(
172
173
from ..events import Event
173
174
from ..exceptions import ApplicationExit
174
175
from ..injection import register_factory
176
+ from ..compatability import is_user_root , ROOT_NAME
175
177
from ..utils .inspect import import_root_module
176
178
from . import init_logger
177
179
from .argument_actions import * # noqa
@@ -181,6 +183,16 @@ def my_command(
181
183
logger = logging .getLogger (__name__ )
182
184
183
185
186
+ class ExecutionPolicy (enum .IntEnum ):
187
+ """Execution policy"""
188
+
189
+ Deny = 0
190
+ Confirm = 10
191
+ Warn = 20
192
+ Allow = 30
193
+
194
+
195
+
184
196
def _key_help (key : str ) -> str :
185
197
"""Formats a key value from environment vars."""
186
198
if key in os .environ :
@@ -259,6 +271,7 @@ def __init__( # noqa: PLR0913
259
271
application_checks : str = None ,
260
272
env_settings_key : str = None ,
261
273
env_loglevel_key : str = None ,
274
+ root_execution_policy : ExecutionPolicy = ExecutionPolicy .Deny ,
262
275
):
263
276
root_module = root_module or import_root_module ()
264
277
self .root_module = root_module
@@ -276,6 +289,8 @@ def __init__( # noqa: PLR0913
276
289
self .ext_allow_list = ext_white_list
277
290
self .ext_block_list = ext_block_list
278
291
292
+ self .root_execution_policy = root_execution_policy
293
+
279
294
# Determine application settings (disable for standalone scripts)
280
295
if application_settings is None and root_module .__name__ != "__main__" :
281
296
application_settings = f"{ root_module .__name__ } .default_settings"
@@ -318,6 +333,19 @@ def application_summary(self) -> str:
318
333
return f"{ self .application_name } version { self .application_version } - { description } "
319
334
return f"{ self .application_name } version { self .application_version } "
320
335
336
+ def _apply_execution_policy (self ):
337
+ if is_user_root ():
338
+ match (self .root_execution_policy ):
339
+ case ExecutionPolicy .Deny :
340
+ print (f"Execution denied as { ROOT_NAME } user" , file = os .stderr )
341
+ sys .exit (1 )
342
+ case ExecutionPolicy .Prompt :
343
+ response = input (f"Warning: Executing as { ROOT_NAME } . Allow execution? [Y/N]" )
344
+ if response not in ("Y" , "y" ):
345
+ sys .exit (1 )
346
+ case ExecutionPolicy .Warning :
347
+ print (f"Warning: Executing as { ROOT_NAME } " , file = os .stderr )
348
+
321
349
def _init_parser (self ):
322
350
# Create argument parser
323
351
self .argument (
0 commit comments