From f22a0633d08e38ac4bf92b5165a708e11b4d6598 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 03 Oct 2012 17:31:37 -0400 Subject: [PATCH] Implemented support for toggling User.canFork in Manager --- src/com/gitblit/ConfigUserService.java | 34 ++++++++++++++++++++++++++++++---- 1 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/com/gitblit/ConfigUserService.java b/src/com/gitblit/ConfigUserService.java index 66eb176..f526835 100644 --- a/src/com/gitblit/ConfigUserService.java +++ b/src/com/gitblit/ConfigUserService.java @@ -279,9 +279,10 @@ */ @Override public boolean updateUserModel(String username, UserModel model) { + UserModel originalUser = null; try { read(); - UserModel oldUser = users.remove(username.toLowerCase()); + originalUser = users.remove(username.toLowerCase()); users.put(model.username.toLowerCase(), model); // null check on "final" teams because JSON-sourced UserModel // can have a null teams object @@ -301,8 +302,8 @@ } // check for implicit team removal - if (oldUser != null) { - for (TeamModel team : oldUser.teams) { + if (originalUser != null) { + for (TeamModel team : originalUser.teams) { if (!model.isTeamMember(team.name)) { team.removeUser(username); } @@ -312,6 +313,13 @@ write(); return true; } catch (Throwable t) { + if (originalUser != null) { + // restore original user + users.put(originalUser.username.toLowerCase(), originalUser); + } else { + // drop attempted add + users.remove(model.username.toLowerCase()); + } logger.error(MessageFormat.format("Failed to update user model {0}!", model.username), t); } @@ -499,13 +507,21 @@ */ @Override public boolean updateTeamModel(String teamname, TeamModel model) { + TeamModel original = null; try { read(); - teams.remove(teamname.toLowerCase()); + original = teams.remove(teamname.toLowerCase()); teams.put(model.name.toLowerCase(), model); write(); return true; } catch (Throwable t) { + if (original != null) { + // restore original team + teams.put(original.name.toLowerCase(), original); + } else { + // drop attempted add + teams.remove(model.name.toLowerCase()); + } logger.error(MessageFormat.format("Failed to update team model {0}!", model.name), t); } return false; @@ -734,8 +750,17 @@ if (model.canAdmin) { roles.add(Constants.ADMIN_ROLE); } + if (model.canFork) { + roles.add(Constants.FORK_ROLE); + } if (model.excludeFromFederation) { roles.add(Constants.NOT_FEDERATED_ROLE); + } + 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); } config.setStringList(USER, model.username, ROLE, roles); @@ -836,6 +861,7 @@ 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.excludeFromFederation = roles.contains(Constants.NOT_FEDERATED_ROLE); // repository memberships -- Gitblit v1.9.1