11import 'dart:async' ;
2+ import 'dart:convert' ;
23
34import 'package:echidna_server/echidna_server.dart' ;
45import 'package:echidna_server/modules/client/client.dart' ;
@@ -8,32 +9,38 @@ import 'package:shelf_modular/shelf_modular.dart';
89/// Verifies that the client key is valid.
910class SignatureGuard extends RouteGuard {
1011 @override
11- FutureOr <bool > canActivate (Request request, Route route) async {
12- final clientId = int .tryParse (request.headers['client-id' ] ?? '' );
13-
14- if (clientId == null ) {
15- return false ;
16- }
12+ FutureOr <bool > canActivate (Request request, [ModularRoute ? route]) async {
13+ final body = await request.readAsString ();
1714
1815 final signatureService = Modular .get <SignatureService >();
1916
2017 final clientKey = await signatureService.extractClientKey (request);
2118
22- if (clientKey == null ) {
23- return false ;
24- }
19+ print (request.headers);
20+
21+ if (clientKey == null ) return false ;
22+
23+ print ('Client key: ${clientKey .key }' );
2524
2625 final signature = request.headers['x-signature' ];
2726
28- if (signature == null ) {
29- return false ;
30- }
27+ if (signature == null ) return false ;
28+
29+ print ( 'Signature: $ signature ' );
3130
32- return signatureService.verifySignature (
33- signature,
34- await request.readAsString (),
35- clientKey.key! ,
36- );
31+ return signatureService.verifySignature (signature, body, clientKey.key! );
32+ }
33+
34+ @override
35+ FutureOr <Response > Function (Request p1) call (Handler handler, [ModularRoute ? route]) {
36+ return (request) async {
37+ if (! await canActivate (request, route! as Route )) {
38+ return Response .forbidden (
39+ jsonEncode ({'error' : 'Invalid signature' }),
40+ );
41+ }
42+ return handler (request);
43+ };
3744 }
3845}
3946
@@ -48,24 +55,21 @@ class SignatureMiddleware extends ModularMiddleware {
4855
4956 final signatureService = Modular .get <SignatureService >();
5057
51- final clientId = int .tryParse (request.headers['client-id' ] ?? '' );
52-
53- if (clientId == null ) {
54- return response;
55- }
56-
5758 final clientKey = await signatureService.extractClientKey (request);
5859
5960 if (clientKey == null ) {
6061 return response;
6162 }
6263
64+ final body = await response.readAsString ();
65+
6366 final signature = signatureService.sign (
64- await response. readAsString () ,
67+ body ,
6568 clientKey.key! ,
6669 );
6770
6871 return response.change (
72+ body: body,
6973 headers: {
7074 'x-signature' : signature,
7175 },
0 commit comments