IQOwnerHandler.java 31.2 KB
Newer Older
Matt Tucker's avatar
Matt Tucker committed
1 2 3 4 5
/**
 * $RCSfile$
 * $Revision$
 * $Date$
 *
Matt Tucker's avatar
Matt Tucker committed
6
 * Copyright (C) 2004 Jive Software. All rights reserved.
Matt Tucker's avatar
Matt Tucker committed
7
 *
Matt Tucker's avatar
Matt Tucker committed
8 9
 * This software is published under the terms of the GNU Public License (GPL),
 * a copy of which is included in this distribution.
Matt Tucker's avatar
Matt Tucker committed
10
 */
Matt Tucker's avatar
Matt Tucker committed
11

Matt Tucker's avatar
Matt Tucker committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
package org.jivesoftware.messenger.muc.spi;

import org.jivesoftware.messenger.forms.DataForm;
import org.jivesoftware.messenger.forms.FormField;
import org.jivesoftware.messenger.forms.spi.XDataFormImpl;
import org.jivesoftware.messenger.forms.spi.XFormFieldImpl;
import org.jivesoftware.messenger.muc.ConflictException;
import org.jivesoftware.messenger.muc.ForbiddenException;
import org.jivesoftware.messenger.muc.MUCRole;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.messenger.*;
import org.jivesoftware.messenger.auth.UnauthorizedException;
import org.jivesoftware.messenger.user.UserNotFoundException;
import java.util.*;

import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.QName;

/**
 * A handler for the IQ packet with namespace http://jabber.org/protocol/muc#owner. This kind of 
 * packets are usually sent by room owners. So this handler provides the necessary functionality
 * to support owner requirements such as: room configuration and room destruction.
 *
 * @author Gaston Dombiak
 */
public class IQOwnerHandler {
    private MUCRoomImpl room;

    private PacketRouter router;

    private XDataFormImpl configurationForm;

    private MetaDataFragment probeResult;

    public IQOwnerHandler(MUCRoomImpl chatroom, PacketRouter packetRouter) {
        this.room = chatroom;
        this.router = packetRouter;
        init();
    }

    public void handleIQ(IQ packet, MUCRole role) throws ForbiddenException, UnauthorizedException,
            ConflictException {
        // Only owners can send packets with the namespace "http://jabber.org/protocol/muc#owner"
        if (MUCRole.OWNER != role.getAffiliation()) {
            throw new ForbiddenException();
        }

        IQ reply = packet.createResult();
        Element element = ((XMPPDOMFragment)packet.getChildFragment()).getRootElement();

        // Analyze the action to perform based on the included element
        Element formElement = element.element(QName.get("x", "jabber:x:data"));
        if (formElement != null) {
            handleDataFormElement(role, formElement, reply);
        }
        else {
            Element destroyElement = element.element("destroy");
            if (destroyElement != null) {
                room.destroyRoom(destroyElement.attributeValue("jid"), destroyElement
                        .elementTextTrim("reason"));
            }
            else {
                List itemsList = element.elements("item");
                if (!itemsList.isEmpty()) {
                    handleItemsElement(itemsList, role, reply);
                }
                else {
                    // If no element was included in the query element then answer the
                    // configuration form
                    if (!element.elementIterator().hasNext()) {
                        refreshConfigurationFormValues();
                        reply.setChildFragment(probeResult);
                    }
                    // An unknown and possibly incorrect element was included in the query
                    // element so answer a BAD_REQUEST error
                    else {
                        reply.setError(XMPPError.Code.BAD_REQUEST);
                    }
                }
            }
        }
        router.route(reply);
    }

    /**
     * Handles packets that includes item elements. Depending on the item's attributes the
     * interpretation of the request may differ. For example, an item that only contains the
     * "affiliation" attribute is requesting the list of owners or admins. Whilst if the item
     * contains the affiliation together with a jid means that the client is changing the
     * affiliation of the requested jid.
     *
     * @param itemsList  the list of items sent by the client.
     * @param senderRole the role of the user that is sent the items.
     * @param reply      the iq packet that will be sent back as a reply to the client's request.
     * @throws ForbiddenException if the user does not have enough permissions.
     */
    private void handleItemsElement(List itemsList, MUCRole senderRole, IQ reply)
            throws ForbiddenException, ConflictException {
        Element item;
        String affiliation = null;
        boolean hasJID = ((Element)itemsList.get(0)).attributeValue("jid") != null;
        boolean hasNick = ((Element)itemsList.get(0)).attributeValue("nick") != null;
        // Check if the client is requesting or changing the list of owners/admin
        if (!hasJID && !hasNick) {
            // The client is requesting the list of owners or admins
            for (Iterator items = itemsList.iterator(); items.hasNext();) {
                item = (Element)items.next();
                affiliation = item.attributeValue("affiliation");
                // Create the result that will hold an item for each owner or admin
                MetaDataFragment result = new MetaDataFragment(DocumentHelper.createElement(QName
                        .get("query", "http://jabber.org/protocol/muc#owner")));

                if ("owner".equals(affiliation)) {
                    // The client is requesting the list of owners
                    MetaDataFragment ownerMetaData;
                    String jid;
                    MUCRole role;
130 131
                    for (Iterator<String> owners = room.getOwners(); owners.hasNext();) {
                        jid = owners.next();
132 133 134
                        ownerMetaData =
                                new MetaDataFragment("http://jabber.org/protocol/muc#owner",
                                        "item");
Matt Tucker's avatar
Matt Tucker committed
135 136 137 138
                        ownerMetaData.setProperty("item:affiliation", "owner");
                        ownerMetaData.setProperty("item:jid", jid);
                        // Add role and nick to the metadata if the user is in the room
                        try {
139 140
                            List<MUCRole> roles = room.getOccupantsByBareJID(jid);
                            role = roles.get(0);
Matt Tucker's avatar
Matt Tucker committed
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
                            ownerMetaData.setProperty("item:role", role.getRoleAsString());
                            ownerMetaData.setProperty("item:nick", role.getNickname());
                        }
                        catch (UserNotFoundException e) {
                            // Do nothing
                        }
                        // Add the item with the owner's information to the result
                        result.addFragment(ownerMetaData);
                    }
                    // Add the result items to the reply
                    reply.addFragment(result);
                }
                else if ("admin".equals(affiliation)) {
                    // The client is requesting the list of admins
                    MetaDataFragment adminMetaData;
                    String jid;
                    MUCRole role;
158 159
                    for (Iterator<String> admins = room.getAdmins(); admins.hasNext();) {
                        jid = admins.next();
160 161 162
                        adminMetaData =
                                new MetaDataFragment("http://jabber.org/protocol/muc#owner",
                                        "item");
Matt Tucker's avatar
Matt Tucker committed
163 164 165 166
                        adminMetaData.setProperty("item:affiliation", "admin");
                        adminMetaData.setProperty("item:jid", jid);
                        // Add role and nick to the metadata if the user is in the room
                        try {
167 168
                            List<MUCRole> roles = room.getOccupantsByBareJID(jid);
                            role = roles.get(0);
Matt Tucker's avatar
Matt Tucker committed
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
                            adminMetaData.setProperty("item:role", role.getRoleAsString());
                            adminMetaData.setProperty("item:nick", role.getNickname());
                        }
                        catch (UserNotFoundException e) {
                            // Do nothing
                        }
                        // Add the item with the admin's information to the result
                        result.addFragment(adminMetaData);
                    }
                    // Add the result items to the reply
                    reply.addFragment(result);
                }
                else {
                    reply.setError(XMPPError.Code.BAD_REQUEST);
                }
            }
        }
        else {
            // The client is modifying the list of owners or admins
188
            Map<String,String> jids = new HashMap<String,String>();
Matt Tucker's avatar
Matt Tucker committed
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
            String bareJID = null;
            String nick;
            // Collect the new affiliations for the specified jids
            for (Iterator items = itemsList.iterator(); items.hasNext();) {
                try {
                    item = (Element)items.next();
                    affiliation = item.attributeValue("affiliation");
                    if (hasJID) {
                        bareJID = XMPPAddress.parseBareAddress(item.attributeValue("jid"));
                    }
                    else {
                        // Get the bare JID based on the requested nick
                        nick = item.attributeValue("nick");
                        bareJID = room.getOccupant(nick).getChatUser().getAddress()
                                .toBareStringPrep();
                    }
                    jids.put(bareJID, affiliation);
                }
                catch (UserNotFoundException e) {
                    // Do nothing
                }
            }

            // Keep a registry of the updated presences
213
            List<Presence> presences = new ArrayList<Presence>(jids.size());
Matt Tucker's avatar
Matt Tucker committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229

            room.lock.readLock().lock();
            try {
                // Check if all the existing owners are being removed
                if (jids.keySet().containsAll(room.owners)) {
                    // Answer a conflict error if we are only removing ALL the owners
                    if (!jids.containsValue("owner")) {
                        reply.setError(XMPPError.Code.CONFLICT);
                        return;
                    }
                }

                room.lock.readLock().unlock();
                room.lock.writeLock().lock();
                try {
                    String targetAffiliation = null;
230 231 232
                    for (Iterator<String> it = jids.keySet().iterator(); it.hasNext();) {
                        bareJID = it.next();
                        targetAffiliation = jids.get(bareJID);
Matt Tucker's avatar
Matt Tucker committed
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
                        if ("owner".equals(targetAffiliation)) {
                            // Add the new user as an owner of the room
                            presences.addAll(room.addOwner(bareJID, senderRole));
                        }
                        else if ("admin".equals(targetAffiliation)) {
                            // Add the new user as an admin of the room
                            presences.addAll(room.addAdmin(bareJID, senderRole));
                        }
                        else if ("member".equals(targetAffiliation)) {
                            // Add the new user as a member of the room
                            presences.addAll(room.addMember(bareJID, null, senderRole));
                        }
                        else if ("none".equals(targetAffiliation)) {
                            // Set that this jid has a NONE affiliation
                            presences.addAll(room.addNone(bareJID, senderRole));
                        }
                    }
                }
                finally {
                    room.lock.writeLock().unlock();
                    room.lock.readLock().lock();
                }
            }
            finally {
                room.lock.readLock().unlock();
            }

            // Send the updated presences to the room occupants
            try {
262 263
                for (Presence presence : presences) {
                    room.send(presence);
Matt Tucker's avatar
Matt Tucker committed
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
                }
            }
            catch (UnauthorizedException e) {
                // Do nothing
            }
        }
    }

    /**
     * Handles packets that includes a data form. The data form was sent using an element with name
     * "x" and namespace "jabber:x:data".
     *
     * @param senderRole  the role of the user that sent the data form.
     * @param formElement the element that contains the data form specification.
     * @param reply       the iq packet that will be sent back as a reply to the client's request.
     * @throws UnauthorizedException If the user doesn't have permission to destroy/configure the
     *                               room.
     * @throws ForbiddenException    if the user does not have enough privileges.
     */
    private void handleDataFormElement(MUCRole senderRole, Element formElement, IQ reply)
            throws UnauthorizedException, ForbiddenException, ConflictException {
        XDataFormImpl completedForm = new XDataFormImpl();
        completedForm.parse(formElement);

        if (DataForm.TYPE_CANCEL.equals(completedForm.getType())) {
            // If the room was just created (i.e. is locked) and the owner cancels the configuration
            // form then destroy the room
            if (room.isLocked()) {
                room.destroyRoom(null, null);
            }
        }
        else if (DataForm.TYPE_SUBMIT.equals(completedForm.getType())) {
            // The owner is requesting an instant room
            if (completedForm.getFieldsSize() == 0) {
                // Do nothing
            }
            // The owner is requesting a reserved room or is changing the current configuration
            else {
                processConfigurationForm(completedForm, senderRole, reply);
            }
            // If the room was locked, unlock it and send to the owner the "room is now unlocked"
            // message
            if (room.isLocked()) {
307
                room.unlockRoom(senderRole);
Matt Tucker's avatar
Matt Tucker committed
308 309 310 311 312 313
            }
        }
    }

    private void processConfigurationForm(XDataFormImpl completedForm, MUCRole senderRole, IQ reply)
            throws ForbiddenException, ConflictException {
314
        Iterator<String> values;
Matt Tucker's avatar
Matt Tucker committed
315 316 317 318 319
        String booleanValue;
        List list;
        FormField field;

        // Get the new list of admins
320
        field = completedForm.getField("muc#roomconfig_roomadmins");
321
        List<String> admins = new ArrayList<String>();
Matt Tucker's avatar
Matt Tucker committed
322 323 324 325 326 327 328 329
        if (field != null) {
            values = field.getValues();
            while (values.hasNext()) {
                admins.add(values.next());
            }
        }

        // Get the new list of owners
330
        field = completedForm.getField("muc#roomconfig_roomowners");
331
        List<String> owners = new ArrayList<String>();
Matt Tucker's avatar
Matt Tucker committed
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
        if (field != null) {
            values = field.getValues();
            while (values.hasNext()) {
                owners.add(values.next());
            }
        }

        // Answer a conflic error if all the current owners will be removed
        if (owners.isEmpty()) {
            reply.setError(XMPPError.Code.CONFLICT);
            return;
        }

        // Keep a registry of the updated presences
        List presences = new ArrayList(admins.size() + owners.size());

        room.lock.writeLock().lock();
        try {
350
            field = completedForm.getField("muc#roomconfig_roomname");
Matt Tucker's avatar
Matt Tucker committed
351 352
            if (field != null) {
                values = field.getValues();
353
                room.setNaturalLanguageName((values.hasNext() ? values.next() : " "));
Matt Tucker's avatar
Matt Tucker committed
354 355
            }

356
            field = completedForm.getField("muc#roomconfig_roomdesc");
Matt Tucker's avatar
Matt Tucker committed
357 358
            if (field != null) {
                values = field.getValues();
359
                room.setDescription((values.hasNext() ? values.next() : " "));
Matt Tucker's avatar
Matt Tucker committed
360 361
            }

362
            field = completedForm.getField("muc#roomconfig_changesubject");
Matt Tucker's avatar
Matt Tucker committed
363 364
            if (field != null) {
                values = field.getValues();
365
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
366 367 368
                room.setCanOccupantsChangeSubject(("1".equals(booleanValue) ? true : false));
            }

369
            field = completedForm.getField("muc#roomconfig_maxusers");
Matt Tucker's avatar
Matt Tucker committed
370 371
            if (field != null) {
                values = field.getValues();
372
                room.setMaxUsers((values.hasNext() ? Integer.parseInt(values.next()) : 30));
Matt Tucker's avatar
Matt Tucker committed
373 374
            }

375
            field = completedForm.getField("muc#roomconfig_presencebroadcast");
Matt Tucker's avatar
Matt Tucker committed
376 377 378 379 380 381 382 383 384
            if (field != null) {
                values = field.getValues();
                list = new ArrayList();
                while (values.hasNext()) {
                    list.add(values.next());
                }
                room.setRolesToBroadcastPresence(list);
            }

385
            field = completedForm.getField("muc#roomconfig_publicroom");
Matt Tucker's avatar
Matt Tucker committed
386 387
            if (field != null) {
                values = field.getValues();
388
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
389 390 391
                room.setPublicRoom(("1".equals(booleanValue) ? true : false));
            }

392
            field = completedForm.getField("muc#roomconfig_persistentroom");
Matt Tucker's avatar
Matt Tucker committed
393 394
            if (field != null) {
                values = field.getValues();
395
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
396 397 398 399 400 401 402 403
                boolean isPersistent = ("1".equals(booleanValue) ? true : false);
                // Delete the room from the DB if it's no longer persistent
                if (room.isPersistent() && !isPersistent) {
                    MUCPersistenceManager.deleteFromDB(room);
                }
                room.setPersistent(isPersistent);
            }

404
            field = completedForm.getField("muc#roomconfig_moderatedroom");
Matt Tucker's avatar
Matt Tucker committed
405 406
            if (field != null) {
                values = field.getValues();
407
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
408 409 410
                room.setModerated(("1".equals(booleanValue) ? true : false));
            }

411
            field = completedForm.getField("muc#roomconfig_inviteonly");
Matt Tucker's avatar
Matt Tucker committed
412 413
            if (field != null) {
                values = field.getValues();
414
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
415 416 417
                room.setInvitationRequiredToEnter(("1".equals(booleanValue) ? true : false));
            }

418
            field = completedForm.getField("muc#roomconfig_allowinvites");
Matt Tucker's avatar
Matt Tucker committed
419 420
            if (field != null) {
                values = field.getValues();
421
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
422 423 424
                room.setCanOccupantsInvite(("1".equals(booleanValue) ? true : false));
            }

425
            field = completedForm.getField("muc#roomconfig_passwordprotectedroom");
Matt Tucker's avatar
Matt Tucker committed
426 427
            if (field != null) {
                values = field.getValues();
428
                booleanValue = (values.hasNext() ? values.next() : "1");
429 430 431
                boolean isPasswordProtected = "1".equals(booleanValue);
                if (isPasswordProtected) {
                    // The room is password protected so set the new password
432
                    field = completedForm.getField("muc#roomconfig_roomsecret");
433
                    if (field != null) {
434
                        values = completedForm.getField("muc#roomconfig_roomsecret").getValues();
435
                        room.setPassword((values.hasNext() ? values.next() : null));
436 437 438 439 440 441
                    }
                }
                else {
                    // The room is not password protected so remove any previous password
                    room.setPassword(null);
                }
Matt Tucker's avatar
Matt Tucker committed
442 443
            }

444
            field = completedForm.getField("muc#roomconfig_whois");
Matt Tucker's avatar
Matt Tucker committed
445 446
            if (field != null) {
                values = field.getValues();
447
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
448 449 450
                room.setCanAnyoneDiscoverJID(("anyone".equals(booleanValue) ? true : false));
            }

451
            field = completedForm.getField("muc#roomconfig_enablelogging");
Matt Tucker's avatar
Matt Tucker committed
452 453
            if (field != null) {
                values = field.getValues();
454
                booleanValue = (values.hasNext() ? values.next() : "1");
Matt Tucker's avatar
Matt Tucker committed
455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
                room.setLogEnabled(("1".equals(booleanValue) ? true : false));
            }
            
            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));

            // Change the affiliation to "member" for the current owners that won't be neither
            // owner nor admin
            List ownersToRemove = new ArrayList(room.owners);
            ownersToRemove.removeAll(admins);
            ownersToRemove.removeAll(owners);
            String jid;
            for (Iterator it = ownersToRemove.iterator(); it.hasNext();) {
                jid = (String)it.next();
                presences.addAll(room.addMember(jid, null, senderRole));
            }

            // Change the affiliation to "member" for the current admins that won't be neither
            // owner nor admin
            List adminsToRemove = new ArrayList(room.admins);
            adminsToRemove.removeAll(admins);
            adminsToRemove.removeAll(owners);
            for (Iterator it = adminsToRemove.iterator(); it.hasNext();) {
                jid = (String)it.next();
                presences.addAll(room.addMember(jid, null, senderRole));
            }

        }
        finally {
            room.lock.writeLock().unlock();
        }

        // Send the updated presences to the room occupants
        try {
            for (Iterator it = presences.iterator(); it.hasNext();) {
                room.send((Presence)it.next());
            }
        }
        catch (UnauthorizedException e) {
            // Do nothing
        }
    }

    private void refreshConfigurationFormValues() {
        room.lock.readLock().lock();
        try {
506
            FormField field = configurationForm.getField("muc#roomconfig_roomname");
Matt Tucker's avatar
Matt Tucker committed
507
            field.clearValues();
508
            field.addValue(room.getNaturalLanguageName());
Matt Tucker's avatar
Matt Tucker committed
509

510
            field = configurationForm.getField("muc#roomconfig_roomdesc");
Matt Tucker's avatar
Matt Tucker committed
511 512 513
            field.clearValues();
            field.addValue(room.getDescription());

514
            field = configurationForm.getField("muc#roomconfig_changesubject");
Matt Tucker's avatar
Matt Tucker committed
515 516 517
            field.clearValues();
            field.addValue((room.canOccupantsChangeSubject() ? "1" : "0"));

518
            field = configurationForm.getField("muc#roomconfig_maxusers");
Matt Tucker's avatar
Matt Tucker committed
519 520 521
            field.clearValues();
            field.addValue(Integer.toString(room.getMaxUsers()));

522
            field = configurationForm.getField("muc#roomconfig_presencebroadcast");
Matt Tucker's avatar
Matt Tucker committed
523 524 525 526 527
            field.clearValues();
            for (Iterator it = room.getRolesToBroadcastPresence(); it.hasNext();) {
                field.addValue((String)it.next());
            }

528
            field = configurationForm.getField("muc#roomconfig_publicroom");
Matt Tucker's avatar
Matt Tucker committed
529 530 531
            field.clearValues();
            field.addValue((room.isPublicRoom() ? "1" : "0"));

532
            field = configurationForm.getField("muc#roomconfig_persistentroom");
Matt Tucker's avatar
Matt Tucker committed
533 534 535
            field.clearValues();
            field.addValue((room.isPersistent() ? "1" : "0"));

536
            field = configurationForm.getField("muc#roomconfig_moderatedroom");
Matt Tucker's avatar
Matt Tucker committed
537 538 539
            field.clearValues();
            field.addValue((room.isModerated() ? "1" : "0"));

540
            field = configurationForm.getField("muc#roomconfig_inviteonly");
Matt Tucker's avatar
Matt Tucker committed
541 542 543
            field.clearValues();
            field.addValue((room.isInvitationRequiredToEnter() ? "1" : "0"));

544
            field = configurationForm.getField("muc#roomconfig_allowinvites");
Matt Tucker's avatar
Matt Tucker committed
545 546 547
            field.clearValues();
            field.addValue((room.canOccupantsInvite() ? "1" : "0"));

548
            field = configurationForm.getField("muc#roomconfig_passwordprotectedroom");
Matt Tucker's avatar
Matt Tucker committed
549 550 551
            field.clearValues();
            field.addValue((room.isPasswordProtected() ? "1" : "0"));

552
            field = configurationForm.getField("muc#roomconfig_roomsecret");
Matt Tucker's avatar
Matt Tucker committed
553 554 555
            field.clearValues();
            field.addValue(room.getPassword());

556
            field = configurationForm.getField("muc#roomconfig_whois");
Matt Tucker's avatar
Matt Tucker committed
557 558 559
            field.clearValues();
            field.addValue((room.canAnyoneDiscoverJID() ? "anyone" : "moderators"));

560
            field = configurationForm.getField("muc#roomconfig_enablelogging");
Matt Tucker's avatar
Matt Tucker committed
561 562 563
            field.clearValues();
            field.addValue((room.isLogEnabled() ? "1" : "0"));

564
            field = configurationForm.getField("muc#roomconfig_roomadmins");
Matt Tucker's avatar
Matt Tucker committed
565
            field.clearValues();
566 567
            for (Iterator<String> it = room.getAdmins(); it.hasNext();) {
                field.addValue(it.next());
Matt Tucker's avatar
Matt Tucker committed
568 569
            }

570
            field = configurationForm.getField("muc#roomconfig_roomowners");
Matt Tucker's avatar
Matt Tucker committed
571
            field.clearValues();
572 573
            for (Iterator<String> it = room.getOwners(); it.hasNext();) {
                field.addValue(it.next());
Matt Tucker's avatar
Matt Tucker committed
574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592
            }
        }
        finally {
            room.lock.readLock().unlock();
        }
    }

    private void init() {
        Element element = DocumentHelper.createElement(QName.get("query",
                "http://jabber.org/protocol/muc#owner"));

        configurationForm = new XDataFormImpl(DataForm.TYPE_FORM);
        configurationForm.setTitle(LocaleUtils.getLocalizedString("muc.form.conf.title"));
        List params = new ArrayList();
        params.add(room.getName());
        configurationForm.addInstruction(LocaleUtils.getLocalizedString("muc.form.conf.instruction", params));

        XFormFieldImpl field = new XFormFieldImpl("FORM_TYPE");
        field.setType(FormField.TYPE_HIDDEN);
593
        field.addValue("http://jabber.org/protocol/muc#roomconfig");
Matt Tucker's avatar
Matt Tucker committed
594 595
        configurationForm.addField(field);

596
        field = new XFormFieldImpl("muc#roomconfig_roomname");
Matt Tucker's avatar
Matt Tucker committed
597 598 599 600
        field.setType(FormField.TYPE_TEXT_SINGLE);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_roomname"));
        configurationForm.addField(field);

601
        field = new XFormFieldImpl("muc#roomconfig_roomdesc");
Matt Tucker's avatar
Matt Tucker committed
602 603 604 605
        field.setType(FormField.TYPE_TEXT_SINGLE);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_roomdesc"));
        configurationForm.addField(field);

606
        field = new XFormFieldImpl("muc#roomconfig_changesubject");
Matt Tucker's avatar
Matt Tucker committed
607 608 609 610
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_changesubject"));
        configurationForm.addField(field);

611
        field = new XFormFieldImpl("muc#roomconfig_maxusers");
Matt Tucker's avatar
Matt Tucker committed
612 613 614 615 616 617 618 619 620 621
        field.setType(FormField.TYPE_LIST_SINGLE);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_maxusers"));
        field.addOption("10", "10");
        field.addOption("20", "20");
        field.addOption("30", "30");
        field.addOption("40", "40");
        field.addOption("50", "50");
        field.addOption(LocaleUtils.getLocalizedString("muc.form.conf.none"), "0");
        configurationForm.addField(field);

622
        field = new XFormFieldImpl("muc#roomconfig_presencebroadcast");
Matt Tucker's avatar
Matt Tucker committed
623 624 625 626 627 628 629
        field.setType(FormField.TYPE_LIST_MULTI);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_presencebroadcast"));
        field.addOption(LocaleUtils.getLocalizedString("muc.form.conf.moderator"), "moderator");
        field.addOption(LocaleUtils.getLocalizedString("muc.form.conf.participant"), "participant");
        field.addOption(LocaleUtils.getLocalizedString("muc.form.conf.visitor"), "visitor");
        configurationForm.addField(field);

630
        field = new XFormFieldImpl("muc#roomconfig_publicroom");
Matt Tucker's avatar
Matt Tucker committed
631 632 633 634
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_publicroom"));
        configurationForm.addField(field);

635
        field = new XFormFieldImpl("muc#roomconfig_persistentroom");
Matt Tucker's avatar
Matt Tucker committed
636 637 638 639
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_persistentroom"));
        configurationForm.addField(field);

640
        field = new XFormFieldImpl("muc#roomconfig_moderatedroom");
Matt Tucker's avatar
Matt Tucker committed
641 642 643 644
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_moderatedroom"));
        configurationForm.addField(field);

645
        field = new XFormFieldImpl("muc#roomconfig_inviteonly");
Matt Tucker's avatar
Matt Tucker committed
646 647 648 649 650 651 652 653 654
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_inviteonly"));
        configurationForm.addField(field);

        field = new XFormFieldImpl();
        field.setType(FormField.TYPE_FIXED);
        field.addValue(LocaleUtils.getLocalizedString("muc.form.conf.allowinvitesfixed"));
        configurationForm.addField(field);

655
        field = new XFormFieldImpl("muc#roomconfig_allowinvites");
Matt Tucker's avatar
Matt Tucker committed
656 657 658 659
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_allowinvites"));
        configurationForm.addField(field);

660
        field = new XFormFieldImpl("muc#roomconfig_passwordprotectedroom");
Matt Tucker's avatar
Matt Tucker committed
661 662 663 664 665 666 667 668 669
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_passwordprotectedroom"));
        configurationForm.addField(field);

        field = new XFormFieldImpl();
        field.setType(FormField.TYPE_FIXED);
        field.addValue(LocaleUtils.getLocalizedString("muc.form.conf.roomsecretfixed"));
        configurationForm.addField(field);

670
        field = new XFormFieldImpl("muc#roomconfig_roomsecret");
Matt Tucker's avatar
Matt Tucker committed
671 672 673 674
        field.setType(FormField.TYPE_TEXT_PRIVATE);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_roomsecret"));
        configurationForm.addField(field);

675
        field = new XFormFieldImpl("muc#roomconfig_whois");
Matt Tucker's avatar
Matt Tucker committed
676 677 678 679 680 681
        field.setType(FormField.TYPE_LIST_SINGLE);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_whois"));
        field.addOption(LocaleUtils.getLocalizedString("muc.form.conf.moderator"), "moderators");
        field.addOption(LocaleUtils.getLocalizedString("muc.form.conf.anyone"), "anyone");
        configurationForm.addField(field);

682
        field = new XFormFieldImpl("muc#roomconfig_enablelogging");
Matt Tucker's avatar
Matt Tucker committed
683 684 685 686 687 688 689 690 691
        field.setType(FormField.TYPE_BOOLEAN);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_enablelogging"));
        configurationForm.addField(field);

        field = new XFormFieldImpl();
        field.setType(FormField.TYPE_FIXED);
        field.addValue(LocaleUtils.getLocalizedString("muc.form.conf.roomadminsfixed"));
        configurationForm.addField(field);

692
        field = new XFormFieldImpl("muc#roomconfig_roomadmins");
Matt Tucker's avatar
Matt Tucker committed
693 694 695 696 697 698 699 700 701
        field.setType(FormField.TYPE_JID_MULTI);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_roomadmins"));
        configurationForm.addField(field);

        field = new XFormFieldImpl();
        field.setType(FormField.TYPE_FIXED);
        field.addValue(LocaleUtils.getLocalizedString("muc.form.conf.roomownersfixed"));
        configurationForm.addField(field);

702
        field = new XFormFieldImpl("muc#roomconfig_roomowners");
Matt Tucker's avatar
Matt Tucker committed
703 704 705 706 707 708 709 710 711
        field.setType(FormField.TYPE_JID_MULTI);
        field.setLabel(LocaleUtils.getLocalizedString("muc.form.conf.owner_roomowners"));
        configurationForm.addField(field);

        // Create the probeResult and add the basic info together with the configuration form
        probeResult = new MetaDataFragment(element);
        probeResult.addFragment(configurationForm);
    }
}