Exemple #1
0
    def test_get_vhosts(self):
        nparser = parser.NginxParser(self.config_path)
        vhosts = nparser.get_vhosts()

        vhost1 = obj.VirtualHost(nparser.abs_path('nginx.conf'),
                                 [obj.Addr('', '8080', False, False,
                                           False, False)],
                                 False, True,
                                 set(['localhost',
                                      r'~^(www\.)?(example|bar)\.']),
                                 [], [10, 1, 9])
        vhost2 = obj.VirtualHost(nparser.abs_path('nginx.conf'),
                                 [obj.Addr('somename', '8080', False, False,
                                           False, False),
                                  obj.Addr('', '8000', False, False,
                                           False, False)],
                                 False, True,
                                 set(['somename', 'another.alias', 'alias']),
                                 [], [10, 1, 12])
        vhost3 = obj.VirtualHost(nparser.abs_path('sites-enabled/example.com'),
                                 [obj.Addr('69.50.225.155', '9000',
                                           False, False, False, False),
                                  obj.Addr('127.0.0.1', '', False, False,
                                           False, False)],
                                 False, True,
                                 set(['.example.com', 'example.*']), [], [0])
        vhost4 = obj.VirtualHost(nparser.abs_path('sites-enabled/default'),
                                 [obj.Addr('myhost', '', False, True,
                                           False, False),
                                  obj.Addr('otherhost', '', False, True,
                                           False, False)],
                                 False, True, set(['www.example.org']),
                                 [], [0])
        vhost5 = obj.VirtualHost(nparser.abs_path('foo.conf'),
                                 [obj.Addr('*', '80', True, True,
                                           False, False)],
                                 True, True, set(['*.www.foo.com',
                                                  '*.www.example.com']),
                                 [], [2, 1, 0])

        self.assertEqual(13, len(vhosts))
        example_com = [x for x in vhosts if 'example.com' in x.filep][0]
        self.assertEqual(vhost3, example_com)
        default = [x for x in vhosts if 'default' in x.filep][0]
        self.assertEqual(vhost4, default)
        fooconf = [x for x in vhosts if 'foo.conf' in x.filep][0]
        self.assertEqual(vhost5, fooconf)
        localhost = [x for x in vhosts if 'localhost' in x.names][0]
        self.assertEqual(vhost1, localhost)
        somename = [x for x in vhosts if 'somename' in x.names][0]
        self.assertEqual(vhost2, somename)
Exemple #2
0
 def test_replace_server_directives(self):
     nparser = parser.NginxParser(self.config_path)
     target = set(['.example.com', 'example.*'])
     filep = nparser.abs_path('sites-enabled/example.com')
     mock_vhost = obj.VirtualHost(filep, None, None, None, target, None,
                                  [0])
     nparser.update_or_add_server_directives(
         mock_vhost, [['server_name', 'foobar.com']])
     from certbot_nginx._internal.parser import COMMENT
     self.assertEqual(
         nparser.parsed[filep],
         [[['server'],
           [['listen', '69.50.225.155:9000'], ['listen', '127.0.0.1'],
            ['server_name', 'foobar.com'], ['#', COMMENT],
            ['server_name', 'example.*'], []]]])
     mock_vhost.names = set(['foobar.com', 'example.*'])
     nparser.update_or_add_server_directives(
         mock_vhost, [['ssl_certificate', 'cert.pem']])
     self.assertEqual(nparser.parsed[filep],
                      [[['server'],
                        [
                            ['listen', '69.50.225.155:9000'],
                            ['listen', '127.0.0.1'],
                            ['server_name', 'foobar.com'],
                            ['#', COMMENT],
                            ['server_name', 'example.*'],
                            [],
                            ['ssl_certificate', 'cert.pem'],
                            ['#', COMMENT],
                            [],
                        ]]])
Exemple #3
0
 def test_has_ssl_on_directive(self):
     nparser = parser.NginxParser(self.config_path)
     mock_vhost = obj.VirtualHost(
         None, None, None, None, None,
         [['listen', 'myhost default_server'],
          ['server_name', 'www.example.org'],
          [['location', '/'],
           [['root', 'html'], ['index', 'index.html index.htm']]]], None)
     self.assertFalse(nparser.has_ssl_on_directive(mock_vhost))
     mock_vhost.raw = [['listen', '*:80', 'default_server', 'ssl'],
                       [
                           'server_name', '*.www.foo.com',
                           '*.www.example.com'
                       ], ['root', '/home/ubuntu/sites/foo/']]
     self.assertFalse(nparser.has_ssl_on_directive(mock_vhost))
     mock_vhost.raw = [['listen', '80 ssl'],
                       [
                           'server_name', '*.www.foo.com',
                           '*.www.example.com'
                       ]]
     self.assertFalse(nparser.has_ssl_on_directive(mock_vhost))
     mock_vhost.raw = [['listen', '80'], ['ssl', 'on'],
                       [
                           'server_name', '*.www.foo.com',
                           '*.www.example.com'
                       ]]
     self.assertTrue(nparser.has_ssl_on_directive(mock_vhost))
Exemple #4
0
    def get_vhosts(self):
        """Gets list of all 'virtual hosts' found in Nginx configuration.
        Technically this is a misnomer because Nginx does not have virtual
        hosts, it has 'server blocks'.

        :returns: List of :class:`~certbot_nginx._internal.obj.VirtualHost`
            objects found in configuration
        :rtype: list

        """
        enabled = True  # We only look at enabled vhosts for now
        servers = self._get_raw_servers()

        vhosts = []
        for filename in servers:
            for server, path in servers[filename]:
                # Parse the server block into a VirtualHost object

                parsed_server = _parse_server_raw(server)
                vhost = obj.VirtualHost(filename, parsed_server['addrs'],
                                        parsed_server['ssl'], enabled,
                                        parsed_server['names'], server, path)
                vhosts.append(vhost)

        self._update_vhosts_addrs_ssl(vhosts)

        return vhosts
Exemple #5
0
    def test_get_vhosts_global_ssl(self):
        nparser = parser.NginxParser(self.config_path)
        vhosts = nparser.get_vhosts()

        vhost = obj.VirtualHost(
            nparser.abs_path('sites-enabled/globalssl.com'),
            [obj.Addr('4.8.2.6', '57', True, False, False, False)], True, True,
            set(['globalssl.com']), [], [0])

        globalssl_com = [x for x in vhosts if 'globalssl.com' in x.filep][0]
        self.assertEqual(vhost, globalssl_com)
    def test_save(self):
        filep = self.config.parser.abs_path('sites-enabled/example.com')
        mock_vhost = obj.VirtualHost(filep, None, None, None,
                                     {'.example.com', 'example.*'}, None, [0])
        self.config.parser.add_server_directives(
            mock_vhost, [['listen', ' ', '5001', ' ', 'ssl']])
        self.config.save()

        # pylint: disable=protected-access
        parsed = self.config.parser._parse_files(filep, override=True)
        self.assertEqual(
            [[['server'],
              [['listen', '69.50.225.155:9000'], ['listen', '127.0.0.1'],
               ['server_name', '.example.com'], ['server_name', 'example.*'],
               ['listen', '5001', 'ssl'], ['#', parser.COMMENT]]]], parsed[0])
Exemple #7
0
    def test_add_server_directives(self):
        nparser = parser.NginxParser(self.config_path)
        mock_vhost = obj.VirtualHost(nparser.abs_path('nginx.conf'),
                                     None, None, None,
                                     set(['localhost',
                                           r'~^(www\.)?(example|bar)\.']),
                                     None, [10, 1, 9])
        nparser.add_server_directives(mock_vhost,
                                      [['foo', 'bar'], ['\n ', 'ssl_certificate', ' ',
                                                        '/etc/ssl/cert.pem']])
        ssl_re = re.compile(r'\n\s+ssl_certificate /etc/ssl/cert.pem')
        dump = nginxparser.dumps(nparser.parsed[nparser.abs_path('nginx.conf')])
        self.assertEqual(1, len(re.findall(ssl_re, dump)))

        example_com = nparser.abs_path('sites-enabled/example.com')
        names = set(['.example.com', 'example.*'])
        mock_vhost.filep = example_com
        mock_vhost.names = names
        mock_vhost.path = [0]
        nparser.add_server_directives(mock_vhost,
                                      [['foo', 'bar'], ['ssl_certificate',
                                                        '/etc/ssl/cert2.pem']])
        nparser.add_server_directives(mock_vhost, [['foo', 'bar']])
        from certbot_nginx._internal.parser import COMMENT
        self.assertEqual(nparser.parsed[example_com],
            [[['server'], [['listen', '69.50.225.155:9000'],
                           ['listen', '127.0.0.1'],
                           ['server_name', '.example.com'],
                           ['server_name', 'example.*'],
                           ['foo', 'bar'],
                           ['#', COMMENT],
                           ['ssl_certificate', '/etc/ssl/cert2.pem'],
                           ['#', COMMENT], [], []
                           ]]])

        server_conf = nparser.abs_path('server.conf')
        names = set(['alias', 'another.alias', 'somename'])
        mock_vhost.filep = server_conf
        mock_vhost.names = names
        mock_vhost.path = []
        self.assertRaises(errors.MisconfigurationError,
                          nparser.add_server_directives,
                          mock_vhost,
                          [['foo', 'bar'],
                           ['ssl_certificate', '/etc/ssl/cert2.pem']])
Exemple #8
0
 def test_comment_is_repeatable(self):
     nparser = parser.NginxParser(self.config_path)
     example_com = nparser.abs_path('sites-enabled/example.com')
     mock_vhost = obj.VirtualHost(example_com, None, None, None,
                                  {'.example.com', 'example.*'}, None, [0])
     nparser.add_server_directives(
         mock_vhost, [['\n  ', '#', ' ', 'what a nice comment']])
     nparser.add_server_directives(mock_vhost, [[
         '\n  ', 'include', ' ',
         nparser.abs_path('comment_in_file.conf')
     ]])
     from certbot_nginx._internal.parser import COMMENT
     self.assertEqual(
         nparser.parsed[example_com],
         [[['server'],
           [['listen', '69.50.225.155:9000'], ['listen', '127.0.0.1'],
            ['server_name', '.example.com'], ['server_name', 'example.*'],
            ['#', ' ', 'what a nice comment'], [],
            ['include', nparser.abs_path('comment_in_file.conf')],
            ['#', COMMENT], []]]])
Exemple #9
0
 def test_remove_server_directives(self):
     nparser = parser.NginxParser(self.config_path)
     mock_vhost = obj.VirtualHost(
         nparser.abs_path('nginx.conf'), None, None, None,
         set(['localhost', r'~^(www\.)?(example|bar)\.']), None, [10, 1, 9])
     example_com = nparser.abs_path('sites-enabled/example.com')
     names = set(['.example.com', 'example.*'])
     mock_vhost.filep = example_com
     mock_vhost.names = names
     mock_vhost.path = [0]
     nparser.add_server_directives(
         mock_vhost,
         [['foo', 'bar'], ['ssl_certificate', '/etc/ssl/cert2.pem']])
     nparser.remove_server_directives(mock_vhost, 'foo')
     nparser.remove_server_directives(mock_vhost, 'ssl_certificate')
     self.assertEqual(
         nparser.parsed[example_com],
         [[['server'],
           [['listen', '69.50.225.155:9000'], ['listen', '127.0.0.1'],
            ['server_name', '.example.com'], ['server_name', 'example.*'],
            []]]])