summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/gitblit/FileSettings.java22
-rw-r--r--src/com/gitblit/GitBlit.java8
-rw-r--r--src/com/gitblit/IStoredSettings.java11
-rw-r--r--src/com/gitblit/RpcServlet.java2
-rw-r--r--src/com/gitblit/WebXmlSettings.java47
-rw-r--r--src/com/gitblit/utils/RpcUtils.java3
6 files changed, 85 insertions, 8 deletions
diff --git a/src/com/gitblit/FileSettings.java b/src/com/gitblit/FileSettings.java
index 56aac8b7..61100587 100644
--- a/src/com/gitblit/FileSettings.java
+++ b/src/com/gitblit/FileSettings.java
@@ -18,7 +18,11 @@ package com.gitblit;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.util.Map;
import java.util.Properties;
+import java.util.regex.Pattern;
+
+import com.gitblit.utils.FileUtils;
/**
* Dynamically loads and reloads a properties file by keeping track of the last
@@ -75,6 +79,24 @@ public class FileSettings extends IStoredSettings {
}
/**
+ * Updates the specified settings in the settings file.
+ */
+ public synchronized boolean saveSettings(Map<String, String> settings) {
+ String content = FileUtils.readContent(propertiesFile, "\n");
+ for (Map.Entry<String, String> setting:settings.entrySet()) {
+ String regex = "(?m)^(" + regExEscape(setting.getKey()) + "\\s*+=\\s*+)"
+ + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";
+ content = content.replaceAll(regex, setting.getKey() + " = " + setting.getValue());
+ }
+ FileUtils.writeContent(propertiesFile, content);
+ return true;
+ }
+
+ private String regExEscape(String input) {
+ return input.replace(".", "\\.");
+ }
+
+ /**
* @return the last modification date of the properties file
*/
protected long lastModified() {
diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index ffef94a7..8386d2d4 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/src/com/gitblit/GitBlit.java
@@ -25,7 +25,6 @@ import java.lang.reflect.Field;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -253,9 +252,8 @@ public class GitBlit implements ServletContextListener {
* @param settings
* @return true if the update succeeded
*/
- public boolean updateSettings(Collection<SettingModel> settings) {
- // TODO update the settings
- return false;
+ public boolean updateSettings(Map<String, String> updatedSettings) {
+ return settings.saveSettings(updatedSettings);
}
public ServerStatus getStatus() {
@@ -1326,7 +1324,7 @@ public class GitBlit implements ServletContextListener {
// Read bundled Gitblit properties to extract setting descriptions.
// This copy is pristine and only used for populating the setting
// models map.
- InputStream is = servletContext.getResourceAsStream("/WEB-INF/gitblit.properties");
+ InputStream is = servletContext.getResourceAsStream("/WEB-INF/reference.properties");
BufferedReader propertiesReader = new BufferedReader(new InputStreamReader(is));
StringBuilder description = new StringBuilder();
SettingModel setting = new SettingModel();
diff --git a/src/com/gitblit/IStoredSettings.java b/src/com/gitblit/IStoredSettings.java
index a376c81a..2d8b6055 100644
--- a/src/com/gitblit/IStoredSettings.java
+++ b/src/com/gitblit/IStoredSettings.java
@@ -17,6 +17,7 @@ package com.gitblit;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import org.slf4j.Logger;
@@ -194,4 +195,14 @@ public abstract class IStoredSettings {
public void overrideSetting(String key, String value) {
overrides.put(key, value);
}
+
+ /**
+ * Updates the values for the specified keys and persists the entire
+ * configuration file.
+ *
+ * @param map
+ * of key, value pairs
+ * @return true if successful
+ */
+ public abstract boolean saveSettings(Map<String, String> updatedSettings);
} \ No newline at end of file
diff --git a/src/com/gitblit/RpcServlet.java b/src/com/gitblit/RpcServlet.java
index 7cf3a598..1136692a 100644
--- a/src/com/gitblit/RpcServlet.java
+++ b/src/com/gitblit/RpcServlet.java
@@ -191,7 +191,7 @@ public class RpcServlet extends JsonServlet {
} else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) {
// update settings on the server
if (GitBlit.getBoolean(Keys.web.enableRpcAdministration, false)) {
- Collection<SettingModel> settings = deserialize(request, response,
+ Map<String, String> settings = deserialize(request, response,
RpcUtils.SETTINGS_TYPE);
GitBlit.self().updateSettings(settings);
} else {
diff --git a/src/com/gitblit/WebXmlSettings.java b/src/com/gitblit/WebXmlSettings.java
index 4b0358d2..055c7d35 100644
--- a/src/com/gitblit/WebXmlSettings.java
+++ b/src/com/gitblit/WebXmlSettings.java
@@ -15,7 +15,13 @@
*/
package com.gitblit;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.util.Enumeration;
+import java.util.Map;
import java.util.Properties;
import javax.servlet.ServletContext;
@@ -32,8 +38,11 @@ public class WebXmlSettings extends IStoredSettings {
private final Properties properties = new Properties();
+ private final ServletContext context;
+
public WebXmlSettings(ServletContext context) {
super(WebXmlSettings.class);
+ this.context = context;
Enumeration<?> keys = context.getInitParameterNames();
while (keys.hasMoreElements()) {
String key = keys.nextElement().toString();
@@ -41,6 +50,17 @@ public class WebXmlSettings extends IStoredSettings {
properties.put(key, decodeValue(value));
logger.debug(key + "=" + properties.getProperty(key));
}
+ // apply any web-configured overrides
+ File file = new File(context.getRealPath("/WEB-INF/web.properties"));
+ if (file.exists()) {
+ try {
+ InputStream is = new FileInputStream(file);
+ properties.load(is);
+ is.close();
+ } catch (Throwable t) {
+ logger.error("Failed to load web.properties setting overrides", t);
+ }
+ }
}
private String decodeValue(String value) {
@@ -54,6 +74,33 @@ public class WebXmlSettings extends IStoredSettings {
}
@Override
+ public synchronized boolean saveSettings(Map<String, String> settings) {
+ try {
+ Properties props = new Properties();
+ // load pre-existing web-configuration
+ File file = new File(context.getRealPath("/WEB-INF/web.properties"));
+ if (file.exists()) {
+ InputStream is = new FileInputStream(file);
+ props.load(is);
+ is.close();
+ }
+
+ // put all new settings and persist
+ props.putAll(settings);
+ OutputStream os = new FileOutputStream(file);
+ props.store(os, null);
+ os.close();
+
+ // override current runtime settings
+ properties.putAll(settings);
+ return true;
+ } catch (Throwable t) {
+ logger.error("Failed to save settings!", t);
+ }
+ return false;
+ }
+
+ @Override
public String toString() {
return "WEB.XML";
}
diff --git a/src/com/gitblit/utils/RpcUtils.java b/src/com/gitblit/utils/RpcUtils.java
index 6572cd9d..e5841518 100644
--- a/src/com/gitblit/utils/RpcUtils.java
+++ b/src/com/gitblit/utils/RpcUtils.java
@@ -30,7 +30,6 @@ import com.gitblit.models.FederationSet;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.ServerSettings;
import com.gitblit.models.ServerStatus;
-import com.gitblit.models.SettingModel;
import com.gitblit.models.UserModel;
import com.google.gson.reflect.TypeToken;
@@ -45,7 +44,7 @@ public class RpcUtils {
public static final Type NAMES_TYPE = new TypeToken<Collection<String>>() {
}.getType();
- public static final Type SETTINGS_TYPE = new TypeToken<Collection<SettingModel>>() {
+ public static final Type SETTINGS_TYPE = new TypeToken<Map<String, String>>() {
}.getType();
private static final Type REPOSITORIES_TYPE = new TypeToken<Map<String, RepositoryModel>>() {