Browse Source

Add the file quota query and per-user quota configuration

master
evgeny 7 days ago
parent
commit
3b641a2423
  1. 2
      src/chat/chat_setting.c
  2. 8
      src/member_files/protocol.c
  3. 3
      src/member_files/protocol.h

2
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},
};

8
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";
}

3
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,

Loading…
Cancel
Save