导航菜单

页面标题

页面副标题

95爱播免登录版 v3.1.9 - Socks5TransferNegotiator.java 源代码

正在查看: 95爱播免登录版 v3.1.9 应用的 Socks5TransferNegotiator.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package org.jivesoftware.smackx.filetransfer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.FromMatchesFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager;
import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamRequest;
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
import org.jivesoftware.smackx.packet.StreamInitiation;

public class Socks5TransferNegotiator extends StreamNegotiator {
    private Connection connection;
    private Socks5BytestreamManager manager;

    private static class ByteStreamRequest extends Socks5BytestreamRequest {
        ByteStreamRequest(Socks5BytestreamManager socks5BytestreamManager, Bytestream bytestream, ByteStreamRequest byteStreamRequest) {
            this(socks5BytestreamManager, bytestream);
        }

        private ByteStreamRequest(Socks5BytestreamManager socks5BytestreamManager, Bytestream bytestream) {
            super(socks5BytestreamManager, bytestream);
        }
    }

    private static class BytestreamSIDFilter extends PacketTypeFilter {
        private String sessionID;

        public BytestreamSIDFilter(String str) {
            super(Bytestream.class);
            if (str == null) {
                throw new IllegalArgumentException("StreamID cannot be null");
            }
            this.sessionID = str;
        }

        public boolean accept(Packet packet) {
            if (super.accept(packet)) {
                Bytestream bytestream = (Bytestream) packet;
                if (this.sessionID.equals(bytestream.getSessionID()) && IQ.Type.SET.equals(bytestream.getType())) {
                    return true;
                }
            }
            return false;
        }
    }

    Socks5TransferNegotiator(Connection connection) {
        this.connection = connection;
        this.manager = Socks5BytestreamManager.getBytestreamManager(connection);
    }

    @Override
    public void cleanup() {
    }

    @Override
    public InputStream createIncomingStream(StreamInitiation streamInitiation) throws XMPPException, InterruptedException {
        this.manager.ignoreBytestreamRequestOnce(streamInitiation.getSessionID());
        return negotiateIncomingStream(initiateIncomingStream(this.connection, streamInitiation));
    }

    @Override
    public OutputStream createOutgoingStream(String str, String str2, String str3) throws XMPPException {
        try {
            return this.manager.establishSession(str3, str).getOutputStream();
        } catch (IOException e) {
            throw new XMPPException("error establishing SOCKS5 Bytestream", e);
        } catch (InterruptedException e2) {
            throw new XMPPException("error establishing SOCKS5 Bytestream", e2);
        }
    }

    @Override
    public PacketFilter getInitiationPacketFilter(String str, String str2) {
        this.manager.ignoreBytestreamRequestOnce(str2);
        return new AndFilter(new PacketFilter[]{new FromMatchesFilter(str), new BytestreamSIDFilter(str2)});
    }

    @Override
    public String[] getNamespaces() {
        return new String[]{"http://jabber.org/protocol/bytestreams"};
    }

    @Override
    InputStream negotiateIncomingStream(Packet packet) throws XMPPException, InterruptedException {
        try {
            PushbackInputStream pushbackInputStream = new PushbackInputStream(new ByteStreamRequest(this.manager, (Bytestream) packet, null).accept().getInputStream());
            pushbackInputStream.unread(pushbackInputStream.read());
            return pushbackInputStream;
        } catch (IOException e) {
            throw new XMPPException("Error establishing input stream", e);
        }
    }
}