记一次修复osu!私服无法连接的问题

2022年10月8日

起因

约上午12点半有用户反映我们的osu私服无法连接

经测试发现此现象并非个例

用户截图无法连接至私服bancho.py服务端

问题排查

-我们首先排查了服务器连通性,ping测试完全没有问题

-检查SSL证书配置,无错误

-切换osu客户端的版本,由稳定版切换至其他版本后仍然无法连接

按住shift启动osu客户端可切换版本

商讨后我们认为是后端bancho.py出现问题,在bancho开发群内询问得到证实,问题出现在bancho api中对于osu客户端版本判断部分

感谢帮助 >_<

问题分析

在bancho.py中,位于 /app/api/domains/cho.py 中有一段用于反作弊的客户端版本判断,位于:

-第385行:定义常量,90天

DELTA_90_DAYS = timedelta(days=90)

-第497到504行:判断客户端版本时间是否与今日相差超过90天

# disallow login for clients older than 90 days
    if osu_version.date < (date.today() - DELTA_90_DAYS):
        return {
            "osu_token": "client-too-old",
            "response_body": (
                app.packets.version_update_forced() + app.packets.user_id(-2)
            ),
        }

为了防止作弊,bancho.py会判断用户客户端版本发布的时间是否与登录时间相差超过90天。如果超过90天则会拒绝连接

然而,osu官方(ppy)并没有在距今90天捏推出更新,因此造成服务端反作弊误判

解决方法

方法1:直接注释掉 /app/api/domains/cho.py的第497到504行,即可停止服务端对于客户端版本的判断

方法2(笔者推荐):将第385行的days=90更改为days=180,即可延长支持的时间

DELTA_90_DAYS = timedelta(days=180)  #当然,也可以把常量名中的90更改为180,会更加清晰,
                                     #在改常量名后要去把第498行也改过来!

Tips

服务端升级bancho.py版本到v4.4.3时,mysql部分可直接选中favourites表来添加列,无需重新配置数据库

添加以前
添加以后

(此处参照https://github.com/osuAkatsuki/bancho.py/commit/ed16598a48135193476a539dafa7cf2601924cad