Add support for getting ip bans, ip intel, and ip logs by hashes
This commit is contained in:
parent
287e6b744a
commit
dc16fa7b6f
@ -10,6 +10,7 @@ import io.vertx.core.CompositeFuture;
|
|||||||
import io.vertx.core.Future;
|
import io.vertx.core.Future;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import net.frozenorb.apiv3.APIv3;
|
import net.frozenorb.apiv3.APIv3;
|
||||||
import net.frozenorb.apiv3.maxmind.MaxMindLocation;
|
import net.frozenorb.apiv3.maxmind.MaxMindLocation;
|
||||||
import net.frozenorb.apiv3.maxmind.MaxMindResult;
|
import net.frozenorb.apiv3.maxmind.MaxMindResult;
|
||||||
@ -28,7 +29,7 @@ public final class IpIntel {
|
|||||||
|
|
||||||
private static final MongoCollection<IpIntel> ipIntelCollection = APIv3.getDatabase().getCollection("ipIntel", IpIntel.class);
|
private static final MongoCollection<IpIntel> ipIntelCollection = APIv3.getDatabase().getCollection("ipIntel", IpIntel.class);
|
||||||
|
|
||||||
@Getter @Id private String id;
|
@Getter @Setter @Id private String id;
|
||||||
@Getter private String hashedIp;
|
@Getter private String hashedIp;
|
||||||
@Getter private Instant lastUpdatedAt;
|
@Getter private Instant lastUpdatedAt;
|
||||||
@Getter private MaxMindResult result;
|
@Getter private MaxMindResult result;
|
||||||
@ -46,6 +47,10 @@ public final class IpIntel {
|
|||||||
ipIntelCollection.find(new Document("_id", id)).first(SyncUtils.vertxWrap(callback));
|
ipIntelCollection.find(new Document("_id", id)).first(SyncUtils.vertxWrap(callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void findByHashedIp(String hashedIp, SingleResultCallback<IpIntel> callback) {
|
||||||
|
ipIntelCollection.find(new Document("hashedIp", hashedIp)).first(SyncUtils.vertxWrap(callback));
|
||||||
|
}
|
||||||
|
|
||||||
public static void findOrCreateById(String id, SingleResultCallback<IpIntel> callback) {
|
public static void findOrCreateById(String id, SingleResultCallback<IpIntel> callback) {
|
||||||
findById(id, (existingIpIntel, error) -> {
|
findById(id, (existingIpIntel, error) -> {
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
|
@ -57,6 +57,10 @@ public final class IpLogEntry {
|
|||||||
ipLogCollection.find(new Document("userIp", userIp)).into(new LinkedList<>(), SyncUtils.vertxWrap(callback));
|
ipLogCollection.find(new Document("userIp", userIp)).into(new LinkedList<>(), SyncUtils.vertxWrap(callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void findByHashedIp(String hashedUserIp, SingleResultCallback<List<IpLogEntry>> callback) {
|
||||||
|
ipLogCollection.find(new Document("hashedUserIp", hashedUserIp)).into(new LinkedList<>(), SyncUtils.vertxWrap(callback));
|
||||||
|
}
|
||||||
|
|
||||||
public static void findByUserAndIp(User user, String userIp, SingleResultCallback<IpLogEntry> callback) {
|
public static void findByUserAndIp(User user, String userIp, SingleResultCallback<IpLogEntry> callback) {
|
||||||
findByUserAndIp(user.getId(), userIp, callback);
|
findByUserAndIp(user.getId(), userIp, callback);
|
||||||
}
|
}
|
||||||
|
@ -16,12 +16,7 @@ public final class GETIpBans implements Handler<RoutingContext> {
|
|||||||
int pageSize = ctx.request().getParam("pageSize") == null ? 100 : Integer.parseInt(ctx.request().getParam("pageSize"));
|
int pageSize = ctx.request().getParam("pageSize") == null ? 100 : Integer.parseInt(ctx.request().getParam("pageSize"));
|
||||||
String userIp = ctx.request().getParam("userIp");
|
String userIp = ctx.request().getParam("userIp");
|
||||||
|
|
||||||
if (userIp != null && !IpUtils.isValidIp(userIp)) {
|
IpBan.findPaginated(userIp == null ? new Document() : (IpUtils.isValidIp(userIp) ? new Document("userIp", userIp) : new Document("hashedUserIp", userIp)), skip, pageSize, (grants, error) -> {
|
||||||
ErrorUtils.respondInvalidInput(ctx, "Ip address \"" + userIp + "\" is not valid.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IpBan.findPaginated(userIp == null ? new Document() : new Document("userIp", userIp), skip, pageSize, (grants, error) -> {
|
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
ErrorUtils.respondInternalError(ctx, error);
|
ErrorUtils.respondInternalError(ctx, error);
|
||||||
} else {
|
} else {
|
||||||
|
@ -12,18 +12,24 @@ public final class GETIpInteld implements Handler<RoutingContext> {
|
|||||||
public void handle(RoutingContext ctx) {
|
public void handle(RoutingContext ctx) {
|
||||||
String userIp = ctx.request().getParam("userIp");
|
String userIp = ctx.request().getParam("userIp");
|
||||||
|
|
||||||
if (!IpUtils.isValidIp(userIp)) {
|
if (IpUtils.isValidIp(userIp)) {
|
||||||
ErrorUtils.respondInvalidInput(ctx, "Ip address \"" + userIp + "\" is not valid.");
|
IpIntel.findOrCreateById(userIp, (ipIntel, error) -> {
|
||||||
return;
|
if (error != null) {
|
||||||
|
ErrorUtils.respondInternalError(ctx, error);
|
||||||
|
} else {
|
||||||
|
APIv3.respondJson(ctx, 200, ipIntel);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
IpIntel.findByHashedIp(userIp, (ipIntel, error) -> {
|
||||||
|
if (error != null) {
|
||||||
|
ErrorUtils.respondInternalError(ctx, error);
|
||||||
|
} else {
|
||||||
|
ipIntel.setId(null); // hide actual ip field if we found the entry via hash
|
||||||
|
APIv3.respondJson(ctx, 200, ipIntel);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
IpIntel.findOrCreateById(userIp, (ipIntel, error) -> {
|
|
||||||
if (error != null) {
|
|
||||||
ErrorUtils.respondInternalError(ctx, error);
|
|
||||||
} else {
|
|
||||||
APIv3.respondJson(ctx, 200, ipIntel);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -6,6 +6,9 @@ import net.frozenorb.apiv3.APIv3;
|
|||||||
import net.frozenorb.apiv3.model.IpLogEntry;
|
import net.frozenorb.apiv3.model.IpLogEntry;
|
||||||
import net.frozenorb.apiv3.model.User;
|
import net.frozenorb.apiv3.model.User;
|
||||||
import net.frozenorb.apiv3.util.ErrorUtils;
|
import net.frozenorb.apiv3.util.ErrorUtils;
|
||||||
|
import net.frozenorb.apiv3.util.UuidUtils;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public final class GETIpLogId implements Handler<RoutingContext> {
|
public final class GETIpLogId implements Handler<RoutingContext> {
|
||||||
|
|
||||||
@ -13,21 +16,29 @@ public final class GETIpLogId implements Handler<RoutingContext> {
|
|||||||
String search = ctx.request().getParam("id");
|
String search = ctx.request().getParam("id");
|
||||||
|
|
||||||
if (search.length() >= 32) {
|
if (search.length() >= 32) {
|
||||||
User.findById(search, (user, error) -> {
|
UUID uuid = null;
|
||||||
if (error != null) {
|
|
||||||
ErrorUtils.respondInternalError(ctx, error);
|
try {
|
||||||
} else if (user == null) {
|
uuid = UuidUtils.parseUuid(search);
|
||||||
ErrorUtils.respondNotFound(ctx, "User", search);
|
} catch (IllegalArgumentException ignored) {}
|
||||||
} else {
|
|
||||||
IpLogEntry.findByUser(user, (ipLog, error2) -> {
|
if (uuid != null) {
|
||||||
if (error2 != null) {
|
IpLogEntry.findByUser(uuid, (ipLog, error) -> {
|
||||||
ErrorUtils.respondInternalError(ctx, error2);
|
if (error != null) {
|
||||||
} else {
|
ErrorUtils.respondInternalError(ctx, error);
|
||||||
APIv3.respondJson(ctx, 200, ipLog);
|
} else {
|
||||||
}
|
APIv3.respondJson(ctx, 200, ipLog);
|
||||||
});
|
}
|
||||||
}
|
});
|
||||||
});
|
} else {
|
||||||
|
IpLogEntry.findByHashedIp(search, (ipLogs, error) -> {
|
||||||
|
if (error != null) {
|
||||||
|
ErrorUtils.respondInternalError(ctx, error);
|
||||||
|
} else {
|
||||||
|
APIv3.respondJson(ctx, 200, ipLogs);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
IpLogEntry.findByIp(search, (ipLogs, error) -> {
|
IpLogEntry.findByIp(search, (ipLogs, error) -> {
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
|
Loading…
Reference in New Issue
Block a user