blob: 250042967ddad74db7ea515983df67d697c975ec [file] [log] [blame]
/*
* This file is part of the QuickServer library
* Copyright (C) QuickServer.org
*
* Use, modification, copying and distribution of this software is subject to
* the terms and conditions of the GNU Lesser General Public License.
* You should have received a copy of the GNU LGP License along with this
* library; if not, you can download a copy from <http://www.quickserver.org/>.
*
* For questions, suggestions, bug-reports, enhancement-requests etc.
* visit http://www.quickserver.org
*
*/
package org.quickserver.net.server;
import java.io.*;
import java.net.SocketTimeoutException;
import org.quickserver.net.AppException;
import org.quickserver.net.ConnectionLostException;
import org.quickserver.util.io.*;
/**
* This class is used to authenticate a client when
* it connects to QuickServer. Only single instance of this class
* will be used per QuickServer to handle all authentication.
* Should have a default constructor.
* <p>
* Ex:
* <code><BLOCKQUOTE><pre>
package echoserver;
import org.quickserver.net.server.*;
import java.io.*;
public class EchoServerQuickAuthenticator extends QuickAuthenticator {
public boolean askAuthorisation(ClientHandler clientHandler)
throws IOException {
String username = askStringInput(clientHandler, "User Name :");
String password = askStringInput(clientHandler, "Password :");
if(username==null || password ==null)
return false;
if(username.equals(password)) {
sendString(clientHandler, "Auth OK");
return true;
} else {
sendString(clientHandler, "Auth Failed");
return false;
}
}
}
</pre></BLOCKQUOTE></code></p>
* @author Akshathkumar Shetty
* @since 1.3
*/
public abstract class QuickAuthenticator
implements Authenticator {
public abstract boolean askAuthorisation(ClientHandler clientHandler)
throws IOException, AppException;
/**
* Prints the given message to the client.
* @param msg Message to send.
* If <code>null</code> is passed it will not send any thing.
*/
public void sendString(ClientHandler clientHandler, String msg)
throws IOException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.STRING)
clientHandler.setDataMode(DataMode.STRING, DataType.OUT);
clientHandler.sendClientMsg(msg);
}
}
/**
* Prints the given message to the client and reads a line of input.
* @return the line of input read from the client.
* @param msg Message to send before reading input. If received String is
* <code>null</code> it will throw {@link ConnectionLostException}.
* If <code>null</code> is passed it will not send any thing.
* @exception IOException if an I/O error occurs
*/
public String askStringInput(ClientHandler clientHandler, String msg)
throws IOException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.STRING)
clientHandler.setDataMode(DataMode.STRING, DataType.OUT);
clientHandler.sendClientMsg(msg);
}
if(clientHandler.getDataMode(DataType.IN)!=DataMode.STRING)
clientHandler.setDataMode(DataMode.STRING, DataType.IN);
String data = null;
if(clientHandler.hasEvent(ClientEvent.RUN_BLOCKING)) {
data = clientHandler.getBufferedReader().readLine();
} else {
ByteBufferInputStream bbin = (ByteBufferInputStream)
clientHandler.getInputStream();
data = bbin.readLine();
}
if(data!=null)
return data;
else
throw new ConnectionLostException();
}
/**
* Sends the given object to the client.
* @param msg Message to send.
* If <code>null</code> is passed it will not send any thing.
*/
public void sendObject(ClientHandler clientHandler, Object msg)
throws IOException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.OBJECT)
clientHandler.setDataMode(DataMode.OBJECT, DataType.OUT);
clientHandler.sendClientObject(msg);
}
}
/**
* Prints the given message to the client and reads a Object from input.
* @return the Object from input read from the client. If received Object is
* <code>null</code> it will throw {@link ConnectionLostException}.
* @param msg Message to send before reading input.
* If <code>null</code> is passed it will not send any thing.
* @exception IOException if an I/O error occurs
*/
public Object askObjectInput(ClientHandler clientHandler, Object msg)
throws IOException, ClassNotFoundException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.OBJECT)
clientHandler.setDataMode(DataMode.OBJECT, DataType.OUT);
clientHandler.sendClientObject(msg);
}
if(clientHandler.getDataMode(DataType.IN)!=DataMode.OBJECT)
clientHandler.setDataMode(DataMode.OBJECT, DataType.IN);
Object data = clientHandler.getObjectInputStream().readObject();
if(data!=null)
return data;
else
throw new ConnectionLostException();
}
/**
* Prints the given message to the client.
* @param msg Message to send.
* If <code>null</code> is passed it will not send any thing.
* @since 1.3.2
*/
public void sendByte(ClientHandler clientHandler, String msg)
throws IOException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.BYTE)
clientHandler.setDataMode(DataMode.BYTE, DataType.OUT);
clientHandler.sendClientBytes(msg);
}
}
/**
* Prints the given message to the client and reads a line of input.
* @return the line of input read from the client. If received byte is
* <code>null</code> it will throw {@link ConnectionLostException}.
* @param msg Message to send before reading input.
* If <code>null</code> is passed it will not send any thing.
* @exception IOException if an I/O error occurs
* @since 1.3.2
*/
public String askByteInput(ClientHandler clientHandler, String msg)
throws IOException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.BYTE)
clientHandler.setDataMode(DataMode.BYTE, DataType.OUT);
clientHandler.sendClientBytes(msg);
}
if(clientHandler.getDataMode(DataType.IN)!=DataMode.BYTE)
clientHandler.setDataMode(DataMode.BYTE, DataType.IN);
String data = clientHandler.readBytes();
if(data!=null)
return data;
else
throw new ConnectionLostException();
}
/**
* Sends the given binary data to the client.
* @param msg binary data to send.
* If <code>null</code> is passed it will not send any thing.
* @since 1.4
*/
public void sendBinary(ClientHandler clientHandler, byte msg[])
throws IOException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.BINARY)
clientHandler.setDataMode(DataMode.BINARY, DataType.OUT);
clientHandler.sendClientBinary(msg);
}
}
/**
* Sends the given binary data to the client and reads binary data input.
* @return the binary data input read from the client. If received byte is
* <code>null</code> it will throw {@link ConnectionLostException}.
* @param msg binary data to send before reading input.
* If <code>null</code> is passed it will not send any thing.
* @exception IOException if an I/O error occurs
* @since 1.4
*/
public byte[] askBinaryInput(ClientHandler clientHandler, byte msg[])
throws IOException {
if(msg!=null) {
if(clientHandler.getDataMode(DataType.OUT)!=DataMode.BINARY)
clientHandler.setDataMode(DataMode.BINARY, DataType.OUT);
clientHandler.sendClientBinary(msg);
}
if(clientHandler.getDataMode(DataType.IN)!=DataMode.BINARY)
clientHandler.setDataMode(DataMode.BINARY, DataType.IN);
byte[] data = clientHandler.readBinary();
if(data!=null)
return data;
else
throw new ConnectionLostException();
}
}