[Python-checkins] cpython (3.5): Issue #25005: Backout fix for #8232 because of use of unsafe

steve.dower python-checkins at python.org
Mon Sep 7 07:38:01 CEST 2015


https://hg.python.org/cpython/rev/aa60b34d5200
changeset:   97730:aa60b34d5200
branch:      3.5
parent:      97728:94966dfd3bd3
user:        Steve Dower <steve.dower at microsoft.com>
date:        Sat Sep 05 11:57:47 2015 -0700
summary:
  Issue #25005: Backout fix for #8232 because of use of unsafe subprocess.call(shell=True)

files:
  Lib/webbrowser.py |  120 ++-------------------------------
  Misc/NEWS         |    3 -
  2 files changed, 9 insertions(+), 114 deletions(-)


diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py
--- a/Lib/webbrowser.py
+++ b/Lib/webbrowser.py
@@ -495,23 +495,10 @@
 #
 
 if sys.platform[:3] == "win":
-
     class WindowsDefault(BaseBrowser):
-        # Windows Default opening arguments.
-
-        cmd = "start"
-        newwindow = ""
-        newtab = ""
-
         def open(self, url, new=0, autoraise=True):
-            # Format the command for optional arguments and add the url.
-            if new == 1:
-                self.cmd += " " + self.newwindow
-            elif new == 2:
-                self.cmd += " " + self.newtab
-            self.cmd += " " + url
             try:
-                subprocess.call(self.cmd, shell=True)
+                os.startfile(url)
             except OSError:
                 # [Error 22] No application is associated with the specified
                 # file for this operation: '<URL>'
@@ -519,108 +506,19 @@
             else:
                 return True
 
-
-    # Windows Sub-Classes for commonly used browsers.
-
-    class InternetExplorer(WindowsDefault):
-        """Launcher class for Internet Explorer browser"""
-
-        cmd = "start iexplore.exe"
-        newwindow = ""
-        newtab = ""
-
-
-    class WinChrome(WindowsDefault):
-        """Launcher class for windows specific Google Chrome browser"""
-
-        cmd = "start chrome.exe"
-        newwindow = "-new-window"
-        newtab = "-new-tab"
-
-
-    class WinFirefox(WindowsDefault):
-        """Launcher class for windows specific Firefox browser"""
-
-        cmd = "start firefox.exe"
-        newwindow = "-new-window"
-        newtab = "-new-tab"
-
-
-    class WinOpera(WindowsDefault):
-        """Launcher class for windows specific Opera browser"""
-
-        cmd = "start opera"
-        newwindow = ""
-        newtab = ""
-
-
-    class WinSeaMonkey(WindowsDefault):
-        """Launcher class for windows specific SeaMonkey browser"""
-
-        cmd = "start seamonkey"
-        newwinow = ""
-        newtab = ""
-
-
     _tryorder = []
     _browsers = {}
 
-    # First try to use the default Windows browser.
+    # First try to use the default Windows browser
     register("windows-default", WindowsDefault)
 
-    def find_windows_browsers():
-        """ Access the windows registry to determine
-        what browsers are on the system.
-        """
-
-        import winreg
-        HKLM = winreg.HKEY_LOCAL_MACHINE
-        subkey = r'Software\Clients\StartMenuInternet'
-        read32 = winreg.KEY_READ | winreg.KEY_WOW64_32KEY
-        read64 = winreg.KEY_READ | winreg.KEY_WOW64_64KEY
-        key32 = winreg.OpenKey(HKLM, subkey, access=read32)
-        key64 = winreg.OpenKey(HKLM, subkey, access=read64)
-
-        # Return a list of browsers found in the registry
-        # Check if there are any different browsers in the
-        # 32 bit location instead of the 64 bit location.
-        browsers = []
-        i = 0
-        while True:
-            try:
-                browsers.append(winreg.EnumKey(key32, i))
-            except EnvironmentError:
-                break
-            i += 1
-
-        i = 0
-        while True:
-            try:
-                browsers.append(winreg.EnumKey(key64, i))
-            except EnvironmentError:
-                break
-            i += 1
-
-        winreg.CloseKey(key32)
-        winreg.CloseKey(key64)
-
-        return browsers
-
-    # Detect some common windows browsers
-    for browser in find_windows_browsers():
-        browser = browser.lower()
-        if "iexplore" in browser:
-            register("iexplore", None, InternetExplorer("iexplore"))
-        elif "chrome" in browser:
-            register("chrome", None, WinChrome("chrome"))
-        elif "firefox" in browser:
-            register("firefox", None, WinFirefox("firefox"))
-        elif "opera" in browser:
-            register("opera", None, WinOpera("opera"))
-        elif "seamonkey" in browser:
-            register("seamonkey", None, WinSeaMonkey("seamonkey"))
-        else:
-            register(browser, None, WindowsDefault(browser))
+    # Detect some common Windows browsers, fallback to IE
+    iexplore = os.path.join(os.environ.get("PROGRAMFILES", "C:\\Program Files"),
+                            "Internet Explorer\\IEXPLORE.EXE")
+    for browser in ("firefox", "firebird", "seamonkey", "mozilla",
+                    "netscape", "opera", iexplore):
+        if shutil.which(browser):
+            register(browser, None, BackgroundBrowser(browser))
 
 #
 # Platform support for MacOS
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -312,9 +312,6 @@
 - Issue #14373: C implementation of functools.lru_cache() now can be used with
   methods.
 
-- Issue #8232: webbrowser support incomplete on Windows. Patch by Brandon
-  Milam
-
 - Issue #24347: Set KeyError if PyDict_GetItemWithError returns NULL.
 
 - Issue #24348: Drop superfluous incref/decref.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list