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
|
package com.juick.server.xmpp.router;
import com.juick.xmpp.extensions.Handshake;
import org.apache.commons.codec.digest.DigestUtils;
import org.xmlpull.v1.XmlPullParserException;
import rocks.xmpp.addr.Jid;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
/**
* Created by vitalyster on 30.01.2017.
*/
public class StreamComponentServer extends Stream {
private String streamId, secret;
public String getStreamId() {
return streamId;
}
public StreamComponentServer(InputStream is, OutputStream os, String password) throws XmlPullParserException {
super(null, null, is, os);
secret = password;
streamId = UUID.randomUUID().toString();
}
@Override
public void handshake() throws XmlPullParserException, IOException {
parser.next();
if (!parser.getName().equals("stream")
|| !parser.getNamespace(null).equals(StreamNamespaces.NS_COMPONENT_ACCEPT)
|| !parser.getNamespace("stream").equals(StreamNamespaces.NS_STREAM)) {
throw new IOException("invalid stream");
}
Jid domain = Jid.of(parser.getAttributeValue(null, "to"));
if (streamHandler.filter(null, domain)) {
send(new XMPPError(XMPPError.Type.cancel, "forbidden").toString());
throw new IOException("invalid domain");
}
from = domain;
to = domain;
send(String.format("<stream:stream xmlns:stream='%s' " +
"xmlns='%s' from='%s' id='%s'>", StreamNamespaces.NS_STREAM, StreamNamespaces.NS_COMPONENT_ACCEPT, from.asBareJid().toEscapedString(), streamId));
Handshake handshake = Handshake.parse(parser);
boolean authenticated = handshake.getValue().equals(DigestUtils.sha1Hex(streamId + secret));
setLoggedIn(authenticated);
if (!authenticated) {
send(new XMPPError(XMPPError.Type.cancel, "not-authorized").toString());
streamHandler.fail(new IOException("stream:stream, failed authentication"));
return;
}
send(new Handshake().toString());
streamHandler.ready(this);
}
}
|