Skip to content

Commit b0e9374

Browse files
committed
feat(api): added support for tls client authentication against reverse proxies
1 parent edd01a5 commit b0e9374

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

gitlab/client.py

+17
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class Gitlab:
7575
or 52x responses. Defaults to False.
7676
keep_base_url: keep user-provided base URL for pagination if it
7777
differs from response headers
78+
tls_client_cert: provide client TLS certificate
79+
tls_client_key: provide client TLS key
7880
7981
Keyword Args:
8082
requests.Session session: HTTP Requests Session
@@ -98,6 +100,8 @@ def __init__(
98100
user_agent: str = gitlab.const.USER_AGENT,
99101
retry_transient_errors: bool = False,
100102
keep_base_url: bool = False,
103+
tls_client_cert: Optional[str] = None,
104+
tls_client_key: Optional[str] = None,
101105
**kwargs: Any,
102106
) -> None:
103107
self._api_version = str(api_version)
@@ -109,6 +113,7 @@ def __init__(
109113
self.timeout = timeout
110114
self.retry_transient_errors = retry_transient_errors
111115
self.keep_base_url = keep_base_url
116+
112117
#: Headers that will be used in request to GitLab
113118
self.headers = {"User-Agent": user_agent}
114119

@@ -129,6 +134,13 @@ def __init__(
129134
self._backend = _backend(**kwargs)
130135
self.session = self._backend.client
131136

137+
if tls_client_cert and tls_client_key:
138+
self.session.cert = (tls_client_cert, tls_client_key)
139+
elif tls_client_cert or tls_client_key:
140+
raise ValueError(
141+
"tls_client_cert and tls_client_key must be provided together"
142+
)
143+
132144
self.per_page = per_page
133145
self.pagination = pagination
134146
self.order_by = order_by
@@ -304,6 +316,8 @@ def from_config(
304316
user_agent=config.user_agent,
305317
retry_transient_errors=config.retry_transient_errors,
306318
keep_base_url=config.keep_base_url,
319+
tls_client_cert=config.tls_client_cert,
320+
tls_client_key=config.tls_client_key,
307321
**kwargs,
308322
)
309323

@@ -360,6 +374,9 @@ def merge_config(
360374
pagination=options.get("pagination") or config.pagination,
361375
order_by=options.get("order_by") or config.order_by,
362376
user_agent=options.get("user_agent") or config.user_agent,
377+
keep_base_url=config.keep_base_url,
378+
tls_client_cert=config.tls_client_cert,
379+
tls_client_key=config.tls_client_key,
363380
)
364381

365382
@staticmethod

gitlab/config.py

+20
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ def __init__(
109109
self.url: Optional[str] = None
110110
self.user_agent: str = USER_AGENT
111111
self.keep_base_url: bool = False
112+
self.tls_client_cert: Optional[str] = None
113+
self.tls_client_key: Optional[str] = None
112114

113115
self._files = _get_config_files(config_files)
114116
if self._files:
@@ -245,6 +247,24 @@ def _parse_config(self) -> None:
245247
except _CONFIG_PARSER_ERRORS:
246248
pass
247249

250+
try:
251+
self.tls_client_cert = _config.get("global", "tls_client_cert")
252+
except _CONFIG_PARSER_ERRORS:
253+
pass
254+
try:
255+
self.tls_client_cert = _config.get(self.gitlab_id, "tls_client_cert")
256+
except _CONFIG_PARSER_ERRORS:
257+
pass
258+
259+
try:
260+
self.tls_client_key = _config.get("global", "tls_client_key")
261+
except _CONFIG_PARSER_ERRORS:
262+
pass
263+
try:
264+
self.tls_client_key = _config.get(self.gitlab_id, "tls_client_key")
265+
except _CONFIG_PARSER_ERRORS:
266+
pass
267+
248268
try:
249269
self.retry_transient_errors = _config.getboolean(
250270
"global", "retry_transient_errors"

0 commit comments

Comments
 (0)