/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const make = require('../make') const random = require('../random') const utils = require('../utils') class network extends make { static sdp () { // session description protocol template return [ 'v=0', 'o=Mozilla-SIPUA 23597 0 IN IP4 0.0.0.0', 's=SIP Call', 't=0 0', 'a=ice-ufrag:f5fda439', 'a=ice-pwd:d0df8e2904bdbd29587966e797655970', 'a=fingerprint:sha-256 DF:69:78:20:8D:2E:08:CE:49:82:A3:11:79:1D:BF:B5:49:49:2D:32:82:2F:0D:88:84:A7:C6:63:23:63:A9:0F', 'm=audio 52757 RTP/SAVPF 109 0 8 101', 'c=IN IP4 192.168.129.33', 'a=rtpmap:109 opus/48000/2', 'a=ptime:20', 'a=rtpmap:0 PCMU/8000', 'a=rtpmap:8 PCMA/8000', 'a=rtpmap:101 telephone-event/8000', 'a=fmtp:101 0-15', 'a=sendrecv', 'a=candidate:0 1 UDP 2113601791 192.168.129.33 52757 typ host', 'a=candidate:0 2 UDP 2113601790 192.168.129.33 59738 typ host', 'm=video 63901 RTP/SAVPF 120', 'c=IN IP4 192.168.129.33', 'a=rtpmap:120 VP8/90000', 'a=sendrecv', 'a=candidate:0 1 UDP 2113601791 192.168.129.33 63901 typ host', 'a=candidate:0 2 UDP 2113601790 192.168.129.33 54165 typ host', 'm=application 65080 SCTP/DTLS 5000', 'c=IN IP4 192.168.129.33', 'a=fmtp:5000 protocol=webrtc-datachannel;streams=16', 'a=sendrecv', 'a=candidate:0 1 UDP 2113601791 192.168.129.33 65080 typ host', 'a=candidate:0 2 UDP 2113601790 192.168.129.33 62658 typ host' ].join('\n') } static IceCandidate () { // https://tools.ietf.org/html/rfc5245#section-15 // candidate= return utils.block.block([ random.pick([0, 1, make.number.any]), ' ', random.pick([0, 1, make.number.any]), ' ', random.pick(['UDP', 'TCP', 'SCTP']), random.pick(['', `/${random.pick(['DTLS', 'DTLS-SRTP'])}`]), ' ', random.pick([make.number.any]), ' ', random.pick([network.goodHostnames]), ' ', random.pick([56187, make.number.any]), ' ', 'type', ' ', random.pick([ 'host', utils.block.block([ random.pick(['srflx', 'prflx', 'relay']), ' ', random.pick(['raddr']), ' ', random.pick([network.goodHostnames]), ' ', random.pick(['rport']), random.use([utils.block.block([' ', make.number.any])]) ]) ]) ]) } static SdpMid () { // m= return utils.block.block([ random.pick(['application', 'video', 'audio']), ' ', make.number.any, ' ', random.pick(['RTP/AVP', 'RTP/SAVPF', 'RTP/SAVP', 'SCTP/DTLS']), ' ', make.number.any ]) } static Turn () { // https://tools.ietf.org/html/rfc7065#section-3.1 return utils.block.block([ // scheme random.pick(network.PeerConnectionProtocols), ':', // turn-host random.pick([ network.any, network.hostname ]), // turn-port random.use([utils.block.block([':', make.number.any])]), random.use([utils.block.block(['/', make.text.any])]), '?', random.pick(['transport']), '=', random.pick(['udp', 'tcp', make.text.any]) ]) } static PeerConnectionProtocols () { return ['turn', 'turns', 'stun', 'stuns'] } static randomIPv4 () { function octet () { return random.pick([random.number(255), make.number.any]) } return `${octet()}.${octet()}.${octet()}.${octet()}.` } static randomIPv6 () { let parts = [] for (let i = 0; i < 8; i++) { parts.push(random.hex(4)) } return parts.join(':') } static iceServer () { return random.pick([ 'stun:23.21.150.121' ]) } static dtmf () { let count = make.number.tiny() const values = [] while (count--) { values.push(random.item(['*', '#', 'A', 'B', 'C', 'D', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])) } return values.join('') } static goodHostnames () { return [ '0.0.0.0', '127.0.0.1:8080' ] } static badHostnames () { return [ 'google.org:8080', '::1', '[::192.9.5.5]:42', '2001:db8:85a3::8a2e:370:3478', '2001:db8:85a3:0:0:8a2e:370:3478', '::ffff:192.0.2.1', '0000:0000:0000:0000:0000:0000:0000:0001', '::192.0.2.128', '::ffff:192.0.2.128', '2001:db8::1:2', '2001:db8::1:1:1:1:1' ] } static hostname () { return random.pick([ network.randomIPv4, network.randomIPv6, network.goodHostnames, network.badHostnames ]) } static port () { return random.pick([80, 443, 21, 23, 9310]) } static hash () { return random.pick([ '', '#', '#main-content', () => `#${make.text.any()}` ]) } static path () { return random.pick([ '', '/', '/index.html', () => `/${make.text.any()}` ]) } static protocol () { return `${random.pick([ 'http', 'https', 'ftp', 'telnet', 'chrome', 'resource' ])}:` } static search () { return random.pick([ '', '?', '?foo=bar', () => `?${make.text.any()}` ]) } static randomBitmask (list) { if (list.length <= 1) { return list.join('') } let max = random.range(2, list.length) let mask = random.pick(list) for (let i = 1; i < max; i++) { mask += `|${random.pick(list)}` } return mask } } module.exports = network