Skip to content

Commit

Permalink
Send signature, fix signature verify on client
Browse files Browse the repository at this point in the history
  • Loading branch information
CodeDoctorDE committed Aug 27, 2024
1 parent 2af747d commit 0574169
Show file tree
Hide file tree
Showing 12 changed files with 50 additions and 31 deletions.
10 changes: 6 additions & 4 deletions api/lib/src/event/process/server.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,23 @@ final class InvalidPacksError extends FatalServerEventError {

@override
String toString() =>
'Server requested packs, that are not available on the client: $signature';
'Server requested packs, that are not available on the client (or is empty): $signature';
}

WorldState? processServerEvent(
Future<WorldState?> processServerEvent(
ServerWorldEvent event,
WorldState state, {
required AssetManager assetManager,
}) {
}) async {
if (!isValidServerEvent(event, state)) return null;
switch (event) {
case WorldInitialized event:
final supported = assetManager.isServerSupported(event.packsSignature);
final supported =
await assetManager.isServerSupported(event.packsSignature);
if (!supported) {
throw InvalidPacksError(signature: event.packsSignature);
}
assetManager.setAllowedPacks(event.packsSignature.keys.toSet());
return state.copyWith(
table: event.table,
id: event.id,
Expand Down
17 changes: 15 additions & 2 deletions api/lib/src/services/asset.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,28 @@ import 'package:quokka_api/quokka_api.dart';

abstract class AssetManager {
QuokkaData? getPack(String key);
Future<QuokkaData?> loadPack(String key) => Future.value(getPack(key));

bool isServerSupported(Map<String, String> signature) {
Iterable<MapEntry<String, QuokkaData>> get packs;

Future<bool> isServerSupported(Map<String, String> signature) async {
if (signature.isEmpty) return false;
for (final entry in signature.entries) {
final pack = getPack(entry.key);
final pack = await loadPack(entry.key);
if (pack == null || pack.getChecksum().toString() != entry.value) {
return false;
}
}
return true;
}

Map<String, String> createSignature() {
final signature = <String, String>{};
for (final entry in packs) {
signature[entry.key] = entry.value.getChecksum().toString();
}
return signature;
}

void setAllowedPacks(Set<String> packs) {}
}
20 changes: 9 additions & 11 deletions app/lib/bloc/multiplayer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ class MultiplayerCubit extends Cubit<MultiplayerState> {

Stream<(Channel, ConnectionInfo)> get inits => _initController.stream;

FatalServerEventError? _fatalError;

MultiplayerCubit() : super(MultiplayerDisabledState());

bool get isConnected => state.isConnected;
Expand Down Expand Up @@ -132,12 +134,8 @@ class MultiplayerCubit extends Cubit<MultiplayerState> {
final state = this.state;
if (state is! MultiplayerConnectedState) return;
state.networker.close();
if (emit) {
if (state.isClient) {
this.emit(MultiplayerDisconnectedState());
} else {
this.emit(MultiplayerDisabledState());
}
if (emit && state.isServer) {
this.emit(MultiplayerDisabledState());
}
}

Expand All @@ -152,7 +150,9 @@ class MultiplayerCubit extends Cubit<MultiplayerState> {
));
final state = await _addNetworker(client);
client.onClosed.listen((_) {
if (!isClosed) emit(MultiplayerDisconnectedState(oldState: state));
if (isClosed) return;
emit(MultiplayerDisconnectedState(oldState: state, error: _fatalError));
_fatalError = null;
}, onError: (e) => emit(MultiplayerDisconnectedState(error: e)));
await client.init();
emit(state);
Expand Down Expand Up @@ -202,9 +202,7 @@ class MultiplayerCubit extends Cubit<MultiplayerState> {
}

Future<void> raiseError(FatalServerEventError e) async {
final state = this.state;
if (state is! MultiplayerConnectedState) return;
await state.networker.close();
emit(MultiplayerDisconnectedState(error: e, oldState: state));
_fatalError = e;
disconnect();
}
}
7 changes: 4 additions & 3 deletions app/lib/bloc/world/bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,17 @@ class WorldBloc extends Bloc<PlayableWorldEvent, ClientWorldState> {
table: state.table,
teamMembers: state.teamMembers,
id: user,
packsSignature: assetManager.createSignature(),
),
user);
})
..serverEvents.listen(_processEvent);

on<ServerWorldEvent>((event, emit) {
on<ServerWorldEvent>((event, emit) async {
try {
final newState =
processServerEvent(event, state, assetManager: assetManager);
if (newState is! ClientWorldState) return null;
await processServerEvent(event, state, assetManager: assetManager);
if (newState is! ClientWorldState) return;
emit(newState);
return save();
} on FatalServerEventError catch (e) {
Expand Down
3 changes: 3 additions & 0 deletions app/lib/helpers/asset.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class GameAssetManager extends AssetManager {
this.currentLocale = 'en',
});

@override
Iterable<MapEntry<String, QuokkaData>> get packs => _loadedPacks.entries
.where((e) => _allowedPacks.isEmpty || _allowedPacks.contains(e.key));

Expand Down Expand Up @@ -85,6 +86,7 @@ class GameAssetManager extends AssetManager {
@override
QuokkaData? getPack(String key) => _loadedPacks[key];

@override
Future<QuokkaData?> loadPack(String key,
{QuokkaData? pack, bool force = false}) async {
final oldPack = _loadedPacks[key];
Expand Down Expand Up @@ -120,6 +122,7 @@ class GameAssetManager extends AssetManager {
..forEach((_, v) => v.then((e) => e.dispose()))
..clear();

@override
void setAllowedPacks(Iterable<String> packs) {
_allowedPacks.clear();
_allowedPacks.addAll(packs);
Expand Down
1 change: 1 addition & 0 deletions server/lib/asset.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:quokka_api/quokka_api.dart';
class ServerAssetManager extends AssetManager {
final Map<String, QuokkaData> _packs = {};
static const _qkaExtension = 'qka';
@override
Iterable<MapEntry<String, QuokkaData>> get packs => _packs.entries;

Future<void> init({required Consoler console, bool verbose = false}) async {
Expand Down
7 changes: 4 additions & 3 deletions server/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ final class QuokkaServer extends Bloc<ServerWorldEvent, WorldState> {
table: data.getTableOrDefault(),
metadata: data.getMetadataOrDefault(),
)) {
on<ServerWorldEvent>((event, emit) {
on<ServerWorldEvent>((event, emit) async {
final newState =
processServerEvent(event, state, assetManager: assetManager);
if (newState == null) return null;
await processServerEvent(event, state, assetManager: assetManager);
if (newState == null) return;
emit(newState);
return save();
});
Expand Down Expand Up @@ -129,6 +129,7 @@ final class QuokkaServer extends Bloc<ServerWorldEvent, WorldState> {
table: state.table,
id: state.id,
teamMembers: state.teamMembers,
packsSignature: assetManager.createSignature(),
),
user);
}
Expand Down
2 changes: 1 addition & 1 deletion server/lib/programs/packs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class PacksProgram extends ConsoleProgram {
String getDescription() => "Show all loaded packs";

@override
void run(List<String> args) {
void run(String label, List<String> args) {
print("-----");
final packs = server.assetManager.packs.toList();
print("Loaded ${packs.length} pack(s).");
Expand Down
6 changes: 3 additions & 3 deletions server/lib/programs/save.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ class SaveProgram extends ConsoleProgram {
String getDescription() => "Saves the world manually";

@override
Future<void> run(List<String> args) async {
print('Saving...');
Future<void> run(String label, List<String> args) async {
server.consoler.print('Saving...', level: LogLevel.info);
await server.save(force: true);
print('Saved.');
server.consoler.print('Saved.', level: LogLevel.info);
}
}
2 changes: 1 addition & 1 deletion server/lib/programs/stop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class StopProgram extends ConsoleProgram {
String getDescription() => "Stops the server";

@override
void run(List<String> args) {
void run(String label, List<String> args) {
server.close();
}
}
4 changes: 2 additions & 2 deletions server/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ packages:
dependency: "direct main"
description:
path: "packages/consoler"
ref: "2433c04c7526744a1aad757b744ec2b68225a35c"
resolved-ref: "2433c04c7526744a1aad757b744ec2b68225a35c"
ref: "68d1e59fa9f611ad496b7f341f0b1741f662469e"
resolved-ref: "68d1e59fa9f611ad496b7f341f0b1741f662469e"
url: "https://github.com/LinwoodDev/dart_pkgs"
source: git
version: "1.0.0"
Expand Down
2 changes: 1 addition & 1 deletion server/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ dependencies:
consoler:
git:
url: https://github.com/LinwoodDev/dart_pkgs
ref: 2433c04c7526744a1aad757b744ec2b68225a35c
ref: 68d1e59fa9f611ad496b7f341f0b1741f662469e
path: packages/consoler
path: ^1.9.0
quokka_api:
Expand Down

0 comments on commit 0574169

Please sign in to comment.