Add WebRTCIPPolicy setting to webContents and webview
authorJohn Kleinschmidt <kleinschmidtorama@gmail.com>
Wed, 8 Mar 2017 14:55:59 +0000 (09:55 -0500)
committerJohn Kleinschmidt <kleinschmidtorama@gmail.com>
Wed, 8 Mar 2017 15:15:48 +0000 (10:15 -0500)
Resolves #8777
Code to set and get the policy come from the muon framework code:
https://github.com/brave/muon/blob/master/atom/browser/api/atom_api_web_
contents.cc#L1324...L1343

atom/browser/api/atom_api_web_contents.cc
atom/browser/api/atom_api_web_contents.h
docs/api/web-contents.md
docs/api/webview-tag.md
lib/browser/guest-view-manager.js
lib/renderer/web-view/web-view-attributes.js
lib/renderer/web-view/web-view-constants.js

index 83fe76e..bfe8a78 100644 (file)
@@ -1067,6 +1067,23 @@ void WebContents::GoToOffset(int offset) {
   web_contents()->GetController().GoToOffset(offset);
 }
 
+const std::string& WebContents::GetWebRTCIPHandlingPolicy() const {
+  return web_contents()->
+    GetMutableRendererPrefs()->webrtc_ip_handling_policy;
+}
+
+void WebContents::SetWebRTCIPHandlingPolicy(
+    const std::string webrtc_ip_handling_policy) {
+  if (GetWebRTCIPHandlingPolicy() == webrtc_ip_handling_policy)
+    return;
+  web_contents()->GetMutableRendererPrefs()->webrtc_ip_handling_policy =
+    webrtc_ip_handling_policy;
+
+  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
+  if (host)
+    host->SyncRendererPrefs();
+}
+
 bool WebContents::IsCrashed() const {
   return web_contents()->IsCrashed();
 }
@@ -1765,6 +1782,10 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
       .SetMethod("copyImageAt", &WebContents::CopyImageAt)
       .SetMethod("capturePage", &WebContents::CapturePage)
       .SetMethod("setEmbedder", &WebContents::SetEmbedder)
+      .SetMethod("setWebRTCIPHandlingPolicy",
+                 &WebContents::SetWebRTCIPHandlingPolicy)
+      .SetMethod("getWebRTCIPHandlingPolicy",
+                 &WebContents::GetWebRTCIPHandlingPolicy)
       .SetProperty("id", &WebContents::ID)
       .SetProperty("session", &WebContents::Session)
       .SetProperty("hostWebContents", &WebContents::HostWebContents)
index 41edcc2..5aecab0 100644 (file)
@@ -92,6 +92,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
   void GoBack();
   void GoForward();
   void GoToOffset(int offset);
+  const std::string& GetWebRTCIPHandlingPolicy() const;
+  void SetWebRTCIPHandlingPolicy(const std::string webrtc_ip_handling_policy);
   bool IsCrashed() const;
   void SetUserAgent(const std::string& user_agent, mate::Arguments* args);
   std::string GetUserAgent();
index a665fae..6ef3b73 100644 (file)
@@ -1245,6 +1245,20 @@ Schedules a full repaint of the window this web contents is in.
 If *offscreen rendering* is enabled invalidates the frame and generates a new
 one through the `'paint'` event.
 
+#### `contents.getWebRTCIPHandlingPolicy()`
+
+* Returns `String` - Returns the WebRTC IP Handling Policy
+
+#### `contents.setWebRTCIPHandlingPolicy(policy)`
+
+* `policy` String - Specify the WebRTC IP Handling Policy
+  * `default` - Exposes user's public and local IPs.  This is the default behavior if not specified.
+  * `default_public_interface_only` - Exposes user's public IP, but does not expose user's local IP.
+  * `default_public_and_private_interfaces` - Exposes user's public and local IPs.
+  * `disable_non_proxied_udp` - Does not expose public or local IPs.
+
+Setting the WebRTC IP handling policy allows you to control which IPs are exposed via WebRTC.  See [BrowserLeaks](https://browserleaks.com/webrtc) for more details.
+
 ### Instance Properties
 
 #### `contents.id`
index 5efc225..105dfa1 100644 (file)
@@ -289,6 +289,13 @@ win.on('resize', () => {
 })
 ```
 
+### `webrtcippolicy`
+
+```html
+<webview  src="https://browserleaks.com/webrtc" webrtcippolicy="disable_non_proxied_udp"></webview>
+```
+This attribute allows you to set the WebRTC IP handling policy which controls what IPs are exposed via WebRTC.  See [webContents](web-contents.md#contentssetwebrtciphandlingpolicypolicy) for available policies.
+
 ## Methods
 
 The `webview` tag has the following methods:
@@ -312,7 +319,7 @@ webview.addEventListener('dom-ready', () => {
   * `userAgent` String (optional) - A user agent originating the request.
   * `extraHeaders` String (optional) - Extra headers separated by "\n"
   * `postData` ([UploadRawData](structures/upload-raw-data.md) | [UploadFile](structures/upload-file.md) | [UploadFileSystem](structures/upload-file-system.md) | [UploadBlob](structures/upload-blob.md))[] - (optional)
-  * `baseURLForDataURL` String (optional) - Base url (with trailing path separator) for files to be loaded by the data url. This is needed only if the specified `url` is a data url and needs to load other files. 
+  * `baseURLForDataURL` String (optional) - Base url (with trailing path separator) for files to be loaded by the data url. This is needed only if the specified `url` is a data url and needs to load other files.
 
 Loads the `url` in the webview, the `url` must contain the protocol prefix,
 e.g. the `http://` or `file://`.
index 0bfe77d..00b309b 100644 (file)
@@ -103,6 +103,9 @@ const createGuest = function (embedder, params) {
         height: params.maxheight
       }
     })
+    if (params.webrtcippolicy) {
+      guest.setWebRTCIPHandlingPolicy(params.webrtcippolicy)
+    }
     if (params.src) {
       const opts = {}
       if (params.httpreferrer) {
index 204046b..c8911f5 100644 (file)
@@ -304,6 +304,13 @@ class DisableBlinkFeaturesAttribute extends WebViewAttribute {
   }
 }
 
+// Attribute specifies WebRTC IP handling policy for handling IP leaking.
+class WebRTCIPHandlingPolicyAttribute extends WebViewAttribute {
+  constructor (webViewImpl) {
+    super(webViewConstants.ATTRIBUTE_WEBRTCIPPOLICY, webViewImpl)
+  }
+}
+
 // Attribute that specifies the web preferences to be enabled.
 class WebPreferencesAttribute extends WebViewAttribute {
   constructor (webViewImpl) {
@@ -329,6 +336,7 @@ WebViewImpl.prototype.setupWebViewAttributes = function () {
   this.attributes[webViewConstants.ATTRIBUTE_GUESTINSTANCE] = new GuestInstanceAttribute(this)
   this.attributes[webViewConstants.ATTRIBUTE_DISABLEGUESTRESIZE] = new BooleanAttribute(webViewConstants.ATTRIBUTE_DISABLEGUESTRESIZE, this)
   this.attributes[webViewConstants.ATTRIBUTE_WEBPREFERENCES] = new WebPreferencesAttribute(this)
+  this.attributes[webViewConstants.ATTRIBUTE_WEBRTCIPPOLICY] = new WebRTCIPHandlingPolicyAttribute(this)
 
   const autosizeAttributes = [webViewConstants.ATTRIBUTE_MAXHEIGHT, webViewConstants.ATTRIBUTE_MAXWIDTH, webViewConstants.ATTRIBUTE_MINHEIGHT, webViewConstants.ATTRIBUTE_MINWIDTH]
   autosizeAttributes.forEach((attribute) => {
index bf26018..42f8134 100644 (file)
@@ -20,6 +20,7 @@ module.exports = {
   ATTRIBUTE_GUESTINSTANCE: 'guestinstance',
   ATTRIBUTE_DISABLEGUESTRESIZE: 'disableguestresize',
   ATTRIBUTE_WEBPREFERENCES: 'webpreferences',
+  ATTRIBUTE_WEBRTCIPPOLICY: 'webrtcippolicy',
 
   // Internal attribute.
   ATTRIBUTE_INTERNALINSTANCEID: 'internalinstanceid',