Browse Source

Verify signed multi-reaction rejection and document the single-choice rule

master
evgeny 5 days ago
parent
commit
b1bf094bfd
  1. 3
      src/chat/merkle_sync_doc.md
  2. 6
      tests/test_chat_feedback.c
  3. 2
      tools/chatcli_commands.txt

3
src/chat/merkle_sync_doc.md

@ -130,7 +130,8 @@ Wire-запись: message_id:32, node_id:8, kind:1, ver:8, data_len:2, data, si
## Опросы и реакции ## Опросы и реакции
`chat_poll_codec` задаёт общий каталог 16 эмодзи и канонические кодеки. `chat_poll_codec` задаёт общий каталог 16 эмодзи и канонические кодеки.
Реакции: count:1 и отсортированные уникальные номера; максимум 8 реакций автора. Реакция: count=1 и номер эмодзи; автор выбирает только один смайлик на сообщение.
Выбор другого смайлика заменяет предыдущий с новым ver; повторное нажатие отменяет реакцию.
Ответ: count:1, отсортированные уникальные номера пунктов, custom_len:2, UTF-8 текст. Ответ: count:1, отсортированные уникальные номера пунктов, custom_len:2, UTF-8 текст.
Пустой набор/ответ кодируется нулевой длиной. Собственный текст — максимум 1024 байта. Пустой набор/ответ кодируется нулевой длиной. Собственный текст — максимум 1024 байта.
Структурно неверные состояния не применяются; семантически неверные подписанные ответы Структурно неверные состояния не применяются; семантически неверные подписанные ответы

6
tests/test_chat_feedback.c

@ -115,8 +115,12 @@ int main(int argc, char** argv) {
assert(chat_feedback_get(&source, "1001", message, source.node_id, CHAT_FEEDBACK_REACTION, &first) == 1); assert(chat_feedback_get(&source, "1001", message, source.node_id, CHAT_FEEDBACK_REACTION, &first) == 1);
uint8_t invalid_multi[] = {2, 0, 1}; uint8_t invalid_multi[] = {2, 0, 1};
assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, invalid_multi, sizeof(invalid_multi), NULL) < 0); assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, invalid_multi, sizeof(invalid_multi), NULL) < 0);
struct chat_feedback_record invalid = first; invalid.ver++; invalid.data_len = sizeof(invalid_multi); struct chat_feedback_record invalid = first; invalid.data_len = sizeof(invalid_multi);
memcpy(invalid.data, invalid_multi, sizeof(invalid_multi)); memcpy(invalid.data, invalid_multi, sizeof(invalid_multi));
uint8_t invalid_body[FB_WIRE_MAX + 32]; int invalid_bytes = fb_signed_bytes(1001, &first, invalid_body);
assert(invalid_bytes > 4);
invalid_body[invalid_bytes - 3] = sizeof(invalid_multi); invalid_body[invalid_bytes - 2] = 2; invalid_body[invalid_bytes] = 1;
assert(sc_ed25519_sign(source.my_ed25519_privkey, invalid_body, invalid_bytes + 1, invalid.signature) == SC_OK);
assert(chat_feedback_apply(&target, "1001", &invalid) < 0); assert(chat_feedback_apply(&target, "1001", &invalid) < 0);
int saved_events = events; int saved_events = events;
assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, a, sizeof(a), &ver) == 0 && ver == 1); assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, a, sizeof(a), &ver) == 0 && ver == 1);

2
tools/chatcli_commands.txt

@ -71,7 +71,7 @@ vote <ch_id> <message_id> [option_id ...] [--custom <text>]
chatcli vote 12345 <message_id> chatcli vote 12345 <message_id>
react <ch_id> <message_id> [emoji_or_id] [--off] [--clear] react <ch_id> <message_id> [emoji_or_id] [--off] [--clear]
Установить реакцию; --off снимает выбранную, --clear снимает все свои реакции. Установить единственную реакцию, заменив предыдущую; --off снимает выбранную, --clear отменяет свою реакцию.
Пример: chatcli react 12345 <message_id> "👍" Пример: chatcli react 12345 <message_id> "👍"
chatcli react 12345 <message_id> 0 --off chatcli react 12345 <message_id> 0 --off
chatcli react 12345 <message_id> --clear chatcli react 12345 <message_id> --clear

Loading…
Cancel
Save