Esempio n. 1
0
def getapikey():
    response = {'status': 'success'}
    try:
        if not apikey_required or (
                valid_api_key(request.form['api_key']) and
            (request.environ.get('REMOTE_ADDR') in approved_ips
             or request.environ.get('HTTP_X_FORWARDED_FOR') in approved_ips)):
            form = APIKeyForm(request.form)
            if form.validate():
                apikey = APIKey(key=generate_unique_key(),
                                name=form.name.data,
                                country=form.country.data)
                db.session.add(apikey)
                db.session.commit()
                response['key'] = apikey.key
                response['name'] = apikey.name
                response['country'] = apikey.country
            else:
                response['status'] = 'failure'
                if current_app.debug:
                    response['reason'] = form.errors
                else:
                    response['reason'] = 'invalid request'
        else:
            response['status'] = 'failure'
            if current_app.debug:
                current_app.logger.error(
                    'Forbidden IP attempted to create API key: ' +
                    (request.environ.get('REMOTE_ADDR')
                     if request.environ.get('REMOTE_ADDR') != None else "") +
                    ' and ' +
                    (request.environ.get('HTTP_X_FORWARDED_FOR') if request.
                     environ.get('HTTP_X_FORWARDED_FOR') != None else ""))
                response['reason'] = 'forbidden IP ' + (
                    request.environ.get('REMOTE_ADDR')
                    if request.environ.get('REMOTE_ADDR') != None else ""
                ) + ' and ' + (request.environ.get('HTTP_X_FORWARDED_FOR')
                               if request.environ.get('HTTP_X_FORWARDED_FOR')
                               != None else "")
            else:
                response['reason'] = 'forbidden'
    except Exception as e:
        response['status'] = 'failure'
        #response['reason'] = type(e).__name__
        if current_app.debug:
            if isinstance(e, BadRequestKeyError):
                current_app.logger.error(json.dumps(request.form, indent=4))
            response['reason'] = traceback.format_exc()
        else:
            response['reason'] = 'internal error'
        current_app.logger.error('Error creating API key: %s' %
                                 traceback.format_exc())
    return jsonify(response)
Esempio n. 2
0
def saveprofile():
    response = {'status': 'success'}
    try:
        if not apikey_required or (
                valid_api_key(request.form['api_key']) and
            (request.environ.get('REMOTE_ADDR') in approved_ips
             or request.environ.get('HTTP_X_FORWARDED_FOR') in approved_ips)):
            u = accesscode_to_user(request.form['AccessCode'].lower())
            if u == None:
                current_app.logger.error(
                    "Access code does not resolve to a valid user!")
                raise
            update_user_with_primeprofile(u, request.form)
        else:
            response['status'] = 'failure'
            if current_app.debug:
                current_app.logger.error(
                    'Forbidden IP attempted to save PrimeServer profile: ' +
                    (request.environ.get('REMOTE_ADDR')
                     if request.environ.get('REMOTE_ADDR') != None else "") +
                    ' and ' +
                    (request.environ.get('HTTP_X_FORWARDED_FOR') if request.
                     environ.get('HTTP_X_FORWARDED_FOR') != None else ""))
                response['reason'] = 'forbidden IP ' + (
                    request.environ.get('REMOTE_ADDR')
                    if request.environ.get('REMOTE_ADDR') != None else ""
                ) + ' and ' + (request.environ.get('HTTP_X_FORWARDED_FOR')
                               if request.environ.get('HTTP_X_FORWARDED_FOR')
                               != None else "")
            else:
                response['reason'] = 'forbidden'
    except Exception as e:
        response['status'] = 'failure'
        #response['reason'] = type(e).__name__
        if current_app.debug:
            if isinstance(e, BadRequestKeyError):
                temp = request.form.copy()
                temp.pop('Scores', None)
                current_app.logger.error(json.dumps(temp, indent=4))
            response['reason'] = traceback.format_exc()
        else:
            response['reason'] = 'internal error'
        current_app.logger.error('Error saving PrimeServer profile: %s' %
                                 traceback.format_exc())
    return jsonify(response)
Esempio n. 3
0
def getprofile():
    response = {}
    try:
        if not apikey_required or (
                valid_api_key(request.form['api_key']) and
            (request.environ.get('REMOTE_ADDR') in approved_ips
             or request.environ.get('HTTP_X_FORWARDED_FOR') in approved_ips)):
            u = accesscode_to_user(request.args.get('access_code').lower())
            if u == None:
                current_app.logger.error(
                    "Access code does not resolve to a valid user!")
                raise
            return jsonify(user_to_primeprofile(u))
        else:
            response['status'] = 'failure'
            if current_app.debug:
                current_app.logger.error(
                    'Forbidden IP attempted to get PrimeServer profile: ' +
                    (request.environ.get('REMOTE_ADDR')
                     if request.environ.get('REMOTE_ADDR') != None else "") +
                    ' and ' +
                    (request.environ.get('HTTP_X_FORWARDED_FOR') if request.
                     environ.get('HTTP_X_FORWARDED_FOR') != None else ""))
                response['reason'] = 'forbidden IP ' + (
                    request.environ.get('REMOTE_ADDR')
                    if request.environ.get('REMOTE_ADDR') != None else ""
                ) + ' and ' + (request.environ.get('HTTP_X_FORWARDED_FOR')
                               if request.environ.get('HTTP_X_FORWARDED_FOR')
                               != None else "")
            else:
                response['reason'] = 'forbidden'
    except Exception as e:
        response['status'] = 'failure'
        #response['reason'] = type(e).__name__
        if current_app.debug:
            response['reason'] = traceback.format_exc()
        else:
            response['reason'] = 'internal error'
        current_app.logger.error('Error getting PrimeServer profile: %s' %
                                 traceback.format_exc())
    return jsonify(response)
Esempio n. 4
0
def getrankmode():
    response = {}
    try:
        if not apikey_required or (
                valid_api_key(request.form['api_key']) and
            (request.environ.get('REMOTE_ADDR') in approved_ips
             or request.environ.get('HTTP_X_FORWARDED_FOR') in approved_ips)):
            return jsonify(
                get_rankmode(scoretype=request.args.get('scoretype')))
        else:
            response['status'] = 'failure'
            if current_app.debug:
                current_app.logger.error(
                    'Forbidden IP attempted to retrieve rank mode: ' +
                    (request.environ.get('REMOTE_ADDR')
                     if request.environ.get('REMOTE_ADDR') != None else "") +
                    ' and ' +
                    (request.environ.get('HTTP_X_FORWARDED_FOR') if request.
                     environ.get('HTTP_X_FORWARDED_FOR') != None else ""))
                response['reason'] = 'forbidden IP ' + (
                    request.environ.get('REMOTE_ADDR')
                    if request.environ.get('REMOTE_ADDR') != None else ""
                ) + ' and ' + (request.environ.get('HTTP_X_FORWARDED_FOR')
                               if request.environ.get('HTTP_X_FORWARDED_FOR')
                               != None else "")
            else:
                response['reason'] = 'forbidden'
    except Exception as e:
        response['status'] = 'failure'
        #response['reason'] = type(e).__name__
        if current_app.debug:
            if isinstance(e, BadRequestKeyError):
                current_app.logger.error(json.dumps(request.form, indent=4))
            response['reason'] = traceback.format_exc()
        else:
            response['reason'] = 'internal error'
        current_app.logger.error('Error retrieving rank mode: %s' %
                                 traceback.format_exc())
    return jsonify(response)
Esempio n. 5
0
def submit():
    response = {'status': 'success'}
    try:
        if not apikey_required or (
                valid_api_key(request.form['api_key']) and
            (request.environ.get('REMOTE_ADDR') in approved_ips
             or request.environ.get('HTTP_X_FORWARDED_FOR') in approved_ips)):
            if int(request.form['Score']) > 0:
                if current_app.debug:
                    current_app.logger.debug(
                        "Score above 0, submitting score...")
                u = accesscode_to_user(request.form['AccessCode'].lower())
                if u == None:
                    current_app.logger.error(
                        "Access code does not resolve to a valid user!")
                    raise
                s = id_to_songname(
                    hex(int(request.form['SongID'])).replace('0x', '').upper())
                if s == None:
                    current_app.logger.error(
                        "Song ID does not resolve to a valid song!")
                    raise
                post = Post(
                    approved=STATUS_PASS_PENDING,
                    song=s,
                    song_id=int(request.form['SongID']),
                    score=int(request.form['Score']),
                    exscore=calc_exscore(int(request.form['Perfect']),
                                         int(request.form['Great']),
                                         int(request.form['Good']),
                                         int(request.form['Bad']),
                                         int(request.form['Miss'])),
                    lettergrade=prime_grade[int(request.form['Grade']) %
                                            0x100],
                    type=prime_charttype[int(request.form['Type'])],
                    difficultynum=int(request.form['ChartLevel']),
                    difficulty=get_diffstr(
                        prime_charttype[int(request.form['Type'])],
                        int(request.form['ChartLevel'])),
                    platform='pad',
                    perfect=int(request.form['Perfect']),
                    great=int(request.form['Great']),
                    good=int(request.form['Good']),
                    bad=int(request.form['Bad']),
                    miss=int(request.form['Miss']),
                    maxcombo=int(request.form['MaxCombo']),
                    pp=int(request.form['PP']),
                    runningstep=int(request.form['RunningStep']),
                    kcal=float(request.form['Kcal']),
                    scrollspeed=(int(request.form['NoteSkinSpeed']) % 0x100) /
                    4.0,
                    noteskin=int(request.form['NoteSkinSpeed']) // 0x10000,
                    modifiers=int(request.form['Modifiers']),
                    rushspeed=float(request.form['RushSpeed']),
                    #gamemix = request.form['Gamemix'],
                    gameversion=request.form['GameVersion'],
                    gameflag=int(request.form['Flag']),
                    ranked='True'
                    if request.form['Flag'] == '128' else 'False',
                    #length = prime_songcategory[int(request.form['SongCategory'])],
                    length=raw_songdata[s]['length'],
                    accesscode=request.form['AccessCode'],
                    acsubmit='True',
                    user_id=u.id)
                if current_app.debug:
                    current_app.logger.debug("Created post object.")
                prime_to_xx_diff(post)
                if current_app.debug:
                    current_app.logger.debug(
                        "Converted Prime difficulty to XX difficulty.")
                if post.difficulty == None or post.difficulty == '':
                    raise
                if post.rushspeed == 0.0:
                    post.rushspeed = 1.0
                song_maxcombo = post.perfect + post.great + post.good + post.bad + post.miss
                if song_maxcombo > get_max_combo(post.song, post.difficulty):
                    update_max_combo(post.song, post.difficulty, song_maxcombo)
                    update_song_list()
                    if current_app.debug:
                        current_app.logger.debug(
                            "Updated max combo for song %s, difficulty %s with max combo of %s"
                            % (post.song, post.difficulty, song_maxcombo))
                post.sp = calc_performance(post.song, post.difficulty,
                                           post.difficultynum, post.perfect,
                                           post.great, post.good, post.bad,
                                           post.miss,
                                           int_to_judge(post.modifiers),
                                           post.rushspeed,
                                           post.stagepass == "True")
                add_exp(u, int(request.form['EXP']))
                add_pp(u, int(request.form['PP']))
                if current_app.debug:
                    current_app.logger.debug("EXP and PP added to profile.")
                if high_score(post):
                    if current_app.debug:
                        current_app.logger.debug(
                            "High score detected, saving score...")
                    del_high_score(post)
                    db.session.add(post)
                    db.session.commit()
                    if current_app.debug:
                        current_app.logger.debug(
                            "Committed score to database.")
                    update_user_sp(u)
                    if current_app.debug:
                        current_app.logger.debug("User SP updated.")
                elif current_app.debug:
                    current_app.logger.debug(
                        "High score not detected, not saving score.")
        else:
            response['status'] = 'failure'
            if current_app.debug:
                current_app.logger.error(
                    'Forbidden IP attempted to submit through PrimeServer: ' +
                    (request.environ.get('REMOTE_ADDR')
                     if request.environ.get('REMOTE_ADDR') != None else "") +
                    ' and ' +
                    (request.environ.get('HTTP_X_FORWARDED_FOR') if request.
                     environ.get('HTTP_X_FORWARDED_FOR') != None else ""))
                response['reason'] = 'forbidden IP ' + (
                    request.environ.get('REMOTE_ADDR')
                    if request.environ.get('REMOTE_ADDR') != None else ""
                ) + ' and ' + (request.environ.get('HTTP_X_FORWARDED_FOR')
                               if request.environ.get('HTTP_X_FORWARDED_FOR')
                               != None else "")
            else:
                response['reason'] = 'forbidden'
    except Exception as e:
        response['status'] = 'failure'
        #response['reason'] = type(e).__name__
        if current_app.debug:
            if isinstance(e, BadRequestKeyError):
                current_app.logger.error(json.dumps(request.form, indent=4))
            response['reason'] = traceback.format_exc()
        else:
            response['reason'] = 'internal error'
        current_app.logger.error('Error submitting through PrimeServer: %s' %
                                 traceback.format_exc())
    return jsonify(response)