def reg(): """注册用户,返回appkey""" # 验证请求参数 # args = self.reqparse.parse_args() username = request.json.get('username') password = request.json.get('password') email = request.json.get('email') telphone = request.json.get('telphone') role_id = request.json.get('role_id') # 与db存储相同的加密方式, 作为开发者钱包的支付密码 pay_password = generate_password_hash(password) print(pay_password) # 注册前, 先创建钱包 server = get_jsonrpc_server() try: result=server.create(username, pay_password) if result.get('success') is not True: print(result) return return_result(20205) except Exception as e: print (e) return return_result(20205) user = User(username=username, email=email, telphone=telphone, role_id=role_id, password_hash=pay_password) db.session.add(user) db.session.commit() return return_result(result=dict(id=user.id))
def reg(): """User register""" form = g.form # The user login password is also the wallet's payment password. password = rsahelper.decrypt(form.password.data).decode('u8') pay_password = generate_password_hash(password) form.password.data = pay_password try: server = get_jsonrpc_server() # print(form.username.data, pay_password) result = server.create(form.username.data, pay_password) if result.get('success') is not True: print(result) return return_result(20205, result=result) except Exception as e: print(e) return return_result(20205) role = Role.query.filter_by(name='normal').first() user = User(**form.data) user.role_id = role.id db.session.add(user) db.session.commit() return return_result(result=dict(id=user.id))
def pay_to_user(): """The user account transfer Args: is_developer:Is it a developer """ is_developer = request.json.get('is_developer') if is_developer is True: send_user_wallet = g.user.username pay_password = g.user.password_hash else: send_user_wallet = get_wallet_name(request.json.get('send_user')) pay_password = request.json.get('pay_password') recv_wallet_username = get_wallet_name(request.json.get('recv_user')) amount = request.json.get('amount') try: server = get_jsonrpc_server() result = server.pay(send_user_wallet, pay_password, recv_wallet_username, amount) print(result) if result.get('success') is not True: print(result) return return_result(20206, result=result) except Exception as e: print(e) return return_result(20206, result=dict(wallet_reason=str(e))) return return_result()
def balance(): """Check balances""" is_developer = g.form.is_developer.data if is_developer: username_wallet = g.user.username pay_password = g.user.password_hash else: username_wallet = g.form.username.data pay_password = g.form.pay_password.data try: server = get_jsonrpc_server() result = server.getbalance(username_wallet, pay_password) if result.get('errcode') != 0: return result except: app.logger.error(formatter_error(traceback.format_exc())) return return_result(20203) result = result.get('result') confirmed = result.get('confirmed', '0') unconfirmed = result.get('unconfirmed', '0') unmatured = result.get('unmatured', '0') total = result.get('total', '0') return return_result(result=dict(total=total, confirmed=confirmed, unconfirmed=unconfirmed, unmatured=unmatured))
def pay_to_user(): """The user account transfer Args: is_developer:Is it a developer """ is_developer = g.form.is_developer.data if is_developer is True: send_user_wallet = g.user.username pay_password = g.user.password_hash else: send_user_wallet = g.form.send_user.data pay_password = g.form.pay_password.data recv_wallet_username = g.form.recv_user.data amount = g.form.amount.data try: server = get_jsonrpc_server() result = server.pay(send_user_wallet, pay_password, recv_wallet_username, amount) print(result) if result.get('success') is not True: print(result) return return_result(20206, result=result) except Exception as e: print(e) return return_result(20206, result=dict(wallet_reason=str(e))) return return_result()
def balance(): """Check balances""" is_developer = request.json.get('is_developer') if is_developer: username_wallet = g.user.username pay_password=g.user.password_hash else: username_wallet = get_wallet_name(request.json.get('username')) pay_password = request.json.get('pay_password') try: server = get_jsonrpc_server() result = server.getbalance(username_wallet, pay_password) if result.get('success') is not True: print(result) return return_result(20203, result=result) except Exception as e: print(e) return return_result(20203, result=dict(wallet_reason=str(e))) result=result.get('result') confirmed = result.get('confirmed', '0') unconfirmed = result.get('unconfirmed', '0') unmatured = result.get('unmatured', '0') total = result.get('total', '0') return return_result(result=dict(total=total, confirmed=confirmed, unconfirmed=unconfirmed, unmatured=unmatured))
def edit_user_role(): """The administrator changes the developer account role.""" user = User.query.get(g.form.id.data) if not user: return return_result(20003) user.role_id = g.form.role_id.data return return_result()
def balance(): """Check balances""" is_developer = g.form.is_developer.data if is_developer: username_wallet = g.user.username pay_password = g.user.password_hash else: username_wallet = g.form.username.data pay_password = g.form.pay_password.data try: server = get_jsonrpc_server() result = server.getbalance(username_wallet, pay_password) if result.get('errcode') != 0: return result except Exception as e: app.logger.error('remote_addr<{}> - {}'.format(request.remote_addr, str(e))) return return_result(20203) result = result.get('result') confirmed = result.get('confirmed', '0') unconfirmed = result.get('unconfirmed', '0') unmatured = result.get('unmatured', '0') total = result.get('total', '0') return return_result(result=dict(total=total, confirmed=confirmed, unconfirmed=unconfirmed, unmatured=unmatured))
def pay_to_user(): """The user account transfer Args: is_developer:Is it a developer """ is_developer = g.form.is_developer.data if is_developer is True: send_user_wallet = g.user.username pay_password = g.user.password_hash else: send_user_wallet = g.form.send_user.data pay_password = g.form.pay_password.data recv_wallet_username = g.form.recv_user.data amount = g.form.amount.data try: server = get_jsonrpc_server() result = server.pay(send_user_wallet, pay_password, recv_wallet_username, amount) if result.get('errcode') != 0: return result except Exception as e: app.logger.error('remote_addr<{}> - {}'.format(request.remote_addr, str(e))) return return_result(20206) return return_result()
def pay_to_user(): """The user account transfer Args: is_developer:Is it a developer """ is_developer = g.form.is_developer.data if is_developer is True: send_user_wallet = g.user.username pay_password = g.user.password_hash else: send_user_wallet = g.form.send_user.data pay_password = g.form.pay_password.data recv_wallet_username = g.form.recv_user.data amount = g.form.amount.data try: server = get_jsonrpc_server() result = server.pay(send_user_wallet, pay_password, recv_wallet_username, amount) if result.get('errcode') != 0: return result except: app.logger.error(formatter_error(traceback.format_exc())) return return_result(20206) return return_result()
def login(): username = g.form.username.data password = g.form.password.data user = User.query.filter_by(username=username).first() if user is None: return return_result(20003) if not user.check_password(password): return return_result(20004) token = user.generate_auth_token(expiration=app.config['EXPIRATION']) return return_result(result=dict(token=token))
def publish(): """Release resources Args: status: 1:add, 2:update, 3:delete(enabled=False) """ data = copy.deepcopy(g.form.data) data['appkey'] = g.appkey username_wallet = get_wallet_name(data['author']) pay_password = data.pop('pay_password') data['currency'] = app.config['PUBLISH_CURRENCY'] data['bid'] = app.config['PUBLISH_BID'] data['claim_name'] = generate_appkey() metadata = dict(title=data['title'], author=data['author'], tag=data['tags'], description=data['des'], language=data['language'] or 'en', license=data['license'], licenseUrl=data['license_url'], nsfw=False, preview=data['preview'], thumbnail=data['thumbnail']) try: server = get_jsonrpc_server() result = server.publish(username_wallet, pay_password, data['claim_name'], metadata, data['content_type'], data['udfs_hash'], data['currency'], data['price'], data['bid'], None, None, True) if result.get('errcode') != 0: return result except: app.logger.error(formatter_error(traceback.format_exc())) return return_result(20201) result = result.get('result') data['fee'] = float(result.get('fee', 0)) data['claim_id'] = result.get('claim_id') data['txid'] = result.get('txid') data['nout'] = int(result.get('nout', 0)) if len(data['txid']) != 64: return return_result(20201, result=result) data['status'] = 1 data['tags'] = save_tag(data['tags']) content = Content(**data) db.session.add(content) data.pop('tags') history = ContentHistory(**data) db.session.add(history) db.session.commit() return return_result(result=dict(id=content.id, claim_id=content.claim_id))
def login(): """ 获取appkey, 可以把appkey信息写入redis,作为查询 """ username = request.json.get('username') password = request.json.get('password') user = User.query.filter_by(username=username).first() if user is None: return return_result(20003) if not user.check_password(password): return return_result(20004) return return_result(reason='success', result=dict(token='token'))
def consume(): appkey = g.appkey customer = request.json.get('username') wallet_username = get_wallet_name(customer) claim_id = request.json.get('claim_id') # 正常消费传值 customer_pay_password = request.json.get('customer_pay_password') # 广告点击传值 author_pay_password = request.json.get('author_pay_password') content = Content.query.filter_by(claim_id=claim_id, appkey=appkey).first() if not content: return return_result(20007) price = content.price if content.author != customer and content.price != 0: # 非免费资源(收费资源/广告) consume = Consume.query.filter_by(claim_id=claim_id, customer=customer, appkey=appkey).first() if not consume: server = get_jsonrpc_server() try: if price >= 0: # 普通消费 result = server.consume(wallet_username, claim_id, customer_pay_password) else: # 广告 send_wallet_username = get_wallet_name(content.author) recv_wallet_username = get_wallet_name(customer) abs_price = abs( float(price)) # decimal 类型 会是这样 0.030000, 要去掉后面的0 print(send_wallet_username, author_pay_password, recv_wallet_username, abs_price) result = server.pay(send_wallet_username, author_pay_password, recv_wallet_username, abs_price) if result.get('success') is not True: print(result) return return_result(20202, result=result) except Exception as e: print(e) return return_result(20202, result=dict(wallet_reason=str(e))) txid = result.get('txid') print(result) c = Consume(txid=txid, claim_id=claim_id, customer=customer, appkey=appkey, price=price) db.session.add(c) return return_result(result=dict(ipfs_hash=content.ipfs_hash))
def decorator(*args, **kwargs): username = request.json.get('username') password = request.json.get('password') if not username or not password: return return_result(10011) user = User.query.filter_by(username=username).first() if user is None: return return_result(10011) if not user.verify_password(password): return return_result(10011) return f(*args, **kwargs)
def decorator(*args, **kwargs): appkey = request.headers.get('U-AppKey') curtime = request.headers.get('U-CurTime') sign = request.headers.get('U-Sign') if not appkey: return return_result(10012) # insert to redis uapp = Application.query.filter_by(appkey=appkey).first() if not uapp: return return_result(10001) user = uapp.user secret = uapp.secret if user.role.name == 'blocked': return return_result(20006) # Verify digital signature if not curtime: return return_result(10017) else: if not curtime.isdigit(): return return_result(20100) if time.time() - int(curtime) > current_app.config['SIGN_EXPIRES']: return return_result(10017) if not sign: return return_result(10013) if not verify_sign(appkey, secret, curtime, sign): return return_result(20102) g.user = user g.appkey = appkey return f(*args, **kwargs)
def consume(): appkey = g.appkey customer = request.json.get('username') wallet_username = get_wallet_name(customer) claim_id = request.json.get('claim_id') # Normal resource consumption customer_pay_password = request.json.get('customer_pay_password') # Ad click author_pay_password = request.json.get('author_pay_password') content = Content.query.filter_by(claim_id=claim_id, appkey=appkey).first() if not content: return return_result(20007) price = content.price if content.author != customer and content.price != 0: # Non-free resources consume = Consume.query.filter_by(claim_id=claim_id, customer=customer, appkey=appkey).first() if not consume: try: server = get_jsonrpc_server() if price >= 0: # Normal result = server.consume(wallet_username, customer_pay_password, claim_id) else: # Ad send_wallet_username = get_wallet_name(content.author) recv_wallet_username = get_wallet_name(customer) abs_price = abs(float(price)) # decimal to float # print(send_wallet_username, author_pay_password, recv_wallet_username, abs_price) result = server.pay(send_wallet_username, author_pay_password, recv_wallet_username, abs_price) if result.get('success') is not True: print(result) return return_result(20202, result=result) except Exception as e: print(e) return return_result(20202, result=dict(wallet_reason=str(e))) # print(result) result = result.get('result') txid = result.get('txid') c = Consume(txid=txid, claim_id=claim_id, customer=customer, appkey=appkey, price=price) db.session.add(c) return return_result(result=dict(udfs_hash=content.udfs_hash))
def delete(): """Update published resources Args: status: 1:add, 2:update, 3:delete(DB: enabled=False; CHAIN:metadata['nsfw']=True) """ content = Content.query.filter_by(id=g.form.id.data, appkey=g.appkey, enabled=True).first() if not content: return return_result(20007) metadata = dict(title=content.title, author=content.author, tag=[tag.name for tag in content.tags], description=content.des, language=content.language or 'en', license=content.license, licenseUrl=content.license_url, nsfw=True, preview=content.preview, thumbnail=content.preview) try: server = get_jsonrpc_server() result = server.update_claim( get_wallet_name(content.author), g.form.pay_password.data, content.claim_name, content.claim_id, content.txid, content.nout, metadata, content.content_type, content.udfs_hash, content.currency, content.price, content.bid, None, None) if result.get('errcode') != 0: return result except: app.logger.error(formatter_error(traceback.format_exc())) return return_result(20208) result = result.get('result') content.txid = result.get('txid') content.nout = int(result.get('nout', 0)) content.fee = float(result.get('fee', 0)) content.status = 3 content.enabled = False data = contenthistory_schema.dump(content).data data['appkey'] = g.appkey history = ContentHistory(**data) db.session.add(history) db.session.commit() return return_result(result=dict(num=1))
def role_edit(): id = request.json.get('id') name = request.json.get('name') des = request.json.get('des') role = Role.query.get(id) if not role: return return_result(errcode=20005) if name is not None: role.name = name if des is not None: role.des = des db.session.add(role) return return_result()
def decorator(*args, **kwargs): appkey = request.headers.get('appkey') if not appkey: return return_result(10012) # 可以换成从redis中获取 uapp = Application.query.filter_by(appkey=appkey).first() if not uapp: return return_result(10001) user = uapp.user if user.role.name == 'blocked': return return_result(20006) g.user = user g.appkey = appkey return f(*args, **kwargs)
def edit(): """ 修改密码, 同时更新appkey""" username = request.json.get('username') # 正式环境需要获取已登录用户 password = request.json.get('password') new_password = request.json.get('new_password') user = User.query.filter_by(username=username).first() if not user: return return_result(20003) if not user.check_password(password): return return_result(20004) user.set_password(new_password) return return_result(reason='success.')
def role_edit(): id = g.form.id.data des = g.form.des.data role = Role.query.get(id) role.des = des db.session.commit() return return_result()
def account(): """ 用户收支总额及资源统计""" appkey=g.appkey username = request.json.get('username') # 发布者收入 publisher_in=Consume.query.with_entities( db.func.sum(Consume.price).label('sum'),db.func.count(Consume.price).label('count')). \ join(Content,Content.claim_id == Consume.claim_id). \ filter(Content.appkey==appkey,Content.author == username,Consume.price>0).first() # 发布者支出 publisher_out=Consume.query.with_entities( db.func.abs(db.func.sum(Consume.price)).label('sum'),db.func.count(Consume.price).label('count')). \ join(Content,Content.claim_id==Consume.claim_id). \ filter(Content.appkey==appkey,Content.author==username,Consume.price<0).first() # 消费者收入 customer_in = Consume.query.with_entities( db.func.abs(db.func.sum(Consume.price)).label('sum'),db.func.count(Consume.price).label('count')). \ filter(Consume.appkey==appkey, Consume.customer == username,Consume.price<0).first() # 消费这支出 customer_out=Consume.query.with_entities( db.func.sum(Consume.price).label('sum'),db.func.count(Consume.price).label('count')). \ filter(Consume.appkey==appkey, Consume.customer==username,Consume.price>0).first() return return_result(result=dict(publisher_in=publisher_in, publisher_out=publisher_out, customer_in=customer_in,customer_out=customer_out))
def check(): """Check whether users pay for resources Args: username: consumer claim_ids: list of claim_id Returns: None: No resource record False: Unpaid udfs_hash: Paid, file hash """ appkey = g.appkey customer = request.json.get('username') claim_ids = request.json.get('claim_ids') result = dict(zip(claim_ids, [None for claim_id in claim_ids])) contents = Content.query.filter(Content.claim_id.in_(claim_ids), appkey == appkey).all() for content in contents: result.update({content.claim_id: False}) if content.author == customer: # Publisher and consumer are the same person result.update({content.claim_id: content.udfs_hash}) else: consume = Consume.query.filter_by(claim_id=content.claim_id, customer=customer, appkey=appkey).first() if consume: result.update({content.claim_id: content.udfs_hash}) return return_result(result=result)
def account(): """ Total user income and resource statistics.""" appkey = g.appkey username = g.form.username.data # Publisher income publisher_in = Consume.query.with_entities( db.func.sum(Consume.price).label('sum'), db.func.count(Consume.price).label('count')).join( Content, Content.claim_id == Consume.claim_id).filter( Content.appkey == appkey, Content.author == username, Consume.price > 0).first() # Publisher expenditure publisher_out = Consume.query.with_entities( db.func.abs(db.func.sum(Consume.price)).label('sum'), db.func.count(Consume.price).label('count')).join( Content, Content.claim_id == Consume.claim_id).filter( Content.appkey == appkey, Content.author == username, Consume.price < 0).first() # Consumer income customer_in = Consume.query.with_entities( db.func.abs(db.func.sum(Consume.price)).label('sum'), db.func.count(Consume.price).label('count')).filter( Consume.appkey == appkey, Consume.customer == username, Consume.price < 0).first() # Consumer expenditure customer_out = Consume.query.with_entities( db.func.sum(Consume.price).label('sum'), db.func.count(Consume.price).label('count')).filter( Consume.appkey == appkey, Consume.customer == username, Consume.price > 0).first() return return_result(result=dict(publisher_in=publisher_in, publisher_out=publisher_out, customer_in=customer_in, customer_out=customer_out))
def check(): """检查用户是否付费 Args: username: 消费者 claim_ids: 资源claim_id列表 Returns: 返回值三种状态: None: 没有此条资源记录 False: 未付费 ipfs_hash: 已付费 """ appkey = g.appkey customer = request.json.get('username') claim_ids = request.json.get('claim_ids') result = dict(zip(claim_ids, [None for claim_id in claim_ids])) # appkey作为条件,是为了避免查询别的应用的资源 contents = Content.query.filter(Content.claim_id.in_(claim_ids), appkey == appkey).all() for content in contents: result.update({content.claim_id: False}) if content.author == customer: # # 消费者与发布者是同一人 result.update({content.claim_id: content.ipfs_hash}) else: consume = Consume.query.filter_by(claim_id=content.claim_id, customer=customer, appkey=appkey).first() if consume: result.update({content.claim_id: content.ipfs_hash}) return return_result(result=result)
def consume(): appkey = g.appkey customer = g.form.customer.data wallet_username = get_wallet_name(customer) claim_id = g.form.claim_id.data # Normal resource consumption customer_pay_password = g.form.customer_pay_password.data # Ad click author_pay_password = g.form.author_pay_password.data content = g.form.content price = content.price if content.author != customer and content.price != 0: # Non-free resources consume = Consume.query.filter_by(claim_id=claim_id, customer=customer, appkey=appkey).first() if not consume: try: server = get_jsonrpc_server() if price >= 0: # Normal result = server.consume(wallet_username, customer_pay_password, claim_id) else: # Ad send_wallet_username = get_wallet_name(content.author) abs_price = abs(float(price)) # decimal to float result = server.pay(send_wallet_username, author_pay_password, wallet_username, abs_price) if result.get('errcode') != 0: return result except Exception as e: app.logger.error('remote_addr<{}> - {}'.format( request.remote_addr, str(e))) return return_result(20202) app.logger.debug(result) result = result.get('result') txid = result.get('txid') if len(txid) != 64: return return_result(20202, result=result) c = Consume(txid=txid, claim_id=claim_id, customer=customer, appkey=appkey, price=price) db.session.add(c) return return_result(result=dict(udfs_hash=content.udfs_hash))
def role_list(page, num): roles = Role.query.order_by(Role.id.asc()).paginate(page, num, error_out=False) total = roles.total pages = roles.pages result = roles_schema.dump(roles.items).data return return_result(result=dict(total=total, pages=pages, records=result))
def role_add(): """管理员才能调用,需要权限检查""" name = request.json.get('name') des = request.json.get('des') role = Role(name=name, des=des) db.session.add(role) db.session.commit() # 先提交,才能取id值 return return_result(result={'id': role.id})
def publish(): """Release resources""" appkey = g.appkey author = request.json.get('author', '') username_wallet = get_wallet_name(author) pay_password = request.json.get('pay_password') title = request.json.get('title') tags = request.json.get('tag') bid = current_app.config['PUBLISH_BID'] udfs_hash = request.json.get('udfs_hash') price = request.json.get('price') content_type = request.json.get('content_type') currency = 'UT' description = request.json.get('description') sourcename = generate_appkey() metadata = dict(title=title, author=author, tag=['action'], description='', language='en', license='', licenseUrl='', nsfw=False, preview='', thumbnail='', ) try: server = get_jsonrpc_server() # print(username_wallet, pay_password, sourcename, bid, metadata, content_type, udfs_hash, currency, price) result = server.publish(username_wallet, pay_password, sourcename,metadata, content_type, udfs_hash, currency, price,bid,None,None,True) # print(result) if result.get('success') is not True: print(result) return return_result(20201, result=result) except Exception as e: print(e) return return_result(20201, result=dict(wallet_reason=str(e))) result=result.get('result') claim_id = result.get('claim_id') txid = result.get('txid') status = 1 tags = save_tag(tags) history = save_content_history(txid=txid, claim_id=claim_id, author=author, appkey=appkey, title=title, udfs_hash=udfs_hash, price=price, content_type=content_type, currency=currency, sourcename=sourcename,des=description, status=status) content = save_content(claim_id=claim_id, author=author, appkey=appkey, txid=txid, title=title, udfs_hash=udfs_hash, price=price, content_type=content_type, currency=currency, sourcename=sourcename, des=description, status=status, tags=tags) db.session.commit() return return_result(result=dict(id=content.id, claim_id=claim_id))