19
19
20
20
import com .github .benmanes .caffeine .cache .Cache ;
21
21
import com .github .benmanes .caffeine .cache .Caffeine ;
22
- import com .soulfiremc .grpc .generated .EmailCodeRequest ;
23
- import com .soulfiremc .grpc .generated .LoginRequest ;
24
- import com .soulfiremc .grpc .generated .LoginServiceGrpc ;
25
- import com .soulfiremc .grpc .generated .NextAuthFlowResponse ;
22
+ import com .soulfiremc .grpc .generated .*;
26
23
import com .soulfiremc .server .SoulFireServer ;
27
24
import com .soulfiremc .server .database .UserEntity ;
28
25
import io .grpc .Status ;
@@ -63,7 +60,7 @@ public void login(LoginRequest request, StreamObserver<NextAuthFlowResponse> res
63
60
// we always return a flow token, even if the email is not registered
64
61
if (user != null ) {
65
62
var emailCode = generateSixDigitCode ();
66
- authFlows .put (authFlowToken , new EmailFlowStage (user .id (), emailCode ));
63
+ authFlows .put (authFlowToken , new EmailFlowStage (user .id (), request . getEmail (), emailCode ));
67
64
soulFireServer .emailSender ().sendLoginCode (user .email (), user .username (), emailCode );
68
65
}
69
66
@@ -85,7 +82,7 @@ public void emailCode(EmailCodeRequest request, StreamObserver<NextAuthFlowRespo
85
82
var flowStage = authFlows .getIfPresent (authFlowToken );
86
83
// Not present also returns invalid code
87
84
// This way we prevent bruteforce attacks
88
- if (!(flowStage instanceof EmailFlowStage (var userId , var code ))
85
+ if (!(flowStage instanceof EmailFlowStage (var userId , var ignored , var code ))
89
86
|| !code .equals (request .getCode ())) {
90
87
responseObserver .onNext (NextAuthFlowResponse .newBuilder ()
91
88
.setAuthFlowToken (authFlowToken .toString ())
@@ -111,9 +108,28 @@ public void emailCode(EmailCodeRequest request, StreamObserver<NextAuthFlowRespo
111
108
}
112
109
}
113
110
111
+ @ Override
112
+ public void emailResend (EmailResendRequest request , StreamObserver <EmailResendResponse > responseObserver ) {
113
+ try {
114
+ var authFlowToken = UUID .fromString (request .getAuthFlowToken ());
115
+ var flowStage = authFlows .getIfPresent (authFlowToken );
116
+ if (flowStage instanceof EmailFlowStage (var userId , var email , var code )) {
117
+ soulFireServer .emailSender ().sendLoginCode (email , soulFireServer .authSystem ().getUserData (userId ).orElseThrow ().username (), code );
118
+ }
119
+
120
+ responseObserver .onNext (EmailResendResponse .newBuilder ()
121
+ .setAuthFlowToken (authFlowToken .toString ())
122
+ .build ());
123
+ responseObserver .onCompleted ();
124
+ } catch (Throwable t ) {
125
+ log .error ("Error resending email code" , t );
126
+ throw new StatusRuntimeException (Status .INTERNAL .withDescription (t .getMessage ()).withCause (t ));
127
+ }
128
+ }
129
+
114
130
private interface FlowStage {
115
131
}
116
132
117
- private record EmailFlowStage (UUID userId , String code ) implements FlowStage {
133
+ private record EmailFlowStage (UUID userId , String email , String code ) implements FlowStage {
118
134
}
119
135
}
0 commit comments