/* * Copyright (C) 1999-2008 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.openfire.fastpath.providers; import org.jivesoftware.xmpp.workgroup.DbProperties; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.jivesoftware.xmpp.workgroup.WorkgroupManager; import org.jivesoftware.xmpp.workgroup.WorkgroupProvider; import org.dom4j.Element; import org.xmpp.packet.IQ; import org.xmpp.packet.JID; import org.xmpp.packet.PacketError; import java.util.StringTokenizer; public class MonitorProvider implements WorkgroupProvider { public boolean handleGet(IQ packet) { Element iq = packet.getChildElement(); String name = iq.getName(); return "monitor".equals(name); } public boolean handleSet(IQ packet) { Element iq = packet.getChildElement(); String name = iq.getName(); return "monitor".equals(name); } public void executeGet(IQ packet, Workgroup workgroup) { IQ reply = IQ.createResultIQ(packet); JID from = packet.getFrom(); String bareJID = from.toBareJID(); boolean isMonitor = false; // Retrieve the sound settings. String monitors = workgroup.getProperties().getProperty("monitors"); if (monitors != null) { StringTokenizer tkn = new StringTokenizer(monitors, ","); while (tkn.hasMoreTokens()) { String agent = tkn.nextToken(); if (agent.equalsIgnoreCase(bareJID)) { isMonitor = true; } } } Element monitorElement = reply.setChildElement("monitor", "http://jivesoftware.com/protocol/workgroup"); if (!isMonitor) { monitorElement.addElement("isMonitor").setText("false"); } else { monitorElement.addElement("isMonitor").setText("true"); } workgroup.send(reply); } public void executeSet(IQ packet, Workgroup workgroup) { IQ reply = null; Element iq = packet.getChildElement(); try { JID from = packet.getFrom(); String bareJID = from.toBareJID(); if (!isOwner(bareJID, workgroup)) { reply = IQ.createResultIQ(packet); reply.setChildElement(packet.getChildElement().createCopy()); reply.setError(new PacketError(PacketError.Condition.forbidden)); workgroup.send(reply); return; } // Verify that an agent is requesting this information. WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); if (iq.element("makeOwner") != null) { String sessionID = iq.element("makeOwner").attributeValue("sessionID"); final String serviceName = workgroupManager.getMUCServiceName(); final String roomName = sessionID + "@" + serviceName; // final String roomJID = roomName + "/" + workgroup.getJID().getNode(); IQ iqPacket = new IQ(IQ.Type.set); iqPacket.setTo(roomName); iqPacket.setFrom(workgroup.getFullJID()); Element query = iqPacket.setChildElement("query", "http://jabber.org/protocol/muc#admin"); Element item = query.addElement("item"); item.addAttribute("affiliation", "owner"); item.addAttribute("jid", packet.getFrom().toBareJID()); workgroup.send(iqPacket); } reply = IQ.createResultIQ(packet); } catch (Exception e) { reply = IQ.createResultIQ(packet); reply.setChildElement(packet.getChildElement().createCopy()); reply.setError(new PacketError(PacketError.Condition.item_not_found)); } workgroup.send(reply); } private boolean isOwner(String jid, Workgroup workgroup) { DbProperties props = workgroup.getProperties(); // Add monitors if you wish :) String monitors = props.getProperty("monitors"); if (monitors != null) { StringTokenizer tkn = new StringTokenizer(monitors, ","); while (tkn.hasMoreTokens()) { String monitor = tkn.nextToken(); if (monitor.equalsIgnoreCase(jid)) { return true; } } } return false; } }