/** * $RCSfile$ * $Revision: 3174 $ * $Date: 2005-12-08 17:41:00 -0300 (Thu, 08 Dec 2005) $ * * Copyright (C) 2004 Jive Software. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */ package org.jivesoftware.wildfire.net; import org.dom4j.Element; import org.jivesoftware.util.JiveGlobals; import org.jivesoftware.wildfire.ClientSession; import org.jivesoftware.wildfire.PacketRouter; import org.jivesoftware.wildfire.RoutingTable; import org.jivesoftware.wildfire.auth.UnauthorizedException; import org.xmlpull.v1.XmlPullParserException; import org.xmpp.packet.IQ; import org.xmpp.packet.Message; import org.xmpp.packet.Presence; import java.io.IOException; import java.net.Socket; /** * A SocketReader specialized for client connections. This reader will be used when the open * stream contains a jabber:client namespace. Received packet will have their FROM attribute * overriden to avoid spoofing.<p> * * By default the hostname specified in the stream header sent by clients will not be validated. * When validated the TO attribute of the stream header has to match the server name or a valid * subdomain. If the value of the 'to' attribute is not valid then a host-unknown error * will be returned. To enable the validation set the system property * <b>xmpp.client.validate.host</b> to true. * * @author Gaston Dombiak */ public class ClientSocketReader extends SocketReader { public ClientSocketReader(PacketRouter router, RoutingTable routingTable, String serverName, Socket socket, SocketConnection connection, boolean useBlockingMode) { super(router, routingTable, serverName, socket, connection, useBlockingMode); } protected void processIQ(IQ packet) throws UnauthorizedException { // Overwrite the FROM attribute to avoid spoofing packet.setFrom(session.getAddress()); super.processIQ(packet); } protected void processPresence(Presence packet) throws UnauthorizedException { // Overwrite the FROM attribute to avoid spoofing packet.setFrom(session.getAddress()); super.processPresence(packet); } protected void processMessage(Message packet) throws UnauthorizedException { // Overwrite the FROM attribute to avoid spoofing packet.setFrom(session.getAddress()); super.processMessage(packet); } /** * Only packets of type Message, Presence and IQ can be processed by this class. Any other * type of packet is unknown and thus rejected generating the connection to be closed. * * @param doc the unknown DOM element that was received * @return always false. */ protected boolean processUnknowPacket(Element doc) { return false; } boolean createSession(String namespace) throws UnauthorizedException, XmlPullParserException, IOException { if ("jabber:client".equals(namespace)) { // The connected client is a regular client so create a ClientSession session = ClientSession.createSession(serverName, reader, connection); return true; } return false; } String getNamespace() { return "jabber:client"; } String getName() { return "Client SR - " + hashCode(); } boolean validateHost() { return JiveGlobals.getBooleanProperty("xmpp.client.validate.host",false); } }