Exemple #1
0
def checkBlacklist(ipAdress):
    '''
    封禁检查...
    '''
    blackItem = database.getRedisData(ipAdress, 'blackList', doEval=True)
    if blackItem != None:
        return blackItem
Exemple #2
0
def authorizer(osuid, otsuToken, path, needGroup=[], customInfo={}):
    def infoer(infoType):
        default = {
            'invalid': '请求被拒绝,授权认证',
            'group': '请求被拒绝,认证用户组权限不足',
            'success': '请求已确认,授权认证'
        }
        cust = customInfo.get(infoType)
        if cust != None and cust != '': info = cust
        else: info = default.get(infoType)
        return info

    authorize, actionTime = database.getRedisData(
        osuid, 'userToken', doEval=True), utils.getTime(1)
    if authorize == None or authorize.get('otsuToken') != otsuToken:
        return infoer('invalid'), -1, {}
    groupStatus, privilege = userGroupChecker(needGroup,
                                              eval(authorize.get('group')),
                                              path)
    if groupStatus != True:
        return infoer('group'), -1, {}
    if authorize.get('otsuToken') == otsuToken:
        # pass and refresh token
        database.setUserOtsuToken(osuid,
                                  otsuToken,
                                  actionTime,
                                  expiresIn,
                                  user=None)
        privilege['osuid'] = osuid
        userObject = database.getUserByosuid(osuid)
        if userObject != None: privilege['osuname'] = userObject.osuname
        else: privilege['osuname'] = '未知'
        return infoer('success'), 1, privilege
Exemple #3
0
def interceptorDo(ipAdress,
                  rdbname='allApiRecord',
                  banTime=300,
                  criticalCount=70,
                  cacheCycleS=5,
                  apiName='*'):
    '''
    全局拦截器做什么(目前主要防水防火)
    Args:
        ipAdress (str): 客户机ip地址.
        rdbname (str): redis数据库[变量名]
        banTime (int): 封禁时长(s)
        criticalCount (int): 连续请求达到这个次数就封禁ip
        cacheCycleS (int): 几秒钟清除一次该ip的请求次数
        apiName (str): 用来决定封禁的接口路径,如"*"表示全域封禁(该api全站),用具体api名称可以实现对某某ip使用某某接口的封禁
    '''
    ipCount = database.getRedisData(ipAdress, 'ipRecord')
    requestCount = database.getRedisData(ipAdress, rdbname)
    # only record ip++
    if ipCount == None: database.setDataToRedis(ipAdress, 1, 'ipRecord')
    else: database.setDataToRedis(ipAdress, int(ipCount) + 1, 'ipRecord')
    # record ip and judge ban ip
    if requestCount == None:
        database.setDataToRedis(ipAdress, 1, rdbname, expireS=cacheCycleS)
    else:
        database.setDataToRedis(ipAdress,
                                int(requestCount) + 1,
                                rdbname,
                                expireS=cacheCycleS)
        if int(requestCount) >= criticalCount:
            if int(requestCount) >= criticalCount * 7: banTime *= 12 * 24 * 180
            elif int(requestCount) >= criticalCount * 5:
                banTime *= 12 * 24 * 90
            elif int(requestCount) >= criticalCount * 3:
                banTime *= 12 * 24
            elif int(requestCount) >= criticalCount * 2:
                banTime *= 12
            database.addToBlacklist(
                ipAdress,
                reason=
                f'over {int(requestCount)} consecutive visits but not not rest.',
                blackTime=banTime,
                banFor=apiName)
Exemple #4
0
def handleGetPlayerDataV1(data, info='获取osu!玩家信息', message='', status=-1):
    playerKey = data.get('playerKey')
    action = data.get('action')
    kt = data.get('keyType')
    data = {}
    if playerKey not in (None, ''):
        if database.getRedisData(f'{playerKey.lower()}apiV1Record',
                                 'recordTimer') == None:
            res = getPlayerInfoWithApiv1(playerKey, keyType=kt)
            if res.get('status') != -1:
                database.setDataToRedis(f'{playerKey.lower()}apiV1Record',
                                        f'冷却中:{utils.getTime(1)}',
                                        'recordTimer',
                                        expireS=dataRecordTimer)

        res = database.getPlayerApiV1Record(playerKey)
        if res != None:
            if type(res) == list:
                if len(res) > 1:
                    repairDuplicateDataRecord(res)
                    osuInfo = getPlayerInfoWithApiv1(playerKey, keyType=kt)
                    if osuInfo.get('status') != -1:
                        osuid = osuInfo.get('message').get('user_id')
                        data, status = [
                            i.getDict for i in res if i.osuid == osuid
                        ][0], 1
                    else:
                        data, status = [i.getDict for i in res], 1
                elif len(res) == 1:
                    data, status = res[0].getDict, 1
            else:
                data, status = res.getDict, 1

    if status == 1:
        if action == 'simple':
            data = {
                'osuid': data.get('osuid'),
                'osuname': data.get('osuname'),
                'pp': data.get('current', {}).get('pp_raw'),
                'rank': data.get('current', {}).get('pp_rank'),
                'country': data.get('current', {}).get('country')
            }
        if action == 'noHistory':
            data['history'] = []

    return data, message, info, status
Exemple #5
0
def handleGetPlayerPlusPP(data, info='获取玩家pp+记录', message='', status=-1):
    playerKey, action = data.get('playerKey'), data.get('action')
    kt = data.get('keyType')
    data = {}
    if playerKey not in (None, ''):
        if action == 'refresh':
            keyBackup = playerKey
            if database.getRedisData(f'{playerKey.lower()}plusPPrecord',
                                     'recordTimer') == None:
                plusRes = utils.requestPlusPP(playerKey)
                if plusRes.get('status') == 1:
                    plusInfo = plusRes.get('message')
                    playerKey = plusInfo.get('osuid')
                    database.savePlayerPlusPPInfo(plusInfo)
                    database.setDataToRedis(f'{keyBackup.lower()}plusPPrecord',
                                            f'冷却中:{utils.getTime(1)}',
                                            'recordTimer',
                                            expireS=dataRecordTimer)

        res = database.getPlayerPlusPPRecord(playerKey)
        if res != None:
            if type(res) == list:
                if len(res) > 1:
                    repairDuplicateDataRecord(res)
                    osuInfo = getPlayerInfoWithApiv1(playerKey, keyType=kt)
                    if osuInfo.get('status') != -1:
                        osuid = osuInfo.get('message').get('user_id')
                        data, status = [
                            i.getDict for i in res if i.osuid == osuid
                        ][0], 1
                    else:
                        data, status = [i.getDict for i in res], 1
                elif len(res) == 1:
                    data, status = res[0].getDict, 1
            else:
                data, status = res.getDict, 1
    if status == -1: message = '如果失败了很有可能是因为没找到信息,请将action设为"refresh"进行数据更新'
    return data, message, info, status
Exemple #6
0
def getSomething(key):
    return database.getRedisData(key, 'otherSomething')