1 11 12 package org.jivesoftware.messenger.muc.spi; 13 14 import org.dom4j.DocumentHelper; 15 import org.dom4j.Element; 16 import org.dom4j.QName; 17 import org.jivesoftware.messenger.forms.DataForm; 18 import org.jivesoftware.messenger.forms.FormField; 19 import org.jivesoftware.messenger.forms.spi.XDataFormImpl; 20 import org.jivesoftware.messenger.forms.spi.XFormFieldImpl; 21 import org.jivesoftware.messenger.muc.ConflictException; 22 import org.jivesoftware.messenger.muc.ForbiddenException; 23 import org.jivesoftware.messenger.muc.MUCRoom; 24 import org.jivesoftware.messenger.muc.MultiUserChatServer; 25 import org.jivesoftware.util.ElementUtil; 26 import org.jivesoftware.util.LocaleUtils; 27 import org.jivesoftware.util.Log; 28 import org.xmpp.packet.IQ; 29 import org.xmpp.packet.PacketError; 30 import org.xmpp.packet.Presence; 31 32 import java.util.ArrayList ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 36 43 class IQMUCRegisterHandler { 44 45 private static Element probeResult; 46 private MultiUserChatServer mucServer; 47 48 public IQMUCRegisterHandler(MultiUserChatServer mucServer) { 49 this.mucServer = mucServer; 50 initialize(); 51 } 52 53 public void initialize() { 54 if (probeResult == null) { 55 XDataFormImpl registrationForm = new XDataFormImpl(DataForm.TYPE_FORM); 58 registrationForm.setTitle(LocaleUtils.getLocalizedString("muc.form.reg.title")); 59 registrationForm.addInstruction(LocaleUtils 60 .getLocalizedString("muc.form.reg.instruction")); 61 62 XFormFieldImpl field = new XFormFieldImpl("FORM_TYPE"); 63 field.setType(FormField.TYPE_HIDDEN); 64 field.addValue("http://jabber.org/protocol/muc#register"); 65 registrationForm.addField(field); 66 67 field = new XFormFieldImpl("muc#register_first"); 68 field.setType(FormField.TYPE_TEXT_SINGLE); 69 field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.first-name")); 70 field.setRequired(true); 71 registrationForm.addField(field); 72 73 field = new XFormFieldImpl("muc#register_last"); 74 field.setType(FormField.TYPE_TEXT_SINGLE); 75 field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.last-name")); 76 field.setRequired(true); 77 registrationForm.addField(field); 78 79 field = new XFormFieldImpl("muc#register_roomnick"); 80 field.setType(FormField.TYPE_TEXT_SINGLE); 81 field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.nickname")); 82 field.setRequired(true); 83 registrationForm.addField(field); 84 85 field = new XFormFieldImpl("muc#register_url"); 86 field.setType(FormField.TYPE_TEXT_SINGLE); 87 field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.url")); 88 registrationForm.addField(field); 89 90 field = new XFormFieldImpl("muc#register_email"); 91 field.setType(FormField.TYPE_TEXT_SINGLE); 92 field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.email")); 93 registrationForm.addField(field); 94 95 field = new XFormFieldImpl("muc#register_faqentry"); 96 field.setType(FormField.TYPE_TEXT_MULTI); 97 field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.faqentry")); 98 registrationForm.addField(field); 99 100 probeResult = DocumentHelper.createElement(QName.get("query", "jabber:iq:register")); 102 probeResult.add(registrationForm.asXMLElement()); 103 } 104 } 105 106 public IQ handleIQ(IQ packet) { 107 IQ reply = null; 108 MUCRoom room = mucServer.getChatRoom(packet.getTo().getNode()); 110 if (room == null) { 111 reply = IQ.createResultIQ(packet); 113 reply.setChildElement(packet.getChildElement().createCopy()); 114 reply.setError(PacketError.Condition.item_not_found); 115 return reply; 116 } 117 else if (!room.isRegistrationEnabled()) { 118 reply = IQ.createResultIQ(packet); 120 reply.setChildElement(packet.getChildElement().createCopy()); 121 reply.setError(PacketError.Condition.not_allowed); 122 return reply; 123 } 124 125 if (IQ.Type.get == packet.getType()) { 126 reply = IQ.createResultIQ(packet); 127 String nickname = room.getReservedNickname(packet.getFrom().toBareJID()); 128 Element currentRegistration = probeResult.createCopy(); 129 if (nickname != null) { 130 ElementUtil.setProperty(currentRegistration, "query.registered", null); 132 Element form = currentRegistration.element(QName.get("x", "jabber:x:data")); 133 Iterator fields = form.elementIterator("field"); 134 Element field; 135 while (fields.hasNext()) { 136 field = (Element) fields.next(); 137 if ("muc#register_roomnick".equals(field.attributeValue("var"))) { 138 field.addElement("value").addText(nickname); 139 } 140 } 141 reply.setChildElement(currentRegistration); 142 } 143 else { 144 reply.setChildElement(currentRegistration); 146 } 147 } 148 else if (IQ.Type.set == packet.getType()) { 149 try { 150 List <Presence> presences = new ArrayList <Presence>(); 152 153 reply = IQ.createResultIQ(packet); 154 Element iq = packet.getChildElement(); 155 156 if (ElementUtil.includesProperty(iq, "query.remove")) { 157 presences.addAll(room.addNone(packet.getFrom().toBareJID(), room.getRole())); 159 } 160 else { 161 Element formElement = iq.element("x"); 163 if (formElement != null) { 165 XDataFormImpl registrationForm = new XDataFormImpl(); 167 registrationForm.parse(formElement); 168 Iterator <String > values = registrationForm.getField("muc#register_roomnick") 170 .getValues(); 171 String nickname = (values.hasNext() ? values.next() : null); 172 173 177 presences.addAll(room.addMember(packet.getFrom().toBareJID(), 179 nickname, 180 room.getRole())); 181 } 182 else { 183 reply.setChildElement(packet.getChildElement().createCopy()); 184 reply.setError(PacketError.Condition.bad_request); 185 } 186 } 187 for (Presence presence : presences) { 189 room.send(presence); 190 } 191 192 } 193 catch (ForbiddenException e) { 194 reply = IQ.createResultIQ(packet); 195 reply.setChildElement(packet.getChildElement().createCopy()); 196 reply.setError(PacketError.Condition.forbidden); 197 } 198 catch (ConflictException e) { 199 reply = IQ.createResultIQ(packet); 200 reply.setChildElement(packet.getChildElement().createCopy()); 201 reply.setError(PacketError.Condition.conflict); 202 } 203 catch (Exception e) { 204 Log.error(e); 205 } 206 } 207 return reply; 208 } 209 } 210 | Popular Tags |