23 #include <stringprep.h>
28 int rlen, len, ns, elem, attr;
50 if(sess->
rate != NULL) {
58 log_write(sess->
c2s->
log, LOG_NOTICE,
"[%d] [%s, port=%d] is being byte rate limited", sess->
fd->
fd, sess->
ip, sess->
port);
77 len = recv(sess->
fd->
fd, buf->
data, rlen, 0);
80 if(sess->
rate != NULL)
111 && sess->
result == NULL && len >= 4 && strncmp(
"GET ", buf->
data, 4) == 0) {
113 "HTTP/1.0 301 Found\r\n"
115 "Server: " PACKAGE_STRING
"\r\n"
116 "Expires: Fri, 10 Oct 1997 10:10:10 GMT\r\n"
117 "Pragma: no-cache\r\n"
118 "Cache-control: private\r\n"
119 "Connection: close\r\n\r\n";
123 answer = malloc(len *
sizeof(
char));
129 len = send(sess->
fd->
fd, answer, len-1, 0);
185 if (redirect != NULL) {
186 log_debug(
ZONE,
"redirecting client's stream using see-other-host for domain: '%s'", s->
req_to);
188 char *other_host = (
char *) malloc(len+1);
216 if(sess->
host == NULL) {
246 log_write(sess->
c2s->
log, LOG_NOTICE,
"[%d] [%s, port=%d] is being stanza rate limited", sess->
fd->
fd, sess->
ip, sess->
port);
261 (strcmp(root,
"message") != 0 && strcmp(root,
"presence") != 0 && strcmp(root,
"iq") != 0)) {
267 if((ns =
nad_find_scoped_namespace(nad,
uri_BIND, NULL)) >= 0 && (elem =
nad_find_elem(nad, 0, ns,
"bind", 1)) >= 0 &&
nad_find_attr(nad, 0, -1,
"type",
"set") >= 0) {
276 char resource_buf[1024];
352 if((ns =
nad_find_scoped_namespace(nad,
uri_BIND, NULL)) >= 0 && (elem =
nad_find_elem(nad, 0, ns,
"unbind", 1)) >= 0 &&
nad_find_attr(nad, 0, -1,
"type",
"set") >= 0) {
353 char resource_buf[1024];
367 if(stringprep_xmpp_resourceprep(resource_buf, 1024) != 0) {
411 log_write(sess->
c2s->
log, LOG_NOTICE,
"[%d] unrecognized pre-session packet, closing stream", sess->
s->
tag);
424 log_write(sess->
c2s->
log, LOG_NOTICE,
"[%d] got pre STARTTLS packet, dropping", sess->
s->
tag);
440 log_write(sess->
c2s->
log, LOG_NOTICE,
"[%d] packet sent before session start, closing stream", sess->
s->
tag);
451 if(sess->
bound > 1) {
462 log_debug(
ZONE,
"packet without 'from' on multiple resource stream");
491 log_write(sess->
c2s->
log, LOG_NOTICE,
"[%d] %s authentication succeeded: %s %s:%d%s%s",
514 log_write(c2s->
log, LOG_NOTICE,
"[%d] [%s] access denied by configuration", fd->
fd, ip);
527 log_write(c2s->
log, LOG_NOTICE,
"[%d] [%s] is being connect rate limited", fd->
fd, ip);
542 int namelen =
sizeof(sa), port, nbytes, flags = 0;
551 ioctl(fd->
fd, FIONREAD, &nbytes);
585 getpeername(fd->
fd, (
struct sockaddr *) &sa, &namelen);
588 log_write(c2s->
log, LOG_NOTICE,
"[%d] [%s, port=%d] connect", fd->
fd, (
char *) data, port);
599 sess->
ip = strdup((
char *) data);
618 sess->
s->
ip = sess->
ip;
622 getsockname(fd->
fd, (
struct sockaddr *) &sa, &namelen);
626 sprintf(sess->
skey,
"%d", fd->
fd);
680 log_debug(
ZONE,
"sm for serviced domain '%s' offline", from);
704 int len, elem, from, c2sid, smid, action, id, ns, attr, scan, replaced;
783 log_write(c2s->
log, LOG_NOTICE,
"connection to router established");
810 if(
NAD_NURI_L(nad,
NAD_ENS(nad, 0)) != strlen(
uri_STREAMS) || strncmp(
uri_STREAMS,
NAD_NURI(nad,
NAD_ENS(nad, 0)), strlen(
uri_STREAMS)) != 0 ||
NAD_ENAME_L(nad, 0) != 8 || strncmp(
"features",
NAD_ENAME(nad, 0), 8) != 0) {
811 log_debug(
ZONE,
"got a non-features packet on an unauth'd stream, dropping");
827 log_write(c2s->
log, LOG_ERR,
"unable to establish encrypted session with router");
845 if(
NAD_NURI_L(nad,
NAD_ENS(nad, 0)) != strlen(
uri_COMPONENT) || strncmp(
uri_COMPONENT,
NAD_NURI(nad,
NAD_ENS(nad, 0)), strlen(
uri_COMPONENT)) != 0 ||
NAD_ENAME_L(nad, 0) != 4 || strncmp(
"bind",
NAD_ENAME(nad, 0), 4) != 0) {
846 log_debug(
ZONE,
"got a packet from router, but we're not online, dropping");
862 if(c2s->
server_fd == 0 && c2s->server_ssl_fd == 0) {
878 if(c2s->server_ssl_fd == NULL)
883 c2s->server_ssl_fd = NULL;
888 if(c2s->
server_fd == NULL && c2s->server_ssl_fd == NULL && c2s->
pbx_pipe == NULL) {
889 log_write(c2s->
log, LOG_ERR,
"both normal and SSL ports are disabled, nothing to do!");
892 log_write(c2s->
log, LOG_ERR,
"server port is disabled, nothing to do!");
903 log_write(c2s->
log, LOG_NOTICE,
"ready for connections", c2s->
id);
969 if(action >= 0 &&
NAD_AVAL_L(nad, action) == 7 && strncmp(
"started",
NAD_AVAL(nad, action), 7) == 0) {
974 log_write(c2s->
log, LOG_NOTICE,
"session %s does not exist; telling sm to close", skey);
980 if(target < 0 || smid < 0) {
984 log_write(c2s->
log, LOG_NOTICE,
"sm sent an invalid start packet: %.*s", len, buf );
1001 strncpy(tsess->
skey, skey,
sizeof(tsess->
skey));
1032 if(action >= 0 &&
NAD_AVAL_L(nad, action) == 7 && strncmp(
"created",
NAD_AVAL(nad, action), 7) == 0) {
1041 log_write(sess->
c2s->
log, LOG_WARNING,
"user created for session %s which is already gone", skey);
1062 log_debug(
ZONE,
"received packet from sm without an sm ID, dropping");
1070 for(bres = sess->
resources; bres != NULL; bres = bres->
next){
1095 if(c2sid < 0 || target < 0) {
1096 log_debug(
ZONE,
"needed ids not found - c2sid:%d target:%d", c2sid, target);
1127 if(
NAD_ENS(nad, 1) == ns && action >= 0) {
1142 if(sess->
bound < 1){
1147 if(sess->
result != NULL) {
1159 if(sess->
result != NULL) {
1173 for(ires = sess->
resources; ires != NULL; ires = ires->
next)
1174 if(ires->
next == bres)
1176 assert(ires != NULL);
1186 if(sess->
result != NULL) {
1214 if((
NAD_AVAL_L(nad, action) == 5 && strncmp(
"start",
NAD_AVAL(nad, action), 5) == 0) ||
1215 (
NAD_AVAL_L(nad, action) == 6 && strncmp(
"create",
NAD_AVAL(nad, action), 6) == 0)) {
1220 log_write(c2s->
log, LOG_NOTICE,
"[%d] user creation failed, and unable to delete user credentials: user=%s, realm=%s", sess->
s->
tag, bres->
jid->
node, sess->
host->
realm);
1222 log_write(c2s->
log, LOG_NOTICE,
"[%d] user creation failed, so deleted user credentials: user=%s, realm=%s", sess->
s->
tag, bres->
jid->
node, sess->
host->
realm);
1233 for(ires = sess->
resources; ires != NULL; ires = ires->
next)
1234 if(ires->
next == bres)
1236 assert(ires != NULL);
1247 log_debug(
ZONE,
"weird, got a failed session response, with a matching id, but the action is bogus *shrug*");
1254 if(
NAD_AVAL_L(nad, action) == 7 && strncmp(
"started",
NAD_AVAL(nad, action), 7) == 0) {
1301 if(!sess->
active || !sess->
s) {
1303 log_debug(
ZONE,
"Got packet for %s - dropping", !sess->
s ?
"session without stream (PBX pipe session?)" :
"inactive session");
1368 ioctl(fd->
fd, FIONREAD, &nbytes);
1382 log_write(c2s->
log, LOG_NOTICE,
"connection to router closed");