aboutsummaryrefslogtreecommitdiff
path: root/juick-server/src/main/java/com/juick/server/xmpp/router/StreamComponentServer.java
blob: 5e2f6f8210506abb0f1e3ba9c9e556d2fff836e6 (plain) (blame)
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();
    }
}