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:
@@ -157,11 +157,11 @@ jid_is_valid(const gchar* const str)
|
|||||||
domain_start = at + 1;
|
domain_start = at + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resourcepart validation
|
// Resourcepart validation if present
|
||||||
if (slash) {
|
if (slash) {
|
||||||
domain_len = slash - domain_start;
|
domain_len = slash - domain_start;
|
||||||
size_t resource_len = strlen(slash + 1);
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ main(int argc, char* argv[])
|
|||||||
cmocka_unit_test(jid_create__returns__correct_parts_with_trailing_slash),
|
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__fulljid_when_exists),
|
||||||
cmocka_unit_test(jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_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_invalid_localpart_chars),
|
||||||
cmocka_unit_test(jid_create__returns__null_from_empty_parts),
|
cmocka_unit_test(jid_create__returns__null_from_empty_parts),
|
||||||
cmocka_unit_test(jid_create__returns__null_from_multiple_at_in_bare),
|
cmocka_unit_test(jid_create__returns__null_from_multiple_at_in_bare),
|
||||||
|
|||||||
@@ -235,6 +235,16 @@ jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_exists(void** state)
|
|||||||
jid_destroy(jid);
|
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
|
void
|
||||||
jid_create__returns__null_from_invalid_localpart_chars(void** state)
|
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@");
|
result = jid_create("user@");
|
||||||
assert_null(result);
|
assert_null(result);
|
||||||
|
|
||||||
// Empty resource (trailing /)
|
|
||||||
result = jid_create("user@domain.com/");
|
|
||||||
assert_null(result);
|
|
||||||
|
|
||||||
// Empty domain in full jid
|
// Empty domain in full jid
|
||||||
result = jid_create("user@/resource");
|
result = jid_create("user@/resource");
|
||||||
assert_null(result);
|
assert_null(result);
|
||||||
|
|||||||
@@ -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_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__fulljid_when_exists(void** state);
|
||||||
void jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_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_invalid_localpart_chars(void** state);
|
||||||
void jid_create__returns__null_from_empty_parts(void** state);
|
void jid_create__returns__null_from_empty_parts(void** state);
|
||||||
void jid_create__returns__null_from_multiple_at_in_bare(void** state);
|
void jid_create__returns__null_from_multiple_at_in_bare(void** state);
|
||||||
|
|||||||
Reference in New Issue
Block a user