Перезаписать обратный вызов RTCPeerConnection 'onicecandidate' - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь подменить IP-адрес, просочившийся из WebRTC, поэтому я хочу переопределить функцию обратного вызова 'onicecandidate', но код ниже не работает, я не могу понять, почему.

  Object.defineProperty(RTCPeerConnection.prototype, 'onicecandidate', {
    set: function (eventHandler) {

        console.log('hook set');

        this._onicecandidateEventHandler = eventHandler;
        this._onicecandidate = function (event) {

            console.log('hook');

            this._onicecandidateEventHandler.apply(this, arguments);
        };


    },
    get: function () {
        return this._onicecandidate;
    }

})

Код вышепредполагается перехватить функцию получателя, назначенную «сценарием снятия отпечатков».

Пример сценария снятия отпечатков пальцев выглядит следующим образом:

    function findIP() {
        var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
        var pc = new myPeerConnection({iceServers: [{urls: "stun:stun.l.google.com:19302"}]}),
        noop = function() {},
        localIPs = {},
        ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
        key;

        function ipIterate(ip) {
            if (!localIPs[ip]) {console.log('got ip: ', ip);}
            localIPs[ip] = true;
        }

        pc.createDataChannel("");

        pc.createOffer(function(sdp) {
            sdp.sdp.split('\n').forEach(function(line) {
                if (line.indexOf('candidate') < 0) return;
                line.match(ipRegex).forEach(ipIterate);
            });
            pc.setLocalDescription(sdp, noop, noop);
        }, noop);

        pc.onicecandidate = function(ice) {
            if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
            ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
        };
    }

Как вы можете видеть: метод получения вашего реального ipот webRTC пытается установить соединение, затем установить обратный вызов для события «onicecandidate», информация о событии содержит информацию о реальном Ip.

То, что я хотел бы сделать, это переопределить функцию 'set' назначения 'onicecandidate', так что она будет заменена моей собственной функцией ловушки, и после "изменения" IP-адреса ловушка вызовет реальный получатель.устанавливается скриптом отпечатка пальца.

В моих тестах: я заметил, что после выполнения моего кода из консоли RTCPeerConnection.prototype был переопределен, если я назначил функцию RTCPeerConnection.onicecandidate, консоль напечатает «набор хуков», поэтому появилсяэто переопределение является успешным, также, если я вызвал RTCPeerConnection.onicecandidate (xxx) mannullay, и моя функция перехвата, и исходная функция выполняются, это работает, как и ожидалось.Тем не менее, этот код не работает, когда я использовал в подлинном скрипте отпечатка пальца, как я вставил выше.Событие onicecandidate никогда не запускается после применения переопределения.

Я новичок в javascript, надеюсь, кто-нибудь сможет объяснить мою путаницу.

Заранее спасибо.

1 Ответ

1 голос
/ 11 марта 2019

Не комментируя, почему это не работает, одно это не поможет вам против сценариев, использующих addEventListener ('icecandidate').

adapter.js содержит "wrapPeerConnectionEvent"вспомогательная функция, которая обрабатывает оба варианта.С этим помощником это становится довольно простой задачей:

wrapPeerConnectionEvent(window, 'icecandidate', (e) => {
  if (e.candidate) {
    const parts = e.candidate.candidate.split(' ');
    parts[4] = '127.0.0.1'; // replace the real ip with 127.0.0.1
    e.candidate.candidate = parts.join(' ');   
  }
  return e;
});

См. https://jsfiddle.net/krgz5qu1/ для полного примера.Обратите внимание, что вам, возможно, придется позаботиться о ip в поле relAddr кандидатов на сервер-рефлексив и ретрансляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...