From b0650b926bf42a584e07dcf19b45fb078eacfd76 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Wed, 5 Aug 2020 10:27:04 -0300 Subject: [PATCH] Fix pending member group edit rights. --- .../securesms/database/GroupDatabase.java | 38 +++++++++++++++++++ .../securesms/groups/LiveGroup.java | 23 +++-------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index caf0483b7..bd215a649 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -739,6 +739,15 @@ public final class GroupDatabase extends Database { return isV2Group() && requireV2GroupProperties().isAdmin(recipient); } + public MemberLevel memberLevel(@NonNull Recipient recipient) { + if (isV2Group()) { + return requireV2GroupProperties().memberLevel(recipient); + } else { + return members.contains(recipient.getId()) ? MemberLevel.FULL_MEMBER + : MemberLevel.NOT_A_MEMBER; + } + } + /** * Who is allowed to add to the membership of this group. */ @@ -817,6 +826,18 @@ public final class GroupDatabase extends Database { .or(false); } + public MemberLevel memberLevel(@NonNull Recipient recipient) { + DecryptedGroup decryptedGroup = getDecryptedGroup(); + + return DecryptedGroupUtil.findMemberByUuid(decryptedGroup.getMembersList(), recipient.getUuid().get()) + .transform(member -> member.getRole() == Member.Role.ADMINISTRATOR + ? MemberLevel.ADMINISTRATOR + : MemberLevel.FULL_MEMBER) + .or(() -> DecryptedGroupUtil.findPendingByUuid(decryptedGroup.getPendingMembersList(), recipient.getUuid().get()) + .isPresent() ? MemberLevel.PENDING_MEMBER + : MemberLevel.NOT_A_MEMBER); + } + public List getMemberRecipients(@NonNull MemberSet memberSet) { return Recipient.resolvedList(getMemberRecipientIds(memberSet)); } @@ -868,4 +889,21 @@ public final class GroupDatabase extends Database { this.includePending = includePending; } } + + public enum MemberLevel { + NOT_A_MEMBER(false), + PENDING_MEMBER(false), + FULL_MEMBER(true), + ADMINISTRATOR(true); + + private final boolean inGroup; + + MemberLevel(boolean inGroup){ + this.inGroup = inGroup; + } + + public boolean isInGroup() { + return inGroup; + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java b/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java index 9617e6ed4..ed95478dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java @@ -145,28 +145,15 @@ public final class LiveGroup { fullMemberCount); } - private LiveData selfMemberLevel() { - return Transformations.map(groupRecord, g -> { - if (g.isAdmin(Recipient.self())) { - return MemberLevel.ADMIN; - } else { - return g.isActive() ? MemberLevel.MEMBER - : MemberLevel.NOT_A_MEMBER; - } - }); + private LiveData selfMemberLevel() { + return Transformations.map(groupRecord, g -> g.memberLevel(Recipient.self())); } - private static boolean applyAccessControl(@NonNull MemberLevel memberLevel, @NonNull GroupAccessControl rights) { + private static boolean applyAccessControl(@NonNull GroupDatabase.MemberLevel memberLevel, @NonNull GroupAccessControl rights) { switch (rights) { - case ALL_MEMBERS: return memberLevel != MemberLevel.NOT_A_MEMBER; - case ONLY_ADMINS: return memberLevel == MemberLevel.ADMIN; + case ALL_MEMBERS: return memberLevel.isInGroup(); + case ONLY_ADMINS: return memberLevel == GroupDatabase.MemberLevel.ADMINISTRATOR; default: throw new AssertionError(); } } - - private enum MemberLevel { - NOT_A_MEMBER, - MEMBER, - ADMIN - } } \ No newline at end of file