From f5fa7958b07d0e585542b712b13f7ad9b47a8be9 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 23 Dec 2011 08:28:15 -0500 Subject: [PATCH] Improved logging of GitblitUserService --- src/com/gitblit/GitBlit.java | 209 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 186 insertions(+), 23 deletions(-) diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java index 80550f4..c818dd5 100644 --- a/src/com/gitblit/GitBlit.java +++ b/src/com/gitblit/GitBlit.java @@ -25,11 +25,14 @@ 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.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -69,6 +72,7 @@ import com.gitblit.models.ServerSettings; import com.gitblit.models.ServerStatus; import com.gitblit.models.SettingModel; +import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; import com.gitblit.utils.ByteFormat; import com.gitblit.utils.FederationUtils; @@ -295,6 +299,16 @@ } /** + * Returns the path of the Groovy folder. This method checks to see if + * Gitblit is running on a cloud service and may return an adjusted path. + * + * @return the Groovy scripts folder path + */ + public static File getGroovyScriptsFolder() { + return getFileOrFolder(Keys.groovy.scriptsFolder, "groovy"); + } + + /** * Updates the list of server settings. * * @param settings @@ -511,6 +525,85 @@ } /** + * Returns the list of available teams that a user or repository may be + * assigned to. + * + * @return the list of teams + */ + public List<String> getAllTeamnames() { + List<String> teams = new ArrayList<String>(userService.getAllTeamNames()); + Collections.sort(teams); + return teams; + } + + /** + * Returns the TeamModel object for the specified name. + * + * @param teamname + * @return a TeamModel object or null + */ + public TeamModel getTeamModel(String teamname) { + return userService.getTeamModel(teamname); + } + + /** + * Returns the list of all teams who are allowed to bypass the access + * restriction placed on the specified repository. + * + * @see IUserService.getTeamnamesForRepositoryRole(String) + * @param repository + * @return list of all teamnames that can bypass the access restriction + */ + public List<String> getRepositoryTeams(RepositoryModel repository) { + return userService.getTeamnamesForRepositoryRole(repository.name); + } + + /** + * Sets the list of all uses who are allowed to bypass the access + * restriction placed on the specified repository. + * + * @see IUserService.setTeamnamesForRepositoryRole(String, List<String>) + * @param repository + * @param teamnames + * @return true if successful + */ + public boolean setRepositoryTeams(RepositoryModel repository, List<String> repositoryTeams) { + return userService.setTeamnamesForRepositoryRole(repository.name, repositoryTeams); + } + + /** + * Updates the TeamModel object for the specified name. + * + * @param teamname + * @param team + * @param isCreate + */ + public void updateTeamModel(String teamname, TeamModel team, boolean isCreate) + throws GitBlitException { + if (!teamname.equalsIgnoreCase(team.name)) { + if (userService.getTeamModel(team.name) != null) { + throw new GitBlitException(MessageFormat.format( + "Failed to rename ''{0}'' because ''{1}'' already exists.", teamname, + team.name)); + } + } + if (!userService.updateTeamModel(teamname, team)) { + throw new GitBlitException(isCreate ? "Failed to add team!" : "Failed to update team!"); + } + } + + /** + * Delete the team object with the specified teamname + * + * @see IUserService.deleteTeam(String) + * @param teamname + * @return true if successful + */ + public boolean deleteTeam(String teamname) { + return userService.deleteTeam(teamname); + } + + /** * Clears all the cached data for the specified repository. * * @param repositoryName @@ -647,6 +740,12 @@ "gitblit", null, "federationSets"))); model.isFederated = getConfig(config, "isFederated", false); model.origin = config.getString("remote", "origin", "url"); + model.preReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList( + "gitblit", null, "preReceiveScript"))); + model.postReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList( + "gitblit", null, "postReceiveScript"))); + model.mailingLists = new ArrayList<String>(Arrays.asList(config.getStringList( + "gitblit", null, "mailingList"))); } r.close(); return model; @@ -866,6 +965,16 @@ config.setString("gitblit", null, "federationStrategy", repository.federationStrategy.name()); config.setBoolean("gitblit", null, "isFederated", repository.isFederated); + if (repository.preReceiveScripts != null) { + config.setStringList("gitblit", null, "preReceiveScript", repository.preReceiveScripts); + } + if (repository.postReceiveScripts != null) { + config.setStringList("gitblit", null, "postReceiveScript", + repository.postReceiveScripts); + } + if (repository.mailingLists != null) { + config.setStringList("gitblit", null, "mailingList", repository.mailingLists); + } try { config.save(); } catch (IOException e) { @@ -1115,6 +1224,7 @@ case PULL_REPOSITORIES: return token.equals(all) || token.equals(unr) || token.equals(jur); case PULL_USERS: + case PULL_TEAMS: return token.equals(all) || token.equals(unr); case PULL_SETTINGS: return token.equals(all); @@ -1329,14 +1439,87 @@ } /** + * Returns the list of all available Groovy push hook scripts that are not + * already specified globally for all repositories. Script files must have + * .groovy extension + * + * @return list of available hook scripts + */ + public List<String> getAvailableScripts() { + File groovyFolder = getGroovyScriptsFolder(); + File[] files = groovyFolder.listFiles(new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.isFile() && pathname.getName().endsWith(".groovy"); + } + }); + + Set<String> globals = new HashSet<String>(); + String[] keys = { Keys.groovy.preReceiveScripts, Keys.groovy.postReceiveScripts }; + for (String key : keys) { + for (String script : getStrings(key)) { + if (script.endsWith(".groovy")) { + globals.add(script.substring(0, script.lastIndexOf('.'))); + } else { + globals.add(script); + } + } + } + + // create list of available scripts by excluding scripts that are + // globally specified + List<String> scripts = new ArrayList<String>(); + if (files != null) { + for (File file : files) { + String script = file.getName().substring(0, file.getName().lastIndexOf('.')); + if (!globals.contains(script)) { + scripts.add(script); + } + } + } + return scripts; + } + + /** * Notify the administrators by email. * * @param subject * @param message */ - public void notifyAdministrators(String subject, String message) { + public void sendMailToAdministrators(String subject, String message) { try { Message mail = mailExecutor.createMessageForAdministrators(); + if (mail != null) { + mail.setSubject(subject); + mail.setText(message); + mailExecutor.queue(mail); + } + } catch (MessagingException e) { + logger.error("Messaging error", e); + } + } + + /** + * Notify users by email of something. + * + * @param subject + * @param message + * @param toAddresses + */ + public void sendMail(String subject, String message, Collection<String> toAddresses) { + this.sendMail(subject, message, toAddresses.toArray(new String[0])); + } + + /** + * Notify users by email of something. + * + * @param subject + * @param message + * @param toAddresses + */ + public void sendMail(String subject, String message, String... toAddresses) { + try { + Message mail = mailExecutor.createMessage(toAddresses); if (mail != null) { mail.setSubject(subject); mail.setText(message); @@ -1360,6 +1543,7 @@ setting.currentValue = settings.getString(key, ""); } } + settingsModel.pushScripts = getAvailableScripts(); return settingsModel; } @@ -1451,28 +1635,7 @@ loginService = (IUserService) realmClass.newInstance(); } } catch (Throwable t) { - // not a login service class or class could not be instantiated. - // try to use default file login service - File realmFile = getFileOrFolder(Keys.realm.userService, "users.properties"); - if (realmFile.exists()) { - // load the existing realm file - loginService = new FileUserService(realmFile); - } else { - // create a new realm file and add the default admin account. - // this is necessary for bootstrapping a dynamic environment - // like running on a cloud service. - try { - realmFile.createNewFile(); - loginService = new FileUserService(realmFile); - UserModel admin = new UserModel("admin"); - admin.password = "admin"; - admin.canAdmin = true; - loginService.updateUserModel(admin); - } catch (IOException x) { - logger.error( - MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmFile), x); - } - } + loginService = new GitblitUserService(); } setUserService(loginService); mailExecutor = new MailExecutor(settings); -- Gitblit v1.9.1