diff --git a/src/client/stabber.c b/src/client/stabber.c index da5992e..5f5d386 100644 --- a/src/client/stabber.c +++ b/src/client/stabber.c @@ -36,6 +36,12 @@ stbbr_verify_last(char *stanza) return verify_last(stanza); } +int +stbbr_verify(char *stanza) +{ + return verify_any(stanza); +} + void stbbr_stop(void) { diff --git a/src/server/stanza.c b/src/server/stanza.c index 2c6ddc8..72156af 100644 --- a/src/server/stanza.c +++ b/src/server/stanza.c @@ -243,6 +243,26 @@ _stanzas_equal(XMPPStanza *first, XMPPStanza *second) return 0; } +int +stanza_verify_any(XMPPStanza *stanza) +{ + if (!stanzas) { + return 0; + } + + GList *curr = g_list_last(stanzas); + while (curr) { + XMPPStanza *curr_stanza = curr->data; + if (_stanzas_equal(curr_stanza, stanza) == 0) { + return 1; + } + + curr = g_list_previous(curr); + } + + return 0; +} + int stanza_verify_last(XMPPStanza *stanza) { diff --git a/src/server/stanza.h b/src/server/stanza.h index b9e652a..3c1f2cb 100644 --- a/src/server/stanza.h +++ b/src/server/stanza.h @@ -26,6 +26,7 @@ const char* stanza_get_id(XMPPStanza *stanza); XMPPStanza* stanza_get_child_by_ns(XMPPStanza *stanza, char *ns); XMPPStanza* stanza_get_child_by_name(XMPPStanza *stanza, char *name); +int stanza_verify_any(XMPPStanza *stanza); int stanza_verify_last(XMPPStanza *stanza); void stanza_free(XMPPStanza *stanza); diff --git a/src/server/verify.c b/src/server/verify.c index 966f79e..5f51bcc 100644 --- a/src/server/verify.c +++ b/src/server/verify.c @@ -45,6 +45,30 @@ handle_data(void *data, const char *content, int length) g_string_append_len(curr_stanza->content, content, length); } +int +verify_any(char *stanza_text) +{ + depth = 0; + if (curr_stanza) { + stanza_free(curr_stanza); + } + XML_Parser parser = XML_ParserCreate(NULL); + XML_SetElementHandler(parser, start_element, end_element); + XML_SetCharacterDataHandler(parser, handle_data); + + XML_Parse(parser, stanza_text, strlen(stanza_text), 0); + XML_ParserFree(parser); + + int result = stanza_verify_any(curr_stanza); + if (result) { + log_println("VERIFY SUCCESS: %s", stanza_text); + } else { + log_println("VERIFY FAIL: %s", stanza_text); + } + + return result; +} + int verify_last(char *stanza_text) { @@ -61,9 +85,9 @@ verify_last(char *stanza_text) int result = stanza_verify_last(curr_stanza); if (result) { - log_println("VERIFY SUCCESS: %s", stanza_text); + log_println("VERIFY LAST SUCCESS: %s", stanza_text); } else { - log_println("VERIFY FAIL: %s", stanza_text); + log_println("VERIFY LAST FAIL: %s", stanza_text); } return result; diff --git a/src/server/verify.h b/src/server/verify.h index ee596d2..00093f3 100644 --- a/src/server/verify.h +++ b/src/server/verify.h @@ -2,5 +2,6 @@ #define __H_VERIFY int verify_last(char *stanza); +int verify_any(char *stanza); #endif diff --git a/stabber.h b/stabber.h index 2fb131b..a14ffb6 100644 --- a/stabber.h +++ b/stabber.h @@ -7,6 +7,7 @@ void stbbr_stop(void); int stbbr_auth_passwd(char *password); void stbbr_for(char *id, char *stream); +int stbbr_verify(char *stanza); int stbbr_verify_last(char *stanza); #endif