diff --git a/changelog.html b/changelog.html index 0afc4a822..3d24eb0a7 100644 --- a/changelog.html +++ b/changelog.html @@ -44,10 +44,11 @@
Next Release at some date
+1.9.0 (tbd)
Payload Example 2 (available parameters):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<chatRoom>
- <roomName>global</roomName> <naturalName>global-2</naturalName> <description>Global Chat Room</description> <subject>global-2 Subject</subject> <creationDate>2014-02-12T15:52:37.592+01:00</creationDate> <modificationDate>2014-09-12T15:35:54.702+02:00</modificationDate> <maxUsers>0</maxUsers> <persistent>true</persistent> <publicRoom>true</publicRoom> <registrationEnabled>false</registrationEnabled> <canAnyoneDiscoverJID>false</canAnyoneDiscoverJID> <canOccupantsChangeSubject>false</canOccupantsChangeSubject> <canOccupantsInvite>false</canOccupantsInvite> <canChangeNickname>false</canChangeNickname> <logEnabled>true</logEnabled> <loginRestrictedToNickname>false</loginRestrictedToNickname> <membersOnly>false</membersOnly> <moderated>false</moderated> <broadcastPresenceRoles> <broadcastPresenceRole>moderator</broadcastPresenceRole> <broadcastPresenceRole>participant</broadcastPresenceRole> <broadcastPresenceRole>visitor</broadcastPresenceRole> </broadcastPresenceRoles> <owners> <owner>owner@localhost</owner> </owners> <admins> <admin>admin@localhost</admin> </admins> <members> <member>member2@localhost</member> <member>member1@localhost</member> </members> <outcasts> <outcast>outcast1@localhost</outcast> </outcasts></chatRoom>
+ <roomName>global</roomName> <naturalName>global-2</naturalName> <description>Global Chat Room</description> <subject>global-2 Subject</subject> <creationDate>2014-02-12T15:52:37.592+01:00</creationDate> <modificationDate>2014-09-12T15:35:54.702+02:00</modificationDate> <maxUsers>0</maxUsers> <persistent>true</persistent> <publicRoom>true</publicRoom> <registrationEnabled>false</registrationEnabled> <canAnyoneDiscoverJID>false</canAnyoneDiscoverJID> <canOccupantsChangeSubject>false</canOccupantsChangeSubject> <canOccupantsInvite>false</canOccupantsInvite> <canChangeNickname>false</canChangeNickname> <logEnabled>true</logEnabled> <loginRestrictedToNickname>false</loginRestrictedToNickname> <membersOnly>false</membersOnly> <moderated>false</moderated> <allowPM>anyone</allowPM> <broadcastPresenceRoles> <broadcastPresenceRole>moderator</broadcastPresenceRole> <broadcastPresenceRole>participant</broadcastPresenceRole> <broadcastPresenceRole>visitor</broadcastPresenceRole> </broadcastPresenceRoles> <owners> <owner>owner@localhost</owner> </owners> <admins> <admin>admin@localhost</admin> </admins> <members> <member>member2@localhost</member> <member>member1@localhost</member> </members> <outcasts> <outcast>outcast1@localhost</outcast> </outcasts></chatRoom>
@@ -1119,11 +1119,11 @@JSON Examples
Payload Example 2 (available parameters):
{ - "roomName": "global-1", "naturalName": "global-1_test_hello", "description": "Global chat room", "subject": "Global chat room subject", "creationDate": "2012-10-18T16:55:12.803+02:00", "modificationDate": "2014-07-10T09:49:12.411+02:00", "maxUsers": "0", "persistent": "true", "publicRoom": "true", "registrationEnabled": "false", "canAnyoneDiscoverJID": "true", "canOccupantsChangeSubject": "false", "canOccupantsInvite": "false", "canChangeNickname": "false", "logEnabled": "true", "loginRestrictedToNickname": "true", "membersOnly": "false", "moderated": "false", "broadcastPresenceRoles": { "broadcastPresenceRole": [ "moderator", "participant", "visitor" ] }, "owners": { "owner": "owner@localhost" }, "admins": { "admin": [ "admin@localhost", "admin2@localhost" ] }, "members": { "member": [ "member@localhost", "member2@localhost" ] }, "outcasts": { "outcast": [ "outcast@localhost", "outcast2@localhost" ] }} + "roomName": "global-1", "naturalName": "global-1_test_hello", "description": "Global chat room", "subject": "Global chat room subject", "creationDate": "2012-10-18T16:55:12.803+02:00", "modificationDate": "2014-07-10T09:49:12.411+02:00", "maxUsers": "0", "persistent": "true", "publicRoom": "true", "registrationEnabled": "false", "canAnyoneDiscoverJID": "true", "canOccupantsChangeSubject": "false", "canOccupantsInvite": "false", "canChangeNickname": "false", "logEnabled": "true", "loginRestrictedToNickname": "true", "membersOnly": "false", "moderated": "false", "allowPM": "anyone", "broadcastPresenceRoles": { "broadcastPresenceRole": [ "moderator", "participant", "visitor" ] }, "owners": { "owner": "owner@localhost" }, "admins": { "admin": [ "admin@localhost", "admin2@localhost" ] }, "members": { "member": [ "member@localhost", "member2@localhost" ] }, "outcasts": { "outcast": [ "outcast@localhost", "outcast2@localhost" ] }}REST API Version 1.3.0 and later - Payload Example 2 (available parameters):
{ - "roomName": "global-1", "naturalName": "global-1_test_hello", "description": "Global chat room", "subject": "Global chat room subject", "creationDate": "2012-10-18T16:55:12.803+02:00", "modificationDate": "2014-07-10T09:49:12.411+02:00", "maxUsers": "0", "persistent": "true", "publicRoom": "true", "registrationEnabled": "false", "canAnyoneDiscoverJID": "true", "canOccupantsChangeSubject": "false", "canOccupantsInvite": "false", "canChangeNickname": "false", "logEnabled": "true", "loginRestrictedToNickname": "true", "membersOnly": "false", "moderated": "false", "broadcastPresenceRoles": [ "moderator", "participant", "visitor" ], "owners": [ "owner@localhost" ], "admins": [ "admin@localhost" ], "members": [ "member@localhost" ], "outcasts": [ "outcast@localhost" ]} + "roomName": "global-1", "naturalName": "global-1_test_hello", "description": "Global chat room", "subject": "Global chat room subject", "creationDate": "2012-10-18T16:55:12.803+02:00", "modificationDate": "2014-07-10T09:49:12.411+02:00", "maxUsers": "0", "persistent": "true", "publicRoom": "true", "registrationEnabled": "false", "canAnyoneDiscoverJID": "true", "canOccupantsChangeSubject": "false", "canOccupantsInvite": "false", "canChangeNickname": "false", "logEnabled": "true", "loginRestrictedToNickname": "true", "membersOnly": "false", "moderated": "false", "allowPM": "anyone", "broadcastPresenceRoles": [ "moderator", "participant", "visitor" ], "owners": [ "owner@localhost" ], "admins": [ "admin@localhost" ], "members": [ "member@localhost" ], "outcasts": [ "outcast@localhost" ]}Delete a chat room Endpoint to delete a chat room.
@@ -1206,7 +1206,7 @@Possible parameters
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <chatRoom> - <roomName>global</roomName> <naturalName>global-2</naturalName> <description>Global Chat Room edit</description> <subject>New subject</subject> <password>test</password> <creationDate>2014-02-12T15:52:37.592+01:00</creationDate> <modificationDate>2014-09-12T14:20:56.286+02:00</modificationDate> <maxUsers>0</maxUsers> <persistent>true</persistent> <publicRoom>true</publicRoom> <registrationEnabled>false</registrationEnabled> <canAnyoneDiscoverJID>false</canAnyoneDiscoverJID> <canOccupantsChangeSubject>false</canOccupantsChangeSubject> <canOccupantsInvite>false</canOccupantsInvite> <canChangeNickname>false</canChangeNickname> <logEnabled>true</logEnabled> <loginRestrictedToNickname>false</loginRestrictedToNickname> <membersOnly>false</membersOnly> <moderated>false</moderated> <broadcastPresenceRoles/> <owners> <owner>owner@localhost</owner> </owners> <admins> <admin>admin@localhost</admin> </admins> <members> <member>member2@localhost</member> <member>member1@localhost</member> </members> <outcasts> <outcast>outcast1@localhost</outcast> </outcasts></chatRoom> + <roomName>global</roomName> <naturalName>global-2</naturalName> <description>Global Chat Room edit</description> <subject>New subject</subject> <password>test</password> <creationDate>2014-02-12T15:52:37.592+01:00</creationDate> <modificationDate>2014-09-12T14:20:56.286+02:00</modificationDate> <maxUsers>0</maxUsers> <persistent>true</persistent> <publicRoom>true</publicRoom> <registrationEnabled>false</registrationEnabled> <canAnyoneDiscoverJID>false</canAnyoneDiscoverJID> <canOccupantsChangeSubject>false</canOccupantsChangeSubject> <canOccupantsInvite>false</canOccupantsInvite> <canChangeNickname>false</canChangeNickname> <logEnabled>true</logEnabled> <loginRestrictedToNickname>false</loginRestrictedToNickname> <membersOnly>false</membersOnly> <moderated>false</moderated> <allowPM>anyone</allowPM> <broadcastPresenceRoles/> <owners> <owner>owner@localhost</owner> </owners> <admins> <admin>admin@localhost</admin> </admins> <members> <member>member2@localhost</member> <member>member1@localhost</member> </members> <outcasts> <outcast>outcast1@localhost</outcast> </outcasts></chatRoom>Invite user to a chat Room
Endpoint to invite a user to a room.
@@ -2360,6 +2360,11 @@ClusterNode
Yes Can be “true” or “false”. True if the room in which only those with “voice” may send messages to all occupants. ++ allowPM +Yes +One of “anyone”, “participants”, “moderators” or “none”. Controls who is allowed to send private messages to other occupants in the room. +broadcastPresenceRoles Yes diff --git a/readme.md b/readme.md index 31c99fe71..25a478ca5 100644 --- a/readme.md +++ b/readme.md @@ -848,6 +848,7 @@ Endpoint to create a new chat room.false false false +anyone moderator participant @@ -907,6 +908,7 @@ Endpoint to create a new chat room. "loginRestrictedToNickname": "true", "membersOnly": "false", "moderated": "false", + "allowPM": "anyone", "broadcastPresenceRoles": { "broadcastPresenceRole": [ "moderator", @@ -959,6 +961,7 @@ Endpoint to create a new chat room. "loginRestrictedToNickname": "true", "membersOnly": "false", "moderated": "false", + "allowPM": "anyone", "broadcastPresenceRoles": [ "moderator", "participant", @@ -1157,6 +1160,7 @@ Endpoint to update a chat room.false false false +anyone owner@localhost @@ -1924,6 +1928,7 @@ If you want to create a resource with JSON data format, please add "**Content-Ty | loginRestrictedToNickname | Yes | Can be "true" or "false". True if registered users can only join the room using their registered nickname. By default, registered users can join the room using any nickname. | | membersOnly | Yes | Can be "true" or "false". True if the room requires an invitation to enter. That is if the room is members-only. | | moderated | Yes | Can be "true" or "false". True if the room in which only those with "voice" may send messages to all occupants. | +| allowPM | Yes | One of "anyone", "participants", "moderators" or "none". Controls who is allowed to send private messages to other occupants in the room. | | broadcastPresenceRoles | Yes | The list of roles of which presence will be broadcasted to the rest of the occupants. | | owners | Yes | A collection with the current list of owners. The collection contains the bareJID of the users with owner affiliation. | | admins | Yes | A collection with the current list of admins. The collection contains the bareJID of the users with admin affiliation. | diff --git a/src/java/org/jivesoftware/openfire/plugin/rest/controller/MUCRoomController.java b/src/java/org/jivesoftware/openfire/plugin/rest/controller/MUCRoomController.java index 402093300..683e362c7 100644 --- a/src/java/org/jivesoftware/openfire/plugin/rest/controller/MUCRoomController.java +++ b/src/java/org/jivesoftware/openfire/plugin/rest/controller/MUCRoomController.java @@ -347,6 +347,7 @@ private void createRoom(MUCRoomEntity mucRoomEntity, String serviceName) throws room.setMaxUsers(mucRoomEntity.getMaxUsers()); room.setMembersOnly(mucRoomEntity.isMembersOnly()); room.setModerated(mucRoomEntity.isModerated()); + room.setCanSendPrivateMessage(mucRoomEntity.getAllowPM()); // Set broadcast presence roles if (mucRoomEntity.getBroadcastPresenceRoles() != null) { @@ -558,6 +559,7 @@ public MUCRoomEntity convertToMUCRoomEntity(MUCRoom room, boolean expand) { mucRoomEntity.setMaxUsers(room.getMaxUsers()); mucRoomEntity.setMembersOnly(room.isMembersOnly()); mucRoomEntity.setModerated(room.isModerated()); + mucRoomEntity.setAllowPM(room.canSendPrivateMessage()); ConcurrentGroupListowners = new ConcurrentGroupList<>(room.getOwners()); ConcurrentGroupList admins = new ConcurrentGroupList<>(room.getAdmins()); diff --git a/src/java/org/jivesoftware/openfire/plugin/rest/entity/MUCRoomEntity.java b/src/java/org/jivesoftware/openfire/plugin/rest/entity/MUCRoomEntity.java index 72bd0f9c0..b7582bb74 100644 --- a/src/java/org/jivesoftware/openfire/plugin/rest/entity/MUCRoomEntity.java +++ b/src/java/org/jivesoftware/openfire/plugin/rest/entity/MUCRoomEntity.java @@ -17,6 +17,7 @@ package org.jivesoftware.openfire.plugin.rest.entity; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.Date; import java.util.List; @@ -31,7 +32,7 @@ "modificationDate", "maxUsers", "persistent", "publicRoom", "registrationEnabled", "canAnyoneDiscoverJID", "canOccupantsChangeSubject", "canOccupantsInvite", "canChangeNickname", "logEnabled", "loginRestrictedToNickname", "membersOnly", "moderated", "broadcastPresenceRoles", "owners", "admins", - "members", "outcasts", "ownerGroups", "adminGroups", "memberGroups", "outcastGroups" }) + "members", "outcasts", "ownerGroups", "adminGroups", "memberGroups", "outcastGroups", "allowPM" }) public class MUCRoomEntity { private String roomName; @@ -56,6 +57,7 @@ public class MUCRoomEntity { private boolean loginRestrictedToNickname; private boolean membersOnly; private boolean moderated; + private String allowPM; private List broadcastPresenceRoles; @@ -255,6 +257,16 @@ public void setModerated(boolean moderated) { this.moderated = moderated; } + @XmlElement + @Schema(description = "Defines who is allowed to send private messages to other occupants. Must be one of \"anyone\", \"participants\", \"moderators\" or \"none\".", example = "anyone") + public String getAllowPM() { + return allowPM == null ? "anyone" : allowPM; + } + + public void setAllowPM(String allowPM) { + this.allowPM = allowPM == null ? "anyone" : allowPM; + } + @XmlElement(name = "broadcastPresenceRole") @XmlElementWrapper(name = "broadcastPresenceRoles") @JsonProperty(value = "broadcastPresenceRoles") diff --git a/src/test/java/org/jivesoftware/openfire/plugin/rest/service/MUCRoomServiceBackwardCompatibilityTest.java b/src/test/java/org/jivesoftware/openfire/plugin/rest/service/MUCRoomServiceBackwardCompatibilityTest.java index ed2a53ae9..9ff069c1a 100644 --- a/src/test/java/org/jivesoftware/openfire/plugin/rest/service/MUCRoomServiceBackwardCompatibilityTest.java +++ b/src/test/java/org/jivesoftware/openfire/plugin/rest/service/MUCRoomServiceBackwardCompatibilityTest.java @@ -88,6 +88,7 @@ public static MUCRoomController constructMockController() throws ServiceExceptio entity.setLoginRestrictedToNickname(false); entity.setMembersOnly(false); entity.setModerated(false); + entity.setAllowPM("anyone"); entity.setBroadcastPresenceRoles(Arrays.asList("moderator", "participant", "visitor")); entity.setOwners(Collections.singletonList("admin@example.org")); entity.setAdmins(Arrays.asList("john@example.org", "jane@example.org")); @@ -163,9 +164,17 @@ protected Application configure() { * The purpose of this test is to ensure that future versions of this plugin return a value that is compatible with * earlier versions of this plugin. * - * The value that is used for comparison was obtained using Openfire 4.5.6 with the restAPI plugin v1.4.0. Using the - * restAPI plugin v1.6.0 on Openfire 4.6.1 and 4.6.7, as well as the restAPI plugin v1.7.0 on Openfire 4.7.0 (using - * the same configuration of the room) yields the exact same result. + * The value that is used for comparison was obtained using Openfire 4.7.2 with the restAPI plugin v1.9.0. This + * value has been observed to be equal with one exception to that obtained from (using the same configuration of the + * room): + * + * + *
, + * + * The exception being the field 'allowPM', which has been added in version v1.9.0 of the restAPI plugin. * * The room configuration was based on a 'demoboot' server start in which a new MUC room is created, using these * values (leaving everything else on default): @@ -187,7 +196,7 @@ public void getChatRoomXml() { Response response = target("restapi/v1/chatrooms/lobby").request(MediaType.APPLICATION_XML).get(); String content = response.readEntity(String.class); - assertEquals("Content of response should match that generated by older versions of this plugin.", "- Openfire 4.5.6 with the restAPI plugin v1.4.0
+ *- restAPI plugin v1.6.0 on Openfire 4.6.1 and 4.6.7
+ *- restAPI plugin v1.7.0 on Openfire 4.7.0
+ *", content); + assertEquals("Content of response should match that generated by older versions of this plugin.", " lobby Lobby Welcome in our lobby! Introduction to XMPP 2022-02-07T16:09:51.517+01:00 2022-02-07T16:09:51.538+01:00 30 true true true true false false true true false false false moderator participant visitor admin@example.org john@example.org jane@example.org ", content); assertEquals("HTTP response should have a status code that is 200.", Response.Status.OK.getStatusCode(), response.getStatus()); } @@ -205,7 +214,7 @@ public void getChatRoomJson() { Response response = target("restapi/v1/chatrooms/lobby").request(MediaType.APPLICATION_JSON).get(); String content = response.readEntity(String.class); - assertEquals("Content of response should match that generated by older versions of this plugin.", "{\"roomName\":\"lobby\",\"naturalName\":\"Lobby\",\"description\":\"Welcome in our lobby!\",\"subject\":\"Introduction to XMPP\",\"creationDate\":1644246591517,\"modificationDate\":1644246591538,\"maxUsers\":30,\"persistent\":true,\"publicRoom\":true,\"registrationEnabled\":true,\"canAnyoneDiscoverJID\":true,\"canOccupantsChangeSubject\":false,\"canOccupantsInvite\":false,\"canChangeNickname\":true,\"logEnabled\":true,\"loginRestrictedToNickname\":false,\"membersOnly\":false,\"moderated\":false,\"broadcastPresenceRoles\":[\"moderator\",\"participant\",\"visitor\"],\"owners\":[\"admin@example.org\"],\"admins\":[\"john@example.org\",\"jane@example.org\"],\"members\":[],\"outcasts\":[],\"ownerGroups\":[],\"adminGroups\":[],\"memberGroups\":[],\"outcastGroups\":[]}", content); + assertEquals("Content of response should match that generated by older versions of this plugin.", "{\"roomName\":\"lobby\",\"naturalName\":\"Lobby\",\"description\":\"Welcome in our lobby!\",\"subject\":\"Introduction to XMPP\",\"creationDate\":1644246591517,\"modificationDate\":1644246591538,\"maxUsers\":30,\"persistent\":true,\"publicRoom\":true,\"registrationEnabled\":true,\"canAnyoneDiscoverJID\":true,\"canOccupantsChangeSubject\":false,\"canOccupantsInvite\":false,\"canChangeNickname\":true,\"logEnabled\":true,\"loginRestrictedToNickname\":false,\"membersOnly\":false,\"moderated\":false,\"broadcastPresenceRoles\":[\"moderator\",\"participant\",\"visitor\"],\"owners\":[\"admin@example.org\"],\"admins\":[\"john@example.org\",\"jane@example.org\"],\"members\":[],\"outcasts\":[],\"ownerGroups\":[],\"adminGroups\":[],\"memberGroups\":[],\"outcastGroups\":[],\"allowPM\":\"anyone\"}", content); assertEquals("HTTP response should have a status code that is 200.", Response.Status.OK.getStatusCode(), response.getStatus()); } @@ -216,9 +225,17 @@ public void getChatRoomJson() { * The purpose of this test is to ensure that future versions of this plugin return a value that is compatible with * earlier versions of this plugin. * - * The value that is used for comparison was obtained using Openfire 4.5.6 with the restAPI plugin v1.4.0. Using the - * restAPI plugin v1.6.0 on Openfire 4.6.1 and 4.6.7, as well as the restAPI plugin v1.7.0 on Openfire 4.7.0 (using - * the same configuration of the room) yields the exact same result. + * The value that is used for comparison was obtained using Openfire 4.7.2 with the restAPI plugin v1.9.0. This + * value has been observed to be equal with one exception to that obtained from (using the same configuration of the + * room): + * + * lobby Lobby Welcome in our lobby! Introduction to XMPP 2022-02-07T16:09:51.517+01:00 2022-02-07T16:09:51.538+01:00 30 true true true true false false true true false false false moderator participant visitor admin@example.org john@example.org jane@example.org anyone + *
, + * + * The exception being the field 'allowPM', which has been added in version v1.9.0 of the restAPI plugin. * * The room configuration was based on a 'demoboot' server start in which a new MUC room is created, using these * values (leaving everything else on default): @@ -240,7 +257,7 @@ public void getChatRoomsXml() { Response response = target("restapi/v1/chatrooms").request(MediaType.APPLICATION_XML).get(); String content = response.readEntity(String.class); - assertEquals("Content of response is: ", "- Openfire 4.5.6 with the restAPI plugin v1.4.0
+ *- restAPI plugin v1.6.0 on Openfire 4.6.1 and 4.6.7
+ *- restAPI plugin v1.7.0 on Openfire 4.7.0
+ *", content); + assertEquals("Content of response is: ", " lobby Lobby Welcome in our lobby! Introduction to XMPP 2022-02-07T16:09:51.517+01:00 2022-02-07T16:09:51.538+01:00 30 true true true true false false true true false false false moderator participant visitor admin@example.org john@example.org jane@example.org ", content); assertEquals("Http Response should be 200: ", Response.Status.OK.getStatusCode(), response.getStatus()); } @@ -258,7 +275,7 @@ public void getChatRoomsJson() { Response response = target("restapi/v1/chatrooms").request(MediaType.APPLICATION_JSON).get(); String content = response.readEntity(String.class); - assertEquals("Content of response is: ", "{\"chatRooms\":[{\"roomName\":\"lobby\",\"naturalName\":\"Lobby\",\"description\":\"Welcome in our lobby!\",\"subject\":\"Introduction to XMPP\",\"creationDate\":1644246591517,\"modificationDate\":1644246591538,\"maxUsers\":30,\"persistent\":true,\"publicRoom\":true,\"registrationEnabled\":true,\"canAnyoneDiscoverJID\":true,\"canOccupantsChangeSubject\":false,\"canOccupantsInvite\":false,\"canChangeNickname\":true,\"logEnabled\":true,\"loginRestrictedToNickname\":false,\"membersOnly\":false,\"moderated\":false,\"broadcastPresenceRoles\":[\"moderator\",\"participant\",\"visitor\"],\"owners\":[\"admin@example.org\"],\"admins\":[\"john@example.org\",\"jane@example.org\"],\"members\":[],\"outcasts\":[],\"ownerGroups\":[],\"adminGroups\":[],\"memberGroups\":[],\"outcastGroups\":[]}]}", content); + assertEquals("Content of response is: ", "{\"chatRooms\":[{\"roomName\":\"lobby\",\"naturalName\":\"Lobby\",\"description\":\"Welcome in our lobby!\",\"subject\":\"Introduction to XMPP\",\"creationDate\":1644246591517,\"modificationDate\":1644246591538,\"maxUsers\":30,\"persistent\":true,\"publicRoom\":true,\"registrationEnabled\":true,\"canAnyoneDiscoverJID\":true,\"canOccupantsChangeSubject\":false,\"canOccupantsInvite\":false,\"canChangeNickname\":true,\"logEnabled\":true,\"loginRestrictedToNickname\":false,\"membersOnly\":false,\"moderated\":false,\"broadcastPresenceRoles\":[\"moderator\",\"participant\",\"visitor\"],\"owners\":[\"admin@example.org\"],\"admins\":[\"john@example.org\",\"jane@example.org\"],\"members\":[],\"outcasts\":[],\"ownerGroups\":[],\"adminGroups\":[],\"memberGroups\":[],\"outcastGroups\":[],\"allowPM\":\"anyone\"}]}", content); assertEquals("Http Response should be 200: ", Response.Status.OK.getStatusCode(), response.getStatus()); } lobby Lobby Welcome in our lobby! Introduction to XMPP 2022-02-07T16:09:51.517+01:00 2022-02-07T16:09:51.538+01:00 30 true true true true false false true true false false false moderator participant visitor admin@example.org john@example.org jane@example.org anyone