[YoutubeDL] improve error message for file:/// URLs
[youtube-dl] / youtube_dl / YoutubeDL.py
index e8ce586042334c3df3a6b98cff54d762620cf7c4..4915fbd45f404ec52c9b9bc96e573251083be8a5 100755 (executable)
@@ -1986,14 +1986,19 @@ class YoutubeDL(object):
         https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel)
         ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel)
         data_handler = compat_urllib_request_DataHandler()
-        unknown_handler = compat_urllib_request.UnknownHandler()
-        handlers = (proxy_handler, https_handler, cookie_processor, ydlh, data_handler, unknown_handler)
-        # we don't use build_opener because it automatically adds FileHandler,
-        # which can be used for malicious purposes (see
+
+        # When passing our own FileHandler instance, build_opener won't add the
+        # default FileHandler and allows us to disable the file protocol, which
+        # can be used for malicious purposes (see
         # https://github.com/rg3/youtube-dl/issues/8227)
-        opener = compat_urllib_request.OpenerDirector()
-        for handler in handlers:
-            opener.add_handler(handler)
+        file_handler = compat_urllib_request.FileHandler()
+
+        def file_open(*args, **kwargs):
+            raise compat_urllib_error.URLError('file:/// protocol is explicitly disabled in youtube-dl for security reasons')
+        file_handler.file_open = file_open
+
+        opener = compat_urllib_request.build_opener(
+            proxy_handler, https_handler, cookie_processor, ydlh, data_handler, file_handler)
 
         # Delete the default user-agent header, which would otherwise apply in
         # cases where our custom HTTP handler doesn't come into play