예제 #1
0
async def enrich(ip, **params):
    if state.geodata:
        try:
            location = state.geodata.get_location(ip, detailed=True)
            if location and 'info' in location:
                return handle_location(**pdict.from_dict(location['info']))
            return response.error('Database not ready')
        except Exception:
            logger.exception('mmgeo error')
            return response.error('Error while quering database')
예제 #2
0
async def enrich(ua, **params):
    """
    Detect device type using User-Agent string
    https://github.com/selwin/python-user-agents
    """
    try:
        parsed = parse(ua)
        res = Prodict(
            os_family=parsed.os.family,
            os_version=list(v if isinstance(v, int)
                            else 0 for v in parsed.os.version),
            browser_family=parsed.browser.family,
            browser_version=list(v if isinstance(
                v, int) else 0 for v in parsed.browser.version,),
            device_family=parsed.device.family,
            device_brand=parsed.device.brand,
            device_model=parsed.device.model)
        res.is_bot = int(parsed.is_bot)
        res.is_tables = int(parsed.is_tablet)
        res.is_mob = int(parsed.is_mobile)
        res.is_pc = int(parsed.is_pc)
        return res
    except Exception:
        logger.exception('handle ex')
        return response.error()
예제 #3
0
async def enrich(**params):
    try:
        ip = params.get('ip', None)
        if not state.db:
            raise HTTPServiceUnavailable()
        if ip:
            location = state.db.get(ip)
            if location:
                return handle_location(**location)
        return {}
    except Exception:
        logger.exception('mmgeo error.', location=location)
        return response.error()
예제 #4
0
async def request_handler(request, handler):
    # get query
    query = dict(**request.query)
    # url params
    if request.method == 'POST':
        if request.content_type == 'application/json':
            raw = await request.text()
            if raw:
                query.update(json_loads(raw))
        else:
            post = await request.post()
            query.update(post)
    # url params
    query.update(request.match_info)
    try:
        result = await handler(**query)
        # Handling stream responses
        if isinstance(result, types.AsyncGeneratorType):
            try:
                stream = StreamResponse()
                await stream.prepare(request)
                async for block in result:
                    await stream.write(block)
                await stream.write_eof()
                return stream
            # Halt handling
            except asyncio.CancelledError:
                logger.warn('halted response')
            return stream
        # regilar response
        else:
            return json_response(result, request=request)
    except ReceivedErrorResponse as e:
        return json_response(response.error(e.message), request=request)
    except Exception as e:
        logger.exception("exc")
        return json_response(response.error(str(e)), request=request)
예제 #5
0
async def error(**params):
    return response.error('Some F*cking error')
예제 #6
0
async def redirback(uid, data, **params):
    """
    
    """
    logger.debug('fb login', u=uid, d=data, p=params)
    code = data.get('code')
    redir_state = data.get('state')

    if not code:
        return response.error('Code is absent')

    if not redir_state:
        return response.error('Invalid state')

    credentials = await client.exchange_code(code)
    if not credentials:
        return response.error('Couldn\'t get credentials')

    me = await client.me(credentials)

    if not me:
        return response.error('Couldn\'t get user info (me)')

    token_debug = await client.debug_token(credentials.get('access_token'))
    logger.debug('debug token; me resp', debresp=token_debug, meresp=me)

    stored_data = await id_get_redir_data(redir_state)
    if not stored_data or not stored_data.get('redir_data'):
        logger.warn('absent redir state', uid=uid, data=data)

    redir_data = stored_data.get('redir_data')
    source_sids = redir_data.get('sids')

    if not source_sids:
        logger.error('Invalid state contents', state=redir_data)
        return response.error('Invalid state contents')

    base_vars = {
        'ctime': msec(),
        'source': 'fbauth',
        'event_id': params.get('id')
    }

    fb_params = {'access_token': credentials.get('access_token'), **base_vars}

    logger.debug('redir data', r=redir_data)
    source_sids_with_params = [(
        v,
        {
            **base_vars
        },
    ) for k, v in source_sids.items()]

    uid_id = (
        'uid',
        uid,
    )
    uid_id_with_params = (
        uid_id,
        base_vars,
    )
    fb_id = (
        'fb',
        me.get('id'),
    )
    fb_id_with_params = (
        fb_id,
        fb_params,
    )

    additional_ids = [uid_id_with_params, fb_id_with_params]

    # save fb-to-phone,tg
    await id_update(fb_id, source_sids_with_params)

    # save uid-to-fb-tg-phone
    uid_sids = [*source_sids_with_params, fb_id_with_params]
    logger.debug('uid sids', uid_id=uid_id, usids=uid_sids)
    await id_update(uid_id, uid_sids)

    # save phone-to-uid,fb
    if source_sids.get('phone'):
        await id_update(source_sids['phone'], additional_ids)
        profile = await id_lookup(source_sids['phone'])
        logger.debug('new profile', profile)

    if source_sids.get('tg'):
        await bot_chat_event(sid_chat=source_sids['tg'],
                             name='fblogin',
                             data=me)

    return response.redirect(cfg.urls.alena_success.url)