Title: [140486] trunk/Source/WebKit2
Revision
140486
Author
[email protected]
Date
2013-01-22 16:35:53 -0800 (Tue, 22 Jan 2013)

Log Message

        Move sandbox initialization to ChildProcess
        https://bugs.webkit.org/show_bug.cgi?id=107486

        Reviewed by Sam Weinig.

        * NetworkProcess/NetworkProcess.h:
        * NetworkProcess/NetworkProcess.cpp:
        (WebKit::NetworkProcess::initializeSandbox): Removed. We no longer need this function
        to be implemented in each process type.

        * NetworkProcess/mac/NetworkProcessMac.mm:
        (WebKit::initializeSandbox): Removed a custom (and incomplete) implementation.
        (WebKit::NetworkProcess::processUpdateSandboxInitializationParameters): Clear
        sandbox profile path in parameters, telling ChildProcess to not enter a sandbox.

        * PluginProcess/PluginProcess.h:
        * PluginProcess/mac/PluginProcessMac.mm:
        Added FIXMEs, saying that we should switch to ChildProcess implementation.

        * Shared/ChildProcess.cpp: Dummy implementations for other platforms.

        * Shared/ChildProcess.h: Added processUpdateSandboxInitializationParameters, which
        child processes will override to change sandbox initialization parameters.

        * Shared/SandboxInitializationParameters.h: Added.
        * Shared/mac/SandboxInitialiationParametersMac.mm: Added.
        Abstracts out sandbox parameter vector for coding safety. Encapsulates other
        things that subclasses will want to do differently.

        * Shared/mac/ChildProcessMac.mm: (WebKit::ChildProcess::initializeSandbox):
        Added a shared implementation, based largely on WebProcess version.

        * SharedWorkerProcess/mac/SharedWorkerProcessMac.mm: Removed custom sandboxing code.

        * WebKit2.xcodeproj/project.pbxproj: Added SandboxInitializationParameters files.

        * WebProcess/WebProcess.cpp:
        * WebProcess/WebProcess.h:
        Updated dummy implementations to match ChildProcess.

        * WebProcess/mac/WebProcessMac.mm:
        (WebKit): Moved sandboxing code to ChildProcess.
        (WebKit::WebProcess::processUpdateSandboxInitializationParameters): Override
        profile path, because default one doesn't work for WebProcessService.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (140485 => 140486)


--- trunk/Source/WebKit2/ChangeLog	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/ChangeLog	2013-01-23 00:35:53 UTC (rev 140486)
@@ -1,3 +1,50 @@
+2013-01-22  Alexey Proskuryakov  <[email protected]>
+
+        Move sandbox initialization to ChildProcess
+        https://bugs.webkit.org/show_bug.cgi?id=107486
+
+        Reviewed by Sam Weinig.
+
+        * NetworkProcess/NetworkProcess.h:
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::initializeSandbox): Removed. We no longer need this function
+        to be implemented in each process type.
+
+        * NetworkProcess/mac/NetworkProcessMac.mm:
+        (WebKit::initializeSandbox): Removed a custom (and incomplete) implementation.
+        (WebKit::NetworkProcess::processUpdateSandboxInitializationParameters): Clear
+        sandbox profile path in parameters, telling ChildProcess to not enter a sandbox.
+
+        * PluginProcess/PluginProcess.h:
+        * PluginProcess/mac/PluginProcessMac.mm:
+        Added FIXMEs, saying that we should switch to ChildProcess implementation.
+
+        * Shared/ChildProcess.cpp: Dummy implementations for other platforms.
+
+        * Shared/ChildProcess.h: Added processUpdateSandboxInitializationParameters, which
+        child processes will override to change sandbox initialization parameters.
+
+        * Shared/SandboxInitializationParameters.h: Added.
+        * Shared/mac/SandboxInitialiationParametersMac.mm: Added.
+        Abstracts out sandbox parameter vector for coding safety. Encapsulates other
+        things that subclasses will want to do differently.
+
+        * Shared/mac/ChildProcessMac.mm: (WebKit::ChildProcess::initializeSandbox):
+        Added a shared implementation, based largely on WebProcess version.
+
+        * SharedWorkerProcess/mac/SharedWorkerProcessMac.mm: Removed custom sandboxing code.
+
+        * WebKit2.xcodeproj/project.pbxproj: Added SandboxInitializationParameters files.
+
+        * WebProcess/WebProcess.cpp:
+        * WebProcess/WebProcess.h:
+        Updated dummy implementations to match ChildProcess.
+
+        * WebProcess/mac/WebProcessMac.mm:
+        (WebKit): Moved sandboxing code to ChildProcess.
+        (WebKit::WebProcess::processUpdateSandboxInitializationParameters): Override
+        profile path, because default one doesn't work for WebProcessService.
+
 2013-01-22  Joseph Pecoraro  <[email protected]>
 
         [Mac] Enable Page Visibility (PAGE_VISIBILITY_API)

Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp (140485 => 140486)


--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp	2013-01-23 00:35:53 UTC (rev 140486)
@@ -216,7 +216,7 @@
 {
 }
 
-void NetworkProcess::initializeSandbox(const ChildProcessInitializationParameters&)
+void NetworkProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
 {
 }
 #endif

Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h (140485 => 140486)


--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h	2013-01-23 00:35:53 UTC (rev 140486)
@@ -78,9 +78,9 @@
 
     // ChildProcess
     virtual void initializeProcessName(const ChildProcessInitializationParameters&) OVERRIDE;
-    virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE;
     virtual void initializeConnection(CoreIPC::Connection*) OVERRIDE;
     virtual bool shouldTerminate() OVERRIDE;
+    virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) OVERRIDE;
 
     // CoreIPC::Connection::Client
     virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&) OVERRIDE;

Modified: trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm (140485 => 140486)


--- trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm	2013-01-23 00:35:53 UTC (rev 140486)
@@ -31,6 +31,7 @@
 #import "NetworkProcessCreationParameters.h"
 #import "PlatformCertificateInfo.h"
 #import "SandboxExtension.h"
+#import "SandboxInitializationParameters.h"
 #import "StringUtilities.h"
 #import <WebCore/FileSystem.h>
 #import <WebCore/LocalizedStrings.h>
@@ -64,37 +65,6 @@
     }
 }
 
-void NetworkProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
-{
-    [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
-
-#if DEBUG_BYPASS_SANDBOX
-    WTFLogAlways("Bypassing network process sandbox.\n");
-    return;
-#endif
-
-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
-    // Use private temporary and cache directories.
-    String systemDirectorySuffix = "com.apple.WebKit.NetworkProcess+" + parameters.clientIdentifier;
-    setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(systemDirectorySuffix).data(), 0);
-    char temporaryDirectory[PATH_MAX];
-    if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
-        WTFLogAlways("NetworkProcess: couldn't retrieve private temporary directory path: %d\n", errno);
-        exit(EX_NOPERM);
-    }
-    setenv("TMPDIR", temporaryDirectory, 1);
-#endif
-
-    // FIXME (NetworkProcess): <rdar://problem/12772605> Actually initialize the sandbox.
-
-    // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
-    OSStatus error = WKEnableSandboxStyleFileQuarantine();
-    if (error) {
-        WTFLogAlways("NetworkProcess: Couldn't enable sandbox style file quarantine: %ld\n", (long)error);
-        exit(EX_NOPERM);
-    }
-}
-
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
 static void overrideSystemProxies(const String& httpProxy, const String& httpsProxy)
 {
@@ -208,6 +178,12 @@
     [NSURLRequest setAllowsSpecificHTTPSCertificate:(NSArray *)certificateInfo.certificateChain() forHost:(NSString *)host];
 }
 
+// FIXME: Remove when the process has a profile.
+void NetworkProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters& parameters)
+{
+    parameters.setSandboxProfilePath(String());
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(NETWORK_PROCESS)

Modified: trunk/Source/WebKit2/PluginProcess/PluginProcess.h (140485 => 140486)


--- trunk/Source/WebKit2/PluginProcess/PluginProcess.h	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/PluginProcess/PluginProcess.h	2013-01-23 00:35:53 UTC (rev 140486)
@@ -76,6 +76,9 @@
     virtual void initializeProcess(const ChildProcessInitializationParameters&) OVERRIDE;
     virtual bool shouldTerminate() OVERRIDE;
 
+    // FIXME: PluginProcess should switch to common code for sandbox initialization.
+    virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE { }
+
     void platformInitializeProcess(const ChildProcessInitializationParameters&);
 
     // CoreIPC::Connection::Client

Modified: trunk/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm (140485 => 140486)


--- trunk/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm	2013-01-23 00:35:53 UTC (rev 140486)
@@ -352,6 +352,7 @@
     
     WKSetVisibleApplicationName((CFStringRef)applicationName);
 
+    // FIXME: Use ChildProcess::initializeSandbox.
     WebKit::initializeSandbox(m_pluginPath, parameters.sandboxProfileDirectoryPath);
 
     if (parameters.processType == TypeSnapshotProcess)

Modified: trunk/Source/WebKit2/Shared/ChildProcess.cpp (140485 => 140486)


--- trunk/Source/WebKit2/Shared/ChildProcess.cpp	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/Shared/ChildProcess.cpp	2013-01-23 00:35:53 UTC (rev 140486)
@@ -86,10 +86,16 @@
 {
 }
 
+#if !PLATFORM(MAC)
 void ChildProcess::initializeSandbox(const ChildProcessInitializationParameters&)
 {
 }
+#endif
 
+void ChildProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
+{
+}
+
 void ChildProcess::initializeConnection(CoreIPC::Connection*)
 {
 }

Modified: trunk/Source/WebKit2/Shared/ChildProcess.h (140485 => 140486)


--- trunk/Source/WebKit2/Shared/ChildProcess.h	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/Shared/ChildProcess.h	2013-01-23 00:35:53 UTC (rev 140486)
@@ -35,6 +35,8 @@
 
 namespace WebKit {
 
+class SandboxInitializationParameters;
+
 struct ChildProcessInitializationParameters {
     String uiProcessName;
     String clientIdentifier;
@@ -77,7 +79,6 @@
 
     virtual void initializeProcess(const ChildProcessInitializationParameters&);
     virtual void initializeProcessName(const ChildProcessInitializationParameters&);
-    virtual void initializeSandbox(const ChildProcessInitializationParameters&);
     virtual void initializeConnection(CoreIPC::Connection*);
 
     virtual bool shouldTerminate() = 0;
@@ -87,6 +88,9 @@
     void terminationTimerFired();
 
     void platformInitialize();
+    // FIXME: This function is virtual only because PluginProcess needs to bypass it. It should switch to common code.
+    virtual void initializeSandbox(const ChildProcessInitializationParameters&);
+    virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&);
 
     // The timeout, in seconds, before this process will be terminated if termination
     // has been enabled. If the timeout is 0 seconds, the process will be terminated immediately.

Added: trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h (0 => 140486)


--- trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h	                        (rev 0)
+++ trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h	2013-01-23 00:35:53 UTC (rev 140486)
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SandboxInitializationParameters_h
+#define SandboxInitializationParameters_h
+
+#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+
+class SandboxInitializationParameters {
+WTF_MAKE_NONCOPYABLE(SandboxInitializationParameters);
+public:
+
+#if PLATFORM(MAC)
+    SandboxInitializationParameters();
+    ~SandboxInitializationParameters();
+
+    // Name must be a literal.
+    void addConfDirectoryParameter(const char* name, int confID);
+    void addPathParameter(const char* name, NSString *path);
+    void addPathParameter(const char* name, const char* path);
+
+    const char* const* namedParameterArray() const;
+
+    size_t count() const;
+    const char* name(size_t index) const;
+    const char* value(size_t index) const;
+
+    void setSandboxProfilePath(const String& path) { m_sandboxProfilePath = path; m_sandboxProfile = String(); }
+    const String& sandboxProfilePath() const { return m_sandboxProfilePath; }
+
+    void setSandboxProfile(const String& profile) { m_sandboxProfilePath = String(); m_sandboxProfile = profile; }
+    const String& sandboxProfile() const { return m_sandboxProfile; }
+
+    void setSystemDirectorySuffix(const String& suffix) { m_systemDirectorySuffix = suffix; }
+    const String& systemDirectorySuffix() const { return m_systemDirectorySuffix; }
+#endif
+
+private:
+#if PLATFORM(MAC)
+    void appendPathInternal(const char* name, const char* path);
+
+    mutable Vector<const char*> m_namedParameters;
+    String m_systemDirectorySuffix;
+
+    String m_sandboxProfilePath;
+    String m_sandboxProfile;
+#endif
+};
+
+}
+
+#endif // SandboxInitializationParameters_h
Property changes on: trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm (140485 => 140486)


--- trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm	2013-01-23 00:35:53 UTC (rev 140486)
@@ -26,9 +26,23 @@
 #import "config.h"
 #import "ChildProcess.h"
 
+#import "SandboxInitializationParameters.h"
 #import "WebKitSystemInterface.h"
+#import <WebCore/FileSystem.h>
 #import <mach/task.h>
+#import <pwd.h>
+#import <stdlib.h>
+#import <sysexits.h>
 
+// We have to #undef __APPLE_API_PRIVATE to prevent sandbox.h from looking for a header file that does not exist (<rdar://problem/9679211>). 
+#undef __APPLE_API_PRIVATE
+#import <sandbox.h>
+
+#define SANDBOX_NAMED_EXTERNAL 0x0003
+extern "C" int sandbox_init_with_parameters(const char *profile, uint64_t flags, const char *const parameters[], char **errorbuf);
+
+using namespace WebCore;
+
 namespace WebKit {
 
 void ChildProcess::setApplicationIsOccluded(bool applicationIsOccluded)
@@ -64,4 +78,73 @@
     setApplicationIsOccluded(false);
 }
 
+void ChildProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
+{
+    [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
+
+    SandboxInitializationParameters sandboxParameters;
+
+    NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
+    NSString *defaultProfilePath = [webkit2Bundle pathForResource:[[NSBundle mainBundle] bundleIdentifier] ofType:@"sb"];
+
+    sandboxParameters.setSandboxProfilePath(defaultProfilePath);
+
+    String defaultSystemDirectorySuffix = [[NSBundle mainBundle] bundleIdentifier] + parameters.clientIdentifier;
+    sandboxParameters.setSystemDirectorySuffix(defaultSystemDirectorySuffix);
+
+    sandboxParameters.addPathParameter("WEBKIT2_FRAMEWORK_DIR", [[webkit2Bundle bundlePath] stringByDeletingLastPathComponent]);
+    sandboxParameters.addConfDirectoryParameter("DARWIN_USER_TEMP_DIR", _CS_DARWIN_USER_TEMP_DIR);
+    sandboxParameters.addConfDirectoryParameter("DARWIN_USER_CACHE_DIR", _CS_DARWIN_USER_CACHE_DIR);
+
+    char buffer[4096];
+    int bufferSize = sizeof(buffer);
+    struct passwd pwd;
+    struct passwd* result = 0;
+    if (getpwuid_r(getuid(), &pwd, buffer, bufferSize, &result) || !result) {
+        WTFLogAlways("%s: Couldn't find home directory\n", getprogname());
+        exit(EX_NOPERM);
+    }
+
+    sandboxParameters.addPathParameter("HOME_DIR", pwd.pw_dir);
+
+    processUpdateSandboxInitializationParameters(parameters, sandboxParameters);
+
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
+    // Use private temporary and cache directories.
+    setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(sandboxParameters.systemDirectorySuffix()).data(), 0);
+    char temporaryDirectory[PATH_MAX];
+    if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
+        WTFLogAlways("%s: couldn't retrieve private temporary directory path: %d\n", getprogname(), errno);
+        exit(EX_NOPERM);
+    }
+    setenv("TMPDIR", temporaryDirectory, 1);
+#endif
+
+    if (!sandboxParameters.sandboxProfilePath().isEmpty()) {
+        CString profilePath = fileSystemRepresentation(sandboxParameters.sandboxProfilePath());
+        char* errorBuf;
+        if (sandbox_init_with_parameters(profilePath.data(), SANDBOX_NAMED_EXTERNAL, sandboxParameters.namedParameterArray(), &errorBuf)) {
+            WTFLogAlways("%s: Couldn't initialize sandbox profile [%s], error '%s'\n", getprogname(), profilePath.data(), errorBuf);
+            for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i)
+                WTFLogAlways("%s=%s\n", sandboxParameters.name(i), sandboxParameters.value(i));
+            exit(EX_NOPERM);
+        }
+    } else if (!sandboxParameters.sandboxProfile().isEmpty()) {
+        char* errorBuf;
+        if (sandbox_init_with_parameters(sandboxParameters.sandboxProfile().utf8().data(), 0, sandboxParameters.namedParameterArray(), &errorBuf)) {
+            WTFLogAlways("%s: Couldn't initialize sandbox profile, error '%s'\n", getprogname(), errorBuf);
+            for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i)
+                WTFLogAlways("%s=%s\n", sandboxParameters.name(i), sandboxParameters.value(i));
+            exit(EX_NOPERM);
+        }
+    }
+
+    // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
+    OSStatus error = WKEnableSandboxStyleFileQuarantine();
+    if (error) {
+        WTFLogAlways("%s: Couldn't enable sandbox style file quarantine: %ld\n", getprogname(), (long)error);
+        exit(EX_NOPERM);
+    }
 }
+
+}

Added: trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm (0 => 140486)


--- trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm	                        (rev 0)
+++ trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm	2013-01-23 00:35:53 UTC (rev 140486)
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "SandboxInitializationParameters.h"
+
+namespace WebKit {
+
+SandboxInitializationParameters::SandboxInitializationParameters()
+{
+}
+
+SandboxInitializationParameters::~SandboxInitializationParameters()
+{
+    for (size_t i = 0; i + 1 < m_namedParameters.size(); i += 2)
+        fastFree(const_cast<char*>(m_namedParameters[i + 1]));
+}
+
+void SandboxInitializationParameters::appendPathInternal(const char* name, const char* path)
+{
+    char normalizedPath[PATH_MAX];
+    if (!realpath(path, normalizedPath))
+        normalizedPath[0] = '\0';
+
+    ASSERT(!(m_namedParameters.size() % 2));
+
+    m_namedParameters.append(name);
+    m_namedParameters.append(fastStrDup(normalizedPath));
+}
+
+void SandboxInitializationParameters::addConfDirectoryParameter(const char* name, int confID)
+{
+    char path[PATH_MAX];
+    if (confstr(confID, path, PATH_MAX) <= 0)
+        path[0] = '\0';
+
+    appendPathInternal(name, path);
+}
+
+void SandboxInitializationParameters::addPathParameter(const char* name, NSString *path)
+{
+    appendPathInternal(name, [path length] ? [(NSString *)path fileSystemRepresentation] : "");
+}
+
+void SandboxInitializationParameters::addPathParameter(const char* name, const char* path)
+{
+    appendPathInternal(name, path);
+}
+
+const char* const* SandboxInitializationParameters::namedParameterArray() const
+{
+    if (!(m_namedParameters.size() % 2))
+        m_namedParameters.append(static_cast<const char*>(0));
+
+    return m_namedParameters.data();
+}
+
+size_t SandboxInitializationParameters::count() const
+{
+    return m_namedParameters.size() / 2;
+}
+
+const char* SandboxInitializationParameters::name(size_t index) const
+{
+    ASSERT(index != m_namedParameters.size());
+    return m_namedParameters[index * 2];
+}
+
+const char* SandboxInitializationParameters::value(size_t index) const
+{
+    return m_namedParameters[index * 2 + 1];
+}
+
+}
Property changes on: trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/Source/WebKit2/SharedWorkerProcess/mac/SharedWorkerProcessMac.mm (140485 => 140486)


--- trunk/Source/WebKit2/SharedWorkerProcess/mac/SharedWorkerProcessMac.mm	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/SharedWorkerProcess/mac/SharedWorkerProcessMac.mm	2013-01-23 00:35:53 UTC (rev 140486)
@@ -46,18 +46,6 @@
 
 namespace WebKit {
 
-static void initializeSandbox()
-{
-    NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
-    const char* profilePath = [[webkit2Bundle pathForResource:@"com.apple.WebKit.SharedWorkerProcess" ofType:@"sb"] fileSystemRepresentation];
-
-    char* errorBuf;
-    if (sandbox_init_with_parameters(profilePath, SANDBOX_NAMED_EXTERNAL, 0, &errorBuf)) {
-        WTFLogAlways("SharedWorkerProcess: couldn't initialize sandbox profile [%s] error '%s'\n", profilePath, errorBuf);
-        exit(EX_NOPERM);
-    }
-}
-
 void SharedWorkerProcess::platformInitializeSharedWorkerProcess(const SharedWorkerProcessCreationParameters& parameters)
 {
     NSString *applicationName = [NSString stringWithFormat:WEB_UI_STRING("Shared Web Worker (%@ Internet plug-in)",
@@ -65,8 +53,6 @@
         (NSString *)parameters.parentProcessName];
     
     WKSetVisibleApplicationName((CFStringRef)applicationName);
-
-    WebKit::initializeSandbox();
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (140485 => 140486)


--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2013-01-23 00:35:53 UTC (rev 140486)
@@ -1053,6 +1053,8 @@
 		E1B78473163F253E0007B692 /* RemoteNetworkingContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1B78472163F253E0007B692 /* RemoteNetworkingContext.mm */; };
 		E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CC1B8E12D7EADF00625838 /* PrintInfo.h */; };
 		E1CC1B9112D7EADF00625838 /* PrintInfoMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */; };
+		E1E552C416AE065F004ED653 /* SandboxInitialiationParametersMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */; };
+		E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */; };
 		E1EDFDA61628868E0039ECDA /* MainMacProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6FA31011E3921E00DB1371 /* MainMacProcess.cpp */; };
 		E1EDFDA7162886960039ECDA /* SharedWorkerProcessMainMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1EDFD9B16287D0B0039ECDA /* SharedWorkerProcessMainMac.mm */; };
 		E1EDFDA8162886990039ECDA /* SharedWorkerProcessMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1EDFDA21628838C0039ECDA /* SharedWorkerProcessMac.mm */; };
@@ -2374,6 +2376,8 @@
 		E1B78472163F253E0007B692 /* RemoteNetworkingContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RemoteNetworkingContext.mm; sourceTree = "<group>"; };
 		E1CC1B8E12D7EADF00625838 /* PrintInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintInfo.h; sourceTree = "<group>"; };
 		E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PrintInfoMac.mm; sourceTree = "<group>"; };
+		E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SandboxInitialiationParametersMac.mm; sourceTree = "<group>"; };
+		E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SandboxInitializationParameters.h; sourceTree = "<group>"; };
 		E1EDFD9816287BD10039ECDA /* SharedWorkerProcessMain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedWorkerProcessMain.h; sourceTree = "<group>"; };
 		E1EDFD9B16287D0B0039ECDA /* SharedWorkerProcessMainMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SharedWorkerProcessMainMac.mm; sourceTree = "<group>"; };
 		E1EDFD9D16287F190039ECDA /* SharedWorkerProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedWorkerProcess.h; sourceTree = "<group>"; };
@@ -2833,6 +2837,7 @@
 				F6A0C13F13281E6E0070430F /* ResourceCachesToClear.h */,
 				BC2D021612AC41CB00E732A3 /* SameDocumentNavigationType.h */,
 				1AAB4A8C1296F0A20023952F /* SandboxExtension.h */,
+				E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */,
 				33152973130D0CB200ED2483 /* SecurityOriginData.cpp */,
 				33152974130D0CB200ED2483 /* SecurityOriginData.h */,
 				518D2CC812D51DFB003BB93B /* SessionState.cpp */,
@@ -3850,6 +3855,7 @@
 				1AF1AC6A1651759E00C17D7F /* RemoteLayerTreeTransaction.h */,
 				1AF1AC691651759E00C17D7F /* RemoteLayerTreeTransaction.mm */,
 				1AAB4AA91296F1540023952F /* SandboxExtensionMac.mm */,
+				E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */,
 				51D1304F1382EAC000351EDD /* SecItemRequestData.cpp */,
 				51D130501382EAC000351EDD /* SecItemRequestData.h */,
 				51D130511382EAC000351EDD /* SecItemResponseData.cpp */,
@@ -5051,6 +5057,7 @@
 				1A97E07616A5F9E0000BC9E5 /* LayerTreeHostMac.h in Headers */,
 				51815BA016A622210054501F /* SyncNetworkResourceLoader.h in Headers */,
 				519B4FF516A9EA970066874D /* SchedulableLoader.h in Headers */,
+				E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -6029,6 +6036,7 @@
 				1A97E07716A5F9E0000BC9E5 /* LayerTreeHostMac.mm in Sources */,
 				51815B9F16A622210054501F /* SyncNetworkResourceLoader.cpp in Sources */,
 				519B4FF416A9EA970066874D /* SchedulableLoader.cpp in Sources */,
+				E1E552C416AE065F004ED653 /* SandboxInitialiationParametersMac.mm in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (140485 => 140486)


--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2013-01-23 00:35:53 UTC (rev 140486)
@@ -1079,7 +1079,7 @@
 {
 }
 
-void WebProcess::initializeSandbox(const ChildProcessInitializationParameters&)
+void WebProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
 {
 }
 

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (140485 => 140486)


--- trunk/Source/WebKit2/WebProcess/WebProcess.h	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h	2013-01-23 00:35:53 UTC (rev 140486)
@@ -266,14 +266,13 @@
     // ChildProcess
     virtual void initializeProcess(const ChildProcessInitializationParameters&) OVERRIDE;
     virtual void initializeProcessName(const ChildProcessInitializationParameters&) OVERRIDE;
-    virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE;
     virtual void initializeConnection(CoreIPC::Connection*) OVERRIDE;
     virtual bool shouldTerminate() OVERRIDE;
     virtual void terminate() OVERRIDE;
+    virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) OVERRIDE;
 
     void platformInitializeProcess(const ChildProcessInitializationParameters&);
 
-
     // CoreIPC::Connection::Client
     friend class WebConnectionToUIProcess;
     virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&);

Modified: trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm (140485 => 140486)


--- trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm	2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm	2013-01-23 00:35:53 UTC (rev 140486)
@@ -28,6 +28,7 @@
 
 #import "CustomProtocolManager.h"
 #import "SandboxExtension.h"
+#import "SandboxInitializationParameters.h"
 #import "WKFullKeyboardAccessWatcher.h"
 #import "WebInspector.h"
 #import "WebPage.h"
@@ -51,23 +52,6 @@
 #import "SecItemShim.h"
 #endif
 
-#if ENABLE(WEB_PROCESS_SANDBOX)
-#import <pwd.h>
-#import <stdlib.h>
-#import <sysexits.h>
-
-// We have to #undef __APPLE_API_PRIVATE to prevent sandbox.h from looking for a header file that does not exist (<rdar://problem/9679211>). 
-#undef __APPLE_API_PRIVATE
-#import <sandbox.h>
-
-#define SANDBOX_NAMED_EXTERNAL 0x0003
-extern "C" int sandbox_init_with_parameters(const char *profile, uint64_t flags, const char *const parameters[], char **errorbuf);
-
-// Define this to 1 to bypass the sandbox for debugging purposes.
-#define DEBUG_BYPASS_SANDBOX 0
-
-#endif
-
 using namespace WebCore;
 using namespace std;
 
@@ -154,108 +138,6 @@
     });
 }
 
-#if ENABLE(WEB_PROCESS_SANDBOX)
-static void appendSandboxParameterPathInternal(Vector<const char*>& vector, const char* name, const char* path)
-{
-    char normalizedPath[PATH_MAX];
-    if (!realpath(path, normalizedPath))
-        normalizedPath[0] = '\0';
-
-    vector.append(name);
-    vector.append(fastStrDup(normalizedPath));
-}
-
-static void appendReadwriteConfDirectory(Vector<const char*>& vector, const char* name, int confID)
-{
-    char path[PATH_MAX];
-    if (confstr(confID, path, PATH_MAX) <= 0)
-        path[0] = '\0';
-
-    appendSandboxParameterPathInternal(vector, name, path);
-}
-
-static void appendReadonlySandboxDirectory(Vector<const char*>& vector, const char* name, NSString *path)
-{
-    appendSandboxParameterPathInternal(vector, name, [path length] ? [(NSString *)path fileSystemRepresentation] : "");
-}
-
-static void appendReadwriteSandboxDirectory(Vector<const char*>& vector, const char* name, const char* path)
-{
-    appendSandboxParameterPathInternal(vector, name, path);
-}
-
-#endif
-
-void WebProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
-{
-    [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
-
-#if ENABLE(WEB_PROCESS_SANDBOX)
-
-#if DEBUG_BYPASS_SANDBOX
-    WTFLogAlways("Bypassing web process sandbox.\n");
-    return;
-#endif
-
-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
-    // Use private temporary and cache directories.
-    String systemDirectorySuffix = "com.apple.WebProcess+" + parameters.clientIdentifier;
-    setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(systemDirectorySuffix).data(), 0);
-    char temporaryDirectory[PATH_MAX];
-    if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
-        WTFLogAlways("WebProcess: couldn't retrieve private temporary directory path: %d\n", errno);
-        exit(EX_NOPERM);
-    }
-    setenv("TMPDIR", temporaryDirectory, 1);
-#endif
-
-    NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
-
-    Vector<const char*> sandboxParameters;
-
-    // These are read-only.
-    appendReadonlySandboxDirectory(sandboxParameters, "WEBKIT2_FRAMEWORK_DIR", [[webkit2Bundle bundlePath] stringByDeletingLastPathComponent]);
-
-    // These are read-write getconf paths.
-    appendReadwriteConfDirectory(sandboxParameters, "DARWIN_USER_TEMP_DIR", _CS_DARWIN_USER_TEMP_DIR);
-    appendReadwriteConfDirectory(sandboxParameters, "DARWIN_USER_CACHE_DIR", _CS_DARWIN_USER_CACHE_DIR);
-
-    char buffer[4096];
-    int bufferSize = sizeof(buffer);
-    struct passwd pwd;
-    struct passwd* result = 0;
-    if (getpwuid_r(getuid(), &pwd, buffer, bufferSize, &result) || !result) {
-        WTFLogAlways("WebProcess: Couldn't find home directory\n");
-        exit(EX_NOPERM);
-    }
-
-    // These are read-write paths.
-    appendReadwriteSandboxDirectory(sandboxParameters, "HOME_DIR", pwd.pw_dir);
-
-    sandboxParameters.append(static_cast<const char*>(0));
-
-    const char* profilePath = [[webkit2Bundle pathForResource:@"com.apple.WebProcess" ofType:@"sb"] fileSystemRepresentation];
-
-    char* errorBuf;
-    if (sandbox_init_with_parameters(profilePath, SANDBOX_NAMED_EXTERNAL, sandboxParameters.data(), &errorBuf)) {
-        WTFLogAlways("WebProcess: Couldn't initialize sandbox profile [%s] error '%s'\n", profilePath, errorBuf);
-        for (size_t i = 0; sandboxParameters[i]; i += 2)
-            WTFLogAlways("%s=%s\n", sandboxParameters[i], sandboxParameters[i + 1]);
-        exit(EX_NOPERM);
-    }
-
-    for (size_t i = 0; sandboxParameters[i]; i += 2)
-        fastFree(const_cast<char*>(sandboxParameters[i + 1]));
-
-    // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
-    OSStatus error = WKEnableSandboxStyleFileQuarantine();
-    if (error) {
-        WTFLogAlways("WebProcess: Couldn't enable sandbox style file quarantine: %ld\n", (long)error);
-        exit(EX_NOPERM);
-    }
-#endif
-}
-
 static id NSApplicationAccessibilityFocusedUIElement(NSApplication*, SEL)
 {
     WebPage* page = WebProcess::shared().focusedWebPage();
@@ -321,4 +203,11 @@
     }
 }
 
+void WebProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters& parameters)
+{
+    // Need to overide the default, because service has a different bundle ID.
+    NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
+    parameters.setSandboxProfilePath([webkit2Bundle pathForResource:@"com.apple.WebProcess" ofType:@"sb"]);
+}
+
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to