diff --git a/src/chat/chat_msg.c b/src/chat/chat_msg.c index 28bc2f81..aee023d1 100644 --- a/src/chat/chat_msg.c +++ b/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; if (base_len > 0) { 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; } 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) base_filename[bfi++] = body[bfi]; base_filename[bfi] = '\0'; - /* base64-decode display prefix (encoded in on_media_registered) */ - uint8_t dec[256]; int dlen = (int)b64_decode(base_filename, bfi, dec, sizeof(dec)); - if (dlen > 0 && dlen < (int)sizeof(base_filename)) { memcpy(base_filename, dec, (size_t)dlen); base_filename[dlen] = '\0'; } + /* base64-decode display prefix if marked with '*' (new format) */ + if (base_filename[0] == '*' && bfi > 1) { + 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"); 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) base_filename[bfi++] = body[bfi]; base_filename[bfi] = '\0'; - uint8_t dec[256]; int dlen = (int)b64_decode(base_filename, bfi, dec, sizeof(dec)); - if (dlen > 0 && dlen < (int)sizeof(base_filename)) { memcpy(base_filename, dec, (size_t)dlen); base_filename[dlen] = '\0'; } + if (base_filename[0] == '*' && bfi > 1) { + 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"); uint8_t author_sig[64]; memcpy(author_sig, sig_blob, 64); diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index 75c285af..c08f7273 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/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\":\""); 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) */ - if (strcmp(ct, "text/plain") != 0 && txt[0]) { + /* base64-decode display prefix for media messages if marked with '*' (new format) */ + if (strcmp(ct, "text/plain") != 0 && txt[0] == '*') { char* pipe = strchr(txt, '|'); if (pipe) { - size_t prefix_len = (size_t)(pipe - txt); - uint8_t dec[1024]; int declen = (int)b64_decode(txt, prefix_len, dec, sizeof(dec)); + size_t prefix_len = (size_t)(pipe - txt); /* includes '*' */ + uint8_t dec[1024]; int declen = (int)b64_decode(txt + 1, prefix_len - 1, dec, sizeof(dec)); 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); memcpy(txt, dec, (size_t)declen); }