feat: Improve validation of JIDs
Add new `jid_is_valid()` function and improve the adherence to XMPP RFCs in jid_create(). Add unit tests for them as well.
This commit is contained in:
@@ -150,6 +150,14 @@ 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__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),
|
||||
cmocka_unit_test(jid_create__returns__correct_parts_with_at_in_resource_only),
|
||||
cmocka_unit_test(jid_is_valid__is__true_for_valid_jid),
|
||||
cmocka_unit_test(jid_is_valid__is__false_for_invalid_jid),
|
||||
cmocka_unit_test(jid_is_valid__is__false_for_null),
|
||||
cmocka_unit_test(jid_is_valid__is__false_for_empty_string),
|
||||
|
||||
cmocka_unit_test(parse_args__returns__null_from_null),
|
||||
cmocka_unit_test(parse_args__returns__null_from_empty),
|
||||
|
||||
@@ -234,3 +234,102 @@ jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_exists(void** state)
|
||||
|
||||
jid_destroy(jid);
|
||||
}
|
||||
|
||||
void
|
||||
jid_create__returns__null_from_invalid_localpart_chars(void** state)
|
||||
{
|
||||
// Space
|
||||
Jid* result = jid_create("user name@domain.com");
|
||||
assert_null(result);
|
||||
|
||||
// Double quote
|
||||
result = jid_create("user\"name@domain.com");
|
||||
assert_null(result);
|
||||
|
||||
// Ampersand
|
||||
result = jid_create("user&name@domain.com");
|
||||
assert_null(result);
|
||||
|
||||
// Single quote
|
||||
result = jid_create("user'name@domain.com");
|
||||
assert_null(result);
|
||||
|
||||
// Colon
|
||||
result = jid_create("user:name@domain.com");
|
||||
assert_null(result);
|
||||
|
||||
// Less than
|
||||
result = jid_create("user<name@domain.com");
|
||||
assert_null(result);
|
||||
|
||||
// Greater than
|
||||
result = jid_create("user>name@domain.com");
|
||||
assert_null(result);
|
||||
}
|
||||
|
||||
void
|
||||
jid_create__returns__null_from_empty_parts(void** state)
|
||||
{
|
||||
// Empty local
|
||||
Jid* result = jid_create("@domain.com");
|
||||
assert_null(result);
|
||||
|
||||
// Empty domain (trailing @)
|
||||
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);
|
||||
}
|
||||
|
||||
void
|
||||
jid_create__returns__null_from_multiple_at_in_bare(void** state)
|
||||
{
|
||||
Jid* result = jid_create("user@domain@other.com");
|
||||
assert_null(result);
|
||||
}
|
||||
|
||||
void
|
||||
jid_create__returns__correct_parts_with_at_in_resource_only(void** state)
|
||||
{
|
||||
// domain.com/user@host (no localpart)
|
||||
Jid* result = jid_create("domain.com/user@host");
|
||||
assert_non_null(result);
|
||||
assert_null(result->localpart);
|
||||
assert_string_equal("domain.com", result->domainpart);
|
||||
assert_string_equal("user@host", result->resourcepart);
|
||||
jid_destroy(result);
|
||||
}
|
||||
|
||||
void
|
||||
jid_is_valid__is__true_for_valid_jid(void** state)
|
||||
{
|
||||
assert_true(jid_is_valid("myuser@mydomain/laptop"));
|
||||
assert_true(jid_is_valid("myuser@mydomain"));
|
||||
assert_true(jid_is_valid("mydomain/laptop"));
|
||||
assert_true(jid_is_valid("mydomain"));
|
||||
}
|
||||
|
||||
void
|
||||
jid_is_valid__is__false_for_invalid_jid(void** state)
|
||||
{
|
||||
assert_false(jid_is_valid("@mydomain"));
|
||||
assert_false(jid_is_valid("/laptop"));
|
||||
}
|
||||
|
||||
void
|
||||
jid_is_valid__is__false_for_null(void** state)
|
||||
{
|
||||
assert_false(jid_is_valid(NULL));
|
||||
}
|
||||
|
||||
void
|
||||
jid_is_valid__is__false_for_empty_string(void** state)
|
||||
{
|
||||
assert_false(jid_is_valid(""));
|
||||
}
|
||||
|
||||
@@ -26,5 +26,13 @@ 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__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);
|
||||
void jid_create__returns__correct_parts_with_at_in_resource_only(void** state);
|
||||
void jid_is_valid__is__true_for_valid_jid(void** state);
|
||||
void jid_is_valid__is__false_for_invalid_jid(void** state);
|
||||
void jid_is_valid__is__false_for_null(void** state);
|
||||
void jid_is_valid__is__false_for_empty_string(void** state);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user