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);
}
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<Recipient> 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;
}
}
}

View File

@ -145,28 +145,15 @@ public final class LiveGroup {
fullMemberCount);
}
private LiveData<MemberLevel> 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<GroupDatabase.MemberLevel> 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
}
}