diff --git a/src/main/java/org/b3log/solo/processor/BeforeRequestHandler.java b/src/main/java/org/b3log/solo/processor/BeforeRequestHandler.java
index 62d906769..cbbefeff6 100644
--- a/src/main/java/org/b3log/solo/processor/BeforeRequestHandler.java
+++ b/src/main/java/org/b3log/solo/processor/BeforeRequestHandler.java
@@ -19,19 +19,29 @@
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.handler.Handler;
+import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Stopwatchs;
+import org.b3log.solo.util.Solos;
/**
* Before request handler.
*
* @author Liang Ding
- * @version 1.0.0.0, Nov 3, 2019
+ * @version 1.0.0.1, Jan 11, 2020
* @since 3.6.7
*/
public class BeforeRequestHandler implements Handler {
@Override
public void handle(final RequestContext context) {
+ final String remoteAddr = Requests.getRemoteAddr(context.getRequest());
+ if (Solos.BLACKLIST_IPS.contains(remoteAddr)) {
+ context.sendStatus(200);
+ context.abort();
+
+ return;
+ }
+
Stopwatchs.start("Request Initialized [requestURI=" + context.requestURI() + "]");
}
}
diff --git a/src/main/java/org/b3log/solo/service/CronMgmtService.java b/src/main/java/org/b3log/solo/service/CronMgmtService.java
index 03ce3b911..389331808 100644
--- a/src/main/java/org/b3log/solo/service/CronMgmtService.java
+++ b/src/main/java/org/b3log/solo/service/CronMgmtService.java
@@ -22,6 +22,7 @@
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.Stopwatchs;
+import org.b3log.solo.util.Solos;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -96,27 +97,27 @@ public void start() {
SCHEDULED_EXECUTOR_SERVICE.scheduleAtFixedRate(() -> {
try {
- articleMgmtService.refreshGitHub();
- userMgmtService.refreshUSite();
+ Solos.reloadBlacklistIPs();
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Executes cron failed", e);
} finally {
Stopwatchs.release();
}
- }, delay, 1000 * 60 * 60 * 24, TimeUnit.MILLISECONDS);
+ }, delay, 30, TimeUnit.MINUTES);
delay += 2000;
SCHEDULED_EXECUTOR_SERVICE.scheduleAtFixedRate(() -> {
try {
+ articleMgmtService.refreshGitHub();
+ userMgmtService.refreshUSite();
exportService.exportHacPai();
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Executes cron failed", e);
} finally {
Stopwatchs.release();
}
- }, delay + 1000 * 60 * 10, 1000 * 60 * 60 * 24, TimeUnit.MILLISECONDS);
+ }, delay, 1000 * 60 * 60 * 24, TimeUnit.MILLISECONDS);
delay += 2000;
-
}
/**
diff --git a/src/main/java/org/b3log/solo/util/Solos.java b/src/main/java/org/b3log/solo/util/Solos.java
index a95481c5f..7d8da8ced 100644
--- a/src/main/java/org/b3log/solo/util/Solos.java
+++ b/src/main/java/org/b3log/solo/util/Solos.java
@@ -38,17 +38,20 @@
import org.b3log.solo.model.Common;
import org.b3log.solo.model.UserExt;
import org.b3log.solo.repository.UserRepository;
+import org.json.JSONArray;
import org.json.JSONObject;
+import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* Solo utilities.
*
* @author Liang Ding
- * @version 1.9.0.6, Jan 8, 2020
+ * @version 1.10.0.0, Jan 11, 2020
* @since 2.8.0
*/
public final class Solos {
@@ -113,6 +116,31 @@ public final class Solos {
COOKIE_SECRET = cookieSecret;
}
+ /**
+ * Blacklist IPs.
+ */
+ public static final List BLACKLIST_IPS = new CopyOnWriteArrayList<>();
+
+ /**
+ * Reloads blacklist IPs.
+ */
+ public static void reloadBlacklistIPs() {
+ final HttpResponse res = HttpRequest.post("https://hacpai.com/apis/blacklist/ip").trustAllCerts(true).
+ connectionTimeout(3000).timeout(7000).header("User-Agent", Solos.USER_AGENT).send();
+ if (200 != res.statusCode()) {
+ return;
+ }
+ res.charset("UTF-8");
+ final JSONObject result = new JSONObject(res.bodyText());
+ if (0 != result.optInt(Keys.CODE)) {
+ return;
+ }
+
+ final JSONArray ips = result.optJSONArray(Common.DATA);
+ BLACKLIST_IPS.clear();
+ BLACKLIST_IPS.addAll(CollectionUtils.jsonArrayToList(ips));
+ }
+
/**
* Constructs a successful result.
*