Merge branch 'develop_liyi' into 'canary_release'

Develop liyi

See merge request StarlockTeam/app-starlock!4
This commit is contained in:
刘燕峰 2025-02-12 09:10:33 +00:00
commit 1a235bcb62
9 changed files with 131 additions and 33 deletions

View File

@ -68,6 +68,7 @@ class LoginData {
void updateStarchart(
StarChartRegisterNodeEntity starChartRegisterNodeEntity) {
starchart = Starchart(
scdUrl: this.starchart?.scdUrl,
starchartId: starChartRegisterNodeEntity.peer?.id,
starchartPeerPublicKey: starChartRegisterNodeEntity.peer?.publicKey,
starchartPeerPrivateKey: starChartRegisterNodeEntity.peer?.privateKey,

View File

@ -80,7 +80,7 @@ class StarLockLoginLogic extends BaseGetXController {
Storage.saveStarChartRegisterNodeInfo(starChartRegisterNodeEntity);
entity.data!.updateStarchart(starChartRegisterNodeEntity);
}
Storage.saveLoginData(entity.data);
await Storage.saveLoginData(entity.data);
Storage.setBool(saveIsVip, entity.data!.isVip == 1);
eventBus.fire(MineInfoChangeRefreshUI());
if (Get.isRegistered<LockMainLogic>()) {

View File

@ -212,7 +212,15 @@ class ConfiguringWifiLogic extends BaseGetXController {
//
showEasyLoading();
state.isLoading.value = true;
//
// 15
Future.delayed(const Duration(seconds: 15), () {
if (state.isLoading.isTrue) {
EasyLoading.dismiss();
state.isLoading.value = false;
state.sureBtnState.value = 0;
showToast('配网失败'.tr);
}
});
}
//

View File

@ -158,7 +158,8 @@ class Starchart {
String? starchartPeerPrivateKey;
Starchart(
{this.scdUrl,this.starchartId,
{this.scdUrl,
this.starchartId,
this.starchartPeerPublicKey,
this.starchartPeerPrivateKey});

View File

@ -6,10 +6,11 @@ import 'package:star_lock/network/api_provider_base.dart';
import 'package:star_lock/talk/starChart/entity/relay_info_entity.dart';
import 'package:star_lock/talk/starChart/entity/report_information_data.dart';
import 'package:star_lock/talk/starChart/entity/star_chart_register_node_entity.dart';
import 'package:star_lock/tools/storage.dart';
class StartChartApi extends BaseProvider {
// url
String _startChartHost = 'http://sls1-scd.star-lock.cn:8080';
String _startChartHost = '';
static StartChartApi get to => Get.put(StartChartApi());
@ -28,6 +29,17 @@ class StartChartApi extends BaseProvider {
required String name,
required String unique,
}) async {
final loginData = await Storage.getLoginData();
// url
if (loginData != null &&
loginData?.starchart != null &&
loginData?.starchart?.scdUrl != null &&
loginData?.starchart?.scdUrl != '') {
StartChartApi.to.startChartHost =
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
}
final response = await post(
_startChartHost + starChartRegisterNodeURL.toUrl,
jsonEncode(<String, dynamic>{
@ -44,6 +56,17 @@ class StartChartApi extends BaseProvider {
// --
Future<RelayInfoEntity> relayQueryInfo() async {
final loginData = await Storage.getLoginData();
// url
if (loginData != null &&
loginData?.starchart != null &&
loginData?.starchart?.scdUrl != null &&
loginData?.starchart?.scdUrl != '') {
StartChartApi.to.startChartHost =
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
}
final response = await get(
_startChartHost + relayQueryInfoURL.toUrl,
isUnShowLoading: true,
@ -56,6 +79,17 @@ class StartChartApi extends BaseProvider {
Future<Response> reportInformation({
required ReportInformationData reportInformationData,
}) async {
final loginData = await Storage.getLoginData();
// url
if (loginData != null &&
loginData?.starchart != null &&
loginData?.starchart?.scdUrl != null &&
loginData?.starchart?.scdUrl != '') {
StartChartApi.to.startChartHost =
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
}
final response = await post(
_startChartHost + reportInformationDataURL.toUrl,
jsonEncode(reportInformationData.toJson()),
@ -69,6 +103,17 @@ class StartChartApi extends BaseProvider {
Future<Response> analyzeInformationOtherEnd({
required String peerId,
}) async {
final loginData = await Storage.getLoginData();
// url
if (loginData != null &&
loginData?.starchart != null &&
loginData?.starchart?.scdUrl != null &&
loginData?.starchart?.scdUrl != '') {
StartChartApi.to.startChartHost =
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
}
final response = await get(
_startChartHost + analyzeInformationOtherEndURL.toUrl + '?id=$peerId',
isUnShowLoading: true,

View File

@ -2,7 +2,7 @@ import 'dart:async';
import 'dart:typed_data';
import 'package:convert/convert.dart';
import 'package:fast_rsa/fast_rsa.dart' as fastRsa;
// import 'package:fast_rsa/fast_rsa.dart' as fastRsa;
import 'package:flutter/services.dart';
import 'package:pointycastle/export.dart' as pc;
import 'dart:convert';
@ -11,6 +11,31 @@ import 'package:star_lock/talk/starChart/exception/start_chart_message_exception
class DoSign {
// sing
// Future<String> generateSign({
// required int currentTimestamp,
// required String privateKeyHex,
// }) async {
// String resultSign = '';
// try {
// // 1. 32
// Uint8List signData = encodeTimestampToLittleEndianBytes(currentTimestamp);
//
// // 2.
// List<int> privateKeyBytes = hexToBytes(privateKeyHex);
//
// // 3. PEM
// final pemPrivateKey =
// convertToPemPrivateKey(privateKeyBytes, isPKCS8: true);
// // 4.
// var result = await fastRsa.RSA
// .signPKCS1v15Bytes(signData, fastRsa.Hash.SHA256, pemPrivateKey);
// resultSign = hex.encode(result);
// } catch (e) {
// throw StartChartMessageException('❌--->上报信息生成签名时出现错误: $e');
// }
// return resultSign ?? '';
// }
Future<String> generateSign({
required int currentTimestamp,
required String privateKeyHex,
@ -20,20 +45,20 @@ class DoSign {
// 1. 32
Uint8List signData = encodeTimestampToLittleEndianBytes(currentTimestamp);
// 2.
List<int> privateKeyBytes = hexToBytes(privateKeyHex);
// 2.
final privateKey = loadPrivateKey(privateKeyHex);
// 3. PEM
final pemPrivateKey =
convertToPemPrivateKey(privateKeyBytes, isPKCS8: true);
// 4.
var result = await fastRsa.RSA
.signPKCS1v15Bytes(signData, fastRsa.Hash.SHA256, pemPrivateKey);
resultSign = hex.encode(result);
// 3. RSA
final signer = pc.RSASigner(pc.SHA256Digest(), '0609608648016503040201');
signer.init(true, pc.PrivateKeyParameter<pc.RSAPrivateKey>(privateKey));
// 4.
final signature = signer.generateSignature(signData);
resultSign = hex.encode(signature.bytes);
} catch (e) {
throw StartChartMessageException('❌--->上报信息生成签名时出现错误: $e');
}
return resultSign ?? '';
return resultSign;
}
// 32

View File

@ -186,7 +186,7 @@ class StartChartManage {
for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
final data = relayInfoEntity.relay_list?[i];
if (data?.peerID != FromPeerId) {
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
final parseUdpUrl = await _parseUdpUrl(data?.listenAddr ?? '');
remoteHost = parseUdpUrl['host'] ?? '';
remotePort = parseUdpUrl['port'] ?? '';
relayPeerId = data?.peerID ?? '';
@ -893,18 +893,30 @@ class StartChartManage {
}
/// UDP URL IP
Map<String, dynamic> _parseUdpUrl(String url) {
// 使 IP
final regex = RegExp(r'udp://(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d+)')
.firstMatch(url);
/// UDP URL IP
Future<Map<String, dynamic>> _parseUdpUrl(String url) async {
final regex = RegExp(r'udp://([a-zA-Z0-9.-]+):(\d+)').firstMatch(url);
if (regex != null) {
final ip = regex.group(1);
final host = regex.group(1);
final portStr = regex.group(2);
final port = int.tryParse(portStr ?? '');
if (ip != null && port != null) {
return {'host': ip, 'port': port};
if (host != null && port != null) {
try {
// DNS
final List<InternetAddress> addresses =
await InternetAddress.lookup(host);
if (addresses.isEmpty) {
throw FormatException('DNS resolution failed for $host');
}
// 使 IP
final String resolvedIp = addresses.first.address;
return {'host': resolvedIp, 'port': port};
} catch (e) {
throw FormatException('DNS resolution error for $host: $e');
}
}
}
throw FormatException('无法解析 URL 格式: $url');
@ -1063,6 +1075,13 @@ class StartChartManage {
reStartTalkExpectMessageTimer();
}
void reSetDefaultTalkExpect() {
_defaultTalkExpect = TalkExpectReq(
videoType: [VideoTypeE.IMAGE],
audioType: [AudioTypeE.G711],
);
}
///
void sendOnlyImageVideoTalkExpectData() {
final talkExpectReq = TalkExpectReq(
@ -1141,10 +1160,7 @@ class StartChartManage {
///
void _resetData() {
_defaultTalkExpect = TalkExpectReq(
videoType: [VideoTypeE.IMAGE],
audioType: [AudioTypeE.G711],
);
reSetDefaultTalkExpect();
isOnlineStarChartServer = false;
talkStatus.setUninitialized();
}

View File

@ -426,6 +426,8 @@ class TalkViewLogic extends BaseGetXController {
@override
void dispose() {
stopProcessingAudio();
//
StartChartManage().reSetDefaultTalkExpect();
super.dispose();
}

View File

@ -185,9 +185,9 @@ dependencies:
common_utils: ^2.0.0
lpinyin: ^2.0.3
#加密解密
encrypt: ^5.0.1
crypto: ^3.0.3
pointycastle: ^3.4.0
# encrypt: ^5.0.1
# crypto: ^3.0.3
pointycastle: ^3.7.3 # 使用最新版本
date_format: ^2.0.7
# 下拉刷新
@ -257,9 +257,9 @@ dependencies:
firebase_analytics: 11.3.0
#</com>
cryptography: ^2.7.0
asn1lib: ^1.0.0
fast_rsa: ^3.6.6
# cryptography: ^2.7.0
# asn1lib: ^1.0.0
# fast_rsa: ^3.6.6
protobuf: ^3.1.0
#录屏
flutter_screen_recording: 2.0.16