Files
PiliPlus/lib/utils/login_utils.dart
dom 22fc256d8a fix #2351
Signed-off-by: dom <githubaccount56556@proton.me>
2026-06-08 11:45:26 +08:00

140 lines
4.2 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:async' show FutureOr;
import 'dart:io' show Platform;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/main.dart';
import 'package:PiliPlus/services/account_service.dart';
import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/accounts/account.dart';
import 'package:PiliPlus/utils/request_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:collection/collection.dart';
import 'package:crypto/crypto.dart' show Digest;
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as web;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
abstract final class LoginUtils {
static FutureOr setWebCookie([Account? account]) {
if (Platform.isLinux) {
return null;
}
final cookies = (account ?? Accounts.main).cookieJar.toList();
final webManager = web.CookieManager.instance(
webViewEnvironment: webViewEnvironment,
);
final isWindows = Platform.isWindows;
return Future.wait(
cookies.map(
(cookie) => webManager.setCookie(
url: web.WebUri(
'${isWindows ? 'https://' : ''} ${cookie.domain}',
),
name: cookie.name,
value: cookie.value,
path: cookie.path ?? '/',
domain: cookie.domain,
isSecure: cookie.secure,
isHttpOnly: cookie.httpOnly,
),
),
);
}
static Future<void> onLoginMain() async {
final account = Accounts.main;
final res = await UserHttp.userInfo();
if (res case Success(:final response)) {
setWebCookie(account);
RequestUtils.syncHistoryStatus();
if (response.isLogin == true) {
final accountService = Get.find<AccountService>()
..face.value = response.face!;
if (accountService.isLogin.value) {
accountService.isLogin.refresh();
} else {
accountService.isLogin.value = true;
}
SmartDialog.showToast('main登录成功');
if (response != Pref.userInfoCache) {
await GStorage.userInfo.put('userInfoCache', response);
}
}
} else {
// 获取用户信息失败
final errMsg = res.toString();
if (errMsg == '账号未登录') {
await Accounts.deleteAll({account});
SmartDialog.showNotify(
msg: '登录失败请检查cookie是否正确$errMsg',
notifyType: .warning,
);
} else {
SmartDialog.showToast(errMsg);
}
}
}
static Future<void> onLogoutMain() {
Get.find<AccountService>()
..face.value = ''
..isLogin.value = false;
return Future.wait([
if (!Platform.isLinux)
web.CookieManager.instance(
webViewEnvironment: webViewEnvironment,
).deleteAllCookies(),
GStorage.userInfo.delete('userInfoCache'),
]);
}
static String generateBuvid() {
final md5Str = Digest(
List.generate(16, (_) => Utils.random.nextInt(256)),
).toString();
return 'XY${md5Str[2]}${md5Str[12]}${md5Str[22]}$md5Str';
}
static final buvid = Pref.buvid;
// static String getUUID() {
// return const Uuid().v4().replaceAll('-', '');
// }
// static String generateBuvid() {
// String uuid = getUUID() + getUUID();
// return 'XY${uuid.substring(0, 35).toUpperCase()}';
// }
static String genDeviceId() {
// https://github.com/bilive/bilive_client/blob/2873de0532c54832f5464a4c57325ad9af8b8698/bilive/lib/app_client.ts#L62
final time = DateTime.now();
final List<int> bytes = [
...Iterable.generate(16, (_) => Utils.random.nextInt(256)),
_dec2bcd(time.year ~/ 100),
_dec2bcd(time.year % 100),
_dec2bcd(time.month),
_dec2bcd(time.day),
_dec2bcd(time.hour),
_dec2bcd(time.minute),
_dec2bcd(time.second),
...Iterable.generate(8, (_) => Utils.random.nextInt(256)),
];
final check = (bytes.sum & 0xFF).toRadixString(16).padLeft(2, '0');
return Digest(bytes).toString() + check;
}
static int _dec2bcd(int dec) {
assert(0 <= dec && dec < 100);
return ((dec ~/ 10) << 4) | (dec % 10);
}
}