Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/controller/ConfigController.java =================================================================== diff -u -rf2ad75cef0c507a64877942631fee13efbc6ed50 -r78b847b4a5962e1c3d0167cfdc0f95137be57e6a --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/controller/ConfigController.java (.../ConfigController.java) (revision f2ad75cef0c507a64877942631fee13efbc6ed50) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/controller/ConfigController.java (.../ConfigController.java) (revision 78b847b4a5962e1c3d0167cfdc0f95137be57e6a) @@ -26,13 +26,19 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; import org.lamsfoundation.lams.admin.web.form.ConfigForm; import org.lamsfoundation.lams.config.ConfigurationItem; +import org.lamsfoundation.lams.logevent.LogEvent; +import org.lamsfoundation.lams.logevent.service.ILogEventService; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.LanguageUtil; import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; @@ -47,19 +53,22 @@ */ @Controller public class ConfigController { - + @Autowired - private Configuration configurationService; + private Configuration configuration; @Autowired @Qualifier("adminMessageService") private MessageService messageService; + @Autowired + private ILogEventService logEventService; + @RequestMapping(path = "/config") public String unspecified(@ModelAttribute ConfigForm configForm, HttpServletRequest request) throws Exception { - request.setAttribute("config", configurationService.arrangeItems(Configuration.ITEMS_NON_LDAP)); + request.setAttribute("config", configuration.arrangeItems(Configuration.ITEMS_NON_LDAP)); request.setAttribute("countryCodes", LanguageUtil.getCountryCodes(false)); - Map smtpAuthTypes = new LinkedHashMap(); + Map smtpAuthTypes = new LinkedHashMap<>(); smtpAuthTypes.put("none", "None"); smtpAuthTypes.put("starttls", "STARTTLS"); smtpAuthTypes.put("ssl", "SSL"); @@ -76,8 +85,13 @@ String errorForward = "config/editconfig"; + StringBuilder changeLog = new StringBuilder(); + Map currentConfig = Configuration.getAll(); + for (int i = 0; i < keys.length; i++) { - ConfigurationItem item = configurationService.getConfigItemByKey(keys[i]); + String key = keys[i]; + String newValue = values[i]; + ConfigurationItem item = currentConfig.get(key); if (item != null) { // return to ldap page if that's where we came from @@ -88,7 +102,7 @@ if (item.getRequired()) { if (!(values[i] != null && values[i].length() > 0)) { request.setAttribute("error", getRequiredError(item.getDescriptionKey())); - request.setAttribute("config", configurationService.arrangeItems(Configuration.ITEMS_NON_LDAP)); + request.setAttribute("config", configuration.arrangeItems(Configuration.ITEMS_NON_LDAP)); return errorForward; } } @@ -98,15 +112,30 @@ Long.parseLong(values[i]); } catch (NumberFormatException e) { request.setAttribute("error", getNumericError(item.getDescriptionKey())); - request.setAttribute("config", configurationService.arrangeItems(Configuration.ITEMS_NON_LDAP)); + request.setAttribute("config", configuration.arrangeItems(Configuration.ITEMS_NON_LDAP)); return errorForward; } } - Configuration.updateItem(keys[i], values[i]); + + String currentValue = item.getValue(); + if (!StringUtils.equals(currentValue, newValue)) { + // prepare log string of what config item changed from which value to what + changeLog.append("\"").append(messageService.getMessage(item.getDescriptionKey())) + .append("\" from \"").append(currentValue).append("\" to \"").append(newValue) + .append("\", "); + } + Configuration.updateItem(key, newValue); } } - configurationService.persistUpdate(); + configuration.persistUpdate(); + if (changeLog.length() > 0) { + // if there were any changes made, log it + String changeLogString = changeLog.insert(0, "Configuration changed: ").substring(0, + changeLog.length() - 2); + logEventService.logEvent(LogEvent.TYPE_CONFIG_CHANGE, getUserId(), null, null, null, changeLogString); + } + Configuration.refreshCache(); return "redirect:/sysadminstart.do"; @@ -124,4 +153,9 @@ return messageService.getMessage("error.numeric", args); } -} + private Integer getUserId() { + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + return user != null ? user.getUserID() : null; + } +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190226.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190226.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190226.sql (revision 78b847b4a5962e1c3d0167cfdc0f95137be57e6a) @@ -0,0 +1,16 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +----------------------Put all sql statements below here------------------------- + +-- LDEV-4778 Add new event type for sysadmin configuration change + +INSERT INTO lams_log_event_type VALUES (26, 'TYPE_CONFIG_CHANGE', 'SECURITY'); + + +----------------------Put all sql statements above here------------------------- + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/logevent/LogEvent.java =================================================================== diff -u -r7f420dcfde4984d32bb8acedde964ca613c1cb6c -r78b847b4a5962e1c3d0167cfdc0f95137be57e6a --- lams_common/src/java/org/lamsfoundation/lams/logevent/LogEvent.java (.../LogEvent.java) (revision 7f420dcfde4984d32bb8acedde964ca613c1cb6c) +++ lams_common/src/java/org/lamsfoundation/lams/logevent/LogEvent.java (.../LogEvent.java) (revision 78b847b4a5962e1c3d0167cfdc0f95137be57e6a) @@ -77,6 +77,7 @@ public static final int TYPE_TOOL_MARK_RELEASED = 23; // Mark released in tool public static final int TYPE_LOGIN = 24; // user logged in public static final int TYPE_LOGOUT = 25; // user logged out + public static final int TYPE_CONFIG_CHANGE = 26; // user logged out /** *************************************************************** */ Index: lams_common/src/java/org/lamsfoundation/lams/util/Configuration.java =================================================================== diff -u -r3e7ee4e7075a1f360de05a43f6630ed3d8b95c6b -r78b847b4a5962e1c3d0167cfdc0f95137be57e6a --- lams_common/src/java/org/lamsfoundation/lams/util/Configuration.java (.../Configuration.java) (revision 3e7ee4e7075a1f360de05a43f6630ed3d8b95c6b) +++ lams_common/src/java/org/lamsfoundation/lams/util/Configuration.java (.../Configuration.java) (revision 78b847b4a5962e1c3d0167cfdc0f95137be57e6a) @@ -91,7 +91,7 @@ public static boolean getAsBoolean(String key) { if ((Configuration.items != null) && (Configuration.items.get(key) != null)) { if (Configuration.getItemValue(Configuration.items.get(key)) != null) { - return new Boolean(Configuration.getItemValue(Configuration.items.get(key))).booleanValue(); + return Boolean.valueOf(Configuration.getItemValue(Configuration.items.get(key))); } } return false; @@ -101,7 +101,7 @@ if ((Configuration.items != null) && (Configuration.items.get(key) != null)) { // could throw NumberFormatException which is a RuntimeException if (Configuration.getItemValue(Configuration.items.get(key)) != null) { - return new Integer(Configuration.getItemValue(Configuration.items.get(key))).intValue(); + return Integer.valueOf(Configuration.getItemValue(Configuration.items.get(key))); } } return -1; @@ -262,7 +262,7 @@ */ public HashMap> arrangeItems(int filter) { List originalList = Configuration.getAllItems(); - HashMap> groupedList = new HashMap>(); + HashMap> groupedList = new HashMap<>(); for (int i = 0; i < originalList.size(); i++) { ConfigurationItem item = originalList.get(i); @@ -300,10 +300,8 @@ } public ConfigurationItem getConfigItemByKey(String key) { - if ((Configuration.items != null) && (Configuration.items.get(key) != null)) { - if (Configuration.items.get(key) != null) { - return Configuration.items.get(key); - } + if (Configuration.items != null) { + return Configuration.items.get(key); } return null; }