Repository: microsoft/ptvsd

Issue:
Make --host a required switch
`--host` is currently optional, and defaults to `localhost`. The old behavior was to default to `0.0.0.0`, which is not a particularly sane default. However, the new default makes things confusing, since it is applied silently - things just work differently. Changing the switch to be explicit solves that problem, while also forcing the user to consider the security implications of either choice.


Discussion:

Resolving patch:
diff --git a/ptvsd/__main__.py b/ptvsd/__main__.py
--- a/ptvsd/__main__.py
+++ b/ptvsd/__main__.py
@@ -157,7 +157,7 @@ def _parse_args(prog, argv):
     parser.add_argument('--nodebug', action='store_true')
     parser.add_argument('--client', action='store_true')
 
-    parser.add_argument('--host')
+    parser.add_argument('--host', required=True)
     parser.add_argument('--port', type=int, required=True)
 
     target = parser.add_mutually_exclusive_group(required=True)


Test patch:
diff --git a/tests/ptvsd/test___main__.py b/tests/ptvsd/test___main__.py
--- a/tests/ptvsd/test___main__.py
+++ b/tests/ptvsd/test___main__.py
@@ -9,22 +9,13 @@ class ParseArgsTests(unittest.TestCase):
 
     EXPECTED_EXTRA = ['--']
 
-    def test_module(self):
-        args, extra = parse_args([
-            'eggs',
-            '--port', '8888',
-            '-m', 'spam',
-        ])
-
-        self.assertEqual(vars(args), {
-            'kind': 'module',
-            'name': 'spam',
-            'address': Address.as_server(None, 8888),
-            'nodebug': False,
-            'single_session': False,
-            'wait': False,
-        })
-        self.assertEqual(extra, self.EXPECTED_EXTRA)
+    def test_host_required(self):
+        with self.assertRaises(SystemExit):
+            parse_args([
+                'eggs',
+                '--port', '8888',
+                '-m', 'spam',
+            ])
 
     def test_module_server(self):
         args, extra = parse_args([
@@ -49,6 +40,7 @@ def test_module_nodebug(self):
             'eggs',
             '--nodebug',
             '--client',
+            '--host', 'localhost',
             '--port', '8888',
             '-m', 'spam',
         ])
@@ -56,7 +48,7 @@ def test_module_nodebug(self):
         self.assertEqual(vars(args), {
             'kind': 'module',
             'name': 'spam',
-            'address': Address.as_client(None, 8888),
+            'address': Address.as_client('localhost', 8888),
             'nodebug': True,
             'single_session': False,
             'wait': False,
@@ -66,6 +58,7 @@ def test_module_nodebug(self):
     def test_script(self):
         args, extra = parse_args([
             'eggs',
+            '--host', 'localhost',
             '--port', '8888',
             'spam.py',
         ])
@@ -73,7 +66,7 @@ def test_script(self):
         self.assertEqual(vars(args), {
             'kind': 'script',
             'name': 'spam.py',
-            'address': Address.as_server(None, 8888),
+            'address': Address.as_server('localhost', 8888),
             'nodebug': False,
             'single_session': False,
             'wait': False,
@@ -103,6 +96,7 @@ def test_script_nodebug(self):
             'eggs',
             '--nodebug',
             '--client',
+            '--host', 'localhost',
             '--port', '8888',
             'spam.py',
         ])
@@ -110,7 +104,7 @@ def test_script_nodebug(self):
         self.assertEqual(vars(args), {
             'kind': 'script',
             'name': 'spam.py',
-            'address': Address.as_client(None, 8888),
+            'address': Address.as_client('localhost', 8888),
             'nodebug': True,
             'single_session': False,
             'wait': False,
@@ -179,6 +173,7 @@ def test_remote_single_session(self):
         args, extra = parse_args([
             'eggs',
             '--single-session',
+            '--host', 'localhost',
             '--port', '8888',
             'spam.py',
         ])
@@ -236,6 +231,7 @@ def test_extra(self):
         args, extra = parse_args([
             'eggs',
             '--DEBUG',
+            '--host', 'localhost',
             '--port', '8888',
             '--vm_type', '???',
             'spam.py',
@@ -251,7 +247,7 @@ def test_extra(self):
         self.assertEqual(vars(args), {
             'kind': 'script',
             'name': 'spam.py',
-            'address': Address.as_server(None, 8888),
+            'address': Address.as_server('localhost', 8888),
             'nodebug': False,
             'single_session': False,
             'wait': False,
@@ -274,6 +270,7 @@ def test_extra_nodebug(self):
             '--DEBUG',
             '--nodebug',
             '--client',
+            '--host', 'localhost',
             '--port', '8888',
             '--vm_type', '???',
             'spam.py',
@@ -289,7 +286,7 @@ def test_extra_nodebug(self):
         self.assertEqual(vars(args), {
             'kind': 'script',
             'name': 'spam.py',
-            'address': Address.as_client(None, 8888),
+            'address': Address.as_client('localhost', 8888),
             'nodebug': True,
             'single_session': False,
             'wait': False,
@@ -337,6 +334,7 @@ def test_unsupported_arg(self):
     def test_pseudo_backward_compatibility(self):
         args, extra = parse_args([
             'eggs',
+            '--host', 'localhost',
             '--port', '8888',
             '--module',
             '--file', 'spam',
@@ -345,7 +343,7 @@ def test_pseudo_backward_compatibility(self):
         self.assertEqual(vars(args), {
             'kind': 'script',
             'name': 'spam',
-            'address': Address.as_server(None, 8888),
+            'address': Address.as_server('localhost', 8888),
             'nodebug': False,
             'single_session': False,
             'wait': False,
@@ -357,6 +355,7 @@ def test_pseudo_backward_compatibility_nodebug(self):
             'eggs',
             '--nodebug',
             '--client',
+            '--host', 'localhost',
             '--port', '8888',
             '--module',
             '--file', 'spam',
@@ -365,7 +364,7 @@ def test_pseudo_backward_compatibility_nodebug(self):
         self.assertEqual(vars(args), {
             'kind': 'script',
             'name': 'spam',
-            'address': Address.as_client(None, 8888),
+            'address': Address.as_client('localhost', 8888),
             'nodebug': True,
             'single_session': False,
             'wait': False,
diff --git a/tests/system_tests/test_connection.py b/tests/system_tests/test_connection.py
--- a/tests/system_tests/test_connection.py
+++ b/tests/system_tests/test_connection.py
@@ -115,6 +115,7 @@ def connect(addr, wait=None, closeonly=False):
         proc = Proc.start_python_module('ptvsd', [
             '--server',
             '--wait',
+            '--host', 'localhost',
             '--port', '5678',
             '--file', filename,
         ], env={