Test avatar immutability, hash validation and quota accounting

This commit is contained in:
evgeny committed 2026-10-06 12:40:07 +02:00
1 parent 405755f06a
commit f2d2e6be8f
3 files changed
+34 -7

No files matched your search

+28 -1
View File
@@ -35,6 +35,32 @@ static void protocol_test(void) {
wire[MF_WIRE_HEADER] = 0; EXPECT(mf_decode(wire, (size_t)n, &r) != 0, "embedded NUL");
}
static void avatar_storage_test(const char* directory) {
char root[1200]; snprintf(root, sizeof(root), "%s/avatar-store", directory);
struct mf_storage* s = mf_storage_create(root, MF_AVATAR_MAX_BYTES, 200000);
EXPECT(s && mf_storage_initialize(s) == MF_OK, "avatar storage initialized"); if (!s) return;
memset(&q, 0, sizeof(q)); q.owner = 77; snprintf(q.path, sizeof(q.path), "avatars");
run(s, 55, 77, MF_MKDIR, MF_OK);
const uint8_t contents[] = {1, 2, 3, 4}; SHA256(contents, sizeof(contents), q.hash);
char hash[65]; for (unsigned i = 0; i < 32; i++) snprintf(hash + i * 2, 3, "%02x", q.hash[i]);
snprintf(q.path, sizeof(q.path), "avatars/%s.png", hash); q.size = sizeof(contents); memset(q.upload, 1, 16);
run(s, 55, 77, MF_BEGIN_WRITE, MF_OK);
memcpy(q.data, contents, sizeof(contents)); q.data_len = sizeof(contents); run(s, 55, 77, MF_WRITE, MF_OK);
q.data_len = 0; run(s, 55, 77, MF_COMMIT, MF_OK);
uint8_t version[16]; memcpy(version, r.version, 16);
memset(q.upload, 2, 16); run(s, 55, 77, MF_BEGIN_WRITE, MF_EXISTS);
memcpy(q.version, version, 16); run(s, 55, 77, MF_BEGIN_WRITE, MF_EXISTS);
memset(q.version, 0, 16); q.hash[0] ^= 1; run(s, 55, 77, MF_BEGIN_WRITE, MF_HASH_MISMATCH); q.hash[0] ^= 1;
q.size = MF_AVATAR_MAX_BYTES + 1; run(s, 55, 77, MF_BEGIN_WRITE, MF_INVALID_RANGE);
q.size = 0; run(s, 55, 77, MF_BEGIN_WRITE, MF_INVALID_RANGE);
memcpy(q.version, version, 16); snprintf(q.target, sizeof(q.target), "renamed.png"); run(s, 55, 77, MF_RENAME, MF_INVALID_PATH);
memset(&q, 0, sizeof(q)); q.owner = 77; run(s, 55, 88, MF_QUOTA, MF_OK);
EXPECT(mf_get64(r.data) == sizeof(contents) && mf_get64(r.data + 16) == 0 &&
mf_get64(r.data + 24) == 1 && mf_get64(r.data + 32) == 1, "avatars counted once in UID quota");
EXPECT(!mf_avatar_file_valid("../avatar.png") && !mf_avatar_file_valid("avatar.png"), "noncanonical avatar names rejected");
mf_storage_destroy(s);
}
static void storage_test(const char* directory) {
struct mf_storage* s = mf_storage_create(directory, 40000, 200000);
EXPECT(s != NULL, "create storage"); if (!s) return;
@@ -346,7 +372,8 @@ int main(void) {
debug_config_init(); debug_set_level(DEBUG_LEVEL_WARN); debug_set_category_level(DEBUG_CATEGORY_MEDIA, DEBUG_LEVEL_DEBUG);
char directory[1024] = "/tmp/utun_member_files_XXXXXX";
if (test_mkdtemp(directory)) return 1;
protocol_test(); storage_test(directory); quota_test(directory); count_test(directory); quota_scan_failure_test(directory); worker_test();
protocol_test(); storage_test(directory); avatar_storage_test(directory); quota_test(directory);
count_test(directory); quota_scan_failure_test(directory); worker_test();
#ifndef _WIN32
large_offset_test(directory);
#endif