From 67d4f89b0cddb3de05c20e08c20f1bea714c2a9e Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Mon, 18 Jun 2012 16:09:44 -0400 Subject: [PATCH] Added setting to control Groovy Grape folder (issue 91) --- src/com/gitblit/ConfigUserService.java | 126 ++++++++++++++++++++++++++++++++++++++---- 1 files changed, 114 insertions(+), 12 deletions(-) diff --git a/src/com/gitblit/ConfigUserService.java b/src/com/gitblit/ConfigUserService.java index 7e4600c..b97154f 100644 --- a/src/com/gitblit/ConfigUserService.java +++ b/src/com/gitblit/ConfigUserService.java @@ -35,6 +35,7 @@ import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; +import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.DeepCopier; import com.gitblit.utils.StringUtils; @@ -59,6 +60,10 @@ private static final String USER = "user"; private static final String PASSWORD = "password"; + + private static final String DISPLAYNAME = "displayName"; + + private static final String EMAILADDRESS = "emailAddress"; private static final String REPOSITORY = "repository"; @@ -81,6 +86,8 @@ private final Map<String, TeamModel> teams = new ConcurrentHashMap<String, TeamModel>(); private volatile long lastModified; + + private volatile boolean forceReload; public ConfigUserService(File realmFile) { this.realmFile = realmFile; @@ -96,6 +103,49 @@ public void setup(IStoredSettings settings) { } + /** + * Does the user service support changes to credentials? + * + * @return true or false + * @since 1.0.0 + */ + @Override + public boolean supportsCredentialChanges() { + return true; + } + + /** + * Does the user service support changes to user display name? + * + * @return true or false + * @since 1.0.0 + */ + @Override + public boolean supportsDisplayNameChanges() { + return true; + } + + /** + * Does the user service support changes to user email address? + * + * @return true or false + * @since 1.0.0 + */ + @Override + public boolean supportsEmailAddressChanges() { + return true; + } + + /** + * Does the user service support changes to team memberships? + * + * @return true or false + * @since 1.0.0 + */ + public boolean supportsTeamMembershipChanges() { + return true; + } + /** * Does the user service support cookie authentication? * @@ -175,6 +225,15 @@ return returnedUser; } + /** + * Logout a user. + * + * @param user + */ + @Override + public void logout(UserModel user) { + } + /** * Retrieve the user object for the specified username. * @@ -308,6 +367,21 @@ public List<String> getAllTeamNames() { read(); List<String> list = new ArrayList<String>(teams.keySet()); + Collections.sort(list); + return list; + } + + /** + * Returns the list of all teams available to the login service. + * + * @return list of all teams + * @since 0.8.0 + */ + @Override + public List<TeamModel> getAllTeams() { + read(); + List<TeamModel> list = new ArrayList<TeamModel>(teams.values()); + list = DeepCopier.copy(list); Collections.sort(list); return list; } @@ -478,6 +552,20 @@ Collections.sort(list); return list; } + + /** + * Returns the list of all users available to the login service. + * + * @return list of all usernames + */ + @Override + public List<UserModel> getAllUsers() { + read(); + List<UserModel> list = new ArrayList<UserModel>(users.values()); + list = DeepCopier.copy(list); + Collections.sort(list); + return list; + } /** * Returns the list of all users who are allowed to bypass the access @@ -624,7 +712,15 @@ // write users for (UserModel model : users.values()) { - config.setString(USER, model.username, PASSWORD, model.password); + if (!StringUtils.isEmpty(model.password)) { + config.setString(USER, model.username, PASSWORD, model.password); + } + if (!StringUtils.isEmpty(model.displayName)) { + config.setString(USER, model.username, DISPLAYNAME, model.displayName); + } + if (!StringUtils.isEmpty(model.emailAddress)) { + config.setString(USER, model.username, EMAILADDRESS, model.emailAddress); + } // user roles List<String> roles = new ArrayList<String>(); @@ -639,7 +735,7 @@ // repository memberships // null check on "final" repositories because JSON-sourced UserModel // can have a null repositories object - if (model.repositories != null) { + if (!ArrayUtils.isEmpty(model.repositories)) { config.setStringList(USER, model.username, REPOSITORY, new ArrayList<String>( model.repositories)); } @@ -649,38 +745,41 @@ for (TeamModel model : teams.values()) { // null check on "final" repositories because JSON-sourced TeamModel // can have a null repositories object - if (model.repositories != null) { + if (!ArrayUtils.isEmpty(model.repositories)) { config.setStringList(TEAM, model.name, REPOSITORY, new ArrayList<String>( model.repositories)); } // null check on "final" users because JSON-sourced TeamModel // can have a null users object - if (model.users != null) { + if (!ArrayUtils.isEmpty(model.users)) { config.setStringList(TEAM, model.name, USER, new ArrayList<String>(model.users)); } // null check on "final" mailing lists because JSON-sourced // TeamModel can have a null users object - if (model.mailingLists != null) { + if (!ArrayUtils.isEmpty(model.mailingLists)) { config.setStringList(TEAM, model.name, MAILINGLIST, new ArrayList<String>( model.mailingLists)); } // null check on "final" preReceiveScripts because JSON-sourced // TeamModel can have a null preReceiveScripts object - if (model.preReceiveScripts != null) { + if (!ArrayUtils.isEmpty(model.preReceiveScripts)) { config.setStringList(TEAM, model.name, PRERECEIVE, model.preReceiveScripts); } // null check on "final" postReceiveScripts because JSON-sourced // TeamModel can have a null postReceiveScripts object - if (model.postReceiveScripts != null) { + if (!ArrayUtils.isEmpty(model.postReceiveScripts)) { config.setStringList(TEAM, model.name, POSTRECEIVE, model.postReceiveScripts); } } config.save(); + // manually set the forceReload flag because not all JVMs support real + // millisecond resolution of lastModified. (issue-55) + forceReload = true; // If the write is successful, delete the current file and rename // the temporary copy to the original filename. @@ -705,7 +804,8 @@ * Reads the realm file and rebuilds the in-memory lookup tables. */ protected synchronized void read() { - if (realmFile.exists() && (realmFile.lastModified() > lastModified)) { + if (realmFile.exists() && (forceReload || (realmFile.lastModified() != lastModified))) { + forceReload = false; lastModified = realmFile.lastModified(); users.clear(); cookies.clear(); @@ -716,8 +816,10 @@ config.load(); Set<String> usernames = config.getSubsections(USER); for (String username : usernames) { - UserModel user = new UserModel(username); - user.password = config.getString(USER, username, PASSWORD); + UserModel user = new UserModel(username.toLowerCase()); + user.password = config.getString(USER, username, PASSWORD); + user.displayName = config.getString(USER, username, DISPLAYNAME); + user.emailAddress = config.getString(USER, username, EMAILADDRESS); // user roles Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList( @@ -733,8 +835,8 @@ } // update cache - users.put(username, user); - cookies.put(StringUtils.getSHA1(username + user.password), user); + users.put(user.username, user); + cookies.put(StringUtils.getSHA1(user.username + user.password), user); } // load the teams -- Gitblit v1.9.1