1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python3
"""Secure subprocess utilities for Python scripts.
This module provides secure subprocess wrappers that:
- Use full executable paths instead of command names
- Validate executables exist before running
- Provide consistent error handling
- Mitigate security vulnerabilities flagged by Bandit
All scripts should use these functions instead of calling subprocess directly.
Ported from the delaunay project's scripts/subprocess_utils.py (minimal subset).
"""
"""Raised when a required executable is not found in PATH."""
"""Get the full path to an executable, validating it exists.
Args:
command: Command name to find (e.g., "git")
Returns:
Full path to the executable
Raises:
ExecutableNotFoundError: If executable is not found in PATH
"""
=
return
"""Build secure kwargs for subprocess.run with consistent hardening.
Args:
function_name: Name of the calling function (for error messages)
**kwargs: User-provided kwargs to validate and merge
Returns:
Validated and hardened kwargs dict for subprocess.run
Raises:
ValueError: If insecure parameters are provided
"""
# Disallow shell=True to preserve security guarantees
= f
# Disallow overriding the program to execute
= f
# Enforce text mode for stable typing (CompletedProcess[str])
=
# Prefer deterministic UTF-8 unless caller overrides
return
"""Run a git command securely using full executable path.
Args:
args: Git command arguments (without 'git' prefix)
cwd: Working directory for the command
**kwargs: Additional arguments passed to subprocess.run
Returns:
CompletedProcess result
Raises:
ExecutableNotFoundError: If git is not found
subprocess.CalledProcessError: If command fails and check=True
subprocess.TimeoutExpired: If command times out
"""
=
=
return
"""Run a git command securely with stdin input using full executable path.
Args:
args: Git command arguments (without 'git' prefix)
input_data: Data to send to stdin
cwd: Working directory for the command
**kwargs: Additional arguments passed to subprocess.run
Returns:
CompletedProcess result
Raises:
ExecutableNotFoundError: If git is not found
subprocess.CalledProcessError: If command fails and check=True
subprocess.TimeoutExpired: If command times out
"""
=
=
return