1package eu.siacs.conversations.xmpp.jingle;
2
3import java.net.Inet6Address;
4import java.net.InetAddress;
5import java.net.NetworkInterface;
6import java.net.SocketException;
7import java.net.UnknownHostException;
8import java.security.SecureRandom;
9import java.util.ArrayList;
10import java.util.Enumeration;
11import java.util.List;
12import java.util.UUID;
13
14import eu.siacs.conversations.xmpp.Jid;
15
16public class DirectConnectionUtils {
17
18 private static List<InetAddress> getLocalAddresses() {
19 final List<InetAddress> addresses = new ArrayList<>();
20 final Enumeration<NetworkInterface> interfaces;
21 try {
22 interfaces = NetworkInterface.getNetworkInterfaces();
23 } catch (SocketException e) {
24 return addresses;
25 }
26 while (interfaces.hasMoreElements()) {
27 NetworkInterface networkInterface = interfaces.nextElement();
28 final Enumeration<InetAddress> inetAddressEnumeration = networkInterface.getInetAddresses();
29 while (inetAddressEnumeration.hasMoreElements()) {
30 final InetAddress inetAddress = inetAddressEnumeration.nextElement();
31 if (inetAddress.isLoopbackAddress() || inetAddress.isLinkLocalAddress()) {
32 continue;
33 }
34 if (inetAddress instanceof Inet6Address) {
35 //let's get rid of scope
36 try {
37 addresses.add(Inet6Address.getByAddress(inetAddress.getAddress()));
38 } catch (UnknownHostException e) {
39 //ignored
40 }
41 } else {
42 addresses.add(inetAddress);
43 }
44 }
45 }
46 return addresses;
47 }
48
49 public static List<JingleCandidate> getLocalCandidates(Jid jid) {
50 SecureRandom random = new SecureRandom();
51 ArrayList<JingleCandidate> candidates = new ArrayList<>();
52 for (InetAddress inetAddress : getLocalAddresses()) {
53 final JingleCandidate candidate = new JingleCandidate(UUID.randomUUID().toString(), true);
54 candidate.setHost(inetAddress.getHostAddress());
55 candidate.setPort(random.nextInt(60000) + 1024);
56 candidate.setType(JingleCandidate.TYPE_DIRECT);
57 candidate.setJid(jid);
58 candidate.setPriority(8257536 + candidates.size());
59 candidates.add(candidate);
60 }
61 return candidates;
62 }
63
64}