aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/platform/__init__.py8
-rw-r--r--libmproxy/platform/linux.py2
-rw-r--r--libmproxy/platform/osx.py119
-rw-r--r--libmproxy/proxy.py2
4 files changed, 90 insertions, 41 deletions
diff --git a/libmproxy/platform/__init__.py b/libmproxy/platform/__init__.py
index 15ac9c1a..09197ded 100644
--- a/libmproxy/platform/__init__.py
+++ b/libmproxy/platform/__init__.py
@@ -3,7 +3,7 @@ import sys
resolver = None
if sys.platform == "linux2":
import linux
- resolver = linux.Resolver()
-#elif sys.platform == "darwin":
-# import osx
-# resolver = osx.Resolver()
+ resolver = linux.Resolver
+elif sys.platform == "darwin":
+ import osx
+ resolver = osx.Resolver
diff --git a/libmproxy/platform/linux.py b/libmproxy/platform/linux.py
index d37f0fe8..411d442e 100644
--- a/libmproxy/platform/linux.py
+++ b/libmproxy/platform/linux.py
@@ -1,4 +1,4 @@
-import socket, struct
+import socket, struct, fcntl
# Python socket module does not have this constant
SO_ORIGINAL_DST = 80
diff --git a/libmproxy/platform/osx.py b/libmproxy/platform/osx.py
index fa51a2db..a66c03ed 100644
--- a/libmproxy/platform/osx.py
+++ b/libmproxy/platform/osx.py
@@ -1,9 +1,92 @@
-import socket, struct
+import socket, ctypes
# Python socket module does not have this constant
DIOCNATLOOK = 23
+PFDEV = "/dev/pf"
+
+
+class PF_STATE_XPORT(ctypes.Union):
+ """
+ union pf_state_xport {
+ u_int16_t port;
+ u_int16_t call_id;
+ u_int32_t spi;
+ };
+ """
+ _fields_ = [
+ ("port", ctypes.c_uint),
+ ("call_id", ctypes.c_uint),
+ ("spi", ctypes.c_ulong),
+ ]
+
+
+class PF_ADDR(ctypes.Union):
+ """
+ struct pf_addr {
+ union {
+ struct in_addr v4;
+ struct in6_addr v6;
+ u_int8_t addr8[16];
+ u_int16_t addr16[8];
+ u_int32_t addr32[4];
+ } pfa;
+ }
+ """
+ _fields_ = [
+ ("addr8", ctypes.c_byte * 2),
+ ("addr16", ctypes.c_byte * 4),
+ ("addr32", ctypes.c_byte * 8),
+ ]
+
+
+class PFIOC_NATLOOK(ctypes.Structure):
+ """
+ struct pfioc_natlook {
+ struct pf_addr saddr;
+ struct pf_addr daddr;
+ struct pf_addr rsaddr;
+ struct pf_addr rdaddr;
+ #ifndef NO_APPLE_EXTENSIONS
+ union pf_state_xport sxport;
+ union pf_state_xport dxport;
+ union pf_state_xport rsxport;
+ union pf_state_xport rdxport;
+ sa_family_t af;
+ u_int8_t proto;
+ u_int8_t proto_variant;
+ u_int8_t direction;
+ #else
+ u_int16_t sport;
+ u_int16_t dport;
+ u_int16_t rsport;
+ u_int16_t rdport;
+ sa_family_t af;
+ u_int8_t proto;
+ u_int8_t direction;
+ #endif
+ };
+ """
+ _fields_ = [
+ ("saddr", PF_ADDR),
+ ("daddr", PF_ADDR),
+ ("rsaddr", PF_ADDR),
+ ("rdaddr", PF_ADDR),
+
+ ("sxport", PF_STATE_XPORT),
+ ("dxport", PF_STATE_XPORT),
+ ("rsxport", PF_STATE_XPORT),
+ ("rdxport", PF_STATE_XPORT),
+ ("af", ctypes.c_uint),
+ ("proto", ctypes.c_ushort),
+ ("proto_variant", ctypes.c_ushort),
+ ("direction", ctypes.c_ushort),
+ ]
+
class Resolver:
+ def __init__(self):
+ self.pfdev = open(PFDEV, "r")
+
def original_addr(self, csock):
"""
The following sttruct defintions are plucked from the current XNU source, found here:
@@ -16,39 +99,5 @@ class Resolver:
u_int16_t call_id;
u_int32_t spi;
};
-
- struct pf_addr {
- union {
- struct in_addr v4;
- struct in6_addr v6;
- u_int8_t addr8[16];
- u_int16_t addr16[8];
- u_int32_t addr32[4];
- } pfa;
-
- struct pfioc_natlook {
- struct pf_addr saddr;
- struct pf_addr daddr;
- struct pf_addr rsaddr;
- struct pf_addr rdaddr;
- #ifndef NO_APPLE_EXTENSIONS
- union pf_state_xport sxport;
- union pf_state_xport dxport;
- union pf_state_xport rsxport;
- union pf_state_xport rdxport;
- sa_family_t af;
- u_int8_t proto;
- u_int8_t proto_variant;
- u_int8_t direction;
- #else
- u_int16_t sport;
- u_int16_t dport;
- u_int16_t rsport;
- u_int16_t rdport;
- sa_family_t af;
- u_int8_t proto;
- u_int8_t direction;
- #endif
- };
"""
pass
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py
index 4c216d11..961ee465 100644
--- a/libmproxy/proxy.py
+++ b/libmproxy/proxy.py
@@ -508,7 +508,7 @@ def process_proxy_options(parser, options):
if not platform.resolver:
parser.error("Transparent mode not supported on this platform.")
trans = dict(
- resolver = platform.resolver,
+ resolver = platform.resolver(),
sslports = TRANSPARENT_SSL_PORTS
)
else: