SOCKSmodule ok except for ftplib

Daniel W. Connolly (connolly@hal.com)
Mon, 09 May 1994 13:07:13 -0500

Python makes a great little WWW experimentation tool...

But to get to the outside world from my box, you have
to go through a firewall.

SOCKS to the rescue!!! Right?

So I made a copy of socketmodule.c, called it socksmodule.c,
changed the runtime-visible "socket.error" to "SOCKet.error",
and built it with -Dconnect=Rconnect etc.

Presto! Python with SOCKS on!

So I went into ftplib.py, and changed:

import socket

to

try:
import SOCKS; socket = SOCKS
except ImportError:
import socket

Everything goes OK until we go to set up the data port connection.

First, I was getting this error:

err_setstr(SocketError, "return unknown socket address type");

because the SOCKS version of getsocketname assumes that you call
bind() right before you call getsocketname -- it squirrels away
the answer to getsocketname() when you do bind(). The ftplib
just did a getsocketname() on a new socket, so Rgetsocketname returned
a bogus address.

So I changed ftplib to match the SOCKS assumptions by adding
sock.bind('', 0)
before it does sock.getsockname(). Then I kept getting:

*resp* '200 PORT command successful.'
*cmd* 'RETR README'
*resp* "425 Can't build data connection: Can't assign requested address."

Hmmm... I just twiddled with ftplib.py a little more and now it seems
to work... go figure.

Anyway... the socksmodule stuff is real simple... and adding it to
the python interpreter is a snap, thanks to all the Setup magic.
I could contribute it if anybody's interested.

Daniel W. Connolly "We believe in the interconnectedness of all things"
Software Engineer, Hal Software Systems, OLIAS project (512) 834-9962 x5010
<connolly@hal.com> http://www.hal.com/%7Econnolly/index.html