jabberd2  2.3.2
s2s.h
Go to the documentation of this file.
1 /*
2  * jabberd - Jabber Open Source Server
3  * Copyright (c) 2002 Jeremie Miller, Thomas Muldowney,
4  * Ryan Eatmon, Robert Norris
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 # include <config.h>
23 #endif
24 
25 #include "mio/mio.h"
26 #include "sx/sx.h"
27 
28 #ifdef HAVE_SIGNAL_H
29 # include <signal.h>
30 #endif
31 #ifdef HAVE_SYS_STAT_H
32 # include <sys/stat.h>
33 #endif
34 
35 #include <udns.h>
36 
37 /* forward decl */
38 typedef struct host_st *host_t;
39 typedef struct s2s_st *s2s_t;
40 typedef struct pkt_st *pkt_t;
41 typedef struct conn_st *conn_t;
42 typedef struct dnsquery_st *dnsquery_t;
43 typedef struct dnscache_st *dnscache_t;
44 typedef struct dnsres_st *dnsres_t;
45 
46 struct host_st {
48  const char *realm;
49 
51  const char *host_pemfile;
52 
54  const char *host_cachain;
55 
57  int host_verify_mode;
58 
61 };
62 
63 struct s2s_st {
65  const char *id;
66 
68  const char *router_ip;
70  const char *router_user;
71  const char *router_pass;
72  const char *router_pemfile;
73  const char *router_cachain;
76 
79 
85 
89 
92 
95 
98 
101  const char *log_facility;
102  const char *log_ident;
103 
105  long long int packet_count;
106  const char *packet_stats;
107 
113 
115  const char *local_ip;
117 
119  const char **origin_ips;
121 
123  const char *local_secret;
124 
126  const char *local_pemfile;
127 
130 
132  const char *local_cachain;
133 
136 
139 
142 
145 
148 
150  const char **lookup_srv;
152 
155 
159 
162 
171 
174 
175  time_t next_check;
176  time_t next_expiry;
177 
181  /*const*/ char **whitelist_domains; // TODO clarify if need to be const
183 
186 
189 
191  int started;
192 
194  int online;
195 
198 
201 
204 
207 
210 
213 
215  int udns_fd;
217 
221 
225 };
226 
227 struct pkt_st {
228  nad_t nad;
229 
230  jid_t from;
231  jid_t to;
232 
233  int db;
234 
236  int port;
237 };
238 
239 typedef enum {
244 } conn_state_t;
245 
246 struct conn_st {
247  s2s_t s2s;
248 
249  const char *key;
250  const char *dkey;
251 
254 
256  int port;
257 
260 
263 
266 
267  time_t init_time;
268 
269  int online;
270 
272  int verify;
273  time_t last_verify;
274 
277  time_t last_packet;
278 
279  unsigned int packet_count;
280 };
281 
282 #define DNS_MAX_RESULTS 50
283 
285 struct dnsquery_st {
286  s2s_t s2s;
287 
289  const char *name;
290 
292  int srv_i;
293 
296 
298  const char *cur_host;
299 
301  int cur_port;
302 
304  time_t cur_expiry;
305 
307  int cur_prio;
308 
311 
314 
316  time_t expiry;
317 
319  struct dns_query *query;
320 };
321 
323 struct dnscache_st {
325  char name[1024];
326 
329 
331  time_t expiry;
332 
333  time_t init_time;
334 
336  int pending;
337  dnsquery_t query;
338 };
339 
341 struct dnsres_st {
343  const char *key;
344 
346  int prio;
347 
349  int weight;
350 
352  time_t expiry;
353 };
354 
355 extern sig_atomic_t s2s_lost_router;
356 
357 int s2s_router_mio_callback(mio_t m, mio_action_t a, mio_fd_t fd, void *data, void *arg);
358 int s2s_router_sx_callback(sx_t s, sx_event_t e, void *data, void *arg);
359 int s2s_domain_in_whitelist(s2s_t s2s, const char *in_domain);
360 
361 char *s2s_route_key(pool_t p, const char *local, const char *remote);
362 int s2s_route_key_match(char *local, const char *remote, const char *rkey, int rkeylen);
363 char *s2s_db_key(pool_t p, const char *secret, const char *remote, const char *id);
364 char *dns_make_ipport(const char* host, int port);
365 
366 int out_packet(s2s_t s2s, pkt_t pkt);
367 int out_route(s2s_t s2s, const char *route, int routelen, conn_t *out, int allow_bad);
368 int dns_select(s2s_t s2s, char* ip, int* port, time_t now, dnscache_t dns, int allow_bad);
369 void dns_resolve_domain(s2s_t s2s, dnscache_t dns);
370 void out_resolve(s2s_t s2s, const char *domain, xht results, time_t expiry);
371 void out_dialback(s2s_t s2s, pkt_t pkt);
372 int out_bounce_domain_queues(s2s_t s2s, const char *domain, int err);
373 int out_bounce_route_queue(s2s_t s2s, const char *rkey, int rkeylen, int err);
374 int out_bounce_conn_queues(conn_t out, int err);
375 void out_flush_domain_queues(s2s_t s2s, const char *domain);
376 void out_flush_route_queue(s2s_t s2s, const char *rkey, int rkeylen);
377 
378 int in_mio_callback(mio_t m, mio_action_t a, mio_fd_t fd, void *data, void *arg);
379 
380 /* sx flag for outgoing dialback streams */
381 #define S2S_DB_HEADER (1<<10)
382 
383 /* max length of FQDN for whitelist matching */
384 #define MAX_DOMAIN_LEN 1023
385 
386 int s2s_db_init(sx_env_t env, sx_plugin_t p, va_list args);
387 
388 /* union for xhash_iter_get to comply with strict-alias rules for gcc3 */
389 union xhashv
390 {
391  void **val;
392  char **char_val;
393  conn_t *conn_val;
396  dnscache_t *dns_val;
397  dnsres_t *dnsres_val;
398 };
399 
400 void out_pkt_free(pkt_t pkt);
#define INET6_ADDRSTRLEN
maximum length of the string representation of an IPv6 address
Definition: util_compat.h:46
Definition: nad.h:93
dns query data
Definition: s2s.h:285
int retry_init
connect retry
Definition: s2s.h:109
char ip[INET6_ADDRSTRLEN+1]
Definition: s2s.h:235
Definition: s2s.h:63
time_t last_invalid_check
Definition: s2s.h:173
unsigned int packet_count
Definition: s2s.h:279
char ip[INET6_ADDRSTRLEN+1]
Definition: s2s.h:255
const char * dkey
Definition: s2s.h:250
int enable_whitelist
Definition: s2s.h:180
sx_t router
router's conn
Definition: s2s.h:87
void out_dialback(s2s_t s2s, pkt_t pkt)
int check_dnscache
Definition: s2s.h:169
int db
Definition: s2s.h:233
const char * local_ip
ip/port to listen on
Definition: s2s.h:115
time_t expiry
time that this entry expires
Definition: s2s.h:352
log_t log
logging
Definition: s2s.h:97
const char * router_pass
Definition: s2s.h:71
int weight
host weight
Definition: s2s.h:349
const char * log_ident
Definition: s2s.h:102
xht hosts
srv lookup results (key host/port)
Definition: s2s.h:295
int s2s_db_init(sx_env_t env, sx_plugin_t p, va_list args)
Definition: db.c:55
int started
this is true if we've connected to the router at least once
Definition: s2s.h:191
jqueue_t dead
list of sx_t on the way out
Definition: s2s.h:185
struct dnsres_st * dnsres_t
Definition: s2s.h:44
char ** whitelist_domains
Definition: s2s.h:181
const char * router_ip
how to connect to the router
Definition: s2s.h:68
int port
Definition: s2s.h:256
an environment
Definition: sx.h:379
xht in_accept
incoming conns prior to stream initiation (key is ip/port)
Definition: s2s.h:212
int check_invalid
Definition: s2s.h:166
const char ** lookup_srv
srvs to lookup
Definition: s2s.h:150
const char * key
ip/port
Definition: s2s.h:343
xht hosts
hosts mapping
Definition: s2s.h:138
time_t next_check
Definition: s2s.h:175
mio_fd_t fd
Definition: s2s.h:88
int verify
number and last timestamp of outstanding db:verify requests
Definition: s2s.h:272
time_t expiry
time that all entries expire
Definition: s2s.h:316
char * host_private_key_password
private key password
Definition: c2s.h:132
struct host_st * host_t
Definition: s2s.h:38
a plugin
Definition: sx.h:344
dns resolution results
Definition: s2s.h:341
void out_pkt_free(pkt_t pkt)
Definition: out.c:601
holder for the config hash and nad
Definition: util.h:200
int in_mio_callback(mio_t m, mio_action_t a, mio_fd_t fd, void *data, void *arg)
Definition: in.c:63
int srv_i
srv lookup index
Definition: s2s.h:292
xht states
states of outgoing dialbacks (key is local/remote)
Definition: s2s.h:259
conn_state_t * state_val
Definition: s2s.h:394
struct pkt_st * pkt_t
Definition: s2s.h:40
struct conn_st * conn_t
Definition: s2s.h:41
mio_action_t
these are the actions and a handler type assigned by the applicaiton using mio
Definition: mio.h:106
void out_flush_route_queue(s2s_t s2s, const char *rkey, int rkeylen)
Definition: out.c:1883
Definition: mio.h:109
int host_verify_mode
verify-mode
Definition: c2s.h:135
xht outq
queues of packets waiting to go out (key is route)
Definition: s2s.h:197
const char * packet_stats
Definition: s2s.h:106
time_t expiry
time that this entry expires
Definition: s2s.h:331
xht out_host
outgoing conns (key is ip/port)
Definition: s2s.h:203
int check_queue
Definition: s2s.h:165
time_t last_verify
Definition: s2s.h:273
long long int packet_count
packet counter
Definition: s2s.h:105
dnsquery_t query
Definition: s2s.h:337
xht dnscache
dns resolution cache
Definition: s2s.h:219
int cur_port
current host lookup port
Definition: s2s.h:301
xht out_dest
outgoing conns (key is dest)
Definition: s2s.h:206
int port
Definition: s2s.h:236
xht routes
routes that this conn handles (key is local/remote)
Definition: s2s.h:265
s2s_t s2s
Definition: s2s.h:247
dnsres_t * dnsres_val
Definition: s2s.h:397
sx_plugin_t sx_db
Definition: s2s.h:84
xht dns_bad
dns resolution bad host cache
Definition: s2s.h:223
int local_port
Definition: s2s.h:116
char * s2s_route_key(pool_t p, const char *local, const char *remote)
generate a local/remote route key
Definition: util.c:27
int router_port
Definition: s2s.h:69
sx_env_t sx_env
sx environment
Definition: s2s.h:81
int udns_fd
udns fds
Definition: s2s.h:215
int compression
enable Stream Compression
Definition: s2s.h:147
int etc_hosts_ttl
/etc/hosts ttl limits
Definition: s2s.h:161
s2s_t s2s
Definition: s2s.h:286
int pending
set when we're waiting for a resolve response
Definition: s2s.h:336
int online
Definition: s2s.h:269
mio - manage i/o
int stanza_size_limit
maximum stanza size
Definition: s2s.h:144
holds the state for a single stream
Definition: sx.h:251
int local_verify_mode
verify-mode
Definition: s2s.h:135
jid_t from
packet addressing (not used for routing)
Definition: sm.h:140
int dns_cache_enabled
Definition: s2s.h:220
int online
true if we're bound in the router
Definition: s2s.h:194
const char * local_cachain
certificate chain
Definition: s2s.h:132
conn_state_t
Definition: s2s.h:239
int out_bounce_domain_queues(s2s_t s2s, const char *domain, int err)
Definition: out.c:1796
void ** val
Definition: c2s.h:377
char * s2s_db_key(pool_t p, const char *secret, const char *remote, const char *id)
generate a dialback key
Definition: util.c:61
packet summary data wrapper
Definition: sm.h:129
struct _log_st * log_t
Definition: log.h:48
jqueue_t * jq_val
Definition: s2s.h:395
const char * key
Definition: s2s.h:249
mio_fd_t udns_mio_fd
Definition: s2s.h:216
int check_keepalive
Definition: s2s.h:167
nad_t nad
nad of the entire packet
Definition: sm.h:146
log_type_t
Definition: log.h:41
const char * log_facility
Definition: s2s.h:101
void out_flush_domain_queues(s2s_t s2s, const char *domain)
Definition: out.c:1865
xht results
results (key ip/port)
Definition: s2s.h:328
char name[1024]
the name proper
Definition: s2s.h:325
const char * realm
our realm (SASL)
Definition: c2s.h:123
int retry_limit
Definition: s2s.h:170
sx_plugin_t sx_ssl
Definition: s2s.h:82
jqueue_t dead_conn
list of conn_t on the way out
Definition: s2s.h:188
time_t init_time
Definition: s2s.h:333
time_t next_expiry
Definition: s2s.h:176
int out_route(s2s_t s2s, const char *route, int routelen, conn_t *out, int allow_bad)
find/make a connection for a route
Definition: out.c:406
sx_t s
Definition: s2s.h:252
xht states_time
time of the last state change (key is local/remote)
Definition: s2s.h:262
conn_t * conn_val
Definition: s2s.h:393
time_t cur_expiry
current host max expiry
Definition: s2s.h:304
Definition: s2s.h:240
Definition: jid.h:42
Definition: c2s.h:121
xht results
host lookup results (key ip/port)
Definition: s2s.h:313
const char * local_secret
dialback secret
Definition: s2s.h:123
dnscache_t * dns_val
Definition: s2s.h:396
const char * host_pemfile
starttls pemfile
Definition: c2s.h:126
int dns_max_ttl
Definition: s2s.h:158
int router_default
Definition: s2s.h:75
const char * name
domain name
Definition: s2s.h:289
int out_reuse
reuse outgoing conns keyed by ip/port
Definition: s2s.h:200
const char * router_pemfile
Definition: s2s.h:72
int check_interval
time checks
Definition: s2s.h:164
mio_fd_t server_fd
listening sockets
Definition: s2s.h:91
sig_atomic_t s2s_lost_router
Definition: main.c:27
int retry_lost
Definition: s2s.h:110
int cur_prio
current host priority
Definition: s2s.h:307
int io_max_fds
max file descriptors
Definition: s2s.h:141
config_t config
config
Definition: s2s.h:94
time_t last_packet
Definition: s2s.h:277
int resolve_aaaa
if we resolve AAAA records
Definition: s2s.h:154
int s2s_route_key_match(char *local, const char *remote, const char *rkey, int rkeylen)
match route key - used for searching route hash
Definition: util.c:44
const char ** origin_ips
ip(s) to originate connections from
Definition: s2s.h:119
char * dns_make_ipport(const char *host, int port)
Definition: out.c:727
int s2s_domain_in_whitelist(s2s_t s2s, const char *in_domain)
Definition: main.c:661
struct dns_query * query
set when we're waiting for a resolve response
Definition: s2s.h:319
int s2s_router_sx_callback(sx_t s, sx_event_t e, void *data, void *arg)
our master callback
Definition: router.c:24
const char ** char_val
Definition: c2s.h:378
int n_whitelist_domains
Definition: s2s.h:182
struct s2s_st * s2s_t
Definition: s2s.h:39
void dns_resolve_domain(s2s_t s2s, dnscache_t dns)
Definition: out.c:1189
const char * router_private_key_password
Definition: s2s.h:74
jid_t to
Definition: sm.h:140
const char * id
our id (hostname) with the router
Definition: s2s.h:65
mio_t mio
mio context
Definition: s2s.h:78
log_type_t log_type
log data
Definition: s2s.h:100
time_t last_queue_check
Definition: s2s.h:172
Definition: mio.h:100
const char * router_cachain
Definition: s2s.h:73
xht in
incoming conns (key is stream id)
Definition: s2s.h:209
const char * router_user
Definition: s2s.h:70
void out_resolve(s2s_t s2s, const char *domain, xht results, time_t expiry)
responses from the resolver
Definition: out.c:1223
const char * local_private_key_password
private key password for local pemfile, if encrypted
Definition: s2s.h:129
int require_tls
Apple security options.
Definition: s2s.h:179
one item in the dns resolution cache
Definition: s2s.h:323
Definition: s2s.h:246
session packet handling
Definition: c2s.h:375
sx_event_t
things that can happen
Definition: sx.h:56
const char * cur_host
current host lookup name
Definition: s2s.h:298
int dns_bad_timeout
Definition: s2s.h:224
int lookup_nsrv
Definition: s2s.h:151
pool - base node for a pool.
Definition: pool.h:80
int cur_weight
current host weight
Definition: s2s.h:310
int origin_nips
Definition: s2s.h:120
int dns_select(s2s_t s2s, char *ip, int *port, time_t now, dnscache_t dns, int allow_bad)
Definition: out.c:190
int out_bounce_route_queue(s2s_t s2s, const char *rkey, int rkeylen, int err)
Definition: out.c:1814
int retry_sleep
Definition: s2s.h:111
int out_bounce_conn_queues(conn_t out, int err)
Definition: out.c:1848
mio_fd_t fd
Definition: s2s.h:253
int out_packet(s2s_t s2s, pkt_t pkt)
send a packet out
Definition: out.c:610
const char * local_pemfile
pemfile for peer connections
Definition: s2s.h:126
time_t init_time
Definition: s2s.h:267
struct dnscache_st * dnscache_t
Definition: s2s.h:43
int prio
host priority
Definition: s2s.h:346
struct dnsquery_st * dnsquery_t
Definition: s2s.h:42
int s2s_router_mio_callback(mio_t m, mio_action_t a, mio_fd_t fd, void *data, void *arg)
Definition: router.c:291
time_t last_activity
timestamps for idle timeouts
Definition: s2s.h:276
int check_idle
Definition: s2s.h:168
sx_plugin_t sx_sasl
Definition: s2s.h:83
int retry_left
Definition: s2s.h:112
int dns_min_ttl
dns ttl limits
Definition: s2s.h:157
const char * host_cachain
certificate chain
Definition: c2s.h:129