Пример #1
0
def events_post():
    sub_secret = flask.request.args.get('sub_secret', None)
    if sub_secret != config.withings_creds['sub_secret']:
        logging.warning(
            'WithingsEvent: Invalid sub_secret: Provided %s, expected %s'
            % (sub_secret, config.withings_creds['sub_secret'])
        )

    # Events come POSTED in the form:
    # logging.info('Received Event: Headers:\n%s\nBody:\n%s',
    #        flask.request.headers, flask.request.get_data())
    # Headers:
    #   X-Google-Apps-Metadata: domain=gmail.com,host=*.bikebuds.cc
    #   X-Appengine-Citylatlong: 0.000000,0.000000
    #   X-Cloud-Trace-Context: \
    #       501952e8e74efe98b012acc24be99669/717376932886432083;o=1
    #   X-Appengine-Default-Namespace: gmail.com
    #   Content-Length: 63
    #   X-Appengine-Region: ?
    #   User-Agent: GuzzleHttp/6.2.1 curl/7.58.0 PHP/7.2.15-0ubuntu0.18.04.1
    #   Host: www.bikebuds.cc
    #   X-Appengine-City: ?
    #   X-Appengine-Country: FR
    #   Content-Type: application/x-www-form-urlencoded
    # Body:
    #   userid=17012450&startdate=1532017199&enddate=1532017200&appli=1
    # event_data = {
    #        'userid': 17012450,
    #        'startdate': 1532017199,
    #        'enddate': 1532017200,
    #        'appli': 1,
    #        }

    event_data = None
    try:
        event_data = flask.request.form.to_dict()
    except Exception:
        logging.error('WithingsEvent: Failed form data: %s', flask.request.form)

    service_key = None
    try:
        if 'service_key' in flask.request.args:
            service_key = Key.from_legacy_urlsafe(flask.request.args.get('service_key'))
        else:
            logging.debug(
                'WithingsEvent: service_key missing in callbackurl %s',
                flask.request.url,
            )
    except binascii.Error:
        # In older code we accidentally registered with poorly constructed
        # callbackurls, ignore these.
        logging.debug(
            'WithingsEvent: Invalid event from bad callbackurl %s', flask.request.url
        )
    except Exception:
        logging.exception(
            'WithingsEvent: Failed service_key: %s',
            flask.request.args.get('service_key'),
        )

    if event_data is None or service_key is None:
        sub_event_failure = SubscriptionEvent.to_entity(
            {
                'url': flask.request.url,
                'event_data': event_data,
                'failure': True,
                'date': datetime.datetime.utcnow(),
            },
            parent=service_key,
        )
        logging.error('WithingsEvent: failure: %s', sub_event_failure)
        return responses.OK_SUB_EVENT_FAILED

    # We can proess this entity.
    event_entity = SubscriptionEvent.to_entity(
        {
            'url': flask.request.url,
            'event_data': event_data,
            'failure': False,
            'date': datetime.datetime.utcnow(),
        },
        name=SubscriptionEvent.hash_name(*sorted(event_data.values())),
        parent=service_key,
    )
    logging.debug(
        'WithingsEvent: Processing: %s from url: %s',
        event_entity.key,
        flask.request.url,
    )
    try:
        task_util.process_event(service_key, event_entity)
        logging.info('WithingsEvent: Queued: %s', event_entity.key)
    except AlreadyExists:
        logging.info('WithingsEvent: Duplicate: %s', event_entity.key)
    return responses.OK