From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Sat, 30 Apr 2016 04:19:14 -0400
Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates

---
 src/main/java/com/gitblit/ConfigUserService.java |   94 +++++++++++++++++++++++++++++++----------------
 1 files changed, 62 insertions(+), 32 deletions(-)

diff --git a/src/main/java/com/gitblit/ConfigUserService.java b/src/main/java/com/gitblit/ConfigUserService.java
index 19e4736..6d7230f 100644
--- a/src/main/java/com/gitblit/ConfigUserService.java
+++ b/src/main/java/com/gitblit/ConfigUserService.java
@@ -24,6 +24,7 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -36,6 +37,8 @@
 
 import com.gitblit.Constants.AccessPermission;
 import com.gitblit.Constants.AccountType;
+import com.gitblit.Constants.Role;
+import com.gitblit.Constants.Transport;
 import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;
@@ -96,7 +99,13 @@
 
 	private static final String LOCALE = "locale";
 
+	private static final String EMAILONMYTICKETCHANGES = "emailMeOnMyTicketChanges";
+
+	private static final String TRANSPORT = "transport";
+
 	private static final String ACCOUNTTYPE = "accountType";
+
+	private static final String DISABLED = "disabled";
 
 	private final File realmFile;
 
@@ -133,7 +142,7 @@
 	 * @return cookie value
 	 */
 	@Override
-	public String getCookie(UserModel model) {
+	public synchronized String getCookie(UserModel model) {
 		if (!StringUtils.isEmpty(model.cookie)) {
 			return model.cookie;
 		}
@@ -195,7 +204,7 @@
 	 * @return true if update is successful
 	 */
 	@Override
-	public boolean updateUserModel(UserModel model) {
+	public synchronized boolean updateUserModel(UserModel model) {
 		return updateUserModel(model.username, model);
 	}
 
@@ -272,6 +281,9 @@
 			}
 			read();
 			originalUser = users.remove(username.toLowerCase());
+			if (originalUser != null) {
+				cookies.remove(originalUser.cookie);
+			}
 			users.put(model.username.toLowerCase(), model);
 			// null check on "final" teams because JSON-sourced UserModel
 			// can have a null teams object
@@ -322,7 +334,7 @@
 	 * @return true if successful
 	 */
 	@Override
-	public boolean deleteUserModel(UserModel model) {
+	public synchronized boolean deleteUserModel(UserModel model) {
 		return deleteUser(model.username);
 	}
 
@@ -369,7 +381,7 @@
 	 * @since 0.8.0
 	 */
 	@Override
-	public List<String> getAllTeamNames() {
+	public synchronized List<String> getAllTeamNames() {
 		read();
 		List<String> list = new ArrayList<String>(teams.keySet());
 		Collections.sort(list);
@@ -444,7 +456,7 @@
 	 * @since 0.8.0
 	 */
 	@Override
-	public boolean updateTeamModel(TeamModel model) {
+	public synchronized boolean updateTeamModel(TeamModel model) {
 		return updateTeamModel(model.name, model);
 	}
 
@@ -456,7 +468,7 @@
 	 * @since 1.2.0
 	 */
 	@Override
-	public boolean updateTeamModels(Collection<TeamModel> models) {
+	public synchronized boolean updateTeamModels(Collection<TeamModel> models) {
 		try {
 			read();
 			for (TeamModel team : models) {
@@ -482,7 +494,7 @@
 	 * @since 0.8.0
 	 */
 	@Override
-	public boolean updateTeamModel(String teamname, TeamModel model) {
+	public synchronized boolean updateTeamModel(String teamname, TeamModel model) {
 		TeamModel original = null;
 		try {
 			read();
@@ -511,7 +523,7 @@
 	 * @since 0.8.0
 	 */
 	@Override
-	public boolean deleteTeamModel(TeamModel model) {
+	public synchronized boolean deleteTeamModel(TeamModel model) {
 		return deleteTeam(model.name);
 	}
 
@@ -523,7 +535,7 @@
 	 * @since 0.8.0
 	 */
 	@Override
-	public boolean deleteTeam(String teamname) {
+	public synchronized boolean deleteTeam(String teamname) {
 		try {
 			// Read realm file
 			read();
@@ -542,7 +554,7 @@
 	 * @return list of all usernames
 	 */
 	@Override
-	public List<String> getAllUsernames() {
+	public synchronized List<String> getAllUsernames() {
 		read();
 		List<String> list = new ArrayList<String>(users.keySet());
 		Collections.sort(list);
@@ -698,31 +710,47 @@
 			if (!StringUtils.isEmpty(model.countryCode)) {
 				config.setString(USER, model.username, COUNTRYCODE, model.countryCode);
 			}
+			if (model.disabled) {
+				config.setBoolean(USER, model.username, DISABLED, true);
+			}
 			if (model.getPreferences() != null) {
-				if (!StringUtils.isEmpty(model.getPreferences().locale)) {
-					config.setString(USER, model.username, LOCALE, model.getPreferences().locale);
+				Locale locale = model.getPreferences().getLocale();
+				if (locale != null) {
+					String val;
+					if (StringUtils.isEmpty(locale.getCountry())) {
+						val = locale.getLanguage();
+					} else {
+						val = locale.getLanguage() + "_" + locale.getCountry();
+					}
+					config.setString(USER, model.username, LOCALE, val);
+				}
+
+				config.setBoolean(USER, model.username, EMAILONMYTICKETCHANGES, model.getPreferences().isEmailMeOnMyTicketChanges());
+
+				if (model.getPreferences().getTransport() != null) {
+					config.setString(USER, model.username, TRANSPORT, model.getPreferences().getTransport().name());
 				}
 			}
 
 			// user roles
 			List<String> roles = new ArrayList<String>();
 			if (model.canAdmin) {
-				roles.add(Constants.ADMIN_ROLE);
+				roles.add(Role.ADMIN.getRole());
 			}
 			if (model.canFork) {
-				roles.add(Constants.FORK_ROLE);
+				roles.add(Role.FORK.getRole());
 			}
 			if (model.canCreate) {
-				roles.add(Constants.CREATE_ROLE);
+				roles.add(Role.CREATE.getRole());
 			}
 			if (model.excludeFromFederation) {
-				roles.add(Constants.NOT_FEDERATED_ROLE);
+				roles.add(Role.NOT_FEDERATED.getRole());
 			}
 			if (roles.size() == 0) {
 				// we do this to ensure that user record with no password
 				// is written.  otherwise, StoredConfig optimizes that account
 				// away. :(
-				roles.add(Constants.NO_ROLE);
+				roles.add(Role.NONE.getRole());
 			}
 			config.setStringList(USER, model.username, ROLE, roles);
 
@@ -751,18 +779,18 @@
 			// team roles
 			List<String> roles = new ArrayList<String>();
 			if (model.canAdmin) {
-				roles.add(Constants.ADMIN_ROLE);
+				roles.add(Role.ADMIN.getRole());
 			}
 			if (model.canFork) {
-				roles.add(Constants.FORK_ROLE);
+				roles.add(Role.FORK.getRole());
 			}
 			if (model.canCreate) {
-				roles.add(Constants.CREATE_ROLE);
+				roles.add(Role.CREATE.getRole());
 			}
 			if (roles.size() == 0) {
 				// we do this to ensure that team record is written.
 				// Otherwise, StoredConfig might optimizes that record away.
-				roles.add(Constants.NO_ROLE);
+				roles.add(Role.NONE.getRole());
 			}
 			config.setStringList(TEAM, model.name, ROLE, roles);
 			if (model.accountType != null) {
@@ -862,27 +890,29 @@
 					user.displayName = config.getString(USER, username, DISPLAYNAME);
 					user.emailAddress = config.getString(USER, username, EMAILADDRESS);
 					user.accountType = AccountType.fromString(config.getString(USER, username, ACCOUNTTYPE));
-					if (Constants.EXTERNAL_ACCOUNT.equals(user.password) && user.accountType.isLocal()) {
-						user.accountType = AccountType.EXTERNAL;
-					}
+					user.disabled = config.getBoolean(USER, username, DISABLED, false);
 					user.organizationalUnit = config.getString(USER, username, ORGANIZATIONALUNIT);
 					user.organization = config.getString(USER, username, ORGANIZATION);
 					user.locality = config.getString(USER, username, LOCALITY);
 					user.stateProvince = config.getString(USER, username, STATEPROVINCE);
 					user.countryCode = config.getString(USER, username, COUNTRYCODE);
 					user.cookie = config.getString(USER, username, COOKIE);
-					user.getPreferences().locale = config.getString(USER, username, LOCALE);
 					if (StringUtils.isEmpty(user.cookie) && !StringUtils.isEmpty(user.password)) {
 						user.cookie = StringUtils.getSHA1(user.username + user.password);
 					}
 
+					// preferences
+					user.getPreferences().setLocale(config.getString(USER, username, LOCALE));
+					user.getPreferences().setEmailMeOnMyTicketChanges(config.getBoolean(USER, username, EMAILONMYTICKETCHANGES, true));
+					user.getPreferences().setTransport(Transport.fromString(config.getString(USER, username, TRANSPORT)));
+
 					// user roles
 					Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList(
 							USER, username, ROLE)));
-					user.canAdmin = roles.contains(Constants.ADMIN_ROLE);
-					user.canFork = roles.contains(Constants.FORK_ROLE);
-					user.canCreate = roles.contains(Constants.CREATE_ROLE);
-					user.excludeFromFederation = roles.contains(Constants.NOT_FEDERATED_ROLE);
+					user.canAdmin = roles.contains(Role.ADMIN.getRole());
+					user.canFork = roles.contains(Role.FORK.getRole());
+					user.canCreate = roles.contains(Role.CREATE.getRole());
+					user.excludeFromFederation = roles.contains(Role.NOT_FEDERATED.getRole());
 
 					// repository memberships
 					if (!user.canAdmin) {
@@ -915,9 +945,9 @@
 					TeamModel team = new TeamModel(teamname);
 					Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList(
 							TEAM, teamname, ROLE)));
-					team.canAdmin = roles.contains(Constants.ADMIN_ROLE);
-					team.canFork = roles.contains(Constants.FORK_ROLE);
-					team.canCreate = roles.contains(Constants.CREATE_ROLE);
+					team.canAdmin = roles.contains(Role.ADMIN.getRole());
+					team.canFork = roles.contains(Role.FORK.getRole());
+					team.canCreate = roles.contains(Role.CREATE.getRole());
 					team.accountType = AccountType.fromString(config.getString(TEAM, teamname, ACCOUNTTYPE));
 
 					if (!team.canAdmin) {

--
Gitblit v1.9.1