feat: handle and allow JIDs with trailing slashes

Make jid_is_valid() allow JIDs ending with a slash (`user@domain/`).
In these cases, the parser now treats the input as a Bare JID with no
resource part, rather than rejecting it as invalid.

We will then just get `user@domain`.
This commit is contained in:
Michael Vetter
2026-03-06 13:17:13 +01:00
parent 35a2f2990a
commit f251cc8bb3
4 changed files with 14 additions and 6 deletions

View File

@@ -157,11 +157,11 @@ jid_is_valid(const gchar* const str)
domain_start = at + 1;
}
// Resourcepart validation
// Resourcepart validation if present
if (slash) {
domain_len = slash - domain_start;
size_t resource_len = strlen(slash + 1);
if (resource_len == 0 || resource_len > JID_MAX_PART_LEN) {
if (resource_len > JID_MAX_PART_LEN) {
return FALSE;
}
} else {

View File

@@ -150,6 +150,7 @@ main(int argc, char* argv[])
cmocka_unit_test(jid_create__returns__correct_parts_with_trailing_slash),
cmocka_unit_test(jid_fulljid_or_barejid__returns__fulljid_when_exists),
cmocka_unit_test(jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_exists),
cmocka_unit_test(jid_create__returns__bare_from_trailing_slash),
cmocka_unit_test(jid_create__returns__null_from_invalid_localpart_chars),
cmocka_unit_test(jid_create__returns__null_from_empty_parts),
cmocka_unit_test(jid_create__returns__null_from_multiple_at_in_bare),

View File

@@ -235,6 +235,16 @@ jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_exists(void** state)
jid_destroy(jid);
}
void
jid_create__returns__bare_from_trailing_slash(void** state)
{
Jid* result = jid_create("myuser@mydomain/");
assert_non_null(result);
assert_string_equal("myuser@mydomain", result->barejid);
assert_null(result->resourcepart);
jid_destroy(result);
}
void
jid_create__returns__null_from_invalid_localpart_chars(void** state)
{
@@ -278,10 +288,6 @@ jid_create__returns__null_from_empty_parts(void** state)
result = jid_create("user@");
assert_null(result);
// Empty resource (trailing /)
result = jid_create("user@domain.com/");
assert_null(result);
// Empty domain in full jid
result = jid_create("user@/resource");
assert_null(result);

View File

@@ -26,6 +26,7 @@ void jid_create__returns__correct_parts_with_at_and_slash_in_resource(void** sta
void jid_create__returns__correct_parts_with_trailing_slash(void** state);
void jid_fulljid_or_barejid__returns__fulljid_when_exists(void** state);
void jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_exists(void** state);
void jid_create__returns__bare_from_trailing_slash(void** state);
void jid_create__returns__null_from_invalid_localpart_chars(void** state);
void jid_create__returns__null_from_empty_parts(void** state);
void jid_create__returns__null_from_multiple_at_in_bare(void** state);