diff --git a/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java b/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java index ac8a478..2289197 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java @@ -12,6 +12,8 @@ public interface VPNDatabase { void cacheResponse(VPNResponse toCache); + void deleteResponse(String ip); + boolean isWhitelisted(UUID uuid); boolean isWhitelisted(String ip); diff --git a/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java b/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java index 94466a0..bafa52b 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java @@ -65,7 +65,12 @@ public class H2VPN implements VPNDatabase { rs.getString("method"), rs.getString("isp"), "N/A", rs.getBoolean("proxy"), rs.getBoolean("cached"), true, rs.getDouble("latitude"), rs.getDouble("longitude"), - System.currentTimeMillis(), -1); + rs.getLong("inserted"), -1); + + if(System.currentTimeMillis() - response.getLastAccess() > TimeUnit.HOURS.toMillis(1)) { + VPNExecutor.threadExecutor.execute(() -> deleteResponse(ip)); + return Optional.empty(); + } return Optional.of(response); } } catch (SQLException throwables) { @@ -98,6 +103,14 @@ public class H2VPN implements VPNDatabase { .append(toCache.getLatitude()).append(toCache.getLongitude()).execute(); } + @Override + public void deleteResponse(String ip) { + if(!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) + return; + + Query.prepare("delete from `responses` where `ip` = ?").append(ip).execute(); + } + @SneakyThrows @Override public boolean isWhitelisted(UUID uuid) { diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java b/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java index 20e1098..6ee677c 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java @@ -7,13 +7,16 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Indexes; +import com.mongodb.client.model.UpdateOptions; import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.api.VPNExecutor; import dev.brighten.antivpn.database.VPNDatabase; import dev.brighten.antivpn.web.objects.VPNResponse; import org.bson.Document; +import org.bson.conversions.Bson; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; public class MongoVPN implements VPNDatabase { @@ -27,6 +30,13 @@ public class MongoVPN implements VPNDatabase { Document rdoc = cacheDocument.find(Filters.eq("ip", ip)).first(); if(rdoc != null) { + long lastUpdate = rdoc.get("lastAccess", 0L); + + if(System.currentTimeMillis() - lastUpdate > TimeUnit.HOURS.toMillis(1)) { + VPNExecutor.threadExecutor.execute(() -> deleteResponse(ip)); + return Optional.empty(); + } + return Optional.of(VPNResponse.builder().asn(rdoc.getString("asn")).ip(ip) .countryName(rdoc.getString("countryName")) .countryCode(rdoc.getString("countryCode")) @@ -39,6 +49,7 @@ public class MongoVPN implements VPNDatabase { .success(true) .latitude(rdoc.getDouble("latitude")) .longitude(rdoc.getDouble("longitude")) + .lastAccess(rdoc.get("lastAccess", 0L)) .build()); } return Optional.empty(); @@ -60,13 +71,20 @@ public class MongoVPN implements VPNDatabase { rdoc.put("success", toCache.isSuccess()); rdoc.put("latitude", toCache.getLatitude()); rdoc.put("longitude", toCache.getLongitude()); + rdoc.put("lastAccess", System.currentTimeMillis()); VPNExecutor.threadExecutor.execute(() -> { - cacheDocument.deleteMany(Filters.eq("ip", toCache.getIp())); - cacheDocument.insertOne(rdoc); + Bson update = new Document("$set", rdoc); + cacheDocument.updateOne(Filters.eq("ip", toCache.getIp()), update, + new UpdateOptions().upsert(true)); }); } + @Override + public void deleteResponse(String ip) { + cacheDocument.deleteMany(Filters.eq("ip", ip)); + } + @Override public boolean isWhitelisted(UUID uuid) { return settingsDocument @@ -100,8 +118,8 @@ public class MongoVPN implements VPNDatabase { @Override public void setWhitelisted(String ip, boolean whitelisted) { if(whitelisted) { - Document wdoc = new Document("setting", "whitelist"); - wdoc.put("ip", ip); + Document wdoc = new Document("setting", "whitelist").append("ip", ip); + AntiVPN.getInstance().getExecutor().getWhitelistedIps().add(ip); VPNExecutor.threadExecutor.execute(() -> settingsDocument.insertOne(wdoc)); } else { diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java b/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java index 9c5d222..809ec5c 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java @@ -52,7 +52,7 @@ public class MySqlVPN implements VPNDatabase { @Override public Optional getStoredResponse(String ip) { - if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()|| MySQL.isClosed()) + if (isDisabled()) return Optional.empty(); ResultSet rs = Query.prepare("select * from `responses` where `ip` = ? limit 1").append(ip).executeQuery(); @@ -65,7 +65,13 @@ public class MySqlVPN implements VPNDatabase { rs.getString("method"), rs.getString("isp"), "N/A", rs.getBoolean("proxy"), rs.getBoolean("cached"), true, rs.getDouble("latitude"), rs.getDouble("longitude"), - System.currentTimeMillis(), -1); + rs.getLong("inserted"), -1); + + if(System.currentTimeMillis() - response.getLastAccess() > TimeUnit.HOURS.toMillis(1)) { + VPNExecutor.threadExecutor.execute(() -> deleteResponse(ip)); + return Optional.empty(); + } + return Optional.of(response); } } catch (SQLException throwables) { @@ -86,7 +92,7 @@ public class MySqlVPN implements VPNDatabase { */ @Override public void cacheResponse(VPNResponse toCache) { - if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (isDisabled()) return; Query.prepare("insert into `responses` (`ip`,`asn`,`countryName`,`countryCode`,`city`,`timeZone`," @@ -98,10 +104,18 @@ public class MySqlVPN implements VPNDatabase { .append(toCache.getLatitude()).append(toCache.getLongitude()).execute(); } + @Override + public void deleteResponse(String ip) { + if(!isDisabled()) + return; + + Query.prepare("delete from `responses` where `ip` = ?").append(ip).execute(); + } + @SneakyThrows @Override public boolean isWhitelisted(UUID uuid) { - if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (isDisabled()) return false; ResultSet set = Query.prepare("select uuid from `whitelisted` where `uuid` = ? limit 1") .append(uuid.toString()).executeQuery(); @@ -112,7 +126,7 @@ public class MySqlVPN implements VPNDatabase { @SneakyThrows @Override public boolean isWhitelisted(String ip) { - if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (isDisabled()) return false; ResultSet set = Query.prepare("select `ip` from `whitelisted-ips` where `ip` = ? limit 1") .append(ip).executeQuery(); @@ -123,7 +137,7 @@ public class MySqlVPN implements VPNDatabase { @Override public void setWhitelisted(UUID uuid, boolean whitelisted) { - if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (isDisabled()) return; if (whitelisted) { @@ -139,7 +153,7 @@ public class MySqlVPN implements VPNDatabase { @Override public void setWhitelisted(String ip, boolean whitelisted) { - if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (isDisabled()) return; if(whitelisted) { @@ -333,6 +347,10 @@ public class MySqlVPN implements VPNDatabase { System.err.println("MySQL Excepton created" + e.getMessage()); } } + + private boolean isDisabled() { + return !AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()|| MySQL.isClosed(); + } @Override public void shutdown() {