Fix pending member group edit rights.

master
Alan Evans 2020-08-05 10:27:04 -03:00 committed by Greyson Parrelli
parent 845f6a0a93
commit b0650b926b
2 changed files with 43 additions and 18 deletions

View File

@ -739,6 +739,15 @@ public final class GroupDatabase extends Database {
return isV2Group() && requireV2GroupProperties().isAdmin(recipient); 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. * Who is allowed to add to the membership of this group.
*/ */
@ -817,6 +826,18 @@ public final class GroupDatabase extends Database {
.or(false); .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<Recipient> getMemberRecipients(@NonNull MemberSet memberSet) { public List<Recipient> getMemberRecipients(@NonNull MemberSet memberSet) {
return Recipient.resolvedList(getMemberRecipientIds(memberSet)); return Recipient.resolvedList(getMemberRecipientIds(memberSet));
} }
@ -868,4 +889,21 @@ public final class GroupDatabase extends Database {
this.includePending = includePending; 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;
}
}
} }

View File

@ -145,28 +145,15 @@ public final class LiveGroup {
fullMemberCount); fullMemberCount);
} }
private LiveData<MemberLevel> selfMemberLevel() { private LiveData<GroupDatabase.MemberLevel> selfMemberLevel() {
return Transformations.map(groupRecord, g -> { return Transformations.map(groupRecord, g -> g.memberLevel(Recipient.self()));
if (g.isAdmin(Recipient.self())) {
return MemberLevel.ADMIN;
} else {
return g.isActive() ? MemberLevel.MEMBER
: MemberLevel.NOT_A_MEMBER;
}
});
} }
private static boolean applyAccessControl(@NonNull MemberLevel memberLevel, @NonNull GroupAccessControl rights) { private static boolean applyAccessControl(@NonNull GroupDatabase.MemberLevel memberLevel, @NonNull GroupAccessControl rights) {
switch (rights) { switch (rights) {
case ALL_MEMBERS: return memberLevel != MemberLevel.NOT_A_MEMBER; case ALL_MEMBERS: return memberLevel.isInGroup();
case ONLY_ADMINS: return memberLevel == MemberLevel.ADMIN; case ONLY_ADMINS: return memberLevel == GroupDatabase.MemberLevel.ADMINISTRATOR;
default: throw new AssertionError(); default: throw new AssertionError();
} }
} }
private enum MemberLevel {
NOT_A_MEMBER,
MEMBER,
ADMIN
}
} }