revert: restore pre-upstream-merge baseline (tree of 3b673150b)
All checks were successful
CI Code / Check spelling (pull_request) Successful in 18s
CI Code / Check coding style (pull_request) Successful in 30s
CI Code / Linux (ubuntu) (pull_request) Successful in 4m51s
CI Code / Linux (debian) (pull_request) Successful in 6m59s
CI Code / Linux (arch) (pull_request) Successful in 10m12s
CI Code / Code Coverage (pull_request) Successful in 6m44s
All checks were successful
CI Code / Check spelling (pull_request) Successful in 18s
CI Code / Check coding style (pull_request) Successful in 30s
CI Code / Linux (ubuntu) (pull_request) Successful in 4m51s
CI Code / Linux (debian) (pull_request) Successful in 6m59s
CI Code / Linux (arch) (pull_request) Successful in 10m12s
CI Code / Code Coverage (pull_request) Successful in 6m44s
Roll the tree back to the pre-merge tip3b673150b, undoing the upstream sync merge72f4f186d(303 files) and the 13 post-merge commits layered on top of it. Purpose: restore the last pre-sync baseline so the reported OMEMO/OTR encryption regressions can be reproduced against a known-good state and the upstream sync ruled in or out as the cause. Nothing is dropped from history; the merge and every post-merge commit remain reachable and can be cherry-picked back selectively. Baseline:3b673150bchore(chatlog): disable background message file logging (stage 1) Undoes merge:72f4f186dmerge: sync upstream profanity-im/profanity
This commit is contained in:
@@ -150,14 +150,6 @@ main(int argc, char* argv[])
|
||||
PROF_FUNC_TEST(autoping_sends_ping_after_interval),
|
||||
PROF_FUNC_TEST(autoping_server_not_supporting_ping),
|
||||
|
||||
/* Autoping availability warning - negative cases wait ~3s */
|
||||
PROF_FUNC_TEST(autoping_warning_shown_when_disabled),
|
||||
PROF_FUNC_TEST(autoping_warning_not_shown_when_server_unsupported),
|
||||
PROF_FUNC_TEST(autoping_warning_not_shown_when_autoping_enabled),
|
||||
PROF_FUNC_TEST(autoping_warning_not_shown_when_user_disabled),
|
||||
PROF_FUNC_TEST(autoping_warning_not_shown_for_user_jid),
|
||||
PROF_FUNC_TEST(autoping_warning_not_shown_for_subdomain_service),
|
||||
|
||||
/* Service Discovery - XEP-0030 */
|
||||
PROF_FUNC_TEST(disco_info_shows_identity),
|
||||
PROF_FUNC_TEST(disco_info_shows_features),
|
||||
@@ -261,10 +253,6 @@ main(int argc, char* argv[])
|
||||
PROF_FUNC_TEST(message_receive_console),
|
||||
PROF_FUNC_TEST(message_receive_chatwin),
|
||||
|
||||
/* XEP-0359 disco gate for stanza-id trust */
|
||||
PROF_FUNC_TEST(stanza_id_dedup_fires_when_server_announces_sid0),
|
||||
PROF_FUNC_TEST(stanza_id_not_trusted_when_server_does_not_announce_sid0),
|
||||
|
||||
#ifdef HAVE_SQLITE
|
||||
/* MUC (groupchat) database — export/import of type="muc" messages */
|
||||
PROF_FUNC_TEST(muc_export_sqlite_to_flatfile),
|
||||
|
||||
@@ -119,9 +119,10 @@ _create_dir(const char* name)
|
||||
gboolean
|
||||
_mkdir_recursive(const char* dir)
|
||||
{
|
||||
int i;
|
||||
gboolean result = TRUE;
|
||||
|
||||
for (size_t i = 1; i <= strlen(dir); i++) {
|
||||
for (i = 1; i <= strlen(dir); i++) {
|
||||
if (dir[i] == '/' || dir[i] == '\0') {
|
||||
gchar* next_dir = g_strndup(dir, i);
|
||||
result = _create_dir(next_dir);
|
||||
@@ -214,7 +215,7 @@ sleep_ms(int ms)
|
||||
* Read available data from fd into output_buffer with timeout.
|
||||
* Returns number of bytes read, 0 on timeout, -1 on error.
|
||||
*/
|
||||
static ssize_t
|
||||
static int
|
||||
_read_output(int timeout_ms)
|
||||
{
|
||||
fd_set readfds;
|
||||
@@ -231,19 +232,17 @@ _read_output(int timeout_ms)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check size before subtracting so OUTPUT_BUF_SIZE - output_len - 1
|
||||
* never goes negative / underflows. Reserves one byte for the
|
||||
* trailing NUL. */
|
||||
if (output_len >= OUTPUT_BUF_SIZE - 1) {
|
||||
size_t space = OUTPUT_BUF_SIZE - output_len - 1;
|
||||
if (space <= 0) {
|
||||
/* Buffer full, shift content */
|
||||
memmove(output_buffer, output_buffer + OUTPUT_BUF_SIZE / 2, OUTPUT_BUF_SIZE / 2);
|
||||
output_len = OUTPUT_BUF_SIZE / 2;
|
||||
space = OUTPUT_BUF_SIZE - output_len - 1;
|
||||
}
|
||||
size_t space = OUTPUT_BUF_SIZE - output_len - 1;
|
||||
|
||||
ssize_t n = read(fd, output_buffer + output_len, space);
|
||||
if (n > 0) {
|
||||
output_len += (size_t)n;
|
||||
output_len += n;
|
||||
output_buffer[output_len] = '\0';
|
||||
}
|
||||
return n;
|
||||
|
||||
@@ -112,144 +112,3 @@ autoping_server_not_supporting_ping(void** state)
|
||||
// Should show error about ping not being supported
|
||||
assert_true(prof_output_regex("Server ping not supported"));
|
||||
}
|
||||
|
||||
/*
|
||||
* Autoping availability warning.
|
||||
*
|
||||
* The warning fires from the on-connect disco handler, so the three inputs
|
||||
* (server ping support, autoping interval, warning preference) must all be
|
||||
* set before prof_connect().
|
||||
*/
|
||||
|
||||
/* Stable substring of the warning text emitted by iq.c. */
|
||||
#define AUTOPING_WARNING_MATCH "This server supports XEP-0199"
|
||||
|
||||
static void
|
||||
_stub_server_disco(gboolean with_ping)
|
||||
{
|
||||
if (with_ping) {
|
||||
stbbr_for_query("http://jabber.org/protocol/disco#info",
|
||||
"<iq to='stabber@localhost/profanity' type='result' from='localhost'>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info'>"
|
||||
"<identity category='server' type='im' name='Stabber'/>"
|
||||
"<feature var='urn:xmpp:ping'/>"
|
||||
"</query>"
|
||||
"</iq>"
|
||||
);
|
||||
} else {
|
||||
stbbr_for_query("http://jabber.org/protocol/disco#info",
|
||||
"<iq to='stabber@localhost/profanity' type='result' from='localhost'>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info'>"
|
||||
"<identity category='server' type='im' name='Stabber'/>"
|
||||
"</query>"
|
||||
"</iq>"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
autoping_warning_shown_when_disabled(void** state)
|
||||
{
|
||||
// All conditions met: server supports ping, autoping off, warning on (default).
|
||||
_stub_server_disco(TRUE);
|
||||
|
||||
prof_input("/autoping set 0");
|
||||
assert_true(prof_output_exact("Autoping disabled."));
|
||||
|
||||
prof_connect();
|
||||
|
||||
assert_true(prof_output_regex(AUTOPING_WARNING_MATCH));
|
||||
}
|
||||
|
||||
void
|
||||
autoping_warning_not_shown_when_server_unsupported(void** state)
|
||||
{
|
||||
// Server does not advertise urn:xmpp:ping -> no warning even with autoping off.
|
||||
_stub_server_disco(FALSE);
|
||||
|
||||
prof_input("/autoping set 0");
|
||||
assert_true(prof_output_exact("Autoping disabled."));
|
||||
|
||||
prof_connect();
|
||||
|
||||
prof_timeout(NEGATIVE_ASSERT_TIMEOUT);
|
||||
assert_false(prof_output_regex(AUTOPING_WARNING_MATCH));
|
||||
}
|
||||
|
||||
void
|
||||
autoping_warning_not_shown_when_autoping_enabled(void** state)
|
||||
{
|
||||
// Warning is suppressed while autoping is enabled.
|
||||
_stub_server_disco(TRUE);
|
||||
|
||||
prof_input("/autoping set 30");
|
||||
assert_true(prof_output_exact("Autoping interval set to 30 seconds."));
|
||||
|
||||
prof_connect();
|
||||
|
||||
prof_timeout(NEGATIVE_ASSERT_TIMEOUT);
|
||||
assert_false(prof_output_regex(AUTOPING_WARNING_MATCH));
|
||||
}
|
||||
|
||||
void
|
||||
autoping_warning_not_shown_when_user_disabled(void** state)
|
||||
{
|
||||
// User opted out -> no warning.
|
||||
_stub_server_disco(TRUE);
|
||||
|
||||
prof_input("/autoping set 0");
|
||||
assert_true(prof_output_exact("Autoping disabled."));
|
||||
|
||||
prof_input("/autoping warning off");
|
||||
assert_true(prof_output_exact("Autoping availability warning disabled."));
|
||||
|
||||
prof_connect();
|
||||
|
||||
prof_timeout(NEGATIVE_ASSERT_TIMEOUT);
|
||||
assert_false(prof_output_regex(AUTOPING_WARNING_MATCH));
|
||||
}
|
||||
|
||||
void
|
||||
autoping_warning_not_shown_for_user_jid(void** state)
|
||||
{
|
||||
// disco#info from a user JID (with '@') should not trigger the warning,
|
||||
// only server responses (no '@') should.
|
||||
stbbr_for_query("http://jabber.org/protocol/disco#info",
|
||||
"<iq to='stabber@localhost/profanity' type='result' from='buddy1@localhost'>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info'>"
|
||||
"<identity category='person' type='chat' name='Buddy1'/>"
|
||||
"<feature var='urn:xmpp:ping'/>"
|
||||
"</query>"
|
||||
"</iq>"
|
||||
);
|
||||
|
||||
prof_input("/autoping set 0");
|
||||
assert_true(prof_output_exact("Autoping disabled."));
|
||||
|
||||
prof_connect();
|
||||
|
||||
prof_timeout(NEGATIVE_ASSERT_TIMEOUT);
|
||||
assert_false(prof_output_regex(AUTOPING_WARNING_MATCH));
|
||||
}
|
||||
|
||||
void
|
||||
autoping_warning_not_shown_for_subdomain_service(void** state)
|
||||
{
|
||||
// disco#info from a subdomain service should not trigger the warning, only the server's own domain should
|
||||
stbbr_for_query("http://jabber.org/protocol/disco#info",
|
||||
"<iq to='stabber@localhost/profanity' type='result' from='conf.localhost'>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info'>"
|
||||
"<identity category='conference' type='text' name='Conference Service'/>"
|
||||
"<feature var='urn:xmpp:ping'/>"
|
||||
"</query>"
|
||||
"</iq>"
|
||||
);
|
||||
|
||||
prof_input("/autoping set 0");
|
||||
assert_true(prof_output_exact("Autoping disabled."));
|
||||
|
||||
prof_connect();
|
||||
|
||||
prof_timeout(NEGATIVE_ASSERT_TIMEOUT);
|
||||
assert_false(prof_output_regex(AUTOPING_WARNING_MATCH));
|
||||
}
|
||||
|
||||
@@ -4,9 +4,3 @@ void autoping_timeout_set(void** state);
|
||||
void autoping_timeout_zero_disables(void** state);
|
||||
void autoping_sends_ping_after_interval(void** state);
|
||||
void autoping_server_not_supporting_ping(void** state);
|
||||
void autoping_warning_shown_when_disabled(void** state);
|
||||
void autoping_warning_not_shown_when_server_unsupported(void** state);
|
||||
void autoping_warning_not_shown_when_autoping_enabled(void** state);
|
||||
void autoping_warning_not_shown_when_user_disabled(void** state);
|
||||
void autoping_warning_not_shown_for_user_jid(void** state);
|
||||
void autoping_warning_not_shown_for_subdomain_service(void** state);
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
* test_i18n.c
|
||||
*
|
||||
* Copyright (C) 2026 Michael Vetter <jubalh@iodoru.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
#include <glib.h>
|
||||
#include "prof_cmocka.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <stabber.h>
|
||||
|
||||
#include "proftest.h"
|
||||
|
||||
void
|
||||
i18n_msg_nickname(void** state)
|
||||
{
|
||||
// Connect with a roster containing a UTF-8 nickname: Σωκράτης (Socrates)
|
||||
prof_connect_with_roster(
|
||||
"<item jid='socrates@localhost' subscription='both' name='Σωκράτης'/>"
|
||||
"<item jid='buddy2@localhost' subscription='both' name='Buddy2'/>");
|
||||
|
||||
// Test that we can /msg the UTF-8 nickname successfully.
|
||||
// This verifies that the UI and command parsing handle UTF-8.
|
||||
prof_input("/msg Σωκράτης Hello");
|
||||
|
||||
// Check if we switched to the socrates window
|
||||
assert_true(prof_output_regex("socrates@localhost"));
|
||||
}
|
||||
|
||||
void
|
||||
i18n_win_nickname(void** state)
|
||||
{
|
||||
prof_connect_with_roster(
|
||||
"<item jid='socrates@localhost' subscription='both' name='Σωκράτης'/>");
|
||||
|
||||
// Open a chat with Socrates
|
||||
prof_input("/msg Σωκράτης");
|
||||
assert_true(prof_output_regex("socrates@localhost"));
|
||||
|
||||
// Switch back to console
|
||||
prof_input("/win 1");
|
||||
assert_true(prof_output_regex("Console"));
|
||||
|
||||
// Switch to Socrates window using name
|
||||
prof_input("/win Σωκράτης");
|
||||
assert_true(prof_output_regex("socrates@localhost"));
|
||||
}
|
||||
|
||||
void
|
||||
i18n_autocomplete_tab_utf8(void** state)
|
||||
{
|
||||
prof_connect_with_roster(
|
||||
"<item jid='socrates@localhost' subscription='both' name='Σωκράτης'/>");
|
||||
|
||||
prof_send_raw("/msg Σω");
|
||||
// TAB for completion
|
||||
prof_send_raw("\t");
|
||||
prof_input(" Hello");
|
||||
|
||||
// If autocompletion worked, we should be in the Socrates window
|
||||
assert_true(prof_output_regex("socrates@localhost"));
|
||||
|
||||
// And stabber should have received the message
|
||||
assert_true(stbbr_received(
|
||||
"<message to='socrates@localhost' id='*' type='chat'>"
|
||||
"<body>Hello</body>"
|
||||
"</message>"));
|
||||
}
|
||||
|
||||
void
|
||||
i18n_autocomplete_tab_latin(void** state)
|
||||
{
|
||||
prof_connect_with_roster(
|
||||
"<item jid='plato@localhost' subscription='both' name='Plato'/>");
|
||||
|
||||
prof_send_raw("/msg Pl");
|
||||
prof_send_raw("\t");
|
||||
prof_input(" Hello");
|
||||
|
||||
assert_true(prof_output_regex("plato@localhost"));
|
||||
|
||||
assert_true(stbbr_received(
|
||||
"<message to='plato@localhost' id='*' type='chat'>"
|
||||
"<body>Hello</body>"
|
||||
"</message>"));
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
/*
|
||||
* test_i18n.h
|
||||
*
|
||||
* Copyright (C) 2026 Michael Vetter <jubalh@iodoru.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
void i18n_msg_nickname(void** state);
|
||||
void i18n_win_nickname(void** state);
|
||||
void i18n_autocomplete_tab_utf8(void** state);
|
||||
void i18n_autocomplete_tab_latin(void** state);
|
||||
@@ -56,70 +56,3 @@ message_receive_chatwin(void **state)
|
||||
|
||||
assert_true(prof_output_regex("someuser@chatserv.org/laptop: .+How are you?"));
|
||||
}
|
||||
|
||||
// XEP-0359 disco gate: server announces urn:xmpp:sid:0 -> stanza-id trusted -> replay flagged as duplicate.
|
||||
void
|
||||
stanza_id_dedup_fires_when_server_announces_sid0(void **state)
|
||||
{
|
||||
stbbr_for_query("http://jabber.org/protocol/disco#info",
|
||||
"<iq type='result' to='stabber@localhost/profanity' from='localhost'>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info'>"
|
||||
"<identity category='server' type='im' name='TestServer'/>"
|
||||
"<feature var='urn:xmpp:sid:0'/>"
|
||||
"</query>"
|
||||
"</iq>"
|
||||
);
|
||||
|
||||
prof_connect();
|
||||
|
||||
stbbr_send(
|
||||
"<message id='m-trust-1' to='stabber@localhost' from='someuser@chatserv.org/laptop' type='chat'>"
|
||||
"<body>first</body>"
|
||||
"<stanza-id xmlns='urn:xmpp:sid:0' by='stabber@localhost' id='archive-id-42'/>"
|
||||
"</message>"
|
||||
);
|
||||
assert_true(prof_output_exact("<< chat message: someuser@chatserv.org/laptop (win 2)"));
|
||||
|
||||
stbbr_send(
|
||||
"<message id='m-trust-2' to='stabber@localhost' from='someuser@chatserv.org/laptop' type='chat'>"
|
||||
"<body>replay</body>"
|
||||
"<stanza-id xmlns='urn:xmpp:sid:0' by='stabber@localhost' id='archive-id-42'/>"
|
||||
"</message>"
|
||||
);
|
||||
assert_true(prof_output_exact("Got a message with duplicate (server-generated) stanza-id from someuser@chatserv.org/laptop."));
|
||||
}
|
||||
|
||||
// XEP-0359 disco gate: server does NOT announce urn:xmpp:sid:0 -> stanza-id untrusted -> no replay error.
|
||||
void
|
||||
stanza_id_not_trusted_when_server_does_not_announce_sid0(void **state)
|
||||
{
|
||||
stbbr_for_query("http://jabber.org/protocol/disco#info",
|
||||
"<iq type='result' to='stabber@localhost/profanity' from='localhost'>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info'>"
|
||||
"<identity category='server' type='im' name='TestServer'/>"
|
||||
"<feature var='urn:xmpp:ping'/>"
|
||||
"</query>"
|
||||
"</iq>"
|
||||
);
|
||||
|
||||
prof_connect();
|
||||
|
||||
stbbr_send(
|
||||
"<message id='m-untrust-1' to='stabber@localhost' from='someuser@chatserv.org/laptop' type='chat'>"
|
||||
"<body>first</body>"
|
||||
"<stanza-id xmlns='urn:xmpp:sid:0' by='stabber@localhost' id='archive-id-77'/>"
|
||||
"</message>"
|
||||
);
|
||||
assert_true(prof_output_exact("<< chat message: someuser@chatserv.org/laptop (win 2)"));
|
||||
|
||||
stbbr_send(
|
||||
"<message id='m-untrust-2' to='stabber@localhost' from='someuser@chatserv.org/laptop' type='chat'>"
|
||||
"<body>replay</body>"
|
||||
"<stanza-id xmlns='urn:xmpp:sid:0' by='stabber@localhost' id='archive-id-77'/>"
|
||||
"</message>"
|
||||
);
|
||||
|
||||
prof_timeout(2);
|
||||
assert_false(prof_output_exact("Got a message with duplicate (server-generated) stanza-id"));
|
||||
prof_timeout_reset();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
void message_send(void **state);
|
||||
void message_receive_console(void **state);
|
||||
void message_receive_chatwin(void **state);
|
||||
void stanza_id_dedup_fires_when_server_announces_sid0(void **state);
|
||||
void stanza_id_not_trusted_when_server_does_not_announce_sid0(void **state);
|
||||
|
||||
@@ -33,7 +33,7 @@ send_receipt_request(void **state)
|
||||
// Register disco#info response for capabilities query (receipts support)
|
||||
stbbr_for_query("http://jabber.org/protocol/disco#info",
|
||||
"<iq from='buddy1@localhost/laptop' to='stabber@localhost' id='*' type='result'>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info' node='http://profanity-im.github.io#JNkIRQChhYM8+Co3IypmMtMJnOE='>"
|
||||
"<query xmlns='http://jabber.org/protocol/disco#info' node='http://profanity-im.github.io#hAkb1xZdJV9BQpgGNw8zG5Xsals='>"
|
||||
"<identity category='client' name='Profanity 0.5.0' type='console'/>"
|
||||
"<feature var='urn:xmpp:receipts'/>"
|
||||
"</query>"
|
||||
@@ -44,7 +44,7 @@ send_receipt_request(void **state)
|
||||
"<presence to='stabber@localhost' from='buddy1@localhost/laptop'>"
|
||||
"<priority>15</priority>"
|
||||
"<status>My status</status>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='JNkIRQChhYM8+Co3IypmMtMJnOE='/>"
|
||||
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='hAkb1xZdJV9BQpgGNw8zG5Xsals='/>"
|
||||
"</presence>"
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user