Skip to content

Commit a75e9e7

Browse files
Support resending email code
1 parent a2af7d1 commit a75e9e7

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

proto/src/main/proto/soulfire/login.proto

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,16 @@ message EmailCodeRequest {
3838
string code = 2;
3939
}
4040

41+
message EmailResendRequest {
42+
string auth_flow_token = 1;
43+
}
44+
45+
message EmailResendResponse {
46+
string auth_flow_token = 1;
47+
}
48+
4149
service LoginService {
4250
rpc login(LoginRequest) returns (NextAuthFlowResponse);
4351
rpc emailCode(EmailCodeRequest) returns (NextAuthFlowResponse);
52+
rpc emailResend(EmailResendRequest) returns (EmailResendResponse);
4453
}

server/src/main/java/com/soulfiremc/server/grpc/LoginServiceImpl.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@
1919

2020
import com.github.benmanes.caffeine.cache.Cache;
2121
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.*;
2623
import com.soulfiremc.server.SoulFireServer;
2724
import com.soulfiremc.server.database.UserEntity;
2825
import io.grpc.Status;
@@ -63,7 +60,7 @@ public void login(LoginRequest request, StreamObserver<NextAuthFlowResponse> res
6360
// we always return a flow token, even if the email is not registered
6461
if (user != null) {
6562
var emailCode = generateSixDigitCode();
66-
authFlows.put(authFlowToken, new EmailFlowStage(user.id(), emailCode));
63+
authFlows.put(authFlowToken, new EmailFlowStage(user.id(), request.getEmail(), emailCode));
6764
soulFireServer.emailSender().sendLoginCode(user.email(), user.username(), emailCode);
6865
}
6966

@@ -85,7 +82,7 @@ public void emailCode(EmailCodeRequest request, StreamObserver<NextAuthFlowRespo
8582
var flowStage = authFlows.getIfPresent(authFlowToken);
8683
// Not present also returns invalid code
8784
// 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))
8986
|| !code.equals(request.getCode())) {
9087
responseObserver.onNext(NextAuthFlowResponse.newBuilder()
9188
.setAuthFlowToken(authFlowToken.toString())
@@ -111,9 +108,28 @@ public void emailCode(EmailCodeRequest request, StreamObserver<NextAuthFlowRespo
111108
}
112109
}
113110

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+
114130
private interface FlowStage {
115131
}
116132

117-
private record EmailFlowStage(UUID userId, String code) implements FlowStage {
133+
private record EmailFlowStage(UUID userId, String email, String code) implements FlowStage {
118134
}
119135
}

0 commit comments

Comments
 (0)