--- Begin Message ---
Package: pork
Version: 0.99.5-2
Severity: normal
Tags: patch
although the bundled libfaim does support SOCKS5 proxies, pork does
not; this means that the otrproxy for secure, deniable IM from
http://www.cypherpunks.ca/otr/
does not work. i've attached a patch that changes pork to use the
libfaim connection code so that this works. to use it, type e.g.
otrproxy &
env SOCKS5_PROXY=127.0.0.1 pork
and you'll have secured im. this should work with other SOCKS5 proxies
too (useful from behind some firewalls), but otrproxy is the only one
i have tested it with.
patch is also online at
http://xent.com/~bsittler/pork-0.99.7-socks5.diff
-- System Information:
Debian Release: 3.1
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.4.22-1-k7
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Versions of packages pork depends on:
ii libc6 2.3.2.ds1-19 GNU C Library: Shared libraries an
ii libncurses5 5.4-4 Shared libraries for terminal hand
ii libperl5.8 5.8.4-6 Shared Perl library
-- no debconf information
diff -u --recursive pork-0.99.7.orig/src/pork_aim.c pork-0.99.7/src/pork_aim.c
--- pork-0.99.7.orig/src/pork_aim.c 2004-12-10 19:15:49.000000000 -0800
+++ pork-0.99.7/src/pork_aim.c 2005-02-15 20:01:44.262712696 -0800
@@ -58,10 +58,6 @@
const char *name,
int exchange);
-static int aim_sock_connect(const char *ip,
- struct sockaddr_storage *laddr,
- int *sock);
-
static int aim_report_idle(struct pork_acct *acct, int mode);
static int aim_connect_abort(struct pork_acct *acct);
static int aim_set_away(struct pork_acct *acct, char *away_msg);
@@ -115,48 +111,6 @@
#endif
}
-static int aim_sock_connect(const char *ip,
- struct sockaddr_storage *laddr,
- int *sock)
-{
- struct sockaddr_storage ss;
- char *addr;
- char *port;
- in_port_t port_num = FAIM_LOGIN_PORT;
-
- port = getenv("AIM_PORT");
- if (port != NULL) {
- u_int32_t temp;
-
- if (str_to_uint(port, &temp) != -1)
- port_num = temp;
- }
-
- addr = xstrdup(ip);
-
- port = strchr(addr, ':');
- if (port != NULL) {
- *port++ = '\0';
-
- if (get_port(port, &port_num) != 0) {
- screen_err_msg("Error: Invalid port: %s", port);
- goto err_out;
- }
- }
-
- if (get_addr(addr, &ss) != 0) {
- screen_err_msg("Error: Invalid host: %s", addr);
- goto err_out;
- }
-
- free(addr);
- return (nb_connect(&ss, laddr, port_num, sock));
-
-err_out:
- free(addr);
- return (-1);
-}
-
static void aim_print_info( char *user,
char *profile,
char *away_msg,
@@ -1483,27 +1437,18 @@
if (redirect->group == AIM_CONN_TYPE_CHATNAV) {
aim_conn_t *chatnav;
- int sock;
- int ret;
- chatnav = aim_newconn(session, AIM_CONN_TYPE_CHATNAV, NULL);
+ chatnav = aim_newconn(session, AIM_CONN_TYPE_CHATNAV, redirect->ip);
if (chatnav == NULL) {
screen_err_msg("Unable to connect to the chatnav server: %s",
strerror(errno));
return (0);
}
- ret = aim_sock_connect(redirect->ip, &acct->laddr, &sock);
- if (ret == 0) {
- aim_connected(sock, 0, chatnav);
- } else if (ret == -EINPROGRESS) {
- chatnav->status |= AIM_CONN_STATUS_INPROGRESS;
- pork_io_add(sock, IO_COND_WRITE, chatnav, chatnav, aim_connected);
+ if (! (chatnav->status | AIM_CONN_STATUS_INPROGRESS)) {
+ aim_connected(chatnav->fd, 0, chatnav);
} else {
- aim_conn_kill(session, &chatnav);
- screen_err_msg("Unable to connect to the chatnav server: %s",
- strerror(errno));
- return (0);
+ pork_io_add(chatnav->fd, IO_COND_WRITE, chatnav, chatnav, aim_connected);
}
aim_conn_addhandler(session, chatnav, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNDEAD, aim_conn_dead, 0);
@@ -1517,27 +1462,19 @@
struct aim_chat *a_chat;
struct imwindow *win;
char buf[128];
- int sock;
- int ret;
char *chat_title;
- chat_conn = aim_newconn(session, AIM_CONN_TYPE_CHAT, NULL);
+ chat_conn = aim_newconn(session, AIM_CONN_TYPE_CHAT, redirect->ip);
if (chat_conn == NULL) {
screen_err_msg("Unable to connect to the chat server");
return (0);
}
- ret = aim_sock_connect(redirect->ip, &acct->laddr, &sock);
- if (ret == 0) {
- aim_connected(sock, 0, chat_conn);
- } else if (ret == -EINPROGRESS) {
- chat_conn->status |= AIM_CONN_STATUS_INPROGRESS;
- pork_io_add(sock, IO_COND_WRITE, chat_conn, chat_conn,
- aim_connected);
+ if (! (chat_conn->status | AIM_CONN_STATUS_INPROGRESS)) {
+ aim_connected(chat_conn->fd, 0, chat_conn);
} else {
- aim_conn_kill(session, &chat_conn);
- screen_err_msg("Unable to connect to the chatnav server");
- return (0);
+ pork_io_add(chat_conn->fd, IO_COND_WRITE, chat_conn, chat_conn,
+ aim_connected);
}
chat_title = get_chatname(redirect->chat.room);
@@ -2013,8 +1950,6 @@
struct aim_authresp_info *authresp;
aim_conn_t *bos_conn;
struct pork_acct *acct = session->aux_data;
- int ret;
- int sock;
struct sockaddr_storage local;
pork_io_del(fr->conn);
@@ -2060,27 +1995,21 @@
return (1);
}
- bos_conn = aim_newconn(session, AIM_CONN_TYPE_BOS, NULL);
+ bos_conn = aim_newconn(session, AIM_CONN_TYPE_BOS, authresp->bosip);
if (bos_conn == NULL) {
aim_conn_kill(session, &bos_conn);
- screen_err_msg("Unable to connect to the AIM BOS server");
+ screen_err_msg("Unable to connect to the BOS server");
return (1);
}
memcpy(&local, &acct->laddr, sizeof(local));
sin_set_port(&local, acct->lport);
- ret = aim_sock_connect(authresp->bosip, &local, &sock);
- if (ret == 0) {
- aim_connected(sock, 0, bos_conn);
- } else if (ret == -EINPROGRESS) {
- bos_conn->status |= AIM_CONN_STATUS_INPROGRESS;
- pork_io_add(sock, IO_COND_WRITE, bos_conn, bos_conn,
- aim_connected);
+ if (! (bos_conn->status | AIM_CONN_STATUS_INPROGRESS)) {
+ aim_connected(bos_conn->fd, 0, bos_conn);
} else {
- aim_conn_kill(session, &bos_conn);
- screen_err_msg("Unable to connect to the BOS server");
- return (0);
+ pork_io_add(bos_conn->fd, IO_COND_WRITE, bos_conn, bos_conn,
+ aim_connected);
}
aim_conn_addhandler(session, bos_conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNDEAD, aim_conn_dead, 0);
@@ -2120,19 +2049,48 @@
static int aim_login(struct pork_acct *acct) {
struct aim_priv *priv = acct->data;
- int ret;
- int sock;
aim_conn_t *auth_conn;
char *server;
+ char *port;
+ in_port_t port_num = FAIM_LOGIN_PORT;
+ const char *socks5_server, *socks5_user, *socks5_passwd;
+
+ socks5_server = getenv("SOCKS5_SERVER");
+ if (socks5_server == NULL)
+ socks5_server = getenv("SOCKS_SERVER");
+ socks5_user = getenv("SOCKS5_USER");
+ socks5_passwd = getenv("SOCKS5_PASSWD");
+ aim_setupproxy(&priv->aim_session, socks5_server, socks5_user, socks5_passwd);
server = getenv("AIM_SERVER");
if (server == NULL)
server = FAIM_LOGIN_SERVER;
+ port = getenv("AIM_PORT");
+ if (port != NULL) {
+ u_int32_t temp;
+
+ if (str_to_uint(port, &temp) != -1)
+ port_num = temp;
+ }
+
+ server = xstrdup(server);
+ if ((port_num != FAIM_LOGIN_PORT) && ! strchr(server, ':'))
+ {
+ size_t len = strlen(server);
+ char buf[7];
+
+ sprintf(buf, ":%hu", (unsigned short) port_num);
+ server = realloc(server, len + 7);
+ strcpy(server, buf);
+ }
+
acct->connected = 0;
screen_status_msg_ts("Logging in as %s...", acct->username);
- auth_conn = aim_newconn(&priv->aim_session, AIM_CONN_TYPE_AUTH, NULL);
+ auth_conn = aim_newconn(&priv->aim_session, AIM_CONN_TYPE_AUTH, server);
+ free(server);
+
if (auth_conn == NULL) {
screen_err_msg("Connection error while logging in as %s",
acct->username);
@@ -2140,17 +2098,10 @@
return (-1);
}
- ret = aim_sock_connect(server, &acct->laddr, &sock);
- if (ret == 0) {
- aim_connected(sock, 0, auth_conn);
- } else if (ret == -EINPROGRESS) {
- auth_conn->status |= AIM_CONN_STATUS_INPROGRESS;
- pork_io_add(sock, IO_COND_WRITE, auth_conn, auth_conn, aim_connected);
- } else {
- screen_err_msg("Error connecting to the authorizer server as %s",
- acct->username);
- aim_conn_kill(&priv->aim_session, &auth_conn);
- return (-1);
+ if (! (auth_conn->status | AIM_CONN_STATUS_INPROGRESS)) {
+ aim_connected(auth_conn->fd, 0, auth_conn);
+ } else {
+ pork_io_add(auth_conn->fd, IO_COND_WRITE, auth_conn, auth_conn, aim_connected);
}
aim_conn_addhandler(&priv->aim_session, auth_conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, aim_connerr, 0);
@@ -2167,7 +2118,7 @@
memset(session, 0, sizeof(*session));
- aim_session_init(session, 0, 0);
+ aim_session_init(session, 1, 0);
aim_setdebuggingcb(session, aim_debug);
aim_tx_setenqueue(session, AIM_TX_IMMEDIATE, NULL);
@@ -2996,8 +2947,6 @@
struct aim_oft_info *oft_info;
struct aim_priv *priv = xfer->acct->data;
char buf[512];
- int ret;
- int sock;
oft_info = xfer->data;
@@ -3005,7 +2954,7 @@
oft_info->port);
oft_info->conn = aim_newconn(&priv->aim_session,
- AIM_CONN_TYPE_RENDEZVOUS, NULL);
+ AIM_CONN_TYPE_RENDEZVOUS, buf);
if (oft_info->conn == NULL) {
screen_err_msg("Error connecting to %s@%s while receiving %s",
@@ -3016,18 +2965,11 @@
oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE;
oft_info->conn->priv = xfer;
- ret = aim_sock_connect(buf, &xfer->acct->laddr, &sock);
- if (ret == 0) {
- aim_connected(sock, 0, oft_info->conn);
- } else if (ret == -EINPROGRESS) {
- oft_info->conn->status |= AIM_CONN_STATUS_INPROGRESS;
- pork_io_add(sock, IO_COND_WRITE, oft_info->conn, oft_info->conn,
- aim_connected);
+ if (! (oft_info->conn->status | AIM_CONN_STATUS_INPROGRESS)) {
+ aim_connected(oft_info->conn->fd, 0, oft_info->conn);
} else {
- aim_conn_kill(&priv->aim_session, &oft_info->conn);
- screen_err_msg("Error connecting to %s@%s while receiving %s",
- xfer->peer_username, buf, xfer->fname_local);
- return (-1);
+ pork_io_add(oft_info->conn->fd, IO_COND_WRITE, oft_info->conn, oft_info->conn,
+ aim_connected);
}
aim_conn_addhandler(&priv->aim_session, oft_info->conn,
--- End Message ---