<!doctype html>
<title>Test RTCPeerConnection.prototype.addIceCandidate with TCP candidates</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';
const sdp = `v=0
o=- 166855176514521964 2 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic:WMS *
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:655Y
a=ice-pwd:somelongpwdwithenoughrandomness
a=fingerprint:sha-256 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
a=setup:actpass
a=mid:audio1
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=ssrc:1001 cname:some
`;
// DRY: copied from fetch/api/request/request-bad-port.any.js
const BLOCKED_PORTS_LIST = [
1, // tcpmux
7, // echo
9, // discard
11, // systat
13, // daytime
15, // netstat
17, // qotd
19, // chargen
20, // ftp-data
21, // ftp
22, // ssh
23, // telnet
25, // smtp
37, // time
42, // name
43, // nicname
53, // domain
69, // tftp
77, // priv-rjs
79, // finger
87, // ttylink
95, // supdup
101, // hostriame
102, // iso-tsap
103, // gppitnp
104, // acr-nema
109, // pop2
110, // pop3
111, // sunrpc
113, // auth
115, // sftp
117, // uucp-path
119, // nntp
123, // ntp
135, // loc-srv / epmap
137, // netbios-ns
139, // netbios-ssn
143, // imap2
161, // snmp
179, // bgp
389, // ldap
427, // afp (alternate)
465, // smtp (alternate)
512, // print / exec
513, // login
514, // shell
515, // printer
526, // tempo
530, // courier
531, // chat
532, // netnews
540, // uucp
548, // afp
554, // rtsp
556, // remotefs
563, // nntp+ssl
587, // smtp (outgoing)
601, // syslog-conn
636, // ldap+ssl
989, // ftps-data
990, // ftps
993, // ldap+ssl
995, // pop3+ssl
1719, // h323gatestat
1720, // h323hostcall
1723, // pptp
2049, // nfs
3659, // apple-sasl
4045, // lockd
5060, // sip
5061, // sips
6000, // x11
6566, // sane-port
6665, // irc (alternate)
6666, // irc (alternate)
6667, // irc (default)
6668, // irc (alternate)
6669, // irc (alternate)
6697, // irc+tls
10080, // amanda
];
function candidateForPort(port) {
return `a=candidate:2983561038 1 tcp 1518214911 127.0.0.1 ${port} typ host tcptype passive generation 0 ufrag 655Y network-id 1 network-cost 10`;
}
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
await pc.setRemoteDescription({type: 'offer', sdp: sdp + candidateForPort(8001) + '\n'})
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
await waitForConnectionStateChangeWithTimeout(t, pc,
['failed', 'disconnected'], 1000);
}, 'TCP candidate aimed at port 8001 accepted');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
await pc.setRemoteDescription({type: 'offer', sdp: sdp})
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
await pc.addIceCandidate(new RTCIceCandidate({
candidate: candidateForPort(8001),
sdpMid: 'audio1'
}));
await waitForConnectionStateChangeWithTimeout(
t, pc, ['failed', 'disconnected'], 1000);
}, 'TCP addIceCandidate aimed at port 8001 accepted');
for (const port of BLOCKED_PORTS_LIST) {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
await pc.setRemoteDescription({type: 'offer', sdp: sdp + candidateForPort(port) + '\n'})
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
pc.oniceconnectionstatechange = t.unreached_func();
await new Promise(resolve => t.step_timeout(resolve, 500));
}, `TCP candidate aimed at Fetch bad port ${port} ignored`);
}
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
await pc.setRemoteDescription({type: 'offer', sdp: sdp})
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
await pc.addIceCandidate(new RTCIceCandidate({
candidate: candidateForPort(2049),
sdpMid: 'audio1'
}));
pc.oniceconnectionstatechange = t.unreached_func();
await new Promise(resolve => t.step_timeout(resolve, 500));
}, `TCP addIceCandidate aimed at Fetch bad port 2049 ignored`);
</script>