def _request(self, method, path, service=Services.API,
                 sign=True, params={}, args={}, body={}):
        """
        Perform API request.

        :param method: HTTP method ('GET', 'POST' etc.)
        :param path: URL to retrieve (e.g. '/v2/post-list')
        :param service: :class:`.Client.Services` field, default is `API`
        :param sign: Whether to sign the request or no.
        :param args: URL arguments (converted to weird form like `/count/10/type/hot/...`)
        :param query: Query args (converted to `?foo=bar&...`)
        :param body: Request body ('POST' requests only.)
        :returns: Decoded JSON response.
        :rtype: dict
        """
        url = '/'.join([
            service.strip('/'),
            path.strip('/'),
            '/'.join('{}/{}'.format(k, v) for k, v in args.items()).strip('/')
        ])

        headers = {
            '9GAG-9GAG_TOKEN': self.token,
            '9GAG-TIMESTAMP': str(utils.get_timestamp()),
            '9GAG-APP_ID': self.app_id,
            'X-Package-ID': self.app_id,
            '9GAG-DEVICE_UUID': self.device_uuid,
            'X-Device-UUID': self.device_uuid,
            '9GAG-DEVICE_TYPE': 'android',
            '9GAG-BUCKET_NAME': 'MAIN_RELEASE',
            }

        if sign:
            headers['9GAG-REQUEST-SIGNATURE'] = utils.sign_request(
                headers['9GAG-TIMESTAMP'],
                headers['9GAG-APP_ID'],
                headers['9GAG-DEVICE_UUID']
            )

        logging.debug('{} {}: {}\n{}'.format(
            method,
            url,
            body,
            '\n'.join(['{}: {}'.format(k, v) for k, v in headers.items()])
        ))

        if method.upper() == 'GET':
            response = requests.get(url, headers=headers, params=params)
        elif method.upper() == 'POST':
            response = requests.post(url, headers=headers, data=body, params=params)
        else:
            raise NotImplementedError('Only GET and POST methods are currently implemented.')

        data = loads(response.text)

        self._validate_response(data)

        return data
def auth_keyboard(user_id):
    markup = InlineKeyboardMarkup()
    sign = sign_request(user_id)
    url = ('http://www.last.fm/api/auth/'
           '?api_key=330cb02fdb1e20e1ac7c99f39b923a8f&cb='
           'https://static.138.197.203.116.clients.your-server.de/'
           f'deezer/lastfm?data={user_id}AAA{sign}')
    markup.add(InlineKeyboardButton(text='Authorize', url=url))
    return markup
Exemple #3
0
    def post_add_operator(self):
        domain_id = self.json_args.get('domain_id')
        login = self.json_args.get('login')
        user_id = self.json_args.get('user_id')
        name = self.json_args.get('name')
        role = self.json_args.get('role')

        session = self.session('repo')

        try:
            if len(name) < 2 or len(name) > MAX_NAME:
                raise ValueError('名称长度不符合要求(2-%d字符) (%s)' % (MAX_NAME, name))

            if not login_re.match(login):
                raise ValueError('登录名不符合规则:小写字母或数字长度4~12位')

            exist_user = session.query(RepoUser).filter(
                RepoUser.domain_id == domain_id).filter(
                    RepoUser.user_id == user_id).first()
            if exist_user is None:
                raise ValueError('代理商不存在 (%s)' % user_id)

            exist_operator = session.query(RepoOperator).filter(
                RepoOperator.domain_id == domain_id).filter(
                    RepoOperator.login == login).first()
            if exist_operator:
                raise ValueError('代理商登录名已经存在 (%s)' % login)

            rand_pass = ''.join(
                random.sample(string.ascii_letters + string.digits, 6))
            signed = sign_request(rand_pass.encode())

            operator = RepoOperator()
            operator.domain_id = domain_id
            operator.user_id = user_id
            operator.login = login
            operator.name = name
            operator.password = signed
            operator.role = role
            operator.status = 'enabled'
            session.add(operator)

            session.commit()
            self.finish({'status': 'ok', 'msg': '创建成功', 'password': rand_pass})

            # sync user
            yield core.sync_user(session, domain_id)

        except ValueError as ve:
            self.finish({'status': 'fail', 'msg': str(ve)})

        except Exception as ee:
            request_log.exception('ADD USER')
            self.finish({'status': 'fail', 'msg': 'EXCEPTION'})

        finally:
            session.close()
	def test_correct_signature(self):

		result = {  "animal" : "testanimal",
					"distribution" : "testdistr",
					"version" : "1.2.3",
					"load" : "success",
					"install" : "success",
					"check" : "failure",
					"install_log" : "pgxnclient install logfile",
					"load_log" : "pgxnclient load logfile",
					"check_log" : "pgxnclient check logfile",
					"check_diff" : "pg_regress diff file" }


		result['signature'] = sign_request(data=result, secret='testsecret')

		# list distributions (there are none)
		response = self.app.post('/api/results', data=json.dumps(result), content_type='application/json')

		self.assertEqual(response.status_code, 200)
		self.assertEqual(len(json.loads(response.data)['uuid']), 36)
	def test_invalid_version(self):

		result = {  "animal" : "testanimal",
					"distribution" : "testdistr",
					"version" : "1.0.0",
					"load" : "success",
					"install" : "success",
					"check" : "failure",
					"install_log" : "pgxnclient install logfile",
					"load_log" : "pgxnclient load logfile",
					"check_log" : "pgxnclient check logfile",
					"check_diff" : "pg_regress diff file" }


		result['signature'] = sign_request(data=result, secret='testsecret')

		# list distributions (there are none)
		response = self.app.post('/api/results', data=json.dumps(result), content_type='application/json')

		self.assertEqual(response.status_code, 401)
		self.assertEqual(json.loads(response.data), {'message' : 'unknown version'})
Exemple #6
0
async def auth_redirect(request: web.Request):
    data = request.query.get('data')
    if data:
        data = data.split('AAA', 1)
        if len(data) == 2:
            user_id, sign = data
    token = request.query.get('token')
    if not token or not user_id or not sign or \
            sign != sign_request(user_id):
        return web.HTTPForbidden()

    session = await api_request('GET', 'auth.getSession', token=token)
    await set_lastfm_token(user_id, session.session.key)

    await bot.send_message(
        int(user_id),
        'You successfuly authorized to use Last.fm '
        f'as {session.session.name}, '
        'reply /lastfm_scrobble to a song to scrobble it\n'
        'reply /lastfm_love to a song to love it on your account\n'
        'send /lastfm_logout to logout from current account')
    return web.HTTPFound('tg://resolve/?domain=DeezerMusicBot')
					logging.info("PostgreSQL cluster started, version = %(version)s" % {'version' : pgversion})

					# run the actual test
					result = test_release(dist['name'], version['version'], version['status'], logdir=args.logdir)

					# additional info, and a random UUID for the result (we're generating it here as a protection against simple replay attacks)
					result.update({'uuid' : str(uuid.uuid4()), 'machine' : args.name, 'config' : json.dumps(pginfo), 'env' : json.dumps({})})

					# there has to be a better way ... but well, this seems to work for now
					result['install_log'] = base64.b64encode(result['install_log'].encode('utf-8'))
					result['load_log'] = base64.b64encode(result['load_log'].encode('utf-8'))
					result['check_log'] = base64.b64encode(result['check_log'].encode('utf-8'))
					result['check_diff'] = base64.b64encode(result['check_diff'].encode('utf-8'))

					# sign the request with the shared secret
					result = sign_request(result, args.secret)

					# do the POST request (if OK, status is 200)
					(status, reason) = post_results(api_host, templates, result)

					if (status == 200):
						logging.info("POST OK : UUID='%(uuid)s' install=%(install)s load=%(load)s check=%(check)s" % {'uuid' : reason['uuid'], 'install' : result['install'], 'load' : result['load'], 'check' : result['check']})
					else:
						logging.error(reason)
						logging.error("POST for %(dist)s-%(version)s failed (status = %(status)d)" % {'dist' : dist['name'], 'version' : version['version'], 'status' : status})

				except Exception as ex:

					logging.info("testing failed: %(msg)s" % {'msg' : str(ex)})
					logging.exception(ex)
Exemple #8
0
    def post_add_user(self):
        domain_id = self.json_args.get('domain_id')
        template_id = self.json_args.get('template_id')
        user_name = self.json_args.get('name')
        # request_id = self.json_args.get('request_id')
        login = self.json_args.get('login')
        level = self.json_args.get('plevel', '1')
        notes = self.json_args.get('notes', '')
        qq = self.json_args.get('qq', '')
        mobile = self.json_args.get('mobile', '')

        session = self.session('repo')

        try:
            if len(user_name) < 2 or len(user_name) > MAX_NAME:
                raise ValueError('代理商名称长度不符合要求(2-%d字符) (%s)' %
                                 (MAX_NAME, user_name))

            if not login_re.match(login):
                raise ValueError('登录名不符合规则:小写字母或数字长度4~12位')

            exist_user = session.query(RepoUser).filter(
                RepoUser.domain_id == domain_id).filter(
                    RepoUser.name == user_name).first()
            if exist_user:
                raise ValueError('代理商用户名已经存在 (%s)' % user_name)

            exist_operator = session.query(RepoOperator).filter(
                RepoOperator.domain_id == domain_id).filter(
                    RepoOperator.login == login).first()
            if exist_operator:
                raise ValueError('代理商登录名已经存在 (%s)' % login)

            q = session.query(RepoTemplate).filter(
                RepoTemplate.domain_id == domain_id).filter(
                    RepoTemplate.template_id == template_id)

            user_template = q.one()
            if user_template is None:
                raise ValueError('代理商模板异常')

            # Next UserID
            latest_user = session.query(RepoUser).filter(
                RepoUser.user_id >= user_template.user_id_start).filter(
                    RepoUser.user_id <= user_template.user_id_end).order_by(
                        desc(RepoUser.user_id)).first()

            if latest_user:
                if latest_user == user_template.user_id_end:
                    raise ValueError('用户数已超出限额,请联系开发人员!')

                user_id = str(int(latest_user.user_id) + 1)
            else:
                user_id = user_template.user_id_start

            user = RepoUser()
            user.user_id = user_id
            user.domain_id = domain_id
            user.name = user_name
            user.master_id = user_template.master_id or user_id
            user.shard_id = user_template.shard_id or user_id
            user.type = user_template.type
            user.password = gen_key(
                16, string.ascii_uppercase + string.ascii_lowercase +
                string.digits)
            user.secret = gen_key(
                32, string.ascii_uppercase + string.ascii_lowercase +
                string.digits)
            user.iv = gen_key(16, string.digits)
            user.back_url = user_template.back_url
            user.tags = get_initial(user_name)
            user.level = level
            user.prefix = user_template.prefix
            user.status = user_template.status
            user.create_time = dt.now()
            user.qq = qq
            user.mobile = mobile
            user.notes = notes
            user.services = user_template.services

            session.add(user)

            rand_pass = ''.join(
                random.sample(string.ascii_letters + string.digits, 6))
            signed = sign_request(rand_pass.encode())

            operator = RepoOperator()
            operator.domain_id = domain_id
            operator.user_id = user_id
            operator.login = login
            operator.name = user_name
            operator.password = signed
            operator.role = user_template.role
            operator.status = user_template.status
            session.add(operator)

            session.commit()
            self.finish({'status': 'ok', 'msg': 'OK', 'password': rand_pass})

            # sync user
            yield core.sync_user(session, domain_id)
            # sync pricing
            # yield core.sync_pricing(session, domain_id, filter_user=user_id)
            self.master.lpush(
                'list:sync:pricing',
                '{domain_id},{product_id},{user_id}'.format(
                    domain_id=domain_id, product_id='', user_id=user_id))

        except ValueError as ve:
            self.finish({'status': 'fail', 'msg': str(ve)})

        except Exception as ee:
            request_log.exception('ADD USER')
            self.finish({'status': 'fail', 'msg': 'EXCEPTION'})

        finally:
            session.close()
Exemple #9
0
    def post_add_domain(self):
        domain_id = self.json_args.get('domain_id')
        domain_name = self.json_args.get('domain_name')
        title = self.json_args.get('title')
        hosts = self.json_args.get('hosts')
        up_user = self.json_args.get('up_user', None)
        id_start = self.json_args.get('id_start', None)
        id_end = self.json_args.get('id_end', None)
        template_list = self.json_args.get('template_list')
        up_domain_id = None
        db_up_user = None

        status = "enabled"

        session = self.session('repo')

        try:
            if up_user:
                # sub-domain
                db_up_user = session.query(RepoUser).filter(
                    RepoUser.user_id == up_user).first()
                if db_up_user is None:
                    raise RuntimeError('没有找到指定的上游用户 %s' % up_user)

                up_domain_id = db_up_user.domain_id

                # check start-end in up_domain
                db_up_domain = session.query(RepoDomain).filter(
                    RepoDomain.domain_id == up_domain_id).one()

                if id_start < db_up_domain.id_start or id_end > db_up_domain.id_end:
                    raise RuntimeError('子平台用户段需要在上级平台用户端内')

                # 用户不可重叠
                exist_domain = session.query(RepoDomain).filter(
                    RepoDomain.up_domain == up_domain_id).filter(
                        or_(between(RepoDomain.id_start, id_start, id_end),
                            between(RepoDomain.id_end, id_start,
                                    id_end))).first()

                if exist_domain:
                    raise RuntimeError(
                        '与同级平台的用户段重叠 %s(%s)' %
                        (exist_domain.domain_name, exist_domain.domain_id))

            else:
                raise RuntimeError('请选择一个上级用户')  # 暂时关闭顶级平台

                # top-level domain
                exist_domain = session.query(RepoDomain).filter(
                    or_(between(RepoDomain.id_start, id_start, id_end),
                        between(RepoDomain.id_end, id_start, id_end))).first()

                if exist_domain:
                    raise RuntimeError('用户段重叠 %s' % exist_domain.domain_id)

            domain = RepoDomain()
            domain.domain_id = domain_id
            domain.domain_name = domain_name
            domain.title = title
            domain.hosts = hosts
            domain.up_domain = up_domain_id
            domain.up_user = up_user
            domain.status = status
            domain.id_start = id_start
            domain.id_end = id_end
            domain.create_time = dt.now()

            session.add(domain)

            # add route/interface

            route = RepoRouteSupply()
            route.domain_id = domain_id
            route.name = '内部路由'
            route.area = 'CN'
            route.adapt_flag = 'yes'
            route.interfaces = 'quxun'
            route.status = 'enabled'
            route.create_time = dt.now()
            session.add(route)

            interface = RepoRouteInterface()
            interface.domain_id = domain_id
            interface.interface_id = 'quxun'
            interface.name = '<趣讯上游>'
            interface.carrier = '1,2,3'
            interface.area = 'CN'
            interface.create_time = dt.now()
            session.add(interface)

            # add user/operator

            user_id = id_start

            user = RepoUser()
            user.domain_id = domain_id
            user.user_id = user_id
            user.name = domain_name
            user.master_id = user_id
            user.shard_id = user_id
            user.type = db_up_user.type
            user.password = gen_key(
                16, string.ascii_uppercase + string.ascii_lowercase +
                string.digits)
            user.secret = gen_key(
                32, string.ascii_uppercase + string.ascii_lowercase +
                string.digits)
            user.iv = gen_key(16, string.digits)
            user.back_url = db_up_user.back_url
            user.tags = get_initial(domain_name)
            user.level = 1
            user.prefix = 'TB'
            user.status = 'enabled'
            user.services = db_up_user.services
            user.create_time = dt.now()

            session.add(user)

            rand_pass = ''.join(
                random.sample(string.ascii_letters + string.digits, 6))
            signed = sign_request(rand_pass.encode())

            admin_login = '******' + user_id

            operator = RepoOperator()
            operator.domain_id = domain_id
            operator.user_id = user_id
            operator.login = admin_login
            operator.name = domain_name + '管理员'
            operator.password = signed
            operator.role = 'down_admin'
            operator.status = 'enabled'

            session.add(operator)
            session.commit()

            # copy template
            if template_list:
                q = session.query(RepoTemplate).filter(
                    RepoTemplate.domain_id == up_domain_id)
                for template in q.all():
                    if template.template_id in template_list:
                        copy_template = RepoTemplate()
                        copy_template.domain_id = domain_id
                        copy_template.template_id = template.template_id
                        copy_template.template_name = template.template_name
                        copy_template.user_id_start = id_start
                        copy_template.user_id_end = id_end
                        copy_template.shard_id = user_id
                        copy_template.type = template.type
                        copy_template.back_url = template.back_url
                        copy_template.level = template.level
                        copy_template.prefix = template.prefix
                        copy_template.status = template.status
                        copy_template.services = template.services
                        copy_template.role = template.role
                        session.add(copy_template)

                session.commit()

            self.finish({
                'status':
                'ok',
                'msg': ('创建成功\n'
                        '管理用户名:%s\n'
                        '密码:%s\n'
                        '(!!这里是唯一记录密码的机会!!)') % (admin_login, rand_pass)
            })

        except Exception as e:
            self.finish({'status': 'fail', 'msg': '创建失败' + str(e)})

        finally:
            session.close()