Browse Source

b64 prefix: * marker to distinguish base64-encoded display data from old plain text

* prefix prepended in on_media_registered before b64 data
on_msg_inserted, chat_core_attachment_download, get_messages_json
only attempt b64_decode when prefix starts with '*' marker
topo_upd
evgeny 2 months ago
parent
commit
a0049a4187
  1. 15
      src/chat/chat_msg.c
  2. 11
      tools/chatgui-android/jni_bridge/android_jni_bridge.c

15
src/chat/chat_msg.c

@ -118,6 +118,7 @@ static void on_media_registered(void* arg, int err, const struct media_index_res
size_t off = 0; size_t off = 0;
if (base_len > 0) { if (base_len > 0) {
char b64[2048]; size_t b64len = b64_encode(mctx->msg_data, base_len, b64, sizeof(b64)); char b64[2048]; size_t b64len = b64_encode(mctx->msg_data, base_len, b64, sizeof(b64));
full_data[off++] = '*';
memcpy(full_data + off, b64, b64len); off += b64len; memcpy(full_data + off, b64, b64len); off += b64len;
} }
off += snprintf(full_data + off, fdcap - off, "|%lld|%lld|%d|", off += snprintf(full_data + off, fdcap - off, "|%lld|%lld|%d|",
@ -552,9 +553,11 @@ void on_msg_inserted(struct DB_SYNC_INSTANCE* si, uint64_t record_ts, const char
while (body[bfi] && body[bfi] != '|' && bfi < sizeof(base_filename) - 1) while (body[bfi] && body[bfi] != '|' && bfi < sizeof(base_filename) - 1)
base_filename[bfi++] = body[bfi]; base_filename[bfi++] = body[bfi];
base_filename[bfi] = '\0'; base_filename[bfi] = '\0';
/* base64-decode display prefix (encoded in on_media_registered) */ /* base64-decode display prefix if marked with '*' (new format) */
uint8_t dec[256]; int dlen = (int)b64_decode(base_filename, bfi, dec, sizeof(dec)); if (base_filename[0] == '*' && bfi > 1) {
if (dlen > 0 && dlen < (int)sizeof(base_filename)) { memcpy(base_filename, dec, (size_t)dlen); base_filename[dlen] = '\0'; } uint8_t dec[256]; int dlen = (int)b64_decode(base_filename + 1, bfi - 1, dec, sizeof(dec));
if (dlen > 0 && dlen < (int)sizeof(base_filename)) { memcpy(base_filename, dec, (size_t)dlen); base_filename[dlen] = '\0'; }
}
if (bfi == 0) snprintf(base_filename, sizeof(base_filename), "file"); if (bfi == 0) snprintf(base_filename, sizeof(base_filename), "file");
const uint8_t* sig_field = strstr(data, "\"sig\":\""); const uint8_t* sig_field = strstr(data, "\"sig\":\"");
@ -636,8 +639,10 @@ void chat_core_attachment_download(const char* channel_id, int64_t msg_id) {
while (body[bfi] && body[bfi] != '|' && bfi < sizeof(base_filename) - 1) while (body[bfi] && body[bfi] != '|' && bfi < sizeof(base_filename) - 1)
base_filename[bfi++] = body[bfi]; base_filename[bfi++] = body[bfi];
base_filename[bfi] = '\0'; base_filename[bfi] = '\0';
uint8_t dec[256]; int dlen = (int)b64_decode(base_filename, bfi, dec, sizeof(dec)); if (base_filename[0] == '*' && bfi > 1) {
if (dlen > 0 && dlen < (int)sizeof(base_filename)) { memcpy(base_filename, dec, (size_t)dlen); base_filename[dlen] = '\0'; } uint8_t dec[256]; int dlen = (int)b64_decode(base_filename + 1, bfi - 1, dec, sizeof(dec));
if (dlen > 0 && dlen < (int)sizeof(base_filename)) { memcpy(base_filename, dec, (size_t)dlen); base_filename[dlen] = '\0'; }
}
if (bfi == 0) snprintf(base_filename, sizeof(base_filename), "file"); if (bfi == 0) snprintf(base_filename, sizeof(base_filename), "file");
uint8_t author_sig[64]; memcpy(author_sig, sig_blob, 64); uint8_t author_sig[64]; memcpy(author_sig, sig_blob, 64);

11
tools/chatgui-android/jni_bridge/android_jni_bridge.c

@ -413,14 +413,15 @@ char* utun_bridge_get_messages_json(const char* channel_id, int limit) {
const char* cts = strstr((const char*)dptr, "\"ct\":\""); const char* cts = strstr((const char*)dptr, "\"ct\":\"");
if (cts) { cts += 6; char* cte = strchr((char*)cts, '"'); if (cte) { size_t tlc = (size_t)(cte - cts); if (tlc < sizeof(ct)) { memcpy(ct, cts, tlc); ct[tlc] = '\0'; } } } if (cts) { cts += 6; char* cte = strchr((char*)cts, '"'); if (cte) { size_t tlc = (size_t)(cte - cts); if (tlc < sizeof(ct)) { memcpy(ct, cts, tlc); ct[tlc] = '\0'; } } }
} }
/* base64-decode display prefix for media messages (encoded in on_media_registered) */ /* base64-decode display prefix for media messages if marked with '*' (new format) */
if (strcmp(ct, "text/plain") != 0 && txt[0]) { if (strcmp(ct, "text/plain") != 0 && txt[0] == '*') {
char* pipe = strchr(txt, '|'); char* pipe = strchr(txt, '|');
if (pipe) { if (pipe) {
size_t prefix_len = (size_t)(pipe - txt); size_t prefix_len = (size_t)(pipe - txt); /* includes '*' */
uint8_t dec[1024]; int declen = (int)b64_decode(txt, prefix_len, dec, sizeof(dec)); uint8_t dec[1024]; int declen = (int)b64_decode(txt + 1, prefix_len - 1, dec, sizeof(dec));
if (declen > 0 && declen < 2000) { if (declen > 0 && declen < 2000) {
size_t suffix_len = strlen(pipe); /* shift suffix left, place decoded at start */
size_t suffix_len = strlen(pipe); /* includes '|' */
memmove(txt + declen, pipe, suffix_len + 1); memmove(txt + declen, pipe, suffix_len + 1);
memcpy(txt, dec, (size_t)declen); memcpy(txt, dec, (size_t)declen);
} }

Loading…
Cancel
Save