diff --git a/pom.xml b/pom.xml
index d4139c2c9..f2a877614 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,4 @@
-
+
4.0.0
com.rebuild
@@ -11,12 +9,12 @@
Building your business-systems free!
https://getrebuild.com/
-
-
- devezhao
- zhaofang123@gmail.com
-
-
+
+
+ devezhao
+ zhaofang123@gmail.com
+
+
@@ -158,11 +156,11 @@
2.3.3
provided
-
- javax.servlet
- jstl
- 1.2
-
+
+ javax.servlet
+ jstl
+ 1.2
+
org.slf4j
slf4j-log4j12
@@ -317,11 +315,11 @@
poi-ooxml
4.1.0
-
- com.h2database
- h2
- 1.4.200
-
+
+ com.h2database
+ h2
+ 1.4.200
+
com.googlecode.aviator
aviator
@@ -332,10 +330,10 @@
thumbnailator
0.4.11
-
- es.moki.ratelimitj
- ratelimitj-inmemory
- 0.6.0
-
+
+ es.moki.ratelimitj
+ ratelimitj-inmemory
+ 0.6.0
+
-
+
\ No newline at end of file
diff --git a/src/main/java/com/rebuild/server/Application.java b/src/main/java/com/rebuild/server/Application.java
index aef0baec0..b494102df 100644
--- a/src/main/java/com/rebuild/server/Application.java
+++ b/src/main/java/com/rebuild/server/Application.java
@@ -18,6 +18,7 @@ import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.rebuild.api.ApiGateway;
import com.rebuild.api.BaseApi;
+import com.rebuild.server.helper.AesPreferencesConfigurer;
import com.rebuild.server.helper.ConfigurableItem;
import com.rebuild.server.helper.SysConfiguration;
import com.rebuild.server.helper.cache.CommonCache;
@@ -67,7 +68,7 @@ public final class Application {
public static final String VER = "1.10.0-dev";
/** Rebuild Build
*/
- public static final int BUILD = 1090;
+ public static final int BUILD = 1091;
/** Logging for Global
*/
@@ -193,7 +194,8 @@ public final class Application {
if (APPLICATION_CTX == null) {
debugMode = true;
LOG.info("Rebuild Booting in DEBUG mode ...");
-
+
+ AesPreferencesConfigurer.initApplicationProperties();
long at = System.currentTimeMillis();
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "application-ctx.xml" });
new Application(ctx).init(at);
diff --git a/src/main/java/com/rebuild/server/ServerListener.java b/src/main/java/com/rebuild/server/ServerListener.java
index 9d50f5fdf..b95562d0b 100644
--- a/src/main/java/com/rebuild/server/ServerListener.java
+++ b/src/main/java/com/rebuild/server/ServerListener.java
@@ -9,6 +9,7 @@ package com.rebuild.server;
import cn.devezhao.commons.CalendarUtils;
import com.alibaba.fastjson.JSONObject;
+import com.rebuild.server.helper.AesPreferencesConfigurer;
import com.rebuild.server.helper.ConfigurableItem;
import com.rebuild.server.helper.License;
import com.rebuild.server.helper.SysConfiguration;
@@ -56,6 +57,8 @@ public class ServerListener extends ContextCleanupListener implements InstallSta
event.getServletContext().setAttribute("baseUrl", CONTEXT_PATH);
try {
+ AesPreferencesConfigurer.initApplicationProperties();
+
if (!checkInstalled()) {
eventHold = event;
LOG.warn(Application.formatFailure("REBUILD IS WAITING FOR INSTALL ..."));
diff --git a/src/main/java/com/rebuild/server/ServerStatus.java b/src/main/java/com/rebuild/server/ServerStatus.java
index 20592e5ca..9f7e762ae 100644
--- a/src/main/java/com/rebuild/server/ServerStatus.java
+++ b/src/main/java/com/rebuild/server/ServerStatus.java
@@ -106,12 +106,11 @@ public final class ServerStatus {
return Status.success(name);
}
- AesPreferencesConfigurer configurer = Application.getBean(AesPreferencesConfigurer.class);
try {
Connection c = DriverManager.getConnection(
- configurer.getItem("db.url"),
- configurer.getItem("db.user"),
- configurer.getItem("db.passwd"));
+ AesPreferencesConfigurer.getItem("db.url"),
+ AesPreferencesConfigurer.getItem("db.user"),
+ AesPreferencesConfigurer.getItem("db.passwd"));
SqlHelper.close(c);
} catch (Exception ex) {
return Status.error(name, ThrowableUtils.getRootCause(ex).getLocalizedMessage());
diff --git a/src/main/java/com/rebuild/server/helper/AesPreferencesConfigurer.java b/src/main/java/com/rebuild/server/helper/AesPreferencesConfigurer.java
index 0ac32ea30..851d86f70 100644
--- a/src/main/java/com/rebuild/server/helper/AesPreferencesConfigurer.java
+++ b/src/main/java/com/rebuild/server/helper/AesPreferencesConfigurer.java
@@ -18,17 +18,22 @@ along with this program. If not, see .
package com.rebuild.server.helper;
-import com.rebuild.server.Application;
import com.rebuild.server.helper.setup.InstallState;
import com.rebuild.server.helper.setup.SetupException;
import com.rebuild.utils.AES;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
+import org.springframework.util.Assert;
+import org.springframework.util.ResourceUtils;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.Properties;
/**
@@ -39,12 +44,18 @@ import java.util.Properties;
*/
public class AesPreferencesConfigurer extends PreferencesPlaceholderConfigurer implements InstallState {
- private Properties propsHold = null;
+ private static final Log LOG = LogFactory.getLog(AesPreferencesConfigurer.class);
+
+ private static Properties propsHold = null;
@Override
protected void loadProperties(Properties props) throws IOException {
super.loadProperties(props);
+
+ props.putAll(fromInstallFile());
this.afterLoad(props);
+ LOG.info("Application properties : " + props);
+
setNullValue(StringUtils.EMPTY);
}
@@ -52,8 +63,6 @@ public class AesPreferencesConfigurer extends PreferencesPlaceholderConfigurer i
* @param props
*/
private void afterLoad(Properties props) {
- props.putAll(fromInstallFile());
-
final Object[] keys = props.keySet().toArray(new Object[0]);
for (Object key : keys) {
String cleanKey = key.toString();
@@ -87,13 +96,6 @@ public class AesPreferencesConfigurer extends PreferencesPlaceholderConfigurer i
setIfEmpty(props, ConfigurableItem.CachePort, "6379");
propsHold = (Properties) props.clone();
-
- if (propsHold.getProperty("db.url").contains("jdbc:h2:")) {
- Application.LOG.warn("Using QuickMode with H2 database!");
- }
- if (Application.devMode()) {
- Application.LOG.info("System properties : " + propsHold);
- }
}
/**
@@ -125,13 +127,29 @@ public class AesPreferencesConfigurer extends PreferencesPlaceholderConfigurer i
}
}
+ // --
+
+ /**
+ * @throws IOException
+ */
+ public static void initApplicationProperties() throws IOException {
+ if (propsHold != null) return;
+ File file = ResourceUtils.getFile("classpath:application.properties");
+ try (InputStream is = new FileInputStream(file)) {
+ Properties props = new Properties();
+ props.load(is);
+ new AesPreferencesConfigurer().afterLoad(props);
+ }
+ }
+
/**
* 获取配置项
*
* @param name
* @return
*/
- public String getItem(String name) {
+ public static String getItem(String name) {
+ Assert.notNull(propsHold, "Rebuild unstarted");
return StringUtils.defaultIfBlank(propsHold.getProperty(name), null);
}
}
\ No newline at end of file
diff --git a/src/main/java/com/rebuild/server/helper/KVStorage.java b/src/main/java/com/rebuild/server/helper/KVStorage.java
index bdf6edf86..ed13638ac 100644
--- a/src/main/java/com/rebuild/server/helper/KVStorage.java
+++ b/src/main/java/com/rebuild/server/helper/KVStorage.java
@@ -21,7 +21,6 @@ package com.rebuild.server.helper;
import cn.devezhao.persist4j.Record;
import cn.devezhao.persist4j.engine.ID;
import com.rebuild.server.Application;
-import com.rebuild.server.helper.cache.CommonCache;
import com.rebuild.server.metadata.EntityHelper;
import com.rebuild.server.service.bizz.UserService;
import org.apache.commons.lang.StringUtils;
@@ -88,37 +87,38 @@ public class KVStorage {
* @return
*/
protected static String getValue(final String key, boolean reload, Object defaultValue) {
- if (!Application.serversReady()) {
- return defaultValue == null ? null : defaultValue.toString();
+ String value = null;
+ if (Application.serversReady()) {
+ value = Application.getCommonCache().get(key);
+ if (value != null && !reload) {
+ return value;
+ }
+
+ // 1. 首先从数据库
+ Object[] fromDb = Application.createQueryNoFilter(
+ "select value from SystemConfig where item = ?")
+ .setParameter(1, key)
+ .unique();
+ value = fromDb == null ? null : StringUtils.defaultIfBlank((String) fromDb[0], null);
}
- String cached = Application.getCommonCache().get(key);
- if (cached != null && !reload) {
- return cached;
- }
-
- // 1. 首先从数据库
- Object[] fromDb = Application.createQueryNoFilter(
- "select value from SystemConfig where item = ?")
- .setParameter(1, key)
- .unique();
- cached = fromDb == null ? null : StringUtils.defaultIfBlank((String) fromDb[0], null);
-
- // 2. 从配置文件加载
- if (cached == null) {
- cached = Application.getBean(AesPreferencesConfigurer.class).getItem(key);
+ // 2. 从配置文件/命令行加载
+ if (value == null) {
+ value = AesPreferencesConfigurer.getItem(key);
}
// 3. 默认值
- if (cached == null && defaultValue != null) {
- cached = defaultValue.toString();
+ if (value == null && defaultValue != null) {
+ value = defaultValue.toString();
}
- if (cached == null) {
- Application.getCommonCache().evict(key);
- } else {
- Application.getCommonCache().put(key, cached);
+ if (Application.serversReady()) {
+ if (value == null) {
+ Application.getCommonCache().evict(key);
+ } else {
+ Application.getCommonCache().put(key, value);
+ }
}
- return cached;
+ return value;
}
}
diff --git a/src/main/java/com/rebuild/server/helper/License.java b/src/main/java/com/rebuild/server/helper/License.java
index 1ec2d2dbc..aedf5f006 100644
--- a/src/main/java/com/rebuild/server/helper/License.java
+++ b/src/main/java/com/rebuild/server/helper/License.java
@@ -42,11 +42,15 @@ public final class License {
SN = SysConfiguration.get(ConfigurableItem.SN, true);
if (SN == null) {
try {
- JSONObject result = siteApi("api/authority/new?ver=" + Application.VER, false);
- if (result != null) {
- SN = result.getString("sn");
+ String apiUrl = String.format("https://getrebuild.com/api/authority/new?ver=%s&k=%s", Application.VER, OSA_KEY);
+ String result = CommonsUtils.get(apiUrl);
+
+ if (JSONUtils.wellFormat(result)) {
+ JSONObject o = JSON.parseObject(result);
+ SN = o.getString("sn");
SysConfiguration.set(ConfigurableItem.SN, SN);
}
+
} catch (Exception ignored) {
// UNCATCHABLE
}
diff --git a/src/main/java/com/rebuild/server/helper/setup/DatabaseBackup.java b/src/main/java/com/rebuild/server/helper/setup/DatabaseBackup.java
index 801896024..07104ce48 100644
--- a/src/main/java/com/rebuild/server/helper/setup/DatabaseBackup.java
+++ b/src/main/java/com/rebuild/server/helper/setup/DatabaseBackup.java
@@ -8,7 +8,6 @@ See LICENSE and COMMERCIAL in the project root for license information.
package com.rebuild.server.helper.setup;
import cn.devezhao.commons.CalendarUtils;
-import com.rebuild.server.Application;
import com.rebuild.server.helper.AesPreferencesConfigurer;
import com.rebuild.server.helper.ConfigurableItem;
import com.rebuild.server.helper.SysConfiguration;
@@ -41,9 +40,9 @@ public class DatabaseBackup {
* @throws IOException
*/
public File backup() throws IOException {
- String url = Application.getBean(AesPreferencesConfigurer.class).getItem("db.url");
- String user = Application.getBean(AesPreferencesConfigurer.class).getItem("db.user");
- String passwd = Application.getBean(AesPreferencesConfigurer.class).getItem("db.passwd");
+ String url = AesPreferencesConfigurer.getItem("db.url");
+ String user = AesPreferencesConfigurer.getItem("db.user");
+ String passwd = AesPreferencesConfigurer.getItem("db.passwd");
url = url.split("\\?")[0].split("//")[1];
String host = url.split(":")[0];
diff --git a/src/main/java/com/rebuild/server/helper/setup/InstallState.java b/src/main/java/com/rebuild/server/helper/setup/InstallState.java
index acf600312..eb6f002de 100644
--- a/src/main/java/com/rebuild/server/helper/setup/InstallState.java
+++ b/src/main/java/com/rebuild/server/helper/setup/InstallState.java
@@ -22,7 +22,7 @@ import java.io.File;
public interface InstallState {
/**
- * 状态文件位置 ~/.rebuild/.rebuild
+ * 安装文件位置 ~/.rebuild/.rebuild
*/
String INSTALL_FILE = ".rebuild";
diff --git a/src/main/java/com/rebuild/server/helper/setup/Installer.java b/src/main/java/com/rebuild/server/helper/setup/Installer.java
index e1612918a..96157c60d 100644
--- a/src/main/java/com/rebuild/server/helper/setup/Installer.java
+++ b/src/main/java/com/rebuild/server/helper/setup/Installer.java
@@ -307,7 +307,7 @@ public class Installer implements InstallState {
* @return
*/
public static boolean isUseH2() {
- String dbUrl = Application.getBean(AesPreferencesConfigurer.class).getItem("db.url");
+ String dbUrl = AesPreferencesConfigurer.getItem("db.url");
return dbUrl.startsWith("jdbc:h2:");
}
}
diff --git a/src/main/java/com/rebuild/utils/AES.java b/src/main/java/com/rebuild/utils/AES.java
index 2fadcac12..f594734ba 100644
--- a/src/main/java/com/rebuild/utils/AES.java
+++ b/src/main/java/com/rebuild/utils/AES.java
@@ -18,10 +18,11 @@ along with this program. If not, see .
package com.rebuild.utils;
-import com.rebuild.server.Application;
import com.rebuild.server.RebuildException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
@@ -33,7 +34,9 @@ import javax.crypto.spec.SecretKeySpec;
* @since 2017-1-2
*/
public class AES {
-
+
+ private static final Log LOG = LogFactory.getLog(AES.class);
+
/**
* @param input
* @return
@@ -58,7 +61,7 @@ public class AES {
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes());
} catch (Exception ex) {
- throw new RebuildException("Encrypt error : " + input, ex);
+ throw new RebuildException("Encrypting error : " + input, ex);
}
return new String(Base64.encodeBase64(crypted));
}
@@ -103,11 +106,24 @@ public class AES {
cipher.init(Cipher.DECRYPT_MODE, skey);
output = cipher.doFinal(Base64.decodeBase64(input));
} catch (Exception ex) {
- throw new RebuildException("Decrypt error : " + input, ex);
+ throw new RebuildException("Decrypting error : " + input, ex);
}
return new String(output);
}
-
+
+ /**
+ * @param input
+ * @return
+ */
+ public static String decryptNothrow(String input) {
+ try {
+ return decrypt(input);
+ } catch (RebuildException ex) {
+ LOG.warn("Decrypting error (Use blank input) : " + input);
+ return StringUtils.EMPTY;
+ }
+ }
+
/**
* 通过 `-Drbpass=KEY` 指定 AES 秘钥
*
diff --git a/src/main/webapp/admin/system-general.jsp b/src/main/webapp/admin/system-general.jsp
index 094bfec4e..2f69a71fc 100644
--- a/src/main/webapp/admin/system-general.jsp
+++ b/src/main/webapp/admin/system-general.jsp
@@ -83,7 +83,7 @@
${MarkWatermark ? "是" : "否"} |
- 数据库自动备份 每日0点备份到数据目录,请预留足够磁盘空间 |
+ 数据库自动备份 每日 0 点备份到数据目录,请预留足够磁盘空间 |
${DBBackupsEnable ? "是" : "否"} |
diff --git a/src/main/webapp/user/login.jsp b/src/main/webapp/user/login.jsp
index 556b93b7d..e495eeeeb 100644
--- a/src/main/webapp/user/login.jsp
+++ b/src/main/webapp/user/login.jsp
@@ -102,7 +102,7 @@
${bundle.lang('NoAccountYet')}
${bundle.lang('SignupNow')}
-