diff --git a/src/main/java/net/frozenorb/apiv3/model/User.java b/src/main/java/net/frozenorb/apiv3/model/User.java index 80a1fb7..27a1df5 100644 --- a/src/main/java/net/frozenorb/apiv3/model/User.java +++ b/src/main/java/net/frozenorb/apiv3/model/User.java @@ -21,10 +21,7 @@ import net.frozenorb.apiv3.serialization.gson.ExcludeFromReplies; import net.frozenorb.apiv3.serialization.jackson.UuidJsonDeserializer; import net.frozenorb.apiv3.serialization.jackson.UuidJsonSerializer; import net.frozenorb.apiv3.unsorted.BlockingCallback; -import net.frozenorb.apiv3.util.MojangUtils; -import net.frozenorb.apiv3.util.PermissionUtils; -import net.frozenorb.apiv3.util.SyncUtils; -import net.frozenorb.apiv3.util.UuidUtils; +import net.frozenorb.apiv3.util.*; import org.bson.Document; import java.time.Instant; @@ -216,6 +213,36 @@ public final class User { return password != null && hashed.equals(password); } + public void requiresTotpAuthorization(String ip, SingleResultCallback callback) { + if (totpSecret == null) { + callback.onResult(RequiresTotpResult.NOT_REQUIRED_NOT_SET, null); + return; + } + + if (ip == null || !IpUtils.isValidIp(ip)) { + callback.onResult(RequiresTotpResult.REQUIRED_NO_EXEMPTIONS, null); + return; + } + + TotpUtils.isPreAuthorized(this, ip, (ipPreAuth, error) -> { + if (error != null) { + callback.onResult(null, error); + } else if (ipPreAuth) { + callback.onResult(RequiresTotpResult.NOT_REQUIRED_IP_PRE_AUTHORIZED, null); + } else { + callback.onResult(RequiresTotpResult.REQUIRED_NO_EXEMPTIONS, null); + } + }); + } + + public enum RequiresTotpResult { + + NOT_REQUIRED_NOT_SET, + NOT_REQUIRED_IP_PRE_AUTHORIZED, + REQUIRED_NO_EXEMPTIONS + + } + public Rank getHighestRankAnywhere() { return getHighestRankScoped(null, Grant.findByUserSync(this)); } diff --git a/src/main/java/net/frozenorb/apiv3/route/users/GETUserRequiresTOTP.java b/src/main/java/net/frozenorb/apiv3/route/users/GETUserRequiresTOTP.java index 201830a..312025d 100644 --- a/src/main/java/net/frozenorb/apiv3/route/users/GETUserRequiresTOTP.java +++ b/src/main/java/net/frozenorb/apiv3/route/users/GETUserRequiresTOTP.java @@ -13,42 +13,29 @@ import net.frozenorb.apiv3.util.TotpUtils; public final class GETUserRequiresTOTP implements Handler { public void handle(RoutingContext ctx) { - User user = User.findByIdSync(ctx.request().getParam("id")); + User.findById(ctx.request().getParam("id"), (user, error) -> { + if (error != null) { + ErrorUtils.respondNotFound(ctx, "User", ctx.request().getParam("id")); + } else { + String userIp = ctx.request().getParam("userIp"); - if (user == null) { - ErrorUtils.respondNotFound(ctx, "User", ctx.request().getParam("id")); - return; - } + if (!IpUtils.isValidIp(userIp)) { + ErrorUtils.respondInvalidInput(ctx, "Ip address \"" + userIp + "\" is not valid."); + return; + } - if (user.getTotpSecret() == null) { - APIv3.respondJson(ctx, ImmutableMap.of( - "required", false, - "message", "User does not have TOTP setup." - )); - return; - } - - String userIp = ctx.request().getParam("userIp"); - - if (!IpUtils.isValidIp(userIp)) { - ErrorUtils.respondInvalidInput(ctx, "Ip address \"" + userIp + "\" is not valid."); - return; - } - - BlockingCallback preAuthorizedCallback = new BlockingCallback<>(); - TotpUtils.isPreAuthorized(user, userIp, preAuthorizedCallback); - - if (preAuthorizedCallback.get()) { - APIv3.respondJson(ctx, ImmutableMap.of( - "required", false, - "message", "User's ip has already been validated" - )); - } else { - APIv3.respondJson(ctx, ImmutableMap.of( - "required", true, - "message", "User has no TOTP exemptions." - )); - } + user.requiresTotpAuthorization(userIp, (requiresTotpResult, error2) -> { + if (error2 != null) { + ErrorUtils.respondInternalError(ctx, error2); + } else { + APIv3.respondJson(ctx, ImmutableMap.of( + "required", (requiresTotpResult == User.RequiresTotpResult.REQUIRED_NO_EXEMPTIONS), + "message", requiresTotpResult.name() + )); + } + }); + } + }); } } \ No newline at end of file