Search in sources :

Example 1 with ConflictException

use of org.jivesoftware.openfire.muc.ConflictException in project Openfire by igniterealtime.

the class LocalMUCRoom method joinRoom.

@Override
public LocalMUCRole joinRoom(String nickname, String password, HistoryRequest historyRequest, LocalMUCUser user, Presence presence) throws UnauthorizedException, UserAlreadyExistsException, RoomLockedException, ForbiddenException, RegistrationRequiredException, ConflictException, ServiceUnavailableException, NotAcceptableException {
    if (((MultiUserChatServiceImpl) mucService).getMUCDelegate() != null) {
        if (!((MultiUserChatServiceImpl) mucService).getMUCDelegate().joiningRoom(this, user.getAddress())) {
            // Delegate said no, reject join.
            throw new UnauthorizedException();
        }
    }
    LocalMUCRole joinRole = null;
    lock.writeLock().lock();
    boolean clientOnlyJoin = false;
    // A "client only join" here is one where the client is already joined, but has re-joined.
    try {
        // If the room has a limit of max user then check if the limit has been reached
        if (!canJoinRoom(user)) {
            throw new ServiceUnavailableException();
        }
        final JID bareJID = user.getAddress().asBareJID();
        boolean isOwner = owners.includes(bareJID);
        // If the room is locked and this user is not an owner raise a RoomLocked exception
        if (isLocked()) {
            if (!isOwner) {
                throw new RoomLockedException();
            }
        }
        // Check if the nickname is already used in the room
        if (occupantsByNickname.containsKey(nickname.toLowerCase())) {
            List<MUCRole> occupants = occupantsByNickname.get(nickname.toLowerCase());
            MUCRole occupant = occupants.size() > 0 ? occupants.get(0) : null;
            if (occupant != null && !occupant.getUserAddress().toBareJID().equals(bareJID.toBareJID())) {
                // Nickname is already used, and not by the same JID
                throw new UserAlreadyExistsException();
            }
            if (occupant.getUserAddress().equals(user.getAddress())) {
                // This user is already an occupant. The client thinks it isn't. (Or else this is a broken gmail).
                clientOnlyJoin = true;
            }
        }
        // Unauthorized exception
        if (isPasswordProtected()) {
            if (password == null || !password.equals(getPassword())) {
                throw new UnauthorizedException();
            }
        }
        // raise a ConflictException
        if (members.containsValue(nickname.toLowerCase())) {
            if (!nickname.toLowerCase().equals(members.get(bareJID))) {
                throw new ConflictException();
            }
        }
        if (isLoginRestrictedToNickname()) {
            String reservedNickname = members.get(bareJID);
            if (reservedNickname != null && !nickname.toLowerCase().equals(reservedNickname)) {
                throw new NotAcceptableException();
            }
        }
        // Set the corresponding role based on the user's affiliation
        MUCRole.Role role;
        MUCRole.Affiliation affiliation;
        if (isOwner) {
            // The user is an owner. Set the role and affiliation accordingly.
            role = MUCRole.Role.moderator;
            affiliation = MUCRole.Affiliation.owner;
        } else if (mucService.isSysadmin(bareJID)) {
            // The user is a system administrator of the MUC service. Treat him as an owner
            // although he won't appear in the list of owners
            role = MUCRole.Role.moderator;
            affiliation = MUCRole.Affiliation.owner;
        } else if (admins.includes(bareJID)) {
            // The user is an admin. Set the role and affiliation accordingly.
            role = MUCRole.Role.moderator;
            affiliation = MUCRole.Affiliation.admin;
        } else // explicit outcast status has higher precedence than member status
        if (outcasts.contains(bareJID)) {
            // The user is an outcast. Raise a "Forbidden" exception.
            throw new ForbiddenException();
        } else if (members.includesKey(bareJID)) {
            // The user is a member. Set the role and affiliation accordingly.
            role = MUCRole.Role.participant;
            affiliation = MUCRole.Affiliation.member;
        } else // this checks if the user is an outcast implicitly (via a group)
        if (outcasts.includes(bareJID)) {
            // The user is an outcast. Raise a "Forbidden" exception.
            throw new ForbiddenException();
        } else {
            // The user has no affiliation (i.e. NONE). Set the role accordingly.
            if (isMembersOnly()) {
                // "Registration Required" exception.
                throw new RegistrationRequiredException();
            }
            role = (isModerated() ? MUCRole.Role.visitor : MUCRole.Role.participant);
            affiliation = MUCRole.Affiliation.none;
        }
        if (!clientOnlyJoin) {
            // Create a new role for this user in this room
            joinRole = new LocalMUCRole(mucService, this, nickname, role, affiliation, user, presence, router);
            // Add the new user as an occupant of this room
            List<MUCRole> occupants = occupantsByNickname.get(nickname.toLowerCase());
            if (occupants == null) {
                occupants = new ArrayList<>();
                occupantsByNickname.put(nickname.toLowerCase(), occupants);
            }
            occupants.add(joinRole);
            // Update the tables of occupants based on the bare and full JID
            List<MUCRole> list = occupantsByBareJID.get(bareJID);
            if (list == null) {
                list = new ArrayList<>();
                occupantsByBareJID.put(bareJID, list);
            }
            list.add(joinRole);
            occupantsByFullJID.put(user.getAddress(), joinRole);
        } else {
            // Grab the existing one.
            joinRole = (LocalMUCRole) occupantsByFullJID.get(user.getAddress());
        }
    } finally {
        lock.writeLock().unlock();
    }
    // Notify other cluster nodes that a new occupant joined the room
    CacheFactory.doClusterTask(new OccupantAddedEvent(this, joinRole));
    // Send presence of existing occupants to new occupant
    sendInitialPresences(joinRole);
    // It is assumed that the room is new based on the fact that it's locked and
    // that it was locked when it was created.
    boolean isRoomNew = isLocked() && creationDate.getTime() == lockedTime;
    try {
        // Send the presence of this new occupant to existing occupants
        Presence joinPresence = joinRole.getPresence().createCopy();
        broadcastPresence(joinPresence, true);
    } catch (Exception e) {
        Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
    }
    // confirmed" message
    if (!isRoomNew && isLocked()) {
        // http://xmpp.org/extensions/xep-0045.html#enter-locked
        Presence presenceItemNotFound = new Presence(Presence.Type.error);
        presenceItemNotFound.setError(PacketError.Condition.item_not_found);
        presenceItemNotFound.setFrom(role.getRoleAddress());
        joinRole.send(presenceItemNotFound);
    }
    if (historyRequest == null) {
        Iterator<Message> history = roomHistory.getMessageHistory();
        while (history.hasNext()) {
            joinRole.send(history.next());
        }
    } else {
        historyRequest.sendHistory(joinRole, roomHistory);
    }
    Message roomSubject = roomHistory.getChangedSubject();
    if (roomSubject != null) {
        joinRole.send(roomSubject);
    }
    if (!clientOnlyJoin) {
        // Update the date when the last occupant left the room
        setEmptyDate(null);
        // Fire event that occupant joined the room
        MUCEventDispatcher.occupantJoined(getRole().getRoleAddress(), user.getAddress(), joinRole.getNickname());
    }
    return joinRole;
}
Also used : ForbiddenException(org.jivesoftware.openfire.muc.ForbiddenException) GroupJID(org.jivesoftware.openfire.group.GroupJID) JID(org.xmpp.packet.JID) Message(org.xmpp.packet.Message) ConflictException(org.jivesoftware.openfire.muc.ConflictException) OccupantAddedEvent(org.jivesoftware.openfire.muc.cluster.OccupantAddedEvent) ServiceUnavailableException(org.jivesoftware.openfire.muc.ServiceUnavailableException) UserAlreadyExistsException(org.jivesoftware.openfire.user.UserAlreadyExistsException) ForbiddenException(org.jivesoftware.openfire.muc.ForbiddenException) GroupNotFoundException(org.jivesoftware.openfire.group.GroupNotFoundException) RoomLockedException(org.jivesoftware.openfire.muc.RoomLockedException) CannotBeInvitedException(org.jivesoftware.openfire.muc.CannotBeInvitedException) NotAllowedException(org.jivesoftware.openfire.muc.NotAllowedException) UnauthorizedException(org.jivesoftware.openfire.auth.UnauthorizedException) NotFoundException(org.jivesoftware.util.NotFoundException) ConflictException(org.jivesoftware.openfire.muc.ConflictException) RegistrationRequiredException(org.jivesoftware.openfire.muc.RegistrationRequiredException) UserAlreadyExistsException(org.jivesoftware.openfire.user.UserAlreadyExistsException) IOException(java.io.IOException) UserNotFoundException(org.jivesoftware.openfire.user.UserNotFoundException) NotAcceptableException(org.jivesoftware.openfire.muc.NotAcceptableException) ServiceUnavailableException(org.jivesoftware.openfire.muc.ServiceUnavailableException) MUCRole(org.jivesoftware.openfire.muc.MUCRole) NotAcceptableException(org.jivesoftware.openfire.muc.NotAcceptableException) RoomLockedException(org.jivesoftware.openfire.muc.RoomLockedException) UnauthorizedException(org.jivesoftware.openfire.auth.UnauthorizedException) Presence(org.xmpp.packet.Presence) UpdatePresence(org.jivesoftware.openfire.muc.cluster.UpdatePresence) RegistrationRequiredException(org.jivesoftware.openfire.muc.RegistrationRequiredException)

Example 2 with ConflictException

use of org.jivesoftware.openfire.muc.ConflictException in project Openfire by igniterealtime.

the class LocalMUCRoom method addMember.

@Override
public List<Presence> addMember(JID jid, String nickname, MUCRole sendRole) throws ForbiddenException, ConflictException {
    final JID bareJID = jid.asBareJID();
    lock.writeLock().lock();
    try {
        MUCRole.Affiliation oldAffiliation = (members.containsKey(bareJID) ? MUCRole.Affiliation.member : MUCRole.Affiliation.none);
        if (isMembersOnly()) {
            if (!canOccupantsInvite()) {
                if (MUCRole.Affiliation.admin != sendRole.getAffiliation() && MUCRole.Affiliation.owner != sendRole.getAffiliation()) {
                    throw new ForbiddenException();
                }
            }
        } else {
            if (MUCRole.Affiliation.admin != sendRole.getAffiliation() && MUCRole.Affiliation.owner != sendRole.getAffiliation()) {
                throw new ForbiddenException();
            }
        }
        // Check if the desired nickname is already reserved for another member
        if (nickname != null && nickname.trim().length() > 0 && members.containsValue(nickname.toLowerCase())) {
            if (!nickname.equals(members.get(bareJID))) {
                throw new ConflictException();
            }
        } else if (isLoginRestrictedToNickname() && (nickname == null || nickname.trim().length() == 0)) {
            throw new ConflictException();
        }
        // Check that the room always has an owner
        if (owners.contains(bareJID) && owners.size() == 1) {
            throw new ConflictException();
        }
        // Check if user is already an member
        if (members.containsKey(bareJID)) {
            // Do nothing
            return Collections.emptyList();
        }
        // Associate the reserved nickname with the bareJID. If nickname is null then associate an
        // empty string
        members.put(bareJID, (nickname == null ? "" : nickname.toLowerCase()));
        // Remove the user from other affiliation lists
        if (removeOwner(bareJID)) {
            oldAffiliation = MUCRole.Affiliation.owner;
        } else if (removeAdmin(bareJID)) {
            oldAffiliation = MUCRole.Affiliation.admin;
        } else if (removeOutcast(bareJID)) {
            oldAffiliation = MUCRole.Affiliation.outcast;
        }
        // Update the DB if the room is persistent
        MUCPersistenceManager.saveAffiliationToDB(this, bareJID, nickname, MUCRole.Affiliation.member, oldAffiliation);
    } finally {
        lock.writeLock().unlock();
    }
    // Update other cluster nodes with new member
    CacheFactory.doClusterTask(new AddMember(this, jid.toBareJID(), (nickname == null ? "" : nickname)));
    // based on the group(s) of the affected user(s)
    return applyAffiliationChange(getRole(), bareJID, null);
}
Also used : ForbiddenException(org.jivesoftware.openfire.muc.ForbiddenException) MUCRole(org.jivesoftware.openfire.muc.MUCRole) GroupJID(org.jivesoftware.openfire.group.GroupJID) JID(org.xmpp.packet.JID) ConflictException(org.jivesoftware.openfire.muc.ConflictException) AddMember(org.jivesoftware.openfire.muc.cluster.AddMember)

Example 3 with ConflictException

use of org.jivesoftware.openfire.muc.ConflictException in project Openfire by igniterealtime.

the class LocalMUCRoom method addAdmin.

@Override
public List<Presence> addAdmin(JID jid, MUCRole sendRole) throws ForbiddenException, ConflictException {
    final JID bareJID = jid.asBareJID();
    lock.writeLock().lock();
    try {
        MUCRole.Affiliation oldAffiliation = MUCRole.Affiliation.none;
        if (MUCRole.Affiliation.owner != sendRole.getAffiliation()) {
            throw new ForbiddenException();
        }
        // Check that the room always has an owner
        if (owners.contains(bareJID) && owners.size() == 1) {
            throw new ConflictException();
        }
        // Check if user is already an admin
        if (admins.contains(bareJID)) {
            // Do nothing
            return Collections.emptyList();
        }
        admins.add(bareJID);
        // Remove the user from other affiliation lists
        if (removeOwner(bareJID)) {
            oldAffiliation = MUCRole.Affiliation.owner;
        } else if (removeMember(bareJID)) {
            oldAffiliation = MUCRole.Affiliation.member;
        } else if (removeOutcast(bareJID)) {
            oldAffiliation = MUCRole.Affiliation.outcast;
        }
        // Update the DB if the room is persistent
        MUCPersistenceManager.saveAffiliationToDB(this, bareJID, null, MUCRole.Affiliation.admin, oldAffiliation);
    } finally {
        lock.writeLock().unlock();
    }
    // Update other cluster nodes with new affiliation
    CacheFactory.doClusterTask(new AddAffiliation(this, jid.toBareJID(), MUCRole.Affiliation.admin));
    // based on the group(s) of the affected user(s)
    return applyAffiliationChange(getRole(), bareJID, null);
}
Also used : ForbiddenException(org.jivesoftware.openfire.muc.ForbiddenException) MUCRole(org.jivesoftware.openfire.muc.MUCRole) GroupJID(org.jivesoftware.openfire.group.GroupJID) JID(org.xmpp.packet.JID) ConflictException(org.jivesoftware.openfire.muc.ConflictException) AddAffiliation(org.jivesoftware.openfire.muc.cluster.AddAffiliation)

Example 4 with ConflictException

use of org.jivesoftware.openfire.muc.ConflictException in project Openfire by igniterealtime.

the class IQMUCRegisterHandler method handleIQ.

public IQ handleIQ(IQ packet) {
    IQ reply = null;
    // Get the target room
    MUCRoom room = null;
    String name = packet.getTo().getNode();
    if (name != null) {
        room = mucService.getChatRoom(name);
    }
    if (room == null) {
        // The room doesn't exist so answer a NOT_FOUND error
        reply = IQ.createResultIQ(packet);
        reply.setChildElement(packet.getChildElement().createCopy());
        reply.setError(PacketError.Condition.item_not_found);
        return reply;
    } else if (!room.isRegistrationEnabled() || (packet.getFrom() != null && MUCRole.Affiliation.outcast == room.getAffiliation(packet.getFrom().asBareJID()))) {
        // The room does not accept users to register or
        // the user is an outcast and is not allowed to register
        reply = IQ.createResultIQ(packet);
        reply.setChildElement(packet.getChildElement().createCopy());
        reply.setError(PacketError.Condition.not_allowed);
        return reply;
    }
    if (IQ.Type.get == packet.getType()) {
        reply = IQ.createResultIQ(packet);
        String nickname = room.getReservedNickname(packet.getFrom());
        Element currentRegistration = probeResult.createCopy();
        if (nickname != null) {
            // The user is already registered with the room so answer a completed form
            ElementUtil.setProperty(currentRegistration, "query.registered", null);
            currentRegistration.addElement("username").addText(nickname);
            Element form = currentRegistration.element(QName.get("x", "jabber:x:data"));
            currentRegistration.remove(form);
            //                @SuppressWarnings("unchecked")
            //				Iterator<Element> fields = form.elementIterator("field");
            //
            //                Element field;
            //                while (fields.hasNext()) {
            //                    field = fields.next();
            //                    if ("muc#register_roomnick".equals(field.attributeValue("var"))) {
            //                        field.addElement("value").addText(nickname);
            //                    }
            //                }
            reply.setChildElement(currentRegistration);
        } else {
            // The user is not registered with the room so answer an empty form
            reply.setChildElement(currentRegistration);
        }
    } else if (IQ.Type.set == packet.getType()) {
        try {
            // Keep a registry of the updated presences
            List<Presence> presences = new ArrayList<>();
            reply = IQ.createResultIQ(packet);
            Element iq = packet.getChildElement();
            if (ElementUtil.includesProperty(iq, "query.remove")) {
                // The user is deleting his registration
                presences.addAll(room.addNone(packet.getFrom(), room.getRole()));
            } else {
                // The user is trying to register with a room
                Element formElement = iq.element("x");
                // Check if a form was used to provide the registration info
                if (formElement != null) {
                    // Get the sent form
                    final DataForm registrationForm = new DataForm(formElement);
                    // Get the desired nickname sent in the form
                    List<String> values = registrationForm.getField("muc#register_roomnick").getValues();
                    String nickname = (!values.isEmpty() ? values.get(0) : null);
                    // TODO The rest of the fields of the form are ignored. If we have a
                    // requirement in the future where we need those fields we'll have to change
                    // MUCRoom.addMember in order to receive a RegistrationInfo (new class)
                    // Add the new member to the members list
                    presences.addAll(room.addMember(packet.getFrom(), nickname, room.getRole()));
                } else {
                    reply.setChildElement(packet.getChildElement().createCopy());
                    reply.setError(PacketError.Condition.bad_request);
                }
            }
            // Send the updated presences to the room occupants
            for (Presence presence : presences) {
                room.send(presence);
            }
        } catch (ForbiddenException e) {
            reply = IQ.createResultIQ(packet);
            reply.setChildElement(packet.getChildElement().createCopy());
            reply.setError(PacketError.Condition.forbidden);
        } catch (ConflictException e) {
            reply = IQ.createResultIQ(packet);
            reply.setChildElement(packet.getChildElement().createCopy());
            reply.setError(PacketError.Condition.conflict);
        } catch (Exception e) {
            Log.error(e.getMessage(), e);
        }
    }
    return reply;
}
Also used : ForbiddenException(org.jivesoftware.openfire.muc.ForbiddenException) MUCRoom(org.jivesoftware.openfire.muc.MUCRoom) ConflictException(org.jivesoftware.openfire.muc.ConflictException) Element(org.dom4j.Element) IQ(org.xmpp.packet.IQ) DataForm(org.xmpp.forms.DataForm) Presence(org.xmpp.packet.Presence) ArrayList(java.util.ArrayList) List(java.util.List) ForbiddenException(org.jivesoftware.openfire.muc.ForbiddenException) ConflictException(org.jivesoftware.openfire.muc.ConflictException)

Example 5 with ConflictException

use of org.jivesoftware.openfire.muc.ConflictException in project Openfire by igniterealtime.

the class IQOwnerHandler method processConfigurationForm.

/**
     * Processes the completed form sent by an owner of the room. This will modify the room's
     * configuration as well as the list of owners and admins.
     *
     * @param completedForm the completed form sent by an owner of the room.
     * @param senderRole the role of the user that sent the completed form.
     * @throws ForbiddenException if the user does not have enough privileges.
     * @throws ConflictException If the room was going to lose all of its owners.
     */
private void processConfigurationForm(DataForm completedForm, MUCRole senderRole) throws ForbiddenException, ConflictException {
    List<String> values;
    String booleanValue;
    FormField field;
    // Get the new list of admins
    field = completedForm.getField("muc#roomconfig_roomadmins");
    boolean adminsSent = field != null;
    List<JID> admins = new ArrayList<>();
    if (field != null) {
        for (String value : field.getValues()) {
            // maintained based on the user's bare JID, (...)"
            if (value != null && value.trim().length() != 0) {
                // could be a group jid
                admins.add(GroupJID.fromString((value.trim())).asBareJID());
            }
        }
    }
    // Get the new list of owners
    field = completedForm.getField("muc#roomconfig_roomowners");
    boolean ownersSent = field != null;
    List<JID> owners = new ArrayList<>();
    if (field != null) {
        for (String value : field.getValues()) {
            // maintained based on the user's bare JID, (...)"
            if (value != null && value.trim().length() != 0) {
                // could be a group jid
                owners.add(GroupJID.fromString((value.trim())).asBareJID());
            }
        }
    }
    // Answer a conflict error if all the current owners will be removed
    if (ownersSent && owners.isEmpty()) {
        throw new ConflictException();
    }
    // Keep a registry of the updated presences
    List<Presence> presences = new ArrayList<>(admins.size() + owners.size());
    field = completedForm.getField("muc#roomconfig_roomname");
    if (field != null) {
        final String value = field.getFirstValue();
        room.setNaturalLanguageName((value != null ? value : " "));
    }
    field = completedForm.getField("muc#roomconfig_roomdesc");
    if (field != null) {
        final String value = field.getFirstValue();
        room.setDescription((value != null ? value : " "));
    }
    field = completedForm.getField("muc#roomconfig_changesubject");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setCanOccupantsChangeSubject(("1".equals(booleanValue)));
    }
    field = completedForm.getField("muc#roomconfig_maxusers");
    if (field != null) {
        final String value = field.getFirstValue();
        room.setMaxUsers((value != null ? Integer.parseInt(value) : 30));
    }
    field = completedForm.getField("muc#roomconfig_presencebroadcast");
    if (field != null) {
        values = new ArrayList<>(field.getValues());
        room.setRolesToBroadcastPresence(values);
    }
    field = completedForm.getField("muc#roomconfig_publicroom");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setPublicRoom(("1".equals(booleanValue)));
    }
    field = completedForm.getField("muc#roomconfig_persistentroom");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        boolean isPersistent = ("1".equals(booleanValue));
        // Delete the room from the DB if it's no longer persistent
        if (room.isPersistent() && !isPersistent) {
            MUCPersistenceManager.deleteFromDB(room);
        }
        room.setPersistent(isPersistent);
    }
    field = completedForm.getField("muc#roomconfig_moderatedroom");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setModerated(("1".equals(booleanValue)));
    }
    field = completedForm.getField("muc#roomconfig_membersonly");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        presences.addAll(room.setMembersOnly(("1".equals(booleanValue))));
    }
    field = completedForm.getField("muc#roomconfig_allowinvites");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setCanOccupantsInvite(("1".equals(booleanValue)));
    }
    field = completedForm.getField("muc#roomconfig_passwordprotectedroom");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        boolean isPasswordProtected = "1".equals(booleanValue);
        if (isPasswordProtected) {
            // The room is password protected so set the new password
            field = completedForm.getField("muc#roomconfig_roomsecret");
            if (field != null) {
                final String secret = completedForm.getField("muc#roomconfig_roomsecret").getFirstValue();
                room.setPassword(secret);
            }
        } else {
            // The room is not password protected so remove any previous password
            room.setPassword(null);
        }
    }
    field = completedForm.getField("muc#roomconfig_whois");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setCanAnyoneDiscoverJID(("anyone".equals(booleanValue)));
    }
    field = completedForm.getField("muc#roomconfig_allowpm");
    if (field != null) {
        final String value = field.getFirstValue();
        room.setCanSendPrivateMessage(value);
    }
    field = completedForm.getField("muc#roomconfig_enablelogging");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setLogEnabled(("1".equals(booleanValue)));
    }
    field = completedForm.getField("x-muc#roomconfig_reservednick");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setLoginRestrictedToNickname(("1".equals(booleanValue)));
    }
    field = completedForm.getField("x-muc#roomconfig_canchangenick");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setChangeNickname(("1".equals(booleanValue)));
    }
    field = completedForm.getField("x-muc#roomconfig_registration");
    if (field != null) {
        final String value = field.getFirstValue();
        booleanValue = ((value != null ? value : "1"));
        room.setRegistrationEnabled(("1".equals(booleanValue)));
    }
    // Update the modification date to reflect the last time when the room's configuration
    // was modified
    room.setModificationDate(new Date());
    if (room.isPersistent()) {
        room.saveToDB();
    }
    // Set the new owners and admins of the room
    presences.addAll(room.addOwners(owners, senderRole));
    presences.addAll(room.addAdmins(admins, senderRole));
    if (ownersSent) {
        // Change the affiliation to "member" for the current owners that won't be neither
        // owner nor admin (if the form included the owners field)
        List<JID> ownersToRemove = new ArrayList<>(room.owners);
        ownersToRemove.removeAll(admins);
        ownersToRemove.removeAll(owners);
        for (JID jid : ownersToRemove) {
            // ignore group jids
            if (!GroupJID.isGroup(jid)) {
                presences.addAll(room.addMember(jid, null, senderRole));
            }
        }
    }
    if (adminsSent) {
        // Change the affiliation to "member" for the current admins that won't be neither
        // owner nor admin (if the form included the admins field)
        List<JID> adminsToRemove = new ArrayList<>(room.admins);
        adminsToRemove.removeAll(admins);
        adminsToRemove.removeAll(owners);
        for (JID jid : adminsToRemove) {
            // ignore group jids
            if (!GroupJID.isGroup(jid)) {
                presences.addAll(room.addMember(jid, null, senderRole));
            }
        }
    }
    // the room
    if (!room.isPersistent() && room.getOccupantsCount() == 0) {
        room.destroyRoom(null, null);
    }
    // Send the updated presences to the room occupants
    for (Object presence : presences) {
        room.send((Presence) presence);
    }
}
Also used : GroupJID(org.jivesoftware.openfire.group.GroupJID) JID(org.xmpp.packet.JID) ConflictException(org.jivesoftware.openfire.muc.ConflictException) ArrayList(java.util.ArrayList) Date(java.util.Date) Presence(org.xmpp.packet.Presence) FormField(org.xmpp.forms.FormField)

Aggregations

ConflictException (org.jivesoftware.openfire.muc.ConflictException)8 ForbiddenException (org.jivesoftware.openfire.muc.ForbiddenException)7 JID (org.xmpp.packet.JID)7 GroupJID (org.jivesoftware.openfire.group.GroupJID)6 MUCRole (org.jivesoftware.openfire.muc.MUCRole)5 Presence (org.xmpp.packet.Presence)4 AddAffiliation (org.jivesoftware.openfire.muc.cluster.AddAffiliation)3 ArrayList (java.util.ArrayList)2 MUCRoom (org.jivesoftware.openfire.muc.MUCRoom)2 IOException (java.io.IOException)1 Date (java.util.Date)1 List (java.util.List)1 Element (org.dom4j.Element)1 UnauthorizedException (org.jivesoftware.openfire.auth.UnauthorizedException)1 GroupNotFoundException (org.jivesoftware.openfire.group.GroupNotFoundException)1 CannotBeInvitedException (org.jivesoftware.openfire.muc.CannotBeInvitedException)1 NotAcceptableException (org.jivesoftware.openfire.muc.NotAcceptableException)1 NotAllowedException (org.jivesoftware.openfire.muc.NotAllowedException)1 RegistrationRequiredException (org.jivesoftware.openfire.muc.RegistrationRequiredException)1 RoomLockedException (org.jivesoftware.openfire.muc.RoomLockedException)1