From 8cdd9c3b2d8f235784d904ec10dd593c57206e2b Mon Sep 17 00:00:00 2001 From: Kelrap Date: Thu, 18 Jul 2024 17:17:28 -0400 Subject: [PATCH 1/3] Lets students add subrooms to spaces --- lib/pages/chat_list/chat_list.dart | 7 +------ .../pangea_room_extension.dart | 2 ++ .../user_permissions_extension.dart | 16 ++-------------- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 803b773e1..9abe76a91 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -819,8 +819,7 @@ class ChatListController extends State label: space.nameIncludingParents(context), // If user is not admin of space, button is grayed out textStyle: TextStyle( - color: (firstSelectedRoom == null || - (firstSelectedRoom.isSpace && !space.isRoomAdmin)) + color: (firstSelectedRoom == null) ? Theme.of(context).colorScheme.outline : Theme.of(context).colorScheme.surfaceTint, ), @@ -838,10 +837,6 @@ class ChatListController extends State if (firstSelectedRoom == null) { throw L10n.of(context)!.nonexistentSelection; } - // If user is not admin of the would-be parent space, does not allow - if (firstSelectedRoom.isSpace && !space.isRoomAdmin) { - throw L10n.of(context)!.cantAddSpaceChild; - } if (space.canSendDefaultStates) { for (final roomId in selectedRoomIds) { diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index fbec662a7..f0094f994 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -291,6 +291,8 @@ extension PangeaRoom on Room { bool get canDelete => _canDelete; + /// Determines whether user has permission to add child room to this + /// Can add child if, and only if, is admin of child bool canIAddSpaceChild(Room? room, {bool spaceMode = false}) { return _canIAddSpaceChild(room, spaceMode: spaceMode); } diff --git a/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart b/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart index b94db5c57..a61b459c6 100644 --- a/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart @@ -88,20 +88,8 @@ extension UserPermissionsRoomExtension on Room { return false; } - final isSpaceAdmin = isRoomAdmin; - final isChildRoomAdmin = room?.isRoomAdmin ?? true; - - // if user is not admin of child room, return false - if (!isChildRoomAdmin) return false; - - // if the child room is a space, or will be a space, - // then the user must be an admin of the parent space - if (room?.isSpace ?? spaceMode) return isSpaceAdmin; - - // otherwise, the user can add the child room to the parent - // if they're the admin of the parent or if the parent creation - // of group chats - return isSpaceAdmin || (pangeaRoomRules?.isCreateRooms ?? false); + // Can add child if, and only if, admin of child + return room?.isRoomAdmin ?? true; } bool get _canIAddSpaceParents => From 9ed7507353b0c15ab79c826e54e0dc7c53d61032 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 22 Jul 2024 10:39:46 -0400 Subject: [PATCH 2/3] Remove canIAddSpaceChild --- .../children_and_parents_extension.dart | 2 +- .../pangea_room_extension.dart | 6 ----- .../room_analytics_extension.dart | 24 +++++++++---------- .../user_permissions_extension.dart | 16 +------------ .../widgets/class/add_space_toggles.dart | 2 +- 5 files changed, 14 insertions(+), 36 deletions(-) diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index 2f0596908..f5a2bf8de 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -131,7 +131,7 @@ extension ChildrenAndParentsRoomExtension on Room { spaceMode = child?.isSpace ?? spaceMode; // get the bool for adding chats to spaces - final bool canAddChild = _canIAddSpaceChild(child, spaceMode: spaceMode); + final bool canAddChild = child?.isRoomAdmin ?? true; if (!spaceMode) return canAddChild; // if adding space to a space, check if the child is an ancestor diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index f0094f994..edd32d96d 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -291,12 +291,6 @@ extension PangeaRoom on Room { bool get canDelete => _canDelete; - /// Determines whether user has permission to add child room to this - /// Can add child if, and only if, is admin of child - bool canIAddSpaceChild(Room? room, {bool spaceMode = false}) { - return _canIAddSpaceChild(room, spaceMode: spaceMode); - } - bool get canIAddSpaceParents => _canIAddSpaceParents; bool pangeaCanSendEvent(String eventType) => _pangeaCanSendEvent(eventType); diff --git a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart index a27526a2b..97ccc24ac 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart @@ -68,19 +68,17 @@ extension AnalyticsRoomExtension on Room { } if (spaceChildren.any((sc) => sc.roomId == analyticsRoom.id)) return; - if (canIAddSpaceChild(null)) { - try { - await setSpaceChild(analyticsRoom.id); - } catch (err) { - debugPrint( - "Failed to add analytics room ${analyticsRoom.id} for student to space $id", - ); - Sentry.addBreadcrumb( - Breadcrumb( - message: "Failed to add analytics room to space $id", - ), - ); - } + try { + await setSpaceChild(analyticsRoom.id); + } catch (err) { + debugPrint( + "Failed to add analytics room ${analyticsRoom.id} for student to space $id", + ); + Sentry.addBreadcrumb( + Breadcrumb( + message: "Failed to add analytics room to space $id", + ), + ); } } diff --git a/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart b/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart index a61b459c6..d066bf84f 100644 --- a/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart @@ -78,24 +78,10 @@ extension UserPermissionsRoomExtension on Room { bool get _canDelete => isSpaceAdmin; - bool _canIAddSpaceChild(Room? room, {bool spaceMode = false}) { - if (!isSpace) { - ErrorHandler.logError( - m: "should not call canIAddSpaceChildren on non-space room. Room id: $id", - data: toJson(), - s: StackTrace.current, - ); - return false; - } - - // Can add child if, and only if, admin of child - return room?.isRoomAdmin ?? true; - } - bool get _canIAddSpaceParents => _isRoomAdmin || pangeaCanSendEvent(EventTypes.SpaceParent); - //overriding the default canSendEvent to check power levels + // Overriding the default canSendEvent to check power levels bool _pangeaCanSendEvent(String eventType) { final powerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content; if (powerLevelsMap == null) return 0 <= ownPowerLevel; diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index c7d4fba71..b8cd622a2 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -79,7 +79,7 @@ class AddToSpaceState extends State { if (widget.activeSpaceId != null) { final activeSpace = Matrix.of(context).client.getRoomById(widget.activeSpaceId!); - if (activeSpace != null && activeSpace.canIAddSpaceChild(null)) { + if (activeSpace != null) { parent = activeSpace; } else { ErrorHandler.logError( From 5ce1d556b64111477090c2ae710e82b9f60c0b1f Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 22 Jul 2024 11:44:53 -0400 Subject: [PATCH 3/3] account for matrix space child permissions --- .../children_and_parents_extension.dart | 3 ++- .../room_analytics_extension.dart | 2 ++ .../widgets/class/add_space_toggles.dart | 26 ++++++++++--------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index f5a2bf8de..371af1768 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -131,7 +131,8 @@ extension ChildrenAndParentsRoomExtension on Room { spaceMode = child?.isSpace ?? spaceMode; // get the bool for adding chats to spaces - final bool canAddChild = child?.isRoomAdmin ?? true; + final bool canAddChild = + (child?.isRoomAdmin ?? true) && canSendEvent(EventTypes.SpaceChild); if (!spaceMode) return canAddChild; // if adding space to a space, check if the child is an ancestor diff --git a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart index 97ccc24ac..225e8be61 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart @@ -67,7 +67,9 @@ extension AnalyticsRoomExtension on Room { return Future.value(); } + if (!canSendEvent(EventTypes.SpaceChild)) return; if (spaceChildren.any((sc) => sc.roomId == analyticsRoom.id)) return; + try { await setSpaceChild(analyticsRoom.id); } catch (err) { diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index b8cd622a2..fd7843955 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -76,18 +76,6 @@ class AddToSpaceState extends State { ) : null; - if (widget.activeSpaceId != null) { - final activeSpace = - Matrix.of(context).client.getRoomById(widget.activeSpaceId!); - if (activeSpace != null) { - parent = activeSpace; - } else { - ErrorHandler.logError( - e: Exception('activeSpaceId ${widget.activeSpaceId} not found'), - ); - } - } - //sort possibleParents //if possibleParent in parents, put first //use sort but use any instead of contains because contains uses == and we want to compare by id @@ -102,6 +90,20 @@ class AddToSpaceState extends State { }); isOpen = widget.startOpen; + + if (widget.activeSpaceId != null) { + final activeSpace = + Matrix.of(context).client.getRoomById(widget.activeSpaceId!); + if (activeSpace == null) { + ErrorHandler.logError( + e: Exception('activeSpaceId ${widget.activeSpaceId} not found'), + ); + return; + } + if (activeSpace.canSendEvent(EventTypes.SpaceChild)) { + parent = activeSpace; + } + } } Future _addSingleSpace(String roomToAddId, Room newParent) async {