正在查看: 95爱播免登录版 v3.1.9 应用的 FileTransferNegotiator.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: 95爱播免登录版 v3.1.9 应用的 FileTransferNegotiator.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package org.jivesoftware.smackx.filetransfer;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketIDFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.XMPPError;
import org.jivesoftware.smackx.FormField;
import org.jivesoftware.smackx.ServiceDiscoveryManager;
import org.jivesoftware.smackx.packet.DataForm;
import org.jivesoftware.smackx.packet.StreamInitiation;
public class FileTransferNegotiator {
public static boolean IBB_ONLY = false;
protected static final String STREAM_DATA_FIELD_NAME = "stream-method";
private static final String STREAM_INIT_PREFIX = "jsi_";
private final StreamNegotiator byteStreamTransferManager;
private final Connection connection;
private final StreamNegotiator inbandTransferManager;
private static final String[] NAMESPACE = {"http://jabber.org/protocol/si/profile/file-transfer", "http://jabber.org/protocol/si"};
private static final Map<Connection, FileTransferNegotiator> transferObject = new ConcurrentHashMap();
private static final Random randomGenerator = new Random();
static {
IBB_ONLY = System.getProperty("ibb") != null;
}
private FileTransferNegotiator(Connection connection) {
configureConnection(connection);
this.connection = connection;
this.byteStreamTransferManager = new Socks5TransferNegotiator(connection);
this.inbandTransferManager = new IBBTransferNegotiator(connection);
}
public void cleanup(Connection connection) {
if (transferObject.remove(connection) != null) {
this.inbandTransferManager.cleanup();
}
}
private void configureConnection(final Connection connection) {
connection.addConnectionListener(new ConnectionListener() {
public void connectionClosed() {
FileTransferNegotiator.this.cleanup(connection);
}
public void connectionClosedOnError(Exception exc) {
FileTransferNegotiator.this.cleanup(connection);
}
public void reconnectingIn(int i) {
}
public void reconnectionFailed(Exception exc) {
}
public void reconnectionSuccessful() {
}
});
}
private DataForm createDefaultInitiationForm() {
DataForm dataForm = new DataForm("form");
FormField formField = new FormField(STREAM_DATA_FIELD_NAME);
formField.setType("list-single");
if (!IBB_ONLY) {
formField.addOption(new FormField.Option("http://jabber.org/protocol/bytestreams"));
}
formField.addOption(new FormField.Option("http://jabber.org/protocol/ibb"));
dataForm.addField(formField);
return dataForm;
}
public static IQ createIQ(String str, String str2, String str3, IQ.Type type) {
IQ iq = new IQ() {
public String getChildElementXML() {
return null;
}
};
iq.setPacketID(str);
iq.setTo(str2);
iq.setFrom(str3);
iq.setType(type);
return iq;
}
public static FileTransferNegotiator getInstanceFor(Connection connection) {
if (connection == null) {
throw new IllegalArgumentException("Connection cannot be null");
}
if (!connection.isConnected()) {
return null;
}
Map<Connection, FileTransferNegotiator> map = transferObject;
if (map.containsKey(connection)) {
return map.get(connection);
}
FileTransferNegotiator fileTransferNegotiator = new FileTransferNegotiator(connection);
setServiceEnabled(connection, true);
map.put(connection, fileTransferNegotiator);
return fileTransferNegotiator;
}
private StreamNegotiator getNegotiator(FormField formField) throws XMPPException {
Iterator options = formField.getOptions();
boolean z = false;
boolean z2 = false;
while (options.hasNext()) {
String value = ((FormField.Option) options.next()).getValue();
if (value.equals("http://jabber.org/protocol/bytestreams") && !IBB_ONLY) {
z = true;
} else if (value.equals("http://jabber.org/protocol/ibb")) {
z2 = true;
}
}
if (z || z2) {
return (z && z2) ? new FaultTolerantNegotiator(this.connection, this.byteStreamTransferManager, this.inbandTransferManager) : z ? this.byteStreamTransferManager : this.inbandTransferManager;
}
XMPPError xMPPError = new XMPPError(XMPPError.Condition.bad_request, "No acceptable transfer mechanism");
throw new XMPPException(xMPPError.getMessage(), xMPPError);
}
private StreamNegotiator getOutgoingNegotiator(FormField formField) throws XMPPException {
Iterator values = formField.getValues();
boolean z = false;
boolean z2 = false;
while (values.hasNext()) {
String str = (String) values.next();
if (str.equals("http://jabber.org/protocol/bytestreams") && !IBB_ONLY) {
z = true;
} else if (str.equals("http://jabber.org/protocol/ibb")) {
z2 = true;
}
}
if (z || z2) {
return (z && z2) ? new FaultTolerantNegotiator(this.connection, this.byteStreamTransferManager, this.inbandTransferManager) : z ? this.byteStreamTransferManager : this.inbandTransferManager;
}
XMPPError xMPPError = new XMPPError(XMPPError.Condition.bad_request, "No acceptable transfer mechanism");
throw new XMPPException(xMPPError.getMessage(), xMPPError);
}
private FormField getStreamMethodField(DataForm dataForm) {
FormField formField;
Iterator<FormField> fields = dataForm.getFields();
do {
formField = null;
if (!fields.hasNext()) {
break;
}
formField = fields.next();
} while (!formField.getVariable().equals(STREAM_DATA_FIELD_NAME));
return formField;
}
public static Collection<String> getSupportedProtocols() {
ArrayList arrayList = new ArrayList();
arrayList.add("http://jabber.org/protocol/ibb");
if (!IBB_ONLY) {
arrayList.add("http://jabber.org/protocol/bytestreams");
}
return Collections.unmodifiableList(arrayList);
}
public static boolean isServiceEnabled(Connection connection) {
ServiceDiscoveryManager instanceFor = ServiceDiscoveryManager.getInstanceFor(connection);
ArrayList arrayList = new ArrayList();
arrayList.addAll(Arrays.asList(NAMESPACE));
arrayList.add("http://jabber.org/protocol/ibb");
if (!IBB_ONLY) {
arrayList.add("http://jabber.org/protocol/bytestreams");
}
Iterator it = arrayList.iterator();
while (it.hasNext()) {
if (!instanceFor.includesFeature((String) it.next())) {
return false;
}
}
return true;
}
public static void setServiceEnabled(Connection connection, boolean z) {
ServiceDiscoveryManager instanceFor = ServiceDiscoveryManager.getInstanceFor(connection);
ArrayList<String> arrayList = new ArrayList();
arrayList.addAll(Arrays.asList(NAMESPACE));
arrayList.add("http://jabber.org/protocol/ibb");
if (!IBB_ONLY) {
arrayList.add("http://jabber.org/protocol/bytestreams");
}
for (String str : arrayList) {
if (!z) {
instanceFor.removeFeature(str);
} else if (!instanceFor.includesFeature(str)) {
instanceFor.addFeature(str);
}
}
}
public String getNextStreamID() {
return STREAM_INIT_PREFIX + Math.abs(randomGenerator.nextLong());
}
public StreamNegotiator negotiateOutgoingTransfer(String str, String str2, String str3, long j, String str4, int i) throws XMPPException {
StreamInitiation streamInitiation = new StreamInitiation();
streamInitiation.setSesssionID(str2);
streamInitiation.setMimeType(URLConnection.guessContentTypeFromName(str3));
StreamInitiation.File file = new StreamInitiation.File(str3, j);
file.setDesc(str4);
streamInitiation.setFile(file);
streamInitiation.setFeatureNegotiationForm(createDefaultInitiationForm());
streamInitiation.setFrom(this.connection.getUser());
streamInitiation.setTo(str);
streamInitiation.setType(IQ.Type.SET);
PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(streamInitiation.getPacketID()));
this.connection.sendPacket(streamInitiation);
StreamInitiation nextResult = createPacketCollector.nextResult(i);
createPacketCollector.cancel();
if (!(nextResult instanceof IQ)) {
return null;
}
StreamInitiation streamInitiation2 = nextResult;
if (streamInitiation2.getType().equals(IQ.Type.RESULT)) {
return getOutgoingNegotiator(getStreamMethodField(nextResult.getFeatureNegotiationForm()));
}
if (streamInitiation2.getType().equals(IQ.Type.ERROR)) {
throw new XMPPException(streamInitiation2.getError());
}
throw new XMPPException("File transfer response unreadable");
}
public void rejectStream(StreamInitiation streamInitiation) {
XMPPError xMPPError = new XMPPError(XMPPError.Condition.forbidden, "Offer Declined");
IQ createIQ = createIQ(streamInitiation.getPacketID(), streamInitiation.getFrom(), streamInitiation.getTo(), IQ.Type.ERROR);
createIQ.setError(xMPPError);
this.connection.sendPacket(createIQ);
}
public StreamNegotiator selectStreamNegotiator(FileTransferRequest fileTransferRequest) throws XMPPException {
StreamInitiation streamInitiation = fileTransferRequest.getStreamInitiation();
FormField streamMethodField = getStreamMethodField(streamInitiation.getFeatureNegotiationForm());
if (streamMethodField == null) {
XMPPError xMPPError = new XMPPError(XMPPError.Condition.bad_request, "No stream methods contained in packet.");
IQ createIQ = createIQ(streamInitiation.getPacketID(), streamInitiation.getFrom(), streamInitiation.getTo(), IQ.Type.ERROR);
createIQ.setError(xMPPError);
this.connection.sendPacket(createIQ);
throw new XMPPException("No stream methods contained in packet.", xMPPError);
}
try {
return getNegotiator(streamMethodField);
} catch (XMPPException e) {
IQ createIQ2 = createIQ(streamInitiation.getPacketID(), streamInitiation.getFrom(), streamInitiation.getTo(), IQ.Type.ERROR);
createIQ2.setError(e.getXMPPError());
this.connection.sendPacket(createIQ2);
throw e;
}
}
}