Added Authorization Factory for catching incoming messages for authorization

cusax-fix
Damian Minkov 20 years ago
parent d3ce7a5728
commit d1b0b26aaa

@ -6,27 +6,31 @@
*/
package net.java.sip.communicator.slick.protocol.icq;
import net.java.sip.communicator.util.*;
import java.util.*;
import net.kano.joustsim.oscar.*;
import net.kano.joustsim.oscar.oscar.service.buddy.*;
import net.kano.joscar.snaccmd.*;
import net.kano.joustsim.oscar.oscar.service.info.*;
import net.kano.joustsim.oscar.oscar.service.icbm.*;
import net.kano.joustsim.*;
import java.beans.*;
import net.kano.joustsim.trust.*;
import net.kano.joscar.snaccmd.loc.*;
import net.kano.joscar.snac.*;
import java.io.*;
import java.util.*;
import net.java.sip.communicator.service.protocol.icqconstants.*;
import net.java.sip.communicator.util.*;
import net.kano.joscar.*;
import net.kano.joscar.flapcmd.*;
import net.kano.joscar.snac.*;
import net.kano.joscar.snaccmd.*;
import net.kano.joscar.snaccmd.conn.*;
import net.kano.joustsim.oscar.oscar.service.ssi.*;
import net.kano.joscar.snaccmd.error.*;
import net.kano.joscar.snaccmd.icbm.*;
import net.kano.joscar.snaccmd.loc.*;
import net.kano.joscar.snaccmd.ssi.*;
import net.kano.joscar.tlv.*;
import net.kano.joustsim.*;
import net.kano.joustsim.oscar.*;
import net.kano.joustsim.oscar.State;
import net.kano.joustsim.oscar.oscar.service.bos.*;
import net.java.sip.communicator.service.protocol.icqconstants.*;
import java.io.*;
import net.kano.joscar.snaccmd.icbm.SendImIcbm;
import net.kano.joscar.tlv.Tlv;
import net.kano.joustsim.oscar.oscar.service.buddy.*;
import net.kano.joustsim.oscar.oscar.service.icbm.*;
import net.kano.joustsim.oscar.oscar.service.info.*;
import net.kano.joustsim.oscar.oscar.service.ssi.*;
import net.kano.joustsim.trust.*;
/**
* An utility that we use to test AIM/ICQ implementations of the
@ -36,6 +40,7 @@
* that icq implementations behave properly.
*
* @author Emil Ivov
* @author Damian Minkov
*/
public class IcqTesterAgent
{
@ -75,6 +80,8 @@ public class IcqTesterAgent
*/
private Screenname icqUIN = null;
private AuthCmdFactory authCmdFactory = new AuthCmdFactory();
/**
* The IcqTesterAgent constructor that would create a tester agent instance,
* prepared to sign on line with the specified icq uin.
@ -373,6 +380,10 @@ public synchronized void handleStateChange(StateEvent event)
{
icbmService = conn.getIcbmService();
connectionLock.notifyAll();
icbmService.getOscarConnection().getSnacProcessor().
getCmdFactoryMgr().getDefaultFactoryList().
registerAll(authCmdFactory);
}
else if (event.getNewState() == State.FAILED
|| event.getNewState() == State.DISCONNECTED)
@ -624,6 +635,12 @@ public IcqStatusEnum getPresneceStatus()
return getBuddyStatus(getIcqUIN());
}
public net.java.sip.communicator.slick.protocol.icq.IcqTesterAgent.
AuthCmdFactory getAuthCmdFactory()
{
return authCmdFactory;
}
/**
* A bos listener is the way of receiving notifications of changes in our
* own state or info. This class allows others to wait() for Bos events.
@ -1117,4 +1134,230 @@ protected void writeChannelData(OutputStream out)
new Tlv(TYPE_OFFLINE).write(out);
}
}
/*
private class AuthRequiredListener
implements SnacResponseListener
{
public void handleResponse(SnacResponseEvent snacResponseEvent)
{
if (snacResponseEvent.getSnacCommand() instanceof SsiDataModResponse)
{
SsiDataModResponse dataModResponse =
(SsiDataModResponse) snacResponseEvent.getSnacCommand();
int[] results = dataModResponse.getResults();
List items = ( (ItemsCmd) snacResponseEvent.getRequest().getCommand()).
getItems();
items = new LinkedList(items);
for (int i = 0; i < results.length; i++)
{
int result = results[i];
if (result ==
SsiDataModResponse.RESULT_ICQ_AUTH_REQUIRED)
{
conn.sendSnac(new AuthReplyCmd("", "First Test - Not Accepted!", false));
}
}
}
}
}
*/
private class AuthReplyCmd
extends SsiCommand
{
private int FLAG_AUTH_ACCEPTED = 1;
private int FLAG_AUTH_DECLINED = 0;
private String uin = null;
private String reason = null;
private boolean accepted = false;
public AuthReplyCmd(String uin, String reason, boolean accepted)
{
super(0x001a);
this.uin = uin;
this.reason = reason;
this.accepted = accepted;
}
public void writeData(OutputStream out)
throws IOException
{
byte[] uinBytes = BinaryTools.getAsciiBytes(uin);
BinaryTools.writeUByte(out, uinBytes.length);
out.write(uinBytes);
if(accepted)
{
BinaryTools.writeUByte(out, FLAG_AUTH_ACCEPTED);
}
else
{
BinaryTools.writeUByte(out, FLAG_AUTH_DECLINED);
}
if(reason == null)
reason = "";
byte[] reasonBytes = BinaryTools.getAsciiBytes(reason);
BinaryTools.writeUShort(out, reasonBytes.length);
out.write(reasonBytes);
}
}
public class AuthCmdFactory
extends ClientIcbmCmdFactory
{
List SUPPORTED_TYPES = null;
public static final int CHANNEL_AUTH = 0x0004;
public String responseReasonStr = null;
public String requestReasonStr = null;
public boolean ACCEPT = false;
public AuthCmdFactory()
{
List types = super.getSupportedTypes();
ArrayList tempTypes = new ArrayList(types);
tempTypes.add(new CmdType(4, 7));
this.SUPPORTED_TYPES = DefensiveTools.getUnmodifiable(tempTypes);
}
public SnacCommand genSnacCommand(SnacPacket packet)
{
if (AbstractIcbm.getIcbmChannel(packet) == CHANNEL_AUTH)
{
AuthOldMsgCmd messageCommand = new AuthOldMsgCmd(packet);
int messageType = messageCommand.messageType;
if (messageType == AuthOldMsgCmd.MTYPE_AUTHREQ)
{
requestReasonStr = messageCommand.reason;
logger.trace("sending authorization " + ACCEPT);
conn.sendSnac(
new AuthReplyCmd(
String.valueOf(messageCommand.sender),
responseReasonStr,
ACCEPT));
}
else
if (messageType == AuthOldMsgCmd.MTYPE_AUTHDENY)
{
//
}
else
if (messageType == AuthOldMsgCmd.MTYPE_AUTHOK)
{
//
}
else
return messageCommand;
}
return super.genSnacCommand(packet);
}
public List getSupportedTypes()
{
return SUPPORTED_TYPES;
}
}
private class AuthOldMsgCmd
extends AbstractImIcbm
{
private static final int TYPE_MESSAGE_DATA = 0x0005;
public static final int MTYPE_AUTHREQ = 0x06;
public static final int MTYPE_AUTHDENY = 0x07;
public static final int MTYPE_AUTHOK = 0x08;
public static final int MTYPE_ADDED = 0x0c;
private int messageType = -1;
private long sender;
private String reason;
public AuthOldMsgCmd(SnacPacket packet)
{
super(IcbmCommand.CMD_ICBM, packet);
DefensiveTools.checkNull(packet, "packet");
ByteBlock snacData = getChannelData();
FullUserInfo userInfo = FullUserInfo.readUserInfo(snacData);
ByteBlock tlvBlock = snacData.subBlock(userInfo.getTotalSize());
TlvChain chain = TlvTools.readChain(tlvBlock);
Tlv messageDataTlv = chain.getLastTlv(TYPE_MESSAGE_DATA);
ByteBlock messageData = messageDataTlv.getData();
sender = LEBinaryTools.getUInt(messageData, 0);
messageType = LEBinaryTools.getUByte(messageData, 4);
int msgFlags = LEBinaryTools.getUByte(messageData, 5);
int textlen = LEBinaryTools.getUShort(messageData, 6);
ByteBlock field = messageData.subBlock(8, textlen);
reason = OscarTools.getString(field, "US-ASCII");
}
protected void writeChannelData(OutputStream out)
throws IOException
{}
}
private static class LEBinaryTools
{
public static final long UINT_MAX = 4294967295L;
public static final int USHORT_MAX = 65535;
public static final short UBYTE_MAX = 255;
public static long getUInt(final ByteBlock data, final int pos)
{
if (data.getLength() - pos < 4)
{
return -1;
}
return ( ( (long) data.get(pos + 3) & 0xffL) << 24)
| ( ( (long) data.get(pos + 2) & 0xffL) << 16)
| ( ( (long) data.get(pos + 1) & 0xffL) << 8)
| ( (long) data.get(pos) & 0xffL);
}
public static short getUByte(final ByteBlock data, final int pos)
{
if (data.getLength() - pos < 1)
{
return -1;
}
return (short) (data.get(pos) & 0xff);
}
public static int getUShort(final ByteBlock data, final int pos)
{
if (data.getLength() - pos < 2)
{
return -1;
}
return ( (data.get(pos + 1) & 0xff) << 8) | (data.get(pos) & 0xff);
}
}
}

Loading…
Cancel
Save