Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions graphify/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,19 @@ def connect(self) -> None:
self._tunnel()


class _ProxyAwareHTTPConnection(_SSRFGuardedHTTPConnection):
"""HTTPConnection that skips SSRF IP validation for the proxy hop."""

def connect(self) -> None:
self.sock = socket.create_connection(
(self.host, self.port),
self.timeout,
self.source_address,
)
if self._tunnel_host:
self._tunnel()


class _SSRFGuardedHTTPSConnection(http.client.HTTPSConnection):
"""HTTPSConnection variant of _SSRFGuardedHTTPConnection.

Expand All @@ -214,17 +227,37 @@ def connect(self) -> None:
self.sock = self._context.wrap_socket(sock, server_hostname=self.host)


class _ProxyAwareHTTPSConnection(_SSRFGuardedHTTPSConnection):
"""HTTPSConnection that skips SSRF IP validation for the proxy hop."""

def connect(self) -> None:
sock = socket.create_connection(
(self.host, self.port),
self.timeout,
self.source_address,
)
if self._tunnel_host:
self.sock = sock
self._tunnel()
sock = self.sock
self.sock = self._context.wrap_socket(sock, server_hostname=self.host)


class _SSRFGuardedHTTPHandler(urllib.request.HTTPHandler):
"""urllib handler that routes http:// through _SSRFGuardedHTTPConnection."""

def http_open(self, req):
if req.has_proxy():
return self.do_open(_ProxyAwareHTTPConnection, req)
return self.do_open(_SSRFGuardedHTTPConnection, req)


class _SSRFGuardedHTTPSHandler(urllib.request.HTTPSHandler):
"""urllib handler that routes https:// through _SSRFGuardedHTTPSConnection."""

def https_open(self, req):
if getattr(req, "_tunnel_host", None) or req.has_proxy():
return self.do_open(_ProxyAwareHTTPSConnection, req)
return self.do_open(_SSRFGuardedHTTPSConnection, req)


Expand Down