Exemplo n.º 1
0
 def __init__(self, *args, **kwargs):
     cherrypy.tools.authenticate = AuthManagerTool()
     cherrypy.tools.session_expire_at_browser_close = SessionExpireAtBrowserCloseTool(
     )
     cherrypy.tools.dashboard_exception_handler = HandlerWrapperTool(
         dashboard_exception_handler, priority=31)
     cherrypy.config.update({'error_page.default': json_error_page})
     super(ControllerTestCase, self).__init__(*args, **kwargs)
Exemplo n.º 2
0
 def __init__(self, *args, **kwargs):
     cherrypy.tools.authenticate = AuthManagerTool()
     cherrypy.tools.dashboard_exception_handler = HandlerWrapperTool(
         dashboard_exception_handler, priority=31)
     cherrypy.config.update({
         'error_page.default': json_error_page,
         'tools.json_in.on': True,
         'tools.json_in.force': False
     })
     super(ControllerTestCase, self).__init__(*args, **kwargs)
Exemplo n.º 3
0
    def setUpClass(cls):
        super().setUpClass()
        cherrypy.tools.authenticate = AuthManagerTool()
        cherrypy.tools.dashboard_exception_handler = HandlerWrapperTool(dashboard_exception_handler,
                                                                        priority=31)
        cherrypy.config.update({
            'error_page.default': json_error_page,
            'tools.json_in.on': True,
            'tools.json_in.force': False
        })
        PLUGIN_MANAGER.hook.configure_cherrypy(config=cherrypy.config)

        if cls._request_logging:
            cherrypy.tools.request_logging = RequestLoggingTool()
            cherrypy.config.update({'tools.request_logging.on': True})
Exemplo n.º 4
0
def _json_stream_output(next_handler, *args, **kwargs):
    """ Output JSON in stream mode. """
    cherrypy.response.headers['Content-Type'] = "application/json"
    _outputs = next_handler(*args, **kwargs)
    if inspect.isgenerator(_outputs):

        def _stream_outputs():
            for _content in _outputs:
                yield json.dumps(_content)

        return _stream_outputs()
    else:
        return json.dumps(_outputs)


cherrypy.tools.json_stream_output = HandlerWrapperTool(_json_stream_output)


## Error Handling ##
def error_response(status, message, traceback, version):
    """ Global http error handler, reply with status code and message json. """
    cherrypy.response.status = status
    cherrypy.response.headers['Content-Type'] = "application/json"
    return json.dumps(dict(message=message))


# Helpers #
def unescape_html(content):
    if unescape is not None:
        return unescape(content)
    else:
Exemplo n.º 5
0
    def _configure(self):
        """
        Configure CherryPy and initialize self.url_prefix

        :returns our URI
        """
        server_addr = self.get_localized_module_option(  # type: ignore
            'server_addr', get_default_addr())
        ssl = self.get_localized_module_option('ssl', True)  # type: ignore
        if not ssl:
            server_port = self.get_localized_module_option(
                'server_port', 8080)  # type: ignore
        else:
            server_port = self.get_localized_module_option(
                'ssl_server_port', 8443)  # type: ignore

        if server_addr is None:
            raise ServerConfigException(
                'no server_addr configured; '
                'try "ceph config set mgr mgr/{}/{}/server_addr <ip>"'.format(
                    self.module_name, self.get_mgr_id()))  # type: ignore
        self.log.info(
            'server: ssl=%s host=%s port=%d',
            'yes' if ssl else 'no',  # type: ignore
            server_addr,
            server_port)

        # Initialize custom handlers.
        cherrypy.tools.authenticate = AuthManagerTool()
        cherrypy.tools.plugin_hooks_filter_request = cherrypy.Tool(
            'before_handler',
            lambda: PLUGIN_MANAGER.hook.filter_request_before_handler(
                request=cherrypy.request),
            priority=1)
        cherrypy.tools.request_logging = RequestLoggingTool()
        cherrypy.tools.dashboard_exception_handler = HandlerWrapperTool(
            dashboard_exception_handler, priority=31)

        cherrypy.log.access_log.propagate = False
        cherrypy.log.error_log.propagate = False

        # Apply the 'global' CherryPy configuration.
        config = {
            'engine.autoreload.on':
            False,
            'server.socket_host':
            server_addr,
            'server.socket_port':
            int(server_port),
            'error_page.default':
            json_error_page,
            'tools.request_logging.on':
            True,
            'tools.gzip.on':
            True,
            'tools.gzip.mime_types': [
                # text/html and text/plain are the default types to compress
                'text/html',
                'text/plain',
                # We also want JSON and JavaScript to be compressed
                'application/json',
                'application/javascript',
            ],
            'tools.json_in.on':
            True,
            'tools.json_in.force':
            False,
            'tools.plugin_hooks_filter_request.on':
            True,
        }

        if ssl:
            # SSL initialization
            cert = self.get_store("crt")  # type: ignore
            if cert is not None:
                self.cert_tmp = tempfile.NamedTemporaryFile()
                self.cert_tmp.write(cert.encode('utf-8'))
                self.cert_tmp.flush()  # cert_tmp must not be gc'ed
                cert_fname = self.cert_tmp.name
            else:
                cert_fname = self.get_localized_module_option(
                    'crt_file')  # type: ignore

            pkey = self.get_store("key")  # type: ignore
            if pkey is not None:
                self.pkey_tmp = tempfile.NamedTemporaryFile()
                self.pkey_tmp.write(pkey.encode('utf-8'))
                self.pkey_tmp.flush()  # pkey_tmp must not be gc'ed
                pkey_fname = self.pkey_tmp.name
            else:
                pkey_fname = self.get_localized_module_option(
                    'key_file')  # type: ignore

            verify_tls_files(cert_fname, pkey_fname)

            config['server.ssl_module'] = 'builtin'
            config['server.ssl_certificate'] = cert_fname
            config['server.ssl_private_key'] = pkey_fname

        self.update_cherrypy_config(config)

        self._url_prefix = prepare_url_prefix(
            self.get_module_option(  # type: ignore
                'url_prefix', default=''))

        uri = "{0}://{1}:{2}{3}/".format(
            'https' if ssl else 'http',
            socket.getfqdn() if server_addr in ['::', '0.0.0.0'] else
            server_addr, server_port, self.url_prefix)

        return uri
Exemplo n.º 6
0
    def _configure(self):
        """
        Configure CherryPy and initialize self.url_prefix

        :returns our URI
        """
        server_addr = self.get_localized_config('server_addr', '::')
        server_port = self.get_localized_config('server_port', '8080')
        if server_addr is None:
            raise ServerConfigException(
                'no server_addr configured; '
                'try "ceph config set mgr mgr/{}/{}/server_addr <ip>"'.format(
                    self.module_name, self.get_mgr_id()))
        self.log.info('server_addr: %s server_port: %s', server_addr,
                      server_port)

        # Initialize custom handlers.
        cherrypy.tools.authenticate = cherrypy.Tool('before_handler',
                                                    Auth.check_auth)
        cherrypy.tools.session_expire_at_browser_close = SessionExpireAtBrowserCloseTool(
        )
        cherrypy.tools.request_logging = RequestLoggingTool()
        cherrypy.tools.dashboard_exception_handler = HandlerWrapperTool(
            dashboard_exception_handler, priority=31)

        # SSL initialization
        cert = self.get_store("crt")
        if cert is not None:
            self.cert_tmp = tempfile.NamedTemporaryFile()
            self.cert_tmp.write(cert.encode('utf-8'))
            self.cert_tmp.flush()  # cert_tmp must not be gc'ed
            cert_fname = self.cert_tmp.name
        else:
            cert_fname = self.get_localized_config('crt_file')

        pkey = self.get_store("key")
        if pkey is not None:
            self.pkey_tmp = tempfile.NamedTemporaryFile()
            self.pkey_tmp.write(pkey.encode('utf-8'))
            self.pkey_tmp.flush()  # pkey_tmp must not be gc'ed
            pkey_fname = self.pkey_tmp.name
        else:
            pkey_fname = self.get_localized_config('key_file')

        if not cert_fname or not pkey_fname:
            raise ServerConfigException('no certificate configured')
        if not os.path.isfile(cert_fname):
            raise ServerConfigException('certificate %s does not exist' %
                                        cert_fname)
        if not os.path.isfile(pkey_fname):
            raise ServerConfigException('private key %s does not exist' %
                                        pkey_fname)

        # Apply the 'global' CherryPy configuration.
        config = {
            'engine.autoreload.on': False,
            'server.socket_host': server_addr,
            'server.socket_port': int(server_port),
            'server.ssl_module': 'builtin',
            'server.ssl_certificate': cert_fname,
            'server.ssl_private_key': pkey_fname,
            'error_page.default': json_error_page,
            'tools.request_logging.on': True
        }
        cherrypy.config.update(config)

        self._url_prefix = prepare_url_prefix(
            self.get_config('url_prefix', default=''))

        uri = "https://{0}:{1}{2}/".format(
            socket.getfqdn() if server_addr == "::" else server_addr,
            server_port, self.url_prefix)

        return uri
Exemplo n.º 7
0
    def _configure(self):
        """
        Configure CherryPy and initialize self.url_prefix

        :returns our URI
        """
        server_addr = self.get_localized_module_option('server_addr',
                                                       get_default_addr())
        ssl = self.get_localized_module_option('ssl', True)
        if not ssl:
            server_port = self.get_localized_module_option('server_port', 8080)
        else:
            server_port = self.get_localized_module_option(
                'ssl_server_port', 8443)

        if server_addr is None:
            raise ServerConfigException(
                'no server_addr configured; '
                'try "ceph config set mgr mgr/{}/{}/server_addr <ip>"'.format(
                    self.module_name, self.get_mgr_id()))
        self.log.info('server: ssl=%s host=%s port=%d', 'yes' if ssl else 'no',
                      server_addr, server_port)

        # Initialize custom handlers.
        cherrypy.tools.authenticate = AuthManagerTool()
        cherrypy.tools.plugin_hooks = cherrypy.Tool(
            'before_handler',
            lambda: PLUGIN_MANAGER.hook.filter_request_before_handler(
                request=cherrypy.request),
            priority=10)
        cherrypy.tools.request_logging = RequestLoggingTool()
        cherrypy.tools.dashboard_exception_handler = HandlerWrapperTool(
            dashboard_exception_handler, priority=31)

        # Apply the 'global' CherryPy configuration.
        config = {
            'engine.autoreload.on':
            False,
            'server.socket_host':
            server_addr,
            'server.socket_port':
            int(server_port),
            'error_page.default':
            json_error_page,
            'tools.request_logging.on':
            True,
            'tools.gzip.on':
            True,
            'tools.gzip.mime_types': [
                # text/html and text/plain are the default types to compress
                'text/html',
                'text/plain',
                # We also want JSON and JavaScript to be compressed
                'application/json',
                'application/javascript',
            ],
            'tools.json_in.on':
            True,
            'tools.json_in.force':
            False,
            'tools.plugin_hooks.on':
            True,
        }

        if ssl:
            # SSL initialization
            cert = self.get_store("crt")
            if cert is not None:
                self.cert_tmp = tempfile.NamedTemporaryFile()
                self.cert_tmp.write(cert.encode('utf-8'))
                self.cert_tmp.flush()  # cert_tmp must not be gc'ed
                cert_fname = self.cert_tmp.name
            else:
                cert_fname = self.get_localized_module_option('crt_file')

            pkey = self.get_store("key")
            if pkey is not None:
                self.pkey_tmp = tempfile.NamedTemporaryFile()
                self.pkey_tmp.write(pkey.encode('utf-8'))
                self.pkey_tmp.flush()  # pkey_tmp must not be gc'ed
                pkey_fname = self.pkey_tmp.name
            else:
                pkey_fname = self.get_localized_module_option('key_file')

            if not cert_fname or not pkey_fname:
                raise ServerConfigException('no certificate configured')
            if not os.path.isfile(cert_fname):
                raise ServerConfigException('certificate %s does not exist' %
                                            cert_fname)
            if not os.path.isfile(pkey_fname):
                raise ServerConfigException('private key %s does not exist' %
                                            pkey_fname)

            # Do some validations to the private key and certificate:
            # - Check the type and format
            # - Check the certificate expiration date
            # - Check the consistency of the private key
            # - Check that the private key and certificate match up
            try:
                with open(cert_fname) as f:
                    x509 = crypto.load_certificate(crypto.FILETYPE_PEM,
                                                   f.read())
                    if x509.has_expired():
                        self.log.warning(
                            'Certificate {} has been expired'.format(
                                cert_fname))
            except (ValueError, crypto.Error) as e:
                raise ServerConfigException(
                    'Invalid certificate {}: {}'.format(cert_fname, str(e)))
            try:
                with open(pkey_fname) as f:
                    pkey = crypto.load_privatekey(crypto.FILETYPE_PEM,
                                                  f.read())
                    pkey.check()
            except (ValueError, crypto.Error) as e:
                raise ServerConfigException(
                    'Invalid private key {}: {}'.format(pkey_fname, str(e)))
            try:
                context = SSL.Context(SSL.TLSv1_METHOD)
                context.use_certificate_file(cert_fname, crypto.FILETYPE_PEM)
                context.use_privatekey_file(pkey_fname, crypto.FILETYPE_PEM)
                context.check_privatekey()
            except crypto.Error as e:
                self.log.warning(
                    'Private key {} and certificate {} do not match up: {}'.
                    format(pkey_fname, cert_fname, str(e)))

            config['server.ssl_module'] = 'builtin'
            config['server.ssl_certificate'] = cert_fname
            config['server.ssl_private_key'] = pkey_fname

        cherrypy.config.update(config)

        self._url_prefix = prepare_url_prefix(
            self.get_module_option('url_prefix', default=''))

        uri = "{0}://{1}:{2}{3}/".format(
            'https' if ssl else 'http',
            socket.getfqdn() if server_addr == "::" else server_addr,
            server_port, self.url_prefix)

        return uri
Exemplo n.º 8
0
    def _configure(self):
        """
        Configure CherryPy and initialize self.url_prefix

        :returns our URI
        """
        server_addr = self.get_localized_module_option('server_addr', '::')
        ssl = strtobool(self.get_localized_module_option('ssl', 'True'))
        def_server_port = 8443
        if not ssl:
            def_server_port = 8080

        server_port = self.get_localized_module_option('server_port',
                                                       def_server_port)
        if server_addr is None:
            raise ServerConfigException(
                'no server_addr configured; '
                'try "ceph config set mgr mgr/{}/{}/server_addr <ip>"'.format(
                    self.module_name, self.get_mgr_id()))
        self.log.info('server_addr: %s server_port: %s', server_addr,
                      server_port)

        # Initialize custom handlers.
        cherrypy.tools.authenticate = AuthManagerTool()
        cherrypy.tools.request_logging = RequestLoggingTool()
        cherrypy.tools.dashboard_exception_handler = HandlerWrapperTool(
            dashboard_exception_handler, priority=31)

        # Apply the 'global' CherryPy configuration.
        config = {
            'engine.autoreload.on':
            False,
            'server.socket_host':
            server_addr,
            'server.socket_port':
            int(server_port),
            'error_page.default':
            json_error_page,
            'tools.request_logging.on':
            True,
            'tools.gzip.on':
            True,
            'tools.gzip.mime_types': [
                # text/html and text/plain are the default types to compress
                'text/html',
                'text/plain',
                # We also want JSON and JavaScript to be compressed
                'application/json',
                'application/javascript',
            ],
            'tools.json_in.on':
            True,
            'tools.json_in.force':
            False
        }

        if ssl:
            # SSL initialization
            cert = self.get_store("crt")
            if cert is not None:
                self.cert_tmp = tempfile.NamedTemporaryFile()
                self.cert_tmp.write(cert.encode('utf-8'))
                self.cert_tmp.flush()  # cert_tmp must not be gc'ed
                cert_fname = self.cert_tmp.name
            else:
                cert_fname = self.get_localized_module_option('crt_file')

            pkey = self.get_store("key")
            if pkey is not None:
                self.pkey_tmp = tempfile.NamedTemporaryFile()
                self.pkey_tmp.write(pkey.encode('utf-8'))
                self.pkey_tmp.flush()  # pkey_tmp must not be gc'ed
                pkey_fname = self.pkey_tmp.name
            else:
                pkey_fname = self.get_localized_module_option('key_file')

            if not cert_fname or not pkey_fname:
                raise ServerConfigException('no certificate configured')
            if not os.path.isfile(cert_fname):
                raise ServerConfigException('certificate %s does not exist' %
                                            cert_fname)
            if not os.path.isfile(pkey_fname):
                raise ServerConfigException('private key %s does not exist' %
                                            pkey_fname)

            config['server.ssl_module'] = 'builtin'
            config['server.ssl_certificate'] = cert_fname
            config['server.ssl_private_key'] = pkey_fname

        cherrypy.config.update(config)

        self._url_prefix = prepare_url_prefix(
            self.get_module_option('url_prefix', default=''))

        uri = "{0}://{1}:{2}{3}/".format(
            'https' if ssl else 'http',
            socket.getfqdn() if server_addr == "::" else server_addr,
            server_port, self.url_prefix)

        return uri
Exemplo n.º 9
0
 def __init__(self):
     HandlerWrapperTool.__init__(self, self.publish, name="jinja")
     self.template = None
Exemplo n.º 10
0
 def callable(self, template='index.html'):
     self.template = template
     HandlerWrapperTool.callable(self)
Exemplo n.º 11
0
 def callable(self, filename=None, *args, **kwargs):
     HandlerWrapperTool.callable(self)
Exemplo n.º 12
0
 def __init__(self):
     HandlerWrapperTool.__init__(self, self.publish, name="jinja")
     self.template = None
Exemplo n.º 13
0
 def __init__(self):
     HandlerWrapperTool.__init__(self, self.jinja)
Exemplo n.º 14
0
 def callable(self, format='xslt', template_dir='views/site', template='index.xsl', extend_xml={}):
     cherrypy.request.format = format
     HandlerWrapperTool.callable(self)
Exemplo n.º 15
0
 def _setup(self, *args, **kwargs):
     if cherrypy.request.config.get('tools.staticdir.on', False) or \
         cherrypy.request.config.get('tools.staticfile.on', False):
         return
     HandlerWrapperTool._setup(self, *args, **kwargs)
Exemplo n.º 16
0
 def __init__(self):
     self.extend = {}
     HandlerWrapperTool.__init__(self, self.publish)
Exemplo n.º 17
0
 def callable(self, template = 'index.html'):
     self.template = template
     HandlerWrapperTool.callable(self)