49 lines
1.8 KiB
Dart
49 lines
1.8 KiB
Dart
|
|
import 'dart:io';
|
|||
|
|
|
|||
|
|
import 'app_config.dart';
|
|||
|
|
|
|||
|
|
/// 生产环境强制守卫。
|
|||
|
|
///
|
|||
|
|
/// 设计目标:本构建(APK)**永远无法进入生产模式**。
|
|||
|
|
/// - 编译期常量 [kAllowProduction] 恒为 false;
|
|||
|
|
/// - 运行期校验当前后端地址 host 不在生产拒绝名单中;
|
|||
|
|
/// 任一命中即打印清晰报错并 [exit],阻断后续执行。
|
|||
|
|
class ProductionGuard {
|
|||
|
|
ProductionGuard._();
|
|||
|
|
|
|||
|
|
/// 编译期开关:绝不允许开启。
|
|||
|
|
static const bool kAllowProduction = false;
|
|||
|
|
|
|||
|
|
/// 生产环境 host/IP 拒绝名单(精确匹配,区分大小写前已小写化)。
|
|||
|
|
static const List<String> _productionHostDenyList = <String>[
|
|||
|
|
'58.220.83.58', // 生产服务器 IP
|
|||
|
|
'api.ainetv.com',
|
|||
|
|
'ainetv.com',
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/// 启动期执行:断言非生产,命中即失败退出。
|
|||
|
|
///
|
|||
|
|
/// 同时作为构建期守卫([assert] 在 debug/profile 构建抛错)与运行期守卫
|
|||
|
|
/// (release 构建中 [assert] 被剥离,但 host 校验仍生效)。
|
|||
|
|
static void enforce() {
|
|||
|
|
// 编译期常量断言:若有人将 kAllowProduction 改为 true,调试构建立即崩溃。
|
|||
|
|
assert(!kAllowProduction, '生产模式被编译期禁用 (kAllowProduction=false)');
|
|||
|
|
|
|||
|
|
// 解析当前后端地址并校验 host,禁止任何生产标识。
|
|||
|
|
final full = AppConfig.apiFullBaseUrl;
|
|||
|
|
final host = Uri.parse(full).host.toLowerCase();
|
|||
|
|
if (_productionHostDenyList.contains(host) || host.contains('prod')) {
|
|||
|
|
_failAndExit(
|
|||
|
|
'检测到生产环境地址 host=$host(来自 $full),已强制阻断启动',
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 打印清晰报错并退出进程,阻断后续执行。
|
|||
|
|
static Never _failAndExit(String reason) {
|
|||
|
|
// ignore: avoid_print
|
|||
|
|
print('[PRODUCTION-GUARD] 启动被拒绝:$reason');
|
|||
|
|
exit(1);
|
|||
|
|
}
|
|||
|
|
}
|