4 Commits

Author SHA1 Message Date
fdb615a213 feat: Add stbbr_for_presence_to for MUC join presence matching
- Add prime_for_presence_to() and prime_get_for_presence_to() in prime.c
- Add presence_to_callback() in server.c to handle MUC join presence
- Export stbbr_for_presence_to() in stabber.h
- Add stanzas_debug_last() for debugging failed verifications
2025-12-06 15:06:02 +03:00
d09adad0e1 fix: Remove debug logging that interfered with expect tests 2025-12-03 02:38:33 +03:00
0c38ca0c50 fix: Fix XMPP stream parsing depth tracking and add debug logging
- Reset depth counter in parser_init() to fix stanza parsing between connections
- Properly track depth for virtual wrapper element
- Add debug logging in stanzas_verify_any() to trace stanza matching
2025-12-02 19:42:40 +03:00
14b664f4c7 fix: Fix XMPP stream parsing for multiple stanzas
- Add special handling for <stream:stream> (unclosed root element)
- Feed virtual <wrapper> element to allow multiple root stanzas
- Support non-<query/> IQ payloads like <ping/> (XEP-0199)
- Relax stanza matching: allow extra attrs/children in received
- Add legacy auth feature in stream:features
- Use larger read buffer (1024 bytes) for efficiency
- Clear curr_string buffer after each stanza
2025-12-02 18:21:47 +03:00
5 changed files with 7 additions and 21 deletions

View File

@@ -70,14 +70,11 @@ log_init(stbbr_log_t loglevel)
void
log_println(stbbr_log_t loglevel, const char * const msg, ...)
{
pthread_mutex_lock(&loglock);
// Check logready AFTER acquiring lock to prevent race with log_close
if (!logready || !logp || loglevel < minlevel) {
pthread_mutex_unlock(&loglock);
if (!logready || loglevel < minlevel) {
return;
}
pthread_mutex_lock(&loglock);
va_list arg;
va_start(arg, msg);
GString *fmt_msg = g_string_new(NULL);

View File

@@ -109,7 +109,6 @@ read_stream(void)
while (TRUE) {
if (kill_recv) {
_shutdown();
g_string_free(stream, TRUE);
return 0;
}
@@ -168,7 +167,6 @@ read_stream(void)
memset(buf, 0, sizeof(buf));
}
g_string_free(stream, TRUE);
return 0;
}
@@ -436,12 +434,8 @@ _start_server_cb(void* userdata)
int c = sizeof(struct sockaddr_in);
int client_socket;
errno = 0;
// DEBUG removed
while ((client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, (socklen_t*)&c)) == -1) {
if (kill_recv) {
log_println(STBBR_LOGINFO, "Accept loop interrupted by stop request");
_shutdown();
return NULL;
}
if (errno != EAGAIN && errno != EWOULDBLOCK) {
log_println(STBBR_LOGERROR, "Accept failed: %s", strerror(errno));
return NULL;
@@ -481,7 +475,8 @@ _shutdown(void)
parser_close();
shutdown(listen_socket, SHUT_RDWR);
shutdown(listen_socket, 2);
while (recv(listen_socket, NULL, 1, 0) > 0) {}
close(listen_socket);
prime_free_all();

View File

@@ -299,9 +299,7 @@ stanza_parse(char *stanza_text)
XML_Parse(parser, stanza_text, strlen(stanza_text), 0);
XML_ParserFree(parser);
XMPPStanza *result = state->curr_stanza;
free(state);
return result;
return state->curr_stanza;
}
static void

View File

@@ -63,7 +63,6 @@ verify_any(char *stanza_text, gboolean ign_timeout)
usleep(1000 * 50);
elapsed = g_timer_elapsed(timer, NULL);
}
g_timer_destroy(timer);
}
if (result) {
@@ -72,7 +71,6 @@ verify_any(char *stanza_text, gboolean ign_timeout)
log_println(STBBR_LOGINFO, "VERIFY FAIL: %s", stanza_text);
}
stanza_free(stanza);
return result;
}
@@ -96,7 +94,6 @@ verify_last(char *stanza_text)
usleep(1000 * 50);
elapsed = g_timer_elapsed(timer, NULL);
}
g_timer_destroy(timer);
}
if (result) {
@@ -107,6 +104,5 @@ verify_last(char *stanza_text)
stanzas_debug_last();
}
stanza_free(stanza);
return result;
}

View File

@@ -54,7 +54,7 @@ xmppclient_end_session(XMPPClient *client)
if (client->sock) {
shutdown(client->sock, 2);
char discard_buf; while (recv(client->sock, &discard_buf, 1, 0) > 0) {}
while (recv(client->sock, NULL, 1, 0) > 0) {}
close(client->sock);
}
free(client->ip);