-
Notifications
You must be signed in to change notification settings - Fork 0
/
XMPPPrebind.java
148 lines (113 loc) · 4.29 KB
/
XMPPPrebind.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.Random;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
public class XMPPPrebind {
protected String sid;
protected String rid;
protected String jid;
protected String boshUrl;
protected String user;
protected String domain;
protected String password;
public XMPPPrebind(String boshUrl, String domain, String user, String password) {
this.boshUrl = boshUrl;
this.user = user;
this.domain = domain;
this.password = password;
}
public String getSid() {
return sid;
}
public String getRid() {
return rid;
}
public String getJid() {
return jid;
}
public void connect() throws Exception {
String hash = Base64.getEncoder()
.encodeToString((this.user + "@" + this.domain + "\0" + this.user + "\0" + this.password).getBytes());
int rid = new Random().nextInt(32768);
String jid = this.user + "@" + this.domain;
String body = "<body rid='" + rid + "' " + "xmlns='http://jabber.org/protocol/httpbind' " + "to='" + this.domain
+ "' xml:lang='en' wait='60' hold='1' " + "window='5' content='text/xml; charset=utf-8' "
+ "ver='1.6' xmpp:version='1.0' xmlns:xmpp='urn:xmpp:xbosh'/>";
String output = this.__sendBody(body);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(output));
Document xml = builder.parse(is);
String sid = xml.getDocumentElement().getAttribute("sid");
rid++;
body = "<body rid='" + rid + "' xmlns='http://jabber.org/protocol/httpbind' sid='" + sid + "'>"
+ "<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>" + hash + "</auth>" + "</body>";
this.__sendBody(body);
rid++;
body = "<body rid='" + rid + "' xmlns='http://jabber.org/protocol/httpbind' sid='" + sid + "' to='"
+ this.domain + "' xml:lang='en' xmpp:restart='true' xmlns:xmpp='urn:xmpp:xbosh'/>";
this.__sendBody(body);
rid++;
body = "<body rid='" + rid + "' xmlns='http://jabber.org/protocol/httpbind' sid='" + sid + "'>"
+ "<iq type='set' id='_bind_auth_2' xmlns='jabber:client'>"
+ "<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>" + "</iq>" + "</body>";
this.__sendBody(body);
rid++;
body = "<body rid='" + rid + "' xmlns='http://jabber.org/protocol/httpbind' sid='" + sid + "'>"
+ "<iq type='set' id='_session_auth_2' xmlns='jabber:client'>"
+ "<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>" + "</iq>" + "</body>";
this.__sendBody(body);
rid++;
body = "<body rid='" + rid + "' sid='" + sid + "' xmlns='http://jabber.org/protocol/httpbind'>"
+ "<iq id='bind_1' type='set' xmlns='jabber:client'>"
+ "<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>" + "<resource>httpclient</resource>" + "</bind>"
+ "</iq>" + "</body>";
this.__sendBody(body);
rid++;
this.rid = rid+"";
this.sid = sid;
this.jid = jid;
}
private String __sendBody(String body) throws Exception {
URL url = new URL(this.boshUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setConnectTimeout(100000);
conn.setReadTimeout(100000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
OutputStream os = conn.getOutputStream();
os.write(body.getBytes());
os.flush();
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
throw new Exception(conn.getResponseMessage());
}
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
String line;
StringBuilder result = new StringBuilder();
while ((line = br.readLine()) != null) {
result.append(line);
}
return result.toString();
}
public static void main(String[] args) {
XMPPPrebind xmpp = new XMPPPrebind("http://localhost:5280/http-bind/", "domain", "uname", "password");
try {
xmpp.connect();
System.out.println(xmpp.rid);
System.out.println(xmpp.sid);
System.out.println(xmpp.jid);
} catch (Exception e) {
e.printStackTrace();
}
}
}