Exemplo n.º 1
0
async def command():
    c = request.args.get('command')

    auth = request.headers.get('Authorization', '').replace('Bearer ', '')

    try:
        t_jwt = jwt.decode(
            auth,
            twitch_ext_secret,
            algorithms=['HS256'],
            options={"require": ["channel_id", "opaque_user_id", "role"]})
    except (InvalidSignatureError, ExpiredSignatureError, InvalidTokenError,
            MissingRequiredClaimError):
        response = Response('')
        response.status_code = 403
        response.headers['Access-Control-Allow-Origin'] = '*'
        return response

    if t_jwt:
        if t_jwt.get('opaque_user_id', '')[0] == 'U':
            j = json.dumps({
                'e': 'BUTTON_COMMAND',
                'd': {
                    'button': {
                        'command': c,
                    },
                    'user': {
                        'username': '******',
                    },
                },
            })
        else:
            app.logger.debug("JWT: " + str(t_jwt))
            response = Response('')
            response.status_code = 403
            response.headers['Access-Control-Allow-Origin'] = '*'
            return response
    else:
        app.logger.debug("JWT: " + str(t_jwt))
        response = Response('')
        response.status_code = 403
        response.headers['Access-Control-Allow-Origin'] = '*'
        return response

    await broadcast(
        j
    )  # after the websockets context issue is solved change this to send message only to target robot
    response = Response('OK')
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response
Exemplo n.º 2
0
 def make_response(self,
                   output: dict,
                   format: str = "json",
                   code: int = 200,
                   meta: str = "meta") -> Response:
     """
     Returns the output string based on format param
     """
     output = self.format_dict(output)
     if "error" in output and meta not in output:
         output["timestamp"] = datetime.utcnow()
     if self.note:
         if meta not in output:
             output[meta] = {}
         output[meta]["note"] = self.note
     if format == "xml":
         root = self.report_type.upper() if self.report_type else "AVWX"
         resp = Response(fxml(output, custom_root=root),
                         mimetype="text/xml")
     elif format == "yaml":
         resp = Response(yaml.dump(output, default_flow_style=False),
                         mimetype="text/x-yaml")
     else:
         resp = jsonify(output)
     resp.status_code = code
     resp.headers["X-Robots-Tag"] = "noindex"
     return resp
Exemplo n.º 3
0
 def make_response(
     self,
     output: dict,
     # pylint: disable=redefined-builtin
     format: str = "json",
     code: int = 200,
     meta: str = "meta",
     root: str = "AVWX",
 ) -> Response:
     """Returns the output string based on format param"""
     output = self.format_output(output)
     if "error" in output and meta not in output:
         output["timestamp"] = datetime.now(tz=timezone.utc)
     if self.note and isinstance(output, dict):
         if meta not in output:
             output[meta] = {}
         output[meta]["note"] = self.note
     if format == "xml":
         resp = Response(fxml(output, custom_root=root.upper()),
                         mimetype="text/xml")
     elif format == "yaml":
         resp = Response(yaml.dump(output, default_flow_style=False),
                         mimetype="text/x-yaml")
     else:
         resp = jsonify(output)
     resp.status_code = code
     resp.headers["X-Robots-Tag"] = "noindex"
     return resp
Exemplo n.º 4
0
async def avatar(from_: str, code: str) -> quart.Response:
    try:
        etag = request.headers["if-none-match"]
    except KeyError:
        etag = None

    address = base64.urlsafe_b64decode(repad(from_)).decode("utf-8")
    info = await client.get_avatar(address, metadata_only=True)
    bin_hash = binascii.a2b_hex(info["sha1"])
    new_etag = base64.urlsafe_b64encode(bin_hash).decode("ascii").rstrip("=")

    cache_ttl = timedelta(seconds=current_app.config.get(
        "AVATAR_CACHE_TTL",
        300,
    ))

    response = Response("", mimetype=info["type"])
    response.headers["etag"] = new_etag
    # XXX: It seems to me that quart expects localtime(?!) in this field...
    response.expires = datetime.now() + cache_ttl
    response.headers["Content-Security-Policy"] = \
        "frame-ancestors 'none'; default-src 'none'; style-src 'unsafe-inline'"

    if etag is not None and new_etag == etag:
        response.status_code = 304
        return response

    data = await client.get_avatar_data(address, info["sha1"])
    if data is None:
        response.status_code = 404
        return response

    response.status_code = 200

    if request.method == "HEAD":
        response.content_length = len(data)
        return response

    response.set_data(data)
    return response
Exemplo n.º 5
0
async def channels_list(host):
    chanlist = []
    try:
        for rid in robots_config[host]:
            chanlist.append({
                "name": robots_config[host][rid]["info"]["name"],
                "id": rid,
                "chat": robots_config[host][rid]['info']['chat']
            })
    except KeyError:
        response = Response('')
        response.status_code = 404
        response.headers['Access-Control-Allow-Origin'] = '*'
        return response
    return {"channels": chanlist}
Exemplo n.º 6
0
async def get_metrics():
    #log.info(request.url)
    target = request.args.get('target')

    monitor_data = Perfdata(monitorconnection.MonitorConfig(), target)

    # Fetch performance data from Monitor
    start_time = time.monotonic()
    try:
        loop = asyncio.get_event_loop()
        fetch_perfdata_task = loop.create_task(
            monitor_data.get_service_metrics())

        if monitorconnection.MonitorConfig().get_enable_scrape_metadata():
            fetch_metadata_task = loop.create_task(
                monitor_data.get_host_metrics())
            await fetch_metadata_task

        await fetch_perfdata_task

        scrape_duration = time.monotonic() - start_time
        monitor_data.add_perfdata(
            "scrape_duration_seconds", {
                'hostname': target,
                'server': monitorconnection.MonitorConfig().get_url()
            }, scrape_duration)
        log.info("scrape", {
            'target': target,
            'url': request.url,
            'scrape_time': scrape_duration
        })
        target_metrics = monitor_data.prometheus_format()

        resp = Response(target_metrics)
        resp.headers['Content-Type'] = CONTENT_TYPE_LATEST
        # after_request_func(resp)
        return resp
    except monitorconnection.ScrapeExecption as err:
        log.warn(
            f"{err.message}", {
                'target': target,
                'url': request.url,
                'remote_url': err.url,
                'err': err.err
            })
        resp = Response("")
        resp.status_code = 500
        return resp