Merge pull request #7947 from beakerbrowser/register-standard-secure-schemes
Add {secure:} opt to protocol.registerStandardSchemes
	
	
This commit is contained in:
		
				commit
				
					
						1d288b69e2
					
				
			
		
					 13 changed files with 88 additions and 18 deletions
				
			
		| 
						 | 
					@ -197,11 +197,20 @@ void AtomContentClient::AddServiceWorkerSchemes(
 | 
				
			||||||
  std::vector<std::string> schemes;
 | 
					  std::vector<std::string> schemes;
 | 
				
			||||||
  ConvertStringWithSeparatorToVector(&schemes, ",",
 | 
					  ConvertStringWithSeparatorToVector(&schemes, ",",
 | 
				
			||||||
                                     switches::kRegisterServiceWorkerSchemes);
 | 
					                                     switches::kRegisterServiceWorkerSchemes);
 | 
				
			||||||
  if (!schemes.empty()) {
 | 
					  for (const std::string& scheme : schemes)
 | 
				
			||||||
    for (const std::string& scheme : schemes)
 | 
					    service_worker_schemes->insert(scheme);
 | 
				
			||||||
      service_worker_schemes->insert(scheme);
 | 
					
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  service_worker_schemes->insert(url::kFileScheme);
 | 
					  service_worker_schemes->insert(url::kFileScheme);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void AtomContentClient::AddSecureSchemesAndOrigins(
 | 
				
			||||||
 | 
					    std::set<std::string>* secure_schemes,
 | 
				
			||||||
 | 
					    std::set<GURL>* secure_origins) {
 | 
				
			||||||
 | 
					  std::vector<std::string> schemes;
 | 
				
			||||||
 | 
					  ConvertStringWithSeparatorToVector(&schemes, ",", switches::kSecureSchemes);
 | 
				
			||||||
 | 
					  for (const std::string& scheme : schemes)
 | 
				
			||||||
 | 
					    secure_schemes->insert(scheme);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace atom
 | 
					}  // namespace atom
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,9 @@ class AtomContentClient : public brightray::ContentClient {
 | 
				
			||||||
      std::vector<content::PepperPluginInfo>* plugins) override;
 | 
					      std::vector<content::PepperPluginInfo>* plugins) override;
 | 
				
			||||||
  void AddServiceWorkerSchemes(
 | 
					  void AddServiceWorkerSchemes(
 | 
				
			||||||
      std::set<std::string>* service_worker_schemes) override;
 | 
					      std::set<std::string>* service_worker_schemes) override;
 | 
				
			||||||
 | 
					  void AddSecureSchemesAndOrigins(
 | 
				
			||||||
 | 
					      std::set<std::string>* secure_schemes,
 | 
				
			||||||
 | 
					      std::set<GURL>* secure_origins) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
  DISALLOW_COPY_AND_ASSIGN(AtomContentClient);
 | 
					  DISALLOW_COPY_AND_ASSIGN(AtomContentClient);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,7 +46,8 @@ std::vector<std::string> GetStandardSchemes() {
 | 
				
			||||||
  return g_standard_schemes;
 | 
					  return g_standard_schemes;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void RegisterStandardSchemes(const std::vector<std::string>& schemes) {
 | 
					void RegisterStandardSchemes(const std::vector<std::string>& schemes,
 | 
				
			||||||
 | 
					                             mate::Arguments* args) {
 | 
				
			||||||
  g_standard_schemes = schemes;
 | 
					  g_standard_schemes = schemes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  auto* policy = content::ChildProcessSecurityPolicy::GetInstance();
 | 
					  auto* policy = content::ChildProcessSecurityPolicy::GetInstance();
 | 
				
			||||||
| 
						 | 
					@ -55,8 +56,17 @@ void RegisterStandardSchemes(const std::vector<std::string>& schemes) {
 | 
				
			||||||
    policy->RegisterWebSafeScheme(scheme);
 | 
					    policy->RegisterWebSafeScheme(scheme);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // add switches to register as standard
 | 
				
			||||||
  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
 | 
					  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
 | 
				
			||||||
      atom::switches::kStandardSchemes, base::JoinString(schemes, ","));
 | 
					      atom::switches::kStandardSchemes, base::JoinString(schemes, ","));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mate::Dictionary opts;
 | 
				
			||||||
 | 
					  bool secure = false;
 | 
				
			||||||
 | 
					  if (args->GetNext(&opts) && opts.Get("secure", &secure) && secure) {
 | 
				
			||||||
 | 
					    // add switches to register as secure
 | 
				
			||||||
 | 
					    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
 | 
				
			||||||
 | 
					      atom::switches::kSecureSchemes, base::JoinString(schemes, ","));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Protocol::Protocol(v8::Isolate* isolate, AtomBrowserContext* browser_context)
 | 
					Protocol::Protocol(v8::Isolate* isolate, AtomBrowserContext* browser_context)
 | 
				
			||||||
| 
						 | 
					@ -220,7 +230,7 @@ void RegisterStandardSchemes(
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  atom::api::RegisterStandardSchemes(schemes);
 | 
					  atom::api::RegisterStandardSchemes(schemes, args);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
 | 
					void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,8 @@ namespace atom {
 | 
				
			||||||
namespace api {
 | 
					namespace api {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::vector<std::string> GetStandardSchemes();
 | 
					std::vector<std::string> GetStandardSchemes();
 | 
				
			||||||
void RegisterStandardSchemes(const std::vector<std::string>& schemes);
 | 
					void RegisterStandardSchemes(const std::vector<std::string>& schemes,
 | 
				
			||||||
 | 
					                             mate::Arguments* args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Protocol : public mate::TrackableObject<Protocol> {
 | 
					class Protocol : public mate::TrackableObject<Protocol> {
 | 
				
			||||||
 public:
 | 
					 public:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -234,7 +234,8 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches(
 | 
				
			||||||
  // Copy following switches to child process.
 | 
					  // Copy following switches to child process.
 | 
				
			||||||
  static const char* const kCommonSwitchNames[] = {
 | 
					  static const char* const kCommonSwitchNames[] = {
 | 
				
			||||||
    switches::kStandardSchemes,
 | 
					    switches::kStandardSchemes,
 | 
				
			||||||
    switches::kEnableSandbox
 | 
					    switches::kEnableSandbox,
 | 
				
			||||||
 | 
					    switches::kSecureSchemes
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  command_line->CopySwitchesFrom(
 | 
					  command_line->CopySwitchesFrom(
 | 
				
			||||||
      *base::CommandLine::ForCurrentProcess(),
 | 
					      *base::CommandLine::ForCurrentProcess(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,6 +144,9 @@ const char kStandardSchemes[] = "standard-schemes";
 | 
				
			||||||
// Register schemes to handle service worker.
 | 
					// Register schemes to handle service worker.
 | 
				
			||||||
const char kRegisterServiceWorkerSchemes[] = "register-service-worker-schemes";
 | 
					const char kRegisterServiceWorkerSchemes[] = "register-service-worker-schemes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Register schemes as secure.
 | 
				
			||||||
 | 
					const char kSecureSchemes[] = "secure-schemes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The minimum SSL/TLS version ("tls1", "tls1.1", or "tls1.2") that
 | 
					// The minimum SSL/TLS version ("tls1", "tls1.1", or "tls1.2") that
 | 
				
			||||||
// TLS fallback will accept.
 | 
					// TLS fallback will accept.
 | 
				
			||||||
const char kSSLVersionFallbackMin[] = "ssl-version-fallback-min";
 | 
					const char kSSLVersionFallbackMin[] = "ssl-version-fallback-min";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,6 +76,7 @@ extern const char kPpapiFlashVersion[];
 | 
				
			||||||
extern const char kDisableHttpCache[];
 | 
					extern const char kDisableHttpCache[];
 | 
				
			||||||
extern const char kStandardSchemes[];
 | 
					extern const char kStandardSchemes[];
 | 
				
			||||||
extern const char kRegisterServiceWorkerSchemes[];
 | 
					extern const char kRegisterServiceWorkerSchemes[];
 | 
				
			||||||
 | 
					extern const char kSecureSchemes[];
 | 
				
			||||||
extern const char kSSLVersionFallbackMin[];
 | 
					extern const char kSSLVersionFallbackMin[];
 | 
				
			||||||
extern const char kCipherSuiteBlacklist[];
 | 
					extern const char kCipherSuiteBlacklist[];
 | 
				
			||||||
extern const char kAppUserModelId[];
 | 
					extern const char kAppUserModelId[];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,6 +133,7 @@ void WebFrame::SetSpellCheckProvider(mate::Arguments* args,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WebFrame::RegisterURLSchemeAsSecure(const std::string& scheme) {
 | 
					void WebFrame::RegisterURLSchemeAsSecure(const std::string& scheme) {
 | 
				
			||||||
 | 
					  // TODO(pfrazee): Remove 2.0
 | 
				
			||||||
  // Register scheme to secure list (https, wss, data).
 | 
					  // Register scheme to secure list (https, wss, data).
 | 
				
			||||||
  blink::WebSecurityPolicy::registerURLSchemeAsSecure(
 | 
					  blink::WebSecurityPolicy::registerURLSchemeAsSecure(
 | 
				
			||||||
      blink::WebString::fromUTF8(scheme));
 | 
					      blink::WebString::fromUTF8(scheme));
 | 
				
			||||||
| 
						 | 
					@ -165,6 +166,7 @@ void WebFrame::RegisterURLSchemeAsPrivileged(const std::string& scheme,
 | 
				
			||||||
  // Register scheme to privileged list (https, wss, data, chrome-extension)
 | 
					  // Register scheme to privileged list (https, wss, data, chrome-extension)
 | 
				
			||||||
  blink::WebString privileged_scheme(blink::WebString::fromUTF8(scheme));
 | 
					  blink::WebString privileged_scheme(blink::WebString::fromUTF8(scheme));
 | 
				
			||||||
  if (secure) {
 | 
					  if (secure) {
 | 
				
			||||||
 | 
					    // TODO(pfrazee): Remove 2.0
 | 
				
			||||||
    blink::WebSecurityPolicy::registerURLSchemeAsSecure(privileged_scheme);
 | 
					    blink::WebSecurityPolicy::registerURLSchemeAsSecure(privileged_scheme);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (bypassCSP) {
 | 
					  if (bypassCSP) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,21 +121,23 @@ bool IsDevToolsExtension(content::RenderFrame* render_frame) {
 | 
				
			||||||
      .SchemeIs("chrome-extension");
 | 
					      .SchemeIs("chrome-extension");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::vector<std::string> ParseSchemesCLISwitch(const char* switch_name) {
 | 
				
			||||||
 | 
					  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 | 
				
			||||||
 | 
					  std::string custom_schemes = command_line->GetSwitchValueASCII(switch_name);
 | 
				
			||||||
 | 
					  return base::SplitString(
 | 
				
			||||||
 | 
					      custom_schemes, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AtomRendererClient::AtomRendererClient()
 | 
					AtomRendererClient::AtomRendererClient()
 | 
				
			||||||
    : node_bindings_(NodeBindings::Create(false)),
 | 
					    : node_bindings_(NodeBindings::Create(false)),
 | 
				
			||||||
      atom_bindings_(new AtomBindings) {
 | 
					      atom_bindings_(new AtomBindings) {
 | 
				
			||||||
  // Parse --standard-schemes=scheme1,scheme2
 | 
					  // Parse --standard-schemes=scheme1,scheme2
 | 
				
			||||||
  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 | 
					  std::vector<std::string> standard_schemes_list =
 | 
				
			||||||
  std::string custom_schemes = command_line->GetSwitchValueASCII(
 | 
					      ParseSchemesCLISwitch(switches::kStandardSchemes);
 | 
				
			||||||
      switches::kStandardSchemes);
 | 
					  for (const std::string& scheme : standard_schemes_list)
 | 
				
			||||||
  if (!custom_schemes.empty()) {
 | 
					    url::AddStandardScheme(scheme.c_str(), url::SCHEME_WITHOUT_PORT);
 | 
				
			||||||
    std::vector<std::string> schemes_list = base::SplitString(
 | 
					 | 
				
			||||||
        custom_schemes, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
 | 
					 | 
				
			||||||
    for (const std::string& scheme : schemes_list)
 | 
					 | 
				
			||||||
      url::AddStandardScheme(scheme.c_str(), url::SCHEME_WITHOUT_PORT);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AtomRendererClient::~AtomRendererClient() {
 | 
					AtomRendererClient::~AtomRendererClient() {
 | 
				
			||||||
| 
						 | 
					@ -182,6 +184,13 @@ void AtomRendererClient::RenderFrameCreated(
 | 
				
			||||||
  // Allow file scheme to handle service worker by default.
 | 
					  // Allow file scheme to handle service worker by default.
 | 
				
			||||||
  // FIXME(zcbenz): Can this be moved elsewhere?
 | 
					  // FIXME(zcbenz): Can this be moved elsewhere?
 | 
				
			||||||
  blink::WebSecurityPolicy::registerURLSchemeAsAllowingServiceWorkers("file");
 | 
					  blink::WebSecurityPolicy::registerURLSchemeAsAllowingServiceWorkers("file");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Parse --secure-schemes=scheme1,scheme2
 | 
				
			||||||
 | 
					  std::vector<std::string> secure_schemes_list =
 | 
				
			||||||
 | 
					      ParseSchemesCLISwitch(switches::kSecureSchemes);
 | 
				
			||||||
 | 
					  for (const std::string& secure_scheme : secure_schemes_list)
 | 
				
			||||||
 | 
					    blink::WebSecurityPolicy::registerURLSchemeAsSecure(
 | 
				
			||||||
 | 
					        blink::WebString::fromUTF8(secure_scheme));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void AtomRendererClient::RenderViewCreated(content::RenderView* render_view) {
 | 
					void AtomRendererClient::RenderViewCreated(content::RenderView* render_view) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,6 +117,16 @@ webContents.setVisualZoomLevelLimits(1, 2)
 | 
				
			||||||
webFrame.setZoomLevelLimits(1, 2)
 | 
					webFrame.setZoomLevelLimits(1, 2)
 | 
				
			||||||
// Replace with
 | 
					// Replace with
 | 
				
			||||||
webFrame.setVisualZoomLevelLimits(1, 2)
 | 
					webFrame.setVisualZoomLevelLimits(1, 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Deprecated
 | 
				
			||||||
 | 
					webFrame.registerURLSchemeAsSecure('app')
 | 
				
			||||||
 | 
					// Replace with
 | 
				
			||||||
 | 
					protocol.registerStandardSchemes(['app'], {secure: true})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Deprecated
 | 
				
			||||||
 | 
					webFrame.registerURLSchemeAsPrivileged('app', {secure: true})
 | 
				
			||||||
 | 
					// Replace with
 | 
				
			||||||
 | 
					protocol.registerStandardSchemes(['app'], {secure: true})
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## `<webview>`
 | 
					## `<webview>`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -985,5 +985,19 @@ describe('protocol module', function () {
 | 
				
			||||||
      ipcMain.once('file-system-error', (event, err) => done(err))
 | 
					      ipcMain.once('file-system-error', (event, err) => done(err))
 | 
				
			||||||
      ipcMain.once('file-system-write-end', () => done())
 | 
					      ipcMain.once('file-system-write-end', () => done())
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it('registers secure, when {secure: true}', function (done) {
 | 
				
			||||||
 | 
					      // the CacheStorage API will only work if secure == true
 | 
				
			||||||
 | 
					      let filePath = path.join(__dirname, 'fixtures', 'pages', 'cache-storage.html')
 | 
				
			||||||
 | 
					      const handler = function (request, callback) {
 | 
				
			||||||
 | 
					        callback({path: filePath})
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ipcMain.once('success', () => done())
 | 
				
			||||||
 | 
					      ipcMain.once('failure', (event, err) => done(err))
 | 
				
			||||||
 | 
					      protocol.registerFileProtocol(standardScheme, handler, function (error) {
 | 
				
			||||||
 | 
					        if (error) return done(error)
 | 
				
			||||||
 | 
					        w.loadURL(origin)
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7
									
								
								spec/fixtures/pages/cache-storage.html
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								spec/fixtures/pages/cache-storage.html
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					  const ipcRenderer = require('electron').ipcRenderer;
 | 
				
			||||||
 | 
					  caches.open('foo').then(
 | 
				
			||||||
 | 
					    () => ipcRenderer.send('success'),
 | 
				
			||||||
 | 
					    err => ipcRenderer.send('failure', err)
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -92,7 +92,7 @@ if (global.isCi) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Register app as standard scheme.
 | 
					// Register app as standard scheme.
 | 
				
			||||||
global.standardScheme = 'app'
 | 
					global.standardScheme = 'app'
 | 
				
			||||||
protocol.registerStandardSchemes([global.standardScheme])
 | 
					protocol.registerStandardSchemes([global.standardScheme], { secure: true })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.on('window-all-closed', function () {
 | 
					app.on('window-all-closed', function () {
 | 
				
			||||||
  app.quit()
 | 
					  app.quit()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue