libpurple/stun.c

Fri, 18 Jan 2013 03:51:05 -0500

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Fri, 18 Jan 2013 03:51:05 -0500
changeset 33643
6f7deddb8850
parent 32983
b24f582761a4
child 34304
faf0414a8b51
permissions
-rw-r--r--

Move blist loading into purple_core_init.

The comments say we want to move this into purple_blist_init, but that
seems like it would be problematic. We need the UI ops to be set, which
moves blist init after UI init. But stuff needs blist signals to be
registered before UI init, etc., etc. It seemed like a pain to work that
all out. I made purple_blist_boot for purple_core_init to call after the
UI init happened. It could have been called _load, but I didn't want
people to accidentally continue calling it.

11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
1 /**
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
2 * @file stun.c STUN (RFC3489) Implementation
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
3 * @ingroup core
20147
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
4 */
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
5
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
6 /* purple
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
7 *
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
8 * STUN implementation inspired by jstun [http://jstun.javawi.de/]
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
9 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
10 * Purple is the legal property of its developers, whose names are too numerous
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
11 * to list here. Please refer to the COPYRIGHT file distributed with this
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
12 * source distribution.
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
13 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
14 * This program is free software; you can redistribute it and/or modify
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
15 * it under the terms of the GNU General Public License as published by
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
16 * the Free Software Foundation; either version 2 of the License, or
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
17 * (at your option) any later version.
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
18 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
19 * This program is distributed in the hope that it will be useful,
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
22 * GNU General Public License for more details.
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
23 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
24 * You should have received a copy of the GNU General Public License
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
25 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 19770
diff changeset
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
27 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
28 */
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
29
11898
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11677
diff changeset
30 #include "internal.h"
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11677
diff changeset
31
11364
d754cf40ec4b [gaim-migrate @ 13588]
Daniel Atallah <datallah@pidgin.im>
parents: 11354
diff changeset
32 #ifndef _WIN32
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
33 #include <net/if.h>
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
34 #include <sys/ioctl.h>
11364
d754cf40ec4b [gaim-migrate @ 13588]
Daniel Atallah <datallah@pidgin.im>
parents: 11354
diff changeset
35 #endif
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
36
12700
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
37 /* Solaris */
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
38 #if defined (__SVR4) && defined (__sun)
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
39 #include <sys/sockio.h>
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
40 #endif
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
41
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
42 #include "debug.h"
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
43 #include "account.h"
14243
0bda01972ff2 [gaim-migrate @ 16833]
Mark Doliner <markdoliner@pidgin.im>
parents: 14226
diff changeset
44 #include "dnsquery.h"
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
45 #include "dnssrv.h"
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
46 #include "network.h"
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
47 #include "proxy.h"
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
48 #include "stun.h"
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
49 #include "prefs.h"
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
50
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
51 #define MSGTYPE_BINDINGREQUEST 0x0001
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
52 #define MSGTYPE_BINDINGRESPONSE 0x0101
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
53
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
54 #define ATTRIB_MAPPEDADDRESS 0x0001
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
55
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
56 struct stun_header {
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
57 guint16 type;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
58 guint16 len;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
59 guint32 transid[4];
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
60 };
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
61
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
62 struct stun_attrib {
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
63 guint16 type;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
64 guint16 len;
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
65 };
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
66
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
67 #ifdef NOTYET
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
68 struct stun_change {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
69 struct stun_header hdr;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
70 struct stun_attrib attrib;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
71 char value[4];
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
72 };
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
73 #endif
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
74
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
75 struct stun_conn {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
76 int fd;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
77 struct sockaddr_in addr;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
78 int test;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
79 int retry;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
80 guint incb;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
81 guint timeout;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
82 struct stun_header *packet;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
83 size_t packetsize;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
84 };
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
85
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
86 static PurpleStunNatDiscovery nattype = {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
87 PURPLE_STUN_STATUS_UNDISCOVERED,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
88 PURPLE_STUN_NAT_TYPE_PUBLIC_IP,
12877
aebd8924bc4b [gaim-migrate @ 15229]
Daniel Atallah <datallah@pidgin.im>
parents: 12757
diff changeset
89 "\0", NULL, 0};
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
90
12877
aebd8924bc4b [gaim-migrate @ 15229]
Daniel Atallah <datallah@pidgin.im>
parents: 12757
diff changeset
91 static GSList *callbacks = NULL;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
92
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
93 static void close_stun_conn(struct stun_conn *sc) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
94
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
95 if (sc->incb)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
96 purple_input_remove(sc->incb);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
97
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
98 if (sc->timeout)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
99 purple_timeout_remove(sc->timeout);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
100
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
101 if (sc->fd)
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
102 close(sc->fd);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
103
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
104 g_free(sc);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
105 }
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
106
22104
56970903b8e9 Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@pidgin.im>
parents: 20147
diff changeset
107 static void do_callbacks(void) {
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
108 while (callbacks) {
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
109 StunCallback cb = callbacks->data;
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
110 if (cb)
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
111 cb(&nattype);
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
112 callbacks = g_slist_delete_link(callbacks, callbacks);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
113 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
114 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
115
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
116 static gboolean timeoutfunc(gpointer data) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
117 struct stun_conn *sc = data;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
118 if(sc->retry >= 2) {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 26782
diff changeset
119 purple_debug_warning("stun", "request timed out, giving up.\n");
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
120 if(sc->test == 2)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
121 nattype.type = PURPLE_STUN_NAT_TYPE_SYMMETRIC;
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
122
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
123 /* set unknown */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
124 nattype.status = PURPLE_STUN_STATUS_UNKNOWN;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
125
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
126 nattype.lookup_time = time(NULL);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
127
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
128 /* callbacks */
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
129 do_callbacks();
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
130
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
131 /* we don't need to remove the timeout (returning FALSE) */
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
132 sc->timeout = 0;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
133 close_stun_conn(sc);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
134
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
135 return FALSE;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
136 }
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
137 purple_debug_info("stun", "request timed out, retrying.\n");
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
138 sc->retry++;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
139 sendto(sc->fd, sc->packet, sc->packetsize, 0,
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
140 (struct sockaddr *)&(sc->addr), sizeof(struct sockaddr_in));
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
141 return TRUE;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
142 }
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
143
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
144 #ifdef NOTYET
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
145 static void do_test2(struct stun_conn *sc) {
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
146 struct stun_change data;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
147 data.hdr.type = htons(0x0001);
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
148 data.hdr.len = 0;
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
149 data.hdr.transid[0] = rand();
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
150 data.hdr.transid[1] = ntohl(((int)'g' << 24) + ((int)'a' << 16) + ((int)'i' << 8) + (int)'m');
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
151 data.hdr.transid[2] = rand();
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
152 data.hdr.transid[3] = rand();
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
153 data.attrib.type = htons(0x003);
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
154 data.attrib.len = htons(4);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
155 data.value[3] = 6;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
156 sc->packet = (struct stun_header*)&data;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
157 sc->packetsize = sizeof(struct stun_change);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
158 sc->retry = 0;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
159 sc->test = 2;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
160 sendto(sc->fd, sc->packet, sc->packetsize, 0, (struct sockaddr *)&(sc->addr), sizeof(struct sockaddr_in));
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
161 sc->timeout = purple_timeout_add(500, (GSourceFunc) timeoutfunc, sc);
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
162 }
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
163 #endif
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
164
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
165 static void reply_cb(gpointer data, gint source, PurpleInputCondition cond) {
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
166 struct stun_conn *sc = data;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
167 char buffer[65536];
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
168 char *tmp;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
169 int len;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
170 struct in_addr in;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
171 struct stun_attrib *attrib;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
172 struct stun_header *hdr;
11300
11bc6db394e6 [gaim-migrate @ 13500]
Richard Laager <rlaager@pidgin.im>
parents: 11229
diff changeset
173 struct ifconf ifc;
11bc6db394e6 [gaim-migrate @ 13500]
Richard Laager <rlaager@pidgin.im>
parents: 11229
diff changeset
174 struct ifreq *ifr;
11bc6db394e6 [gaim-migrate @ 13500]
Richard Laager <rlaager@pidgin.im>
parents: 11229
diff changeset
175 struct sockaddr_in *sinptr;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
176
32983
b24f582761a4 stun: Initialize 'in', silence compiler.
Paul Aurich <darkrain42@pidgin.im>
parents: 32594
diff changeset
177 memset(&in, 0, sizeof(in));
b24f582761a4 stun: Initialize 'in', silence compiler.
Paul Aurich <darkrain42@pidgin.im>
parents: 32594
diff changeset
178
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
179 len = recv(source, buffer, sizeof(buffer) - 1, 0);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
180 if (!len) {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 26782
diff changeset
181 purple_debug_warning("stun", "unable to read stun response\n");
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
182 return;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
183 }
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
184 buffer[len] = '\0';
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
185
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
186 if (len < sizeof(struct stun_header)) {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 26782
diff changeset
187 purple_debug_warning("stun", "got invalid response\n");
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
188 return;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
189 }
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
190
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
191 hdr = (struct stun_header*) buffer;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
192 if (len != (ntohs(hdr->len) + sizeof(struct stun_header))) {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 26782
diff changeset
193 purple_debug_warning("stun", "got incomplete response\n");
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
194 return;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
195 }
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
196
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
197 /* wrong transaction */
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
198 if(hdr->transid[0] != sc->packet->transid[0]
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
199 || hdr->transid[1] != sc->packet->transid[1]
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
200 || hdr->transid[2] != sc->packet->transid[2]
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
201 || hdr->transid[3] != sc->packet->transid[3]) {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 26782
diff changeset
202 purple_debug_warning("stun", "got wrong transid\n");
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
203 return;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
204 }
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
205
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
206 if(sc->test==1) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
207 if (hdr->type != MSGTYPE_BINDINGRESPONSE) {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 26782
diff changeset
208 purple_debug_warning("stun",
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
209 "Expected Binding Response, got %d\n",
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
210 hdr->type);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
211 return;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
212 }
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
213
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
214 tmp = buffer + sizeof(struct stun_header);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
215 while((buffer + len) > (tmp + sizeof(struct stun_attrib))) {
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
216 attrib = (struct stun_attrib*) tmp;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
217 tmp += sizeof(struct stun_attrib);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
218
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
219 if (!((buffer + len) > (tmp + ntohs(attrib->len))))
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
220 break;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
221
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
222 if(attrib->type == htons(ATTRIB_MAPPEDADDRESS)
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
223 && ntohs(attrib->len) == 8) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
224 char *ip;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
225 /* Skip the first unused byte,
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
226 * the family(1 byte), and the port(2 bytes);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
227 * then read the 4 byte IPv4 address */
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
228 memcpy(&in.s_addr, tmp + 4, 4);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
229 ip = inet_ntoa(in);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
230 if(ip)
32002
a577544f30d7 Almost certainly not an issue, but bounds check a strcpy in stun.c (EFF)
Ethan Blanton <elb@pidgin.im>
parents: 31680
diff changeset
231 g_strlcpy(nattype.publicip, ip, sizeof(nattype.publicip));
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
232 }
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
233
12757
ef403877ac2e [gaim-migrate @ 15104]
Daniel Atallah <datallah@pidgin.im>
parents: 12756
diff changeset
234 tmp += ntohs(attrib->len);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
235 }
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
236 purple_debug_info("stun", "got public ip %s\n", nattype.publicip);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
237 nattype.status = PURPLE_STUN_STATUS_DISCOVERED;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
238 nattype.type = PURPLE_STUN_NAT_TYPE_UNKNOWN_NAT;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
239 nattype.lookup_time = time(NULL);
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
240
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
241 /* is it a NAT? */
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
242
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
243 ifc.ifc_len = sizeof(buffer);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
244 ifc.ifc_req = (struct ifreq *) buffer;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
245 ioctl(source, SIOCGIFCONF, &ifc);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
246
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
247 tmp = buffer;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
248 while(tmp < buffer + ifc.ifc_len) {
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
249 ifr = (struct ifreq *) tmp;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
250
11364
d754cf40ec4b [gaim-migrate @ 13588]
Daniel Atallah <datallah@pidgin.im>
parents: 11354
diff changeset
251 tmp += sizeof(struct ifreq);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
252
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
253 if(ifr->ifr_addr.sa_family == AF_INET) {
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
254 /* we only care about ipv4 interfaces */
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
255 sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
256 if(sinptr->sin_addr.s_addr == in.s_addr) {
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
257 /* no NAT */
19770
9184bfee0172 Add a missing newline to the end of a purple_debug_info call.
Richard Laager <rlaager@pidgin.im>
parents: 19048
diff changeset
258 purple_debug_info("stun", "no nat\n");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
259 nattype.type = PURPLE_STUN_NAT_TYPE_PUBLIC_IP;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
260 }
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
261 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
262 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
263
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
264 #ifndef NOTYET
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
265 close_stun_conn(sc);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
266 do_callbacks();
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
267 #else
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
268 purple_timeout_remove(sc->timeout);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
269 sc->timeout = 0;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
270
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
271 do_test2(sc);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
272 } else if(sc->test == 2) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
273 close_stun_conn(sc);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
274 nattype.type = PURPLE_STUN_NAT_TYPE_FULL_CONE;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
275 do_callbacks();
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
276 #endif
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
277 }
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
278 }
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
279
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
280
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
281 static void hbn_listen_cb(int fd, gpointer data) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
282 GSList *hosts = data;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
283 struct stun_conn *sc;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
284 static struct stun_header hdr_data;
11425
668f93d8c3a2 [gaim-migrate @ 13662]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11424
diff changeset
285
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
286 if(fd < 0) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
287 nattype.status = PURPLE_STUN_STATUS_UNKNOWN;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
288 nattype.lookup_time = time(NULL);
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
289 do_callbacks();
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
290 return;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
291 }
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
292
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
293 sc = g_new0(struct stun_conn, 1);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
294 sc->fd = fd;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
295
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
296 sc->addr.sin_family = AF_INET;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
297 sc->addr.sin_port = htons(purple_network_get_port_from_fd(fd));
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
298 sc->addr.sin_addr.s_addr = INADDR_ANY;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
299
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
300 sc->incb = purple_input_add(fd, PURPLE_INPUT_READ, reply_cb, sc);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
301
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
302 hosts = g_slist_delete_link(hosts, hosts);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
303 memcpy(&(sc->addr), hosts->data, sizeof(struct sockaddr_in));
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
304 g_free(hosts->data);
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
305 hosts = g_slist_delete_link(hosts, hosts);
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
306 while (hosts) {
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
307 hosts = g_slist_delete_link(hosts, hosts);
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
308 g_free(hosts->data);
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
309 hosts = g_slist_delete_link(hosts, hosts);
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
310 }
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
311
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
312 hdr_data.type = htons(MSGTYPE_BINDINGREQUEST);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
313 hdr_data.len = 0;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
314 hdr_data.transid[0] = rand();
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
315 hdr_data.transid[1] = ntohl(((int)'g' << 24) + ((int)'a' << 16) + ((int)'i' << 8) + (int)'m');
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
316 hdr_data.transid[2] = rand();
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
317 hdr_data.transid[3] = rand();
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
318
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
319 if(sendto(sc->fd, &hdr_data, sizeof(struct stun_header), 0,
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
320 (struct sockaddr *)&(sc->addr),
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
321 sizeof(struct sockaddr_in)) < sizeof(struct stun_header)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
322 nattype.status = PURPLE_STUN_STATUS_UNKNOWN;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
323 nattype.lookup_time = time(NULL);
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
324 do_callbacks();
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
325 close_stun_conn(sc);
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
326 return;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
327 }
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
328 sc->test = 1;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
329 sc->packet = &hdr_data;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
330 sc->packetsize = sizeof(struct stun_header);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
331 sc->timeout = purple_timeout_add(500, (GSourceFunc) timeoutfunc, sc);
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
332 }
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
333
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
334 static void hbn_cb(GSList *hosts, gpointer data, const char *error_message) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
335
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
336 if(!hosts || !hosts->data) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
337 nattype.status = PURPLE_STUN_STATUS_UNDISCOVERED;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
338 nattype.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
339 do_callbacks();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
340 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
341 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
342
32594
f2feea134fdb Remove deprecated purple_network_listen_map_external().
Andrew Victor <andrew.victor@mxit.com>
parents: 32593
diff changeset
343 if (!purple_network_listen_range(12108, 12208, AF_UNSPEC, SOCK_DGRAM, TRUE, hbn_listen_cb, hosts)) {
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
344 while (hosts) {
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
345 hosts = g_slist_delete_link(hosts, hosts);
26782
0d61de90ae02 Don't leak the struct sockaddr* from purple_dnsquery_a.
Paul Aurich <darkrain42@pidgin.im>
parents: 25859
diff changeset
346 g_free(hosts->data);
30704
a07bc8a6c401 Optimize just a teensy-tiny bit.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 27497
diff changeset
347 hosts = g_slist_delete_link(hosts, hosts);
26782
0d61de90ae02 Don't leak the struct sockaddr* from purple_dnsquery_a.
Paul Aurich <darkrain42@pidgin.im>
parents: 25859
diff changeset
348 }
0d61de90ae02 Don't leak the struct sockaddr* from purple_dnsquery_a.
Paul Aurich <darkrain42@pidgin.im>
parents: 25859
diff changeset
349
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
350 nattype.status = PURPLE_STUN_STATUS_UNKNOWN;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
351 nattype.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
352 do_callbacks();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
353 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
354 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
355
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
356
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
357 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12877
diff changeset
358
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
359 static void do_test1(PurpleSrvResponse *resp, int results, gpointer sdata) {
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
360 const char *servername = sdata;
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
361 int port = 3478;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
362
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
363 if(results) {
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
364 servername = resp[0].hostname;
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
365 port = resp[0].port;
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
366 }
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
367 purple_debug_info("stun", "got %d SRV responses, server: %s, port: %d\n",
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
368 results, servername, port);
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
369
32297
100ef65e9664 Replace purple_dnsquery_a_account with purple_dnsquery_a.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 32002
diff changeset
370 purple_dnsquery_a(NULL, servername, port, hbn_cb, NULL);
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
371 g_free(resp);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
372 }
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
373
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
374 static gboolean call_callback(gpointer data) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
375 StunCallback cb = data;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
376 cb(&nattype);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
377 return FALSE;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
378 }
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
379
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
380 PurpleStunNatDiscovery *purple_stun_discover(StunCallback cb) {
16478
19107605c565 Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@pidgin.im>
parents: 15884
diff changeset
381 const char *servername = purple_prefs_get_string("/purple/network/stun_server");
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
382
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
383 purple_debug_info("stun", "using server %s\n", servername);
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
384
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
385 if(nattype.status == PURPLE_STUN_STATUS_DISCOVERING) {
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
386 if(cb)
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
387 callbacks = g_slist_append(callbacks, cb);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
388 return &nattype;
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
389 }
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
390
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
391 if(nattype.status != PURPLE_STUN_STATUS_UNDISCOVERED) {
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
392 gboolean use_cached_result = TRUE;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
393
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
394 /** Deal with the server name having changed since we did the
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
395 lookup */
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
396 if (servername && strlen(servername) > 1
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 22104
diff changeset
397 && !purple_strequal(servername, nattype.servername)) {
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
398 use_cached_result = FALSE;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
399 }
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
400
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
401 /* If we don't have a successful status and it has been 5
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
402 minutes since we last did a lookup, redo the lookup */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
403 if (nattype.status != PURPLE_STUN_STATUS_DISCOVERED
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
404 && (time(NULL) - nattype.lookup_time) > 300) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
405 use_cached_result = FALSE;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
406 }
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
407
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
408 if (use_cached_result) {
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
409 if(cb)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
410 purple_timeout_add(10, call_callback, cb);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
411 return &nattype;
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
412 }
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
413 }
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
414
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
415 if(!servername || (strlen(servername) < 2)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
416 nattype.status = PURPLE_STUN_STATUS_UNKNOWN;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
417 nattype.lookup_time = time(NULL);
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
418 if(cb)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
419 purple_timeout_add(10, call_callback, cb);
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
420 return &nattype;
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
421 }
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
422
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
423 nattype.status = PURPLE_STUN_STATUS_DISCOVERING;
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
424 nattype.publicip[0] = '\0';
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
425 g_free(nattype.servername);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
426 nattype.servername = g_strdup(servername);
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
427
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
428 callbacks = g_slist_append(callbacks, cb);
32300
59a31f9f67fc Clean up SRV/TXT query functions.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 32297
diff changeset
429 purple_srv_resolve(NULL, "stun", "udp", servername, do_test1,
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
430 (gpointer) servername);
12756
b8df02e0c6e5 [gaim-migrate @ 15103]
Daniel Atallah <datallah@pidgin.im>
parents: 12700
diff changeset
431
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
432 return &nattype;
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
433 }
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
434
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
435 void purple_stun_init() {
16478
19107605c565 Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@pidgin.im>
parents: 15884
diff changeset
436 purple_prefs_add_string("/purple/network/stun_server", "");
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
437 }

mercurial