[tor-bugs] #9022 [Pluggable transport]: Create an XMPP pluggable transport
Tor Bug Tracker & Wiki
blackhole at torproject.org
Sat Jun 8 19:51:05 UTC 2013
#9022: Create an XMPP pluggable transport
---------------------------------+------------------------------------------
Reporter: asn | Owner: feynman
Type: task | Status: accepted
Priority: normal | Milestone:
Component: Pluggable transport | Version:
Keywords: | Parent:
Points: | Actualpoints:
---------------------------------+------------------------------------------
Comment(by asn):
Replying to [comment:7 feynman]:
> Replying to [comment:3 asn]:
>
> I should make a couple of notes here. First of all, the client really
controls every aspect of initializing the connection. The xmpp bot on the
server side just logs into an xmpp server and listens for traffic. It does
not even bind to a port.
>
> On the client side, the xmpp bot binds to one or more ports and listens
for traffic. It associates each of these ports with:
> *An xmpp username to forward traffic to
> *An ip:port that the xmpp bot on the server side should try to connect
to
>
> When it gets a connection, it sends a message "connect me!" to the xmpp
bot on the server through the chatline. It puts the ip:port the server
should try to connect to in the xml subject tag and the ip:port of its
newly spawned connect socket in the xml nick tag (used for nicknames).
This way, the xmpp bot on the server side has a way to send data to that
connected socket when replying. The client xmpp bot also creates an entry
in its routing table that associates the following tuple:
> (ip:port of connected socket, server's xmpp username, server ip:port to
connect to)
> with the newly connected socket.
>
> When the xmpp bot on the server side gets a connection request, it
creates a new socket and tries to connect it to the ip:port specified in
the subject tag. If successful, it adds an entry to its routing table that
associates the following tuple:
> (ip:port that the server just connected to, client's xmpp username,
client's connected socket's ip:port)
> with the newly connected socket.
>
> Now, when either socket receives data, they are prompted to send the
data over the chat server using the socket's key in the routing table to
construct the appropriate nick and subject xml tags. When a message is
received over an xmpp server, the routing table key is constructed from
the username of the computer that sent it, along with the nick and subject
xml tags. The data is then forwarded to the appropriate socket.
>
> An analogous process takes place for disconnections, starting with a
closing socket sending a "disconnect me!" message to the xmpp bot on the
other side of the chat server.
Hey there! I have a quick code review and comments. If you are bored
fixing my comments, just say so, and I will do it when I get some free
time.
- All your git commit messages say 'master'. Instead commit messages are
supposed to be a summary of what the commit does. Check out
https://gitweb.torproject.org/tor.git for example.
- Your comments are too verbose some times
(https://github.com/aeftimia/hexchat/blob/master/fast/hexchat.py#L53
https://github.com/aeftimia/hexchat/blob/master/fast/hexchat.py#L110
https://github.com/aeftimia/hexchat/blob/master/fast/hexchat.py#L25),
which makes the code hard to read, and some other times insufficient
(https://github.com/aeftimia/hexchat/blob/master/fast/hexchat.py#L21 how
do the keys/values of this dict look like?)
(https://github.com/aeftimia/hexchat/blob/master/fast/hexchat.py#L123
bottleneck?) If you want an example of a robustly commented Python
codebase check out https://gitweb.torproject.org/stem.git or Twisted or
something.
- Also, check out http://www.python.org/dev/peps/pep-0008/ for Guido's
ideas on Python comments.
- Which XMPP plugins do we really need? For example, do we need Multi-User
Chat?
- Instead of using print(), use the Python logging module for your logs.
- Stuff like "send '_' for empty data" must be mentioned in the spec.
- Maybe add a more paranoid "(dis)connect me!" string so that it's even
more unlikely to be encountered in a normal XMPP concersation? Add some
numbers, and symbols, and stuff.
- You are using rfind() but not checking the retval. You are also using
functions like find() without checking for exceptions. Don't assume that
the data you receive are correctly formatted. Your program might crash
with an exception.
- Try not to do catch-all excepts: http://ischenko.blogspot.gr/2005/01
/exception-based-code-antipatterns.html
- I still think sockbot is a weird name -- and you also needed two lines
of comments to explain it. Why don't you name the class Hexchat or
something?
- What's the deal with the lambda in the "disconnected" event handler
function pointer? Or the `lambda: False`? Am I missing something?
- Maybe split the codebase to more files? One for the client and another
for the server? This way you won't need to have variables like
client_socks and server_socks that are only used in one mode.
- Using `sock` as an abbreviation for `socket` continues to be confusing
in names like `server_socks`. Maybe expand `sock` to `socket`?
All in all, code looks good, the new comments are helpful, and I think I
kind of understand how it works.
--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/9022#comment:10>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online
More information about the tor-bugs
mailing list