示例#1
0
def create_webapp(config, messages_service):
    webapp = web.Application(
        middlewares=[timer_middleware, error_middleware],
        debug=config['debug_mode'],
        logger=logger
    )
    x_forwarded = XForwardedRelaxed(num=0)  # num=0 is a hack to get the first
    ensure_future(x_forwarded.setup(webapp))

    prefix = config['prefix']
    webapp.router.add_get(prefix + '/{channel}', get_messages)
    webapp.router.add_post(prefix + '/{channel}', webhook_handler)

    webapp['messages'] = messages_service
    return webapp
示例#2
0
async def make_app():
    parser = argparse.ArgumentParser(
        description='Python CAS Gateway',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument('--redis-url', help='Redis URL', default='redis://127.0.0.1:6379/0')
    parser.add_argument('--timeout', type=int, help='Request timeout', default=10)
    parser.add_argument('--bind-host', help='Address to bind to', default='0.0.0.0')
    parser.add_argument('--bind-port', type=int, help='Port to bind to', default='8000')
    parser.add_argument('--cas-version', type=int, help='CAS version in use', default=3)
    parser.add_argument('--chunk-size', type=int, help='Chunk size for streaming responses back to the client',
                        default=1024*4)
    parser.add_argument('--require-attribute', help='Require the given CAS attribute to be present and '
                                                    'not set to an empty string. Requires CAS version 3.')

    required_named = parser.add_argument_group('required named arguments')
    required_named.add_argument('--backend-url', help='URL to the backend to be proxied (e.g. http://myhost.com:8888)',
                                required=True)
    required_named.add_argument('--cas-url', help='URL to the CAS server', required=True)

    args = parser.parse_args()
    app = web.Application()

    print("Configuring...")

    app.settings = type('Settings', (object,), dict(
        backend_url=URL(args.backend_url),
        cas_url=URL(args.cas_url),
        redis_url=URL(args.redis_url),
        timeout=args.timeout,
        bind_host=args.bind_host,
        bind_port=args.bind_port,
        # aiohttp_cas was this as a string
        cas_version=str(args.cas_version),
        require_attribute=args.require_attribute,
    ))()

    print("Connecting to redis...")
    pool = await create_pool(
        (app.settings.redis_url.host or '127.0.0.1', app.settings.redis_url.port or 6379),
        db=int(app.settings.redis_url.path.strip('/') or 0),
        create_connection_timeout=10,
        password=app.settings.redis_url.password,
    )

    await remotes_setup(app, XForwardedRelaxed())
    session_setup(app, RedisStorage(pool))

    u = app.settings.cas_url
    cas_setup(
        app=app,
        host='{}:{}'.format(u.host, u.port) if u.port != 80 else u.host,
        host_prefix=app.settings.cas_url.path,
        version=app.settings.cas_version,
        host_scheme=app.settings.cas_url.scheme
    )
    app.router.add_route('GET', '/cas-gateway-ready', ready_check)
    app.router.add_route('*', '/{tail:.*}', handle)

    return app
async def test_x_forwarded_relaxed_multiple_host(aiohttp_client):
    async def handler(request):
        return web.Response()

    app = web.Application()
    app.router.add_get('/', handler)
    await _setup(app, XForwardedRelaxed())
    cl = await aiohttp_client(app)
    resp = await cl.get('/', headers=[('X-Forwarded-For', '10.10.10.10'),
                                      ('X-Forwarded-Proto', 'http'),
                                      ('X-Forwarded-Host', 'example.org'),
                                      ('X-Forwarded-Host', 'example.com')])
    assert resp.status == 400
示例#4
0
def make_app():
    handler = Handler()
    handler.load_data(path=settings.PROJECT_ROOT / 'data')

    app = web.Application(middlewares=[
        XForwardedRelaxed().middleware,
        blacklist_middleware,
    ])

    setup_routes(app, handler)

    app.cleanup_ctx.append(heartbeat_ctx)

    return app
示例#5
0
    def __init__(self, port, logs=None):

        # Build Web App
        self.port = port
        self.logs = logs
        self.webapp = web.Application(middlewares=[
            # Just in case someone wants to use it behind a reverse proxy
            # Not sure why someone will want to do that though
            XForwardedRelaxed().middleware,
            # Handle unexpected and HTTP exceptions
            self._middleware_exceptions,
            # Handle media type validation
            self._middleware_media_type,
            # Handle schema validation
            self._middleware_schema,
        ])

        self.webapp.router.add_get('/api/logs', self.api_logs)
        self.webapp.router.add_post('/api/config', self.api_config)
        self.webapp.router.add_post('/api/push', self.api_push)
        self.webapp.router.add_post('/api/message', self.api_message)

        # Enable CORS in case someone wants to build a web agent
        self.cors = CorsConfig(
            self.webapp, defaults={
                '*': ResourceOptions(
                    allow_credentials=True,
                    expose_headers='*',
                    allow_headers='*',
                )
            }
        )
        for route in self.webapp.router.routes():
            self.cors.add(route)

        # Create task for the push hearbeat
        event_loop = get_event_loop()

        self.timestamp = None
        self.heartbeat = event_loop.create_task(self._check_last_timestamp())

        # Build Terminal UI App
        self.ui = UIManager()
        self.tuiapp = MainLoop(
            self.ui.topmost,
            pop_ups=True,
            palette=self.ui.palette,
            event_loop=AsyncioEventLoop(loop=event_loop),
        )
示例#6
0
async def test_x_forwarded_relaxed_no_forwards(test_client):
    async def handler(request):
        url = cl.make_url('/')
        host = url.host + ':' + str(url.port)
        assert request.host == host
        assert request.scheme == 'http'
        assert not request.secure
        assert request.remote == '127.0.0.1'

        return web.Response()

    app = web.Application()
    app.router.add_get('/', handler)
    await _setup(app, XForwardedRelaxed())
    cl = await test_client(app)
    resp = await cl.get('/')
    assert resp.status == 200
async def test_x_forwarded_relaxed_ok(aiohttp_client):
    async def handler(request):
        assert request.host == 'example.com'
        assert request.scheme == 'https'
        assert request.secure
        assert request.remote == '10.10.10.10'

        return web.Response()

    app = web.Application()
    app.router.add_get('/', handler)
    await _setup(app, XForwardedRelaxed())
    cl = await aiohttp_client(app)
    resp = await cl.get('/', headers={'X-Forwarded-For': '10.10.10.10',
                                      'X-Forwarded-Proto': 'https',
                                      'X-Forwarded-Host': 'example.com'})
    assert resp.status == 200
示例#8
0
    async def serve(self, endpoint):
        app = aiohttp.web.Application()
        app.add_routes([
            aiohttp.web.get("/",    self.serve_index),
            aiohttp.web.get("/vgm", self.serve_vgm),
        ])

        try:
            from aiohttp_remotes import XForwardedRelaxed, setup as setup_remotes
            await setup_remotes(app, XForwardedRelaxed())
        except ImportError:
            self._logger.warning("aiohttp_remotes not installed; X-Forwarded-For will not be used")

        runner = aiohttp.web.AppRunner(app,
            access_log_format='%a(%{X-Forwarded-For}i) "%r" %s "%{Referer}i" "%{User-Agent}i"')
        await runner.setup()
        site = aiohttp.web.TCPSite(runner, *endpoint.split(":", 2))
        await site.start()
        await asyncio.Future()
示例#9
0
async def app_factory(*args) -> web.Application:  # pylint: disable=unused-argument
    app = web.Application(middlewares=[
        ForwardedRelaxed().middleware,
        XForwardedRelaxed().middleware,
        request_context_middleware,
    ])
    app.update(  # pylint: disable=no-member
        subapps={},
        client_session=None,  # populated via signal
        scheduler=None,  # populated via signal
        redis=None,  # populated via signal
        db=None,  # populated via signal
        REDIS_URL=settings.REDIS_URL,
        DATABASE_URL=settings.DATABASE_URL,
        SLACK_INVITE_TOKEN=settings.SLACK_INVITE_TOKEN,
        SLACK_TOKEN=settings.SLACK_TOKEN,
    )

    app.cleanup_ctx.extend([
        apscheduler_ctx,
        client_session,
        redis_pool,
        postgresql_pool,
        slack_client,
        background_jobs,
    ])

    app.router.add_get("/", index)

    app["subapps"]["website"] = await website.app_factory()
    app.add_subapp("/web", app["subapps"]["website"])

    app["subapps"]["sirbot"] = await sirbot.app_factory()
    app.add_subapp("/bot", app["subapps"]["sirbot"])

    return app
示例#10
0
async def app_factory() -> web.Application:
    app = web.Application(middlewares=[
        ForwardedRelaxed().middleware,
        XForwardedRelaxed().middleware,
        request_context_middleware,
    ])
    app.update(  # pylint: disable=no-member
        client_session=None,  # populated via signal
        scheduler=None,  # populated via signal
        redis=None,  # populated via signal
        db=None,  # populated via signal
        REDIS_URL=settings.REDIS_URL,
        POSTGRESQL_DSN=settings.POSTGRESQL_DSN,
    )

    app.cleanup_ctx.extend(
        [apscheduler, client_session, redis_pool, postgresql_pool])

    app.router.add_get("/", index)

    app["website_app"] = await website.app_factory()
    app.add_subapp("/web", app["website_app"])

    return app
示例#11
0
    return response


app = web.Application()
aiohttp_jinja2.setup(app,
                     loader=jinja2.FileSystemLoader(
                         str(Path(__file__).parent / "templates")))
env = aiohttp_jinja2.get_env(app)
env.filters.update(yaml=filter_yaml, highlight=filter_highlight)
env.globals["version"] = __version__

app.add_routes(routes)
app.router.add_static("/assets",
                      Path(__file__).parent / "templates" / "assets")

# behind proxy
app.middlewares.append(XForwardedRelaxed().middleware)

secret_key = os.getenv("SESSION_SECRET_KEY") or Fernet.generate_key()
secret_key = base64.urlsafe_b64decode(secret_key)
session_setup(app,
              EncryptedCookieStorage(secret_key, cookie_name="KUBE_WEB_VIEW"))

authorize_url = os.getenv("OAUTH2_AUTHORIZE_URL")
access_token_url = os.getenv("OAUTH2_ACCESS_TOKEN_URL")

if authorize_url and access_token_url:
    app.middlewares.append(auth)

web.run_app(app)
示例#12
0
def get_app(cluster_manager, config):
    templates_paths = [str(Path(__file__).parent / "templates")]
    if config.templates_path:
        # prepend the custom template path so custom templates will overwrite any default ones
        templates_paths.insert(0, config.templates_path)

    static_assets_path = Path(__file__).parent / "templates" / "assets"
    if config.static_assets_path:
        # overwrite assets path
        static_assets_path = Path(config.static_assets_path)

    object_links = collections.defaultdict(list)
    if config.object_links:
        for link_def in config.object_links.split(","):
            resource_type, sep, url_template = link_def.partition("=")
            object_links[resource_type].append({
                "href": url_template,
                "title": "External link for object {name}",
                "icon": "external-link-alt",
            })

    label_links = collections.defaultdict(list)
    if config.label_links:
        for link_def in config.label_links.split(","):
            label, sep, url_template = link_def.partition("=")
            label_links[label].append({
                "href": url_template,
                "title":
                "External link for {label} label with value '{label_value}'",
                "icon": "external-link-alt",
            })

    app = web.Application()
    aiohttp_jinja2.setup(
        app,
        loader=jinja2.FileSystemLoader(templates_paths),
        trim_blocks=True,
        lstrip_blocks=True,
    )
    env = aiohttp_jinja2.get_env(app)
    env.filters.update(
        pluralize=jinja2_filters.pluralize,
        yaml=jinja2_filters.yaml,
        highlight=jinja2_filters.highlight,
        age_color=jinja2_filters.age_color,
        cpu=jinja2_filters.cpu,
        memory=jinja2_filters.memory,
    )
    env.globals["version"] = __version__
    env.globals["object_links"] = object_links
    env.globals["label_links"] = label_links

    app.add_routes(routes)
    app.router.add_static("/assets", static_assets_path)

    # behind proxy
    app.middlewares.append(XForwardedRelaxed().middleware)

    secret_key = os.getenv("SESSION_SECRET_KEY") or Fernet.generate_key()
    secret_key = base64.urlsafe_b64decode(secret_key)
    session_setup(
        app, EncryptedCookieStorage(secret_key, cookie_name="KUBE_WEB_VIEW"))

    authorize_url = os.getenv("OAUTH2_AUTHORIZE_URL")
    access_token_url = os.getenv("OAUTH2_ACCESS_TOKEN_URL")

    if authorize_url and access_token_url:
        logger.info(
            f"Using OAuth2 middleware with authorization endpoint {authorize_url}"
        )
        app.middlewares.append(auth)

    app.middlewares.append(error_handler)

    app[CLUSTER_MANAGER] = cluster_manager
    app[CONFIG] = config

    return app
示例#13
0
def create_app(**kwargs):
    ''' Completely initialize the flask application
  '''
    from aiohttp import web
    from aiohttp_wsgi import WSGIHandler
    from aiohttp_remotes import setup, XForwardedRelaxed
    #
    from flask import Flask, Blueprint, current_app, redirect
    from flask_cors import CORS
    #
    from appyter.render.flask_app.socketio import socketio
    from appyter.render.flask_app.core import core
    import appyter.render.flask_app.static
    import appyter.render.flask_app.download
    import appyter.render.flask_app.execution
    if kwargs['debug']:
        import appyter.render.flask_app.livereload
    #
    from appyter.context import get_env, find_blueprints
    from appyter.util import join_routes
    config = get_env(**kwargs)
    #
    if config['DEBUG']:
        logging.basicConfig(
            level=logging.DEBUG,
            format='%(name)s %(message).80s',
        )
    else:
        logging.basicConfig(
            level=logging.WARNING,
            format='%(name)s %(message).80s',
        )
        logging.getLogger(__package__).setLevel(logging.INFO)
    #
    logger.info('Initializing aiohttp...')
    app = web.Application()
    app['config'] = config
    #
    logger.info('Initializing socketio...')
    socketio.attach(app, join_routes(config['PREFIX'], 'socket.io'))
    #
    logger.info('Initializing flask...')
    flask_app = Flask(__name__, static_url_path=None, static_folder=None)
    CORS(flask_app)
    flask_app.config.update(config)
    flask_app.debug = config['DEBUG']
    #
    logger.info('Registering blueprints...')
    flask_app.register_blueprint(core)
    for blueprint_name, blueprint in find_blueprints(
            config=flask_app.config).items():
        if isinstance(blueprint, Blueprint):
            flask_app.register_blueprint(blueprint,
                                         url_prefix='/' +
                                         blueprint_name.strip('/'))
        elif callable(blueprint):
            blueprint(flask_app, url_prefix='/' + blueprint_name.strip('/'))
        else:
            raise Exception('Unrecognized blueprint type: ' + blueprint_name)
    #
    if app['config']['PREFIX'].strip('/'):
        logger.info('Registering prefix redirect')

        async def redirect_to_prefix(request):
            path = request.match_info['path']
            if path == app['config']['PREFIX'].strip('/'): path = ''
            raise web.HTTPFound(
                join_routes(app['config']['PREFIX'], path) + '/')

        app.router.add_get('/{path:[^/]*}', redirect_to_prefix)
    #
    logger.info('Registering flask with aiohttp...')
    wsgi_handler = WSGIHandler(flask_app)
    app.router.add_route(
        '*', join_routes(app['config']['PREFIX'], '{path_info:.*}'),
        wsgi_handler)
    if flask_app.config['PROXY']:
        logger.info('Applying proxy fix middleware...')
        import asyncio
        asyncio.get_event_loop().run_until_complete(
            setup(app, XForwardedRelaxed()))
    return app