From 9f633719094ed1ff52d3dd520a77cc732bff0392 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Fri, 15 Aug 2025 20:11:56 +0200 Subject: [PATCH 1/7] feat: Adapt to channel-invite QR codes --- src/main/java/com/b44t/messenger/DcContext.java | 1 + src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java | 4 +--- .../java/org/thoughtcrime/securesms/qr/QrCodeHandler.java | 4 ++++ src/main/res/values/strings.xml | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index 7220693c47..a356e4b347 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -49,6 +49,7 @@ public class DcContext { public final static int DC_QR_ASK_VERIFYCONTACT = 200; public final static int DC_QR_ASK_VERIFYGROUP = 202; + public final static int DC_QR_ASK_JOIN_BROADCAST= 204; public final static int DC_QR_FPR_OK = 210; public final static int DC_QR_FPR_MISMATCH = 220; public final static int DC_QR_FPR_WITHOUT_ADDR = 230; diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java index fc9946eae9..ef4f14333b 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java @@ -314,9 +314,7 @@ public void changeData(@Nullable int[] memberList, @Nullable DcContact dcContact if (dcChat != null) { if (dcChat.canSend() && dcChat.isEncrypted()) { itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0)); - if (!isOutBroadcast) { - itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0)); - } + itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0)); } } for (int value : memberList) { diff --git a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java index d43f061e49..00da3556df 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java @@ -43,6 +43,7 @@ public void handleQrData(String rawString) { switch (qrParsed.getState()) { case DcContext.DC_QR_ASK_VERIFYCONTACT: case DcContext.DC_QR_ASK_VERIFYGROUP: + case DcContext.DC_QR_ASK_JOIN_BROADCAST: showVerifyContactOrGroup(activity, builder, rawString, qrParsed, name); break; @@ -225,6 +226,9 @@ private void showVerifyContactOrGroup(Activity activity, AlertDialog.Builder bui case DcContext.DC_QR_ASK_VERIFYGROUP: msg = activity.getString(R.string.qrscan_ask_join_group, qrParsed.getText1()); break; + case DcContext.DC_QR_ASK_JOIN_BROADCAST: + msg = activity.getString(R.string.qrscan_ask_join_channel, qrParsed.getText1()); + break; default: msg = activity.getString(R.string.ask_start_chat_with, name); break; diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index cced2242a9..9206bd45f6 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1005,6 +1005,7 @@ Move the QR code to the camera QR code could not be decoded Do you want to join the group \"%1$s\"? + Do you want to join the channel \"%1$s\"? The scanned fingerprint does not match the last seen for %1$s. This QR code contains a fingerprint but no address.\n\nFor an out-of-band-verification, please establish an encrypted connection to the recipient first. Scanned QR code text:\n\n%1$s From 46b2d4b9cd10aca18c23fdffa19731de7659218d Mon Sep 17 00:00:00 2001 From: Hocuri Date: Mon, 15 Sep 2025 10:52:54 +0200 Subject: [PATCH 2/7] Update submodule --- jni/deltachat-core-rust | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index 75bcf8660b..43d65cb012 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit 75bcf8660bca5b80bea7835bd85df11518a0f7e4 +Subproject commit 43d65cb0124785fb1a9a71cb8d5218c4047aeb9c From 5727a0fcb33db5c0570c6d7cf218259f150df286 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Mon, 15 Sep 2025 10:59:22 +0200 Subject: [PATCH 3/7] feat: Make it impossible to clone an OutBroadcast Cloning wouldn't work, because you can only be added to a broadcast channel via a QR code --- src/main/java/org/thoughtcrime/securesms/ProfileActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java index 8f36b35c03..e506e82adb 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java @@ -109,7 +109,7 @@ public boolean onCreateOptionsMenu(Menu menu) { if (chatId != 0) { DcChat dcChat = dcContext.getChat(chatId); - menu.findItem(R.id.menu_clone).setVisible(chatIsMultiUser && !chatIsInBroadcast && !chatIsMailingList); + menu.findItem(R.id.menu_clone).setVisible(chatIsMultiUser && !chatIsInBroadcast && !chatIsOutBroadcast && !chatIsMailingList); if (chatIsDeviceTalk) { menu.findItem(R.id.edit_name).setVisible(false); menu.findItem(R.id.show_encr_info).setVisible(false); From f8161108428d87dedfa6d47be10e475cbd5ff32f Mon Sep 17 00:00:00 2001 From: Hocuri Date: Mon, 15 Sep 2025 11:29:07 +0200 Subject: [PATCH 4/7] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11cb5991a5..701ecab670 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +* Make it possible to invite members into a channel via a QR code, + and make channels more secure * target Android 15 * improve readability of info messages in dark mode * drop too short disappearing messages options From c64fd608b8d6542bb696ed3301801bbe9f9bb02b Mon Sep 17 00:00:00 2001 From: Hocuri Date: Mon, 15 Sep 2025 17:00:32 +0200 Subject: [PATCH 5/7] fix: Hide the 'Add Member' button for broadcasts --- .../java/org/thoughtcrime/securesms/ProfileAdapter.java | 4 +++- .../securesms/util/SelectedContactsAdapter.java | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java index 8125515f57..90bab620eb 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java @@ -314,7 +314,9 @@ public void changeData(@Nullable int[] memberList, @Nullable DcContact dcContact itemData.add(new ItemData(ITEM_DIVIDER, null, 0)); if (dcChat != null) { if (dcChat.canSend() && dcChat.isEncrypted()) { - itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0)); + if (!isOutBroadcast) { + itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0)); + } itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0)); } } diff --git a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java index 887e07c80b..70ec1fd5f7 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java @@ -54,7 +54,9 @@ public SelectedContactsAdapter(@NonNull Context context, public void changeData(Collection contactIds) { contacts.clear(); - contacts.add(DC_CONTACT_ID_ADD_MEMBER); + if (!isBroadcast) { + contacts.add(DC_CONTACT_ID_ADD_MEMBER); + } if (contactIds != null) { for (int id : contactIds) { if (id != DC_CONTACT_ID_SELF) { @@ -75,7 +77,7 @@ public void remove(@NonNull Integer contactId) { } public Set getContacts() { - final Set set = new HashSet<>(contacts.size()-1); + final Set set = new HashSet<>(contacts.size()); for (int i = 1; i < contacts.size(); i++) { set.add(contacts.get(i)); } From 694c36abcb14814327cea320e288b3f0f74b50ef Mon Sep 17 00:00:00 2001 From: Hocuri Date: Wed, 8 Oct 2025 15:46:56 +0200 Subject: [PATCH 6/7] Update submodule --- jni/dc_wrapper.c | 9 +++------ jni/deltachat-core-rust | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 246c3550b6..11d9ee4cc5 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -737,7 +737,7 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendTextMsg(JNIEnv *env, jobjec JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendVideochatInvitation(JNIEnv *env, jobject obj, jint chat_id) { - return (jint)dc_send_videochat_invitation(get_dc_context(env, obj), chat_id); + return (jint)0; } @@ -1611,16 +1611,13 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getSetupCodeBegin(JNIEnv *env, j JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getVideochatUrl(JNIEnv *env, jobject obj) { - char* temp = dc_msg_get_videochat_url(get_dc_msg(env, obj)); - jstring ret = JSTRING_NEW(temp); - dc_str_unref(temp); - return ret; + return NULL; } JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getVideochatType(JNIEnv *env, jobject obj) { - return (jint)dc_msg_get_videochat_type(get_dc_msg(env, obj)); + return (jint)0; } diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index 43d65cb012..27d1d3559b 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit 43d65cb0124785fb1a9a71cb8d5218c4047aeb9c +Subproject commit 27d1d3559bee1f53a55e026e55256a197fe53082 From 27bb724b2615d855baa9291867d53bd2ebc775fd Mon Sep 17 00:00:00 2001 From: Hocuri Date: Thu, 23 Oct 2025 20:01:47 +0200 Subject: [PATCH 7/7] fix: Don't show empty toast if message fails but no `error!()` is sent --- .../org/thoughtcrime/securesms/ConversationActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 9aaa1e3555..ebb7a100b0 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -1152,7 +1152,10 @@ else if (!body.isEmpty()){ if (doSend) { if (dcContext.sendMsg(dcChat.getId(), msg) == 0) { - Util.runOnMain(()-> Toast.makeText(ConversationActivity.this, dcContext.getLastError(), Toast.LENGTH_LONG).show()); + String lastError = dcContext.getLastError(); + if (!"".equals(lastError)) { + Util.runOnMain(() -> Toast.makeText(ConversationActivity.this, lastError, Toast.LENGTH_LONG).show()); + } future.set(chatId); return; }