diff --git a/src/chat/chat_setting.c b/src/chat/chat_setting.c index b70a5a32..387ea690 100644 --- a/src/chat/chat_setting.c +++ b/src/chat/chat_setting.c @@ -64,7 +64,7 @@ static const struct chat_setting_def g_setting_defs[] = { {"call_compressor_max_gain_db",CHAT_SETTING_INT, 15, 1, 60}, {"member_files_enabled", CHAT_SETTING_BOOL, 1, 0, 1}, {"member_files_path", CHAT_SETTING_STRING, 0, 0, 0}, - {"member_files_quota_mb", CHAT_SETTING_INT, 1024, 1, 1048576}, + {"member_files_user_quota_mb", CHAT_SETTING_INT, 1024, 1, 1048576}, {"member_files_upload_ttl_sec", CHAT_SETTING_INT, 3600, 60, 604800}, }; diff --git a/src/member_files/protocol.c b/src/member_files/protocol.c index b26dbee4..d6655214 100644 --- a/src/member_files/protocol.c +++ b/src/member_files/protocol.c @@ -68,7 +68,7 @@ int mf_encode(const struct mf_message* m, uint8_t* p, size_t cap) { return -1; } memset(p, 0, MF_WIRE_HEADER); - p[0] = 2; p[1] = m->kind; p[2] = m->command; p[3] = (uint8_t)m->status; p[4] = (uint8_t)(m->status >> 8); + p[0] = 3; p[1] = m->kind; p[2] = m->command; p[3] = (uint8_t)m->status; p[4] = (uint8_t)(m->status >> 8); mf_put64(p + 5, m->request_id); mf_put64(p + 13, m->owner); mf_put64(p + 21, m->offset); mf_put64(p + 29, m->size); mf_put64(p + 37, m->cursor); memcpy(p + 45, m->version, 16); memcpy(p + 61, m->upload, 16); memcpy(p + 77, m->hash, 32); @@ -84,7 +84,7 @@ int mf_decode(const uint8_t* p, size_t n, struct mf_message* m) { if (!p || !m || n < MF_WIRE_HEADER) goto bad; size_t a = p[119] | ((size_t)p[120] << 8), b = p[121] | ((size_t)p[122] << 8); size_t d = p[123] | ((size_t)p[124] << 8); - if (p[0] != 2 || (p[1] != MF_REQUEST && p[1] != MF_RESPONSE) || p[2] < MF_LIST || p[2] > MF_STREAM_CANCEL || + if (p[0] != 3 || (p[1] != MF_REQUEST && p[1] != MF_RESPONSE) || p[2] < MF_LIST || p[2] > MF_QUOTA || a > MF_PATH_MAX || b > MF_PATH_MAX || d > MF_BLOCK_SIZE || n != MF_WIRE_HEADER + a + b + d || memchr(p + MF_WIRE_HEADER, 0, a + b) || p[118] > 1) goto bad; memset(m, 0, sizeof(*m)); @@ -110,6 +110,6 @@ const char* mf_status_text(int status) { const char* mf_command_text(int command) { static const char* commands[] = { "SWEEP", "LIST", "STAT", "READ", "BEGIN_WRITE", "WRITE", "COMMIT", "ABORT", - "MKDIR", "RENAME", "REMOVE", "STREAM_WRITE", "STREAM_READ", "DATA", "END", "CANCEL" }; - return command >= 0 && command <= MF_STREAM_CANCEL ? commands[command] : "UNKNOWN"; + "MKDIR", "RENAME", "REMOVE", "STREAM_WRITE", "STREAM_READ", "DATA", "END", "CANCEL", "QUOTA" }; + return command >= 0 && command <= MF_QUOTA ? commands[command] : "UNKNOWN"; } diff --git a/src/member_files/protocol.h b/src/member_files/protocol.h index 63b2b37a..e98815c8 100644 --- a/src/member_files/protocol.h +++ b/src/member_files/protocol.h @@ -20,6 +20,7 @@ extern "C" { #define MF_WIRE_HEADER 125 #define MF_WIRE_MAX (MF_WIRE_HEADER + 2 * MF_PATH_MAX + MF_BLOCK_SIZE) #define MF_ENTRY_HEADER 35 +#define MF_QUOTA_BYTES 24 /* used:u64, limit:u64, reserved:u64; все значения в байтах */ #define MF_IDLE_TB 100000ULL /* 10 секунд */ #define MF_REQUEST 1 #define MF_RESPONSE 2 @@ -28,7 +29,7 @@ extern "C" { enum mf_command { MF_LIST = 1, MF_STAT, MF_READ, MF_BEGIN_WRITE, MF_WRITE, MF_COMMIT, MF_ABORT, MF_MKDIR, MF_RENAME, MF_REMOVE, - MF_STREAM_WRITE, MF_STREAM_READ, MF_STREAM_DATA, MF_STREAM_END, MF_STREAM_CANCEL + MF_STREAM_WRITE, MF_STREAM_READ, MF_STREAM_DATA, MF_STREAM_END, MF_STREAM_CANCEL, MF_QUOTA }; enum mf_status { MF_OK, MF_ACCESS_DENIED, MF_NOT_FOUND, MF_INVALID_PATH, MF_INVALID_RANGE, MF_EXISTS,