package org.zarroboogs.smartzpn.tunnel.shadowsocks;
import org.zarroboogs.smartzpn.tunnel.IEncryptor;
import org.zarroboogs.smartzpn.tunnel.Tunnel;
import java.nio.ByteBuffer;
import java.nio.channels.Selector;
public class ShadowsocksTunnel extends Tunnel {
private IEncryptor mEncryptor;
private ShadowsocksConfig mConfig;
private boolean m_TunnelEstablished;
public ShadowsocksTunnel(ShadowsocksConfig config, Selector selector) throws Exception {
super(config.ServerAddress, selector);
if (config.Encryptor == null) {
throw new Exception("Error: The Encryptor for ShadowsocksTunnel is null.");
}
mConfig = config;
mEncryptor = config.Encryptor;
}
@Override
protected void onConnected(ByteBuffer buffer) throws Exception {
//构造socks5请求(跳过前3个字节)
buffer.clear();
buffer.put((byte) 0x03);//domain
byte[] domainBytes = m_DestAddress.getHostName().getBytes();
buffer.put((byte) domainBytes.length);//domain length;
buffer.put(domainBytes);
buffer.putShort((short) m_DestAddress.getPort());
buffer.flip();
mEncryptor.encrypt(buffer);
if (write(buffer, true)) {
m_TunnelEstablished = true;
onTunnelEstablished();
} else {
m_TunnelEstablished = true;
this.beginReceive();
}
}
@Override
protected boolean isTunnelEstablished() {
return m_TunnelEstablished;
}
@Override
protected void beforeSend(ByteBuffer buffer) throws Exception {
mEncryptor.encrypt(buffer);
}
@Override
protected void afterReceived(ByteBuffer buffer) throws Exception {
mEncryptor.decrypt(buffer);
}
@Override
protected void onDispose() {
mConfig = null;
mEncryptor = null;
}
}