Search in sources :

Example 1 with IUserService

use of com.gitblit.IUserService in project gitblit by gitblit.

the class GitblitAuthority method loadUsers.

private IUserService loadUsers(File folder) {
    File file = new File(folder, "gitblit.properties");
    if (!file.exists()) {
        return null;
    }
    gitblitSettings = new FileSettings(file.getAbsolutePath());
    mail = new MailService(gitblitSettings);
    String us = gitblitSettings.getString(Keys.realm.userService, "${baseFolder}/users.conf");
    String ext = us.substring(us.lastIndexOf(".") + 1).toLowerCase();
    IUserService service = null;
    if (!ext.equals("conf") && !ext.equals("properties") && ext.contains("userservice")) {
        String realm = ext.substring(0, ext.indexOf("userservice"));
        us = gitblitSettings.getString(MessageFormat.format("realm.{0}.backingUserService", realm), "${baseFolder}/users.conf");
    }
    if (us.endsWith(".conf")) {
        service = new ConfigUserService(FileUtils.resolveParameter(Constants.baseFolder$, folder, us));
    } else {
        throw new RuntimeException("Unsupported user service: " + us);
    }
    service = new ConfigUserService(FileUtils.resolveParameter(Constants.baseFolder$, folder, us));
    return service;
}
Also used : MailService(com.gitblit.service.MailService) FileSettings(com.gitblit.FileSettings) IUserService(com.gitblit.IUserService) ConfigUserService(com.gitblit.ConfigUserService) File(java.io.File)

Example 2 with IUserService

use of com.gitblit.IUserService in project gitblit by gitblit.

the class UserManager method createUserService.

protected IUserService createUserService(File realmFile) {
    IUserService service = null;
    if (realmFile.getName().toLowerCase().endsWith(".conf")) {
        // config-based realm file
        service = new ConfigUserService(realmFile);
    }
    assert service != null;
    if (!realmFile.exists()) {
        // Create the Administrator account for a new realm file
        try {
            realmFile.createNewFile();
        } catch (IOException x) {
            logger.error(MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmFile), x);
        }
        UserModel admin = new UserModel("admin");
        admin.password = "admin";
        admin.canAdmin = true;
        admin.excludeFromFederation = true;
        service.updateUserModel(admin);
    }
    return service;
}
Also used : UserModel(com.gitblit.models.UserModel) IUserService(com.gitblit.IUserService) ConfigUserService(com.gitblit.ConfigUserService) IOException(java.io.IOException)

Example 3 with IUserService

use of com.gitblit.IUserService in project gitblit by gitblit.

the class FederationPullService method pull.

/**
	 * Mirrors a repository and, optionally, the server's users, and/or
	 * configuration settings from a origin Gitblit instance.
	 *
	 * @param registration
	 * @throws Exception
	 */
private void pull(FederationModel registration) throws Exception {
    Map<String, RepositoryModel> repositories = FederationUtils.getRepositories(registration, true);
    String registrationFolder = registration.folder.toLowerCase().trim();
    // confirm valid characters in server alias
    Character c = StringUtils.findInvalidCharacter(registrationFolder);
    if (c != null) {
        logger.error(MessageFormat.format("Illegal character ''{0}'' in folder name ''{1}'' of federation registration {2}!", c, registrationFolder, registration.name));
        return;
    }
    File repositoriesFolder = gitblit.getRepositoriesFolder();
    File registrationFolderFile = new File(repositoriesFolder, registrationFolder);
    registrationFolderFile.mkdirs();
    // Clone/Pull the repository
    for (Map.Entry<String, RepositoryModel> entry : repositories.entrySet()) {
        String cloneUrl = entry.getKey();
        RepositoryModel repository = entry.getValue();
        if (!repository.hasCommits) {
            logger.warn(MessageFormat.format("Skipping federated repository {0} from {1} @ {2}. Repository is EMPTY.", repository.name, registration.name, registration.url));
            registration.updateStatus(repository, FederationPullStatus.SKIPPED);
            continue;
        }
        // Determine local repository name
        String repositoryName;
        if (StringUtils.isEmpty(registrationFolder)) {
            repositoryName = repository.name;
        } else {
            repositoryName = registrationFolder + "/" + repository.name;
        }
        if (registration.bare) {
            // bare repository, ensure .git suffix
            if (!repositoryName.toLowerCase().endsWith(DOT_GIT_EXT)) {
                repositoryName += DOT_GIT_EXT;
            }
        } else {
            // normal repository, strip .git suffix
            if (repositoryName.toLowerCase().endsWith(DOT_GIT_EXT)) {
                repositoryName = repositoryName.substring(0, repositoryName.indexOf(DOT_GIT_EXT));
            }
        }
        // confirm that the origin of any pre-existing repository matches
        // the clone url
        String fetchHead = null;
        Repository existingRepository = gitblit.getRepository(repositoryName);
        if (existingRepository == null && gitblit.isCollectingGarbage(repositoryName)) {
            logger.warn(MessageFormat.format("Skipping local repository {0}, busy collecting garbage", repositoryName));
            continue;
        }
        if (existingRepository != null) {
            StoredConfig config = existingRepository.getConfig();
            config.load();
            String origin = config.getString("remote", "origin", "url");
            RevCommit commit = JGitUtils.getCommit(existingRepository, org.eclipse.jgit.lib.Constants.FETCH_HEAD);
            if (commit != null) {
                fetchHead = commit.getName();
            }
            existingRepository.close();
            if (!origin.startsWith(registration.url)) {
                logger.warn(MessageFormat.format("Skipping federated repository {0} from {1} @ {2}. Origin does not match, consider EXCLUDING.", repository.name, registration.name, registration.url));
                registration.updateStatus(repository, FederationPullStatus.SKIPPED);
                continue;
            }
        }
        // clone/pull this repository
        CredentialsProvider credentials = new UsernamePasswordCredentialsProvider(Constants.FEDERATION_USER, registration.token);
        logger.info(MessageFormat.format("Pulling federated repository {0} from {1} @ {2}", repository.name, registration.name, registration.url));
        CloneResult result = JGitUtils.cloneRepository(registrationFolderFile, repository.name, cloneUrl, registration.bare, credentials);
        Repository r = gitblit.getRepository(repositoryName);
        RepositoryModel rm = gitblit.getRepositoryModel(repositoryName);
        repository.isFrozen = registration.mirror;
        if (result.createdRepository) {
            // default local settings
            repository.federationStrategy = FederationStrategy.EXCLUDE;
            repository.isFrozen = registration.mirror;
            repository.showRemoteBranches = !registration.mirror;
            logger.info(MessageFormat.format("     cloning {0}", repository.name));
            registration.updateStatus(repository, FederationPullStatus.MIRRORED);
        } else {
            // fetch and update
            boolean fetched = false;
            RevCommit commit = JGitUtils.getCommit(r, org.eclipse.jgit.lib.Constants.FETCH_HEAD);
            String newFetchHead = commit.getName();
            fetched = fetchHead == null || !fetchHead.equals(newFetchHead);
            if (registration.mirror) {
                // mirror
                if (fetched) {
                    // update local branches to match the remote tracking branches
                    for (RefModel ref : JGitUtils.getRemoteBranches(r, false, -1)) {
                        if (ref.displayName.startsWith("origin/")) {
                            String branch = org.eclipse.jgit.lib.Constants.R_HEADS + ref.displayName.substring(ref.displayName.indexOf('/') + 1);
                            String hash = ref.getReferencedObjectId().getName();
                            JGitUtils.setBranchRef(r, branch, hash);
                            logger.info(MessageFormat.format("     resetting {0} of {1} to {2}", branch, repository.name, hash));
                        }
                    }
                    String newHead;
                    if (StringUtils.isEmpty(repository.HEAD)) {
                        newHead = newFetchHead;
                    } else {
                        newHead = repository.HEAD;
                    }
                    JGitUtils.setHEADtoRef(r, newHead);
                    logger.info(MessageFormat.format("     resetting HEAD of {0} to {1}", repository.name, newHead));
                    registration.updateStatus(repository, FederationPullStatus.MIRRORED);
                } else {
                    // indicate no commits pulled
                    registration.updateStatus(repository, FederationPullStatus.NOCHANGE);
                }
            } else {
                // non-mirror
                if (fetched) {
                    // indicate commits pulled to origin/master
                    registration.updateStatus(repository, FederationPullStatus.PULLED);
                } else {
                    // indicate no commits pulled
                    registration.updateStatus(repository, FederationPullStatus.NOCHANGE);
                }
            }
            // preserve local settings
            repository.isFrozen = rm.isFrozen;
            repository.federationStrategy = rm.federationStrategy;
            // merge federation sets
            Set<String> federationSets = new HashSet<String>();
            if (rm.federationSets != null) {
                federationSets.addAll(rm.federationSets);
            }
            if (repository.federationSets != null) {
                federationSets.addAll(repository.federationSets);
            }
            repository.federationSets = new ArrayList<String>(federationSets);
            // merge indexed branches
            Set<String> indexedBranches = new HashSet<String>();
            if (rm.indexedBranches != null) {
                indexedBranches.addAll(rm.indexedBranches);
            }
            if (repository.indexedBranches != null) {
                indexedBranches.addAll(repository.indexedBranches);
            }
            repository.indexedBranches = new ArrayList<String>(indexedBranches);
        }
        // only repositories that are actually _cloned_ from the origin
        // Gitblit repository are marked as federated. If the origin
        // is from somewhere else, these repositories are not considered
        // "federated" repositories.
        repository.isFederated = cloneUrl.startsWith(registration.url);
        gitblit.updateConfiguration(r, repository);
        r.close();
    }
    IUserService userService = null;
    try {
        // Pull USERS
        // TeamModels are automatically pulled because they are contained
        // within the UserModel. The UserService creates unknown teams
        // and updates existing teams.
        Collection<UserModel> users = FederationUtils.getUsers(registration);
        if (users != null && users.size() > 0) {
            File realmFile = new File(registrationFolderFile, registration.name + "_users.conf");
            realmFile.delete();
            userService = new ConfigUserService(realmFile);
            for (UserModel user : users) {
                userService.updateUserModel(user.username, user);
                // the user accounts of this Gitblit instance
                if (registration.mergeAccounts) {
                    // repositories are stored within subfolders
                    if (!StringUtils.isEmpty(registrationFolder)) {
                        if (user.permissions != null) {
                            // pulling from >= 1.2 version
                            Map<String, AccessPermission> copy = new HashMap<String, AccessPermission>(user.permissions);
                            user.permissions.clear();
                            for (Map.Entry<String, AccessPermission> entry : copy.entrySet()) {
                                user.setRepositoryPermission(registrationFolder + "/" + entry.getKey(), entry.getValue());
                            }
                        } else {
                            // pulling from <= 1.1 version
                            List<String> permissions = new ArrayList<String>(user.repositories);
                            user.repositories.clear();
                            for (String permission : permissions) {
                                user.addRepositoryPermission(registrationFolder + "/" + permission);
                            }
                        }
                    }
                    // insert new user or update local user
                    UserModel localUser = gitblit.getUserModel(user.username);
                    if (localUser == null) {
                        // create new local user
                        gitblit.addUser(user);
                    } else {
                        // update repository permissions of local user
                        if (user.permissions != null) {
                            // pulling from >= 1.2 version
                            Map<String, AccessPermission> copy = new HashMap<String, AccessPermission>(user.permissions);
                            for (Map.Entry<String, AccessPermission> entry : copy.entrySet()) {
                                localUser.setRepositoryPermission(entry.getKey(), entry.getValue());
                            }
                        } else {
                            // pulling from <= 1.1 version
                            for (String repository : user.repositories) {
                                localUser.addRepositoryPermission(repository);
                            }
                        }
                        localUser.password = user.password;
                        localUser.canAdmin = user.canAdmin;
                        gitblit.reviseUser(localUser.username, localUser);
                    }
                    for (String teamname : gitblit.getAllTeamNames()) {
                        TeamModel team = gitblit.getTeamModel(teamname);
                        if (user.isTeamMember(teamname) && !team.hasUser(user.username)) {
                            // new team member
                            team.addUser(user.username);
                            gitblit.updateTeamModel(teamname, team);
                        } else if (!user.isTeamMember(teamname) && team.hasUser(user.username)) {
                            // remove team member
                            team.removeUser(user.username);
                            gitblit.updateTeamModel(teamname, team);
                        }
                        // update team repositories
                        TeamModel remoteTeam = user.getTeam(teamname);
                        if (remoteTeam != null) {
                            if (remoteTeam.permissions != null) {
                                // pulling from >= 1.2
                                for (Map.Entry<String, AccessPermission> entry : remoteTeam.permissions.entrySet()) {
                                    team.setRepositoryPermission(entry.getKey(), entry.getValue());
                                }
                                gitblit.updateTeamModel(teamname, team);
                            } else if (!ArrayUtils.isEmpty(remoteTeam.repositories)) {
                                // pulling from <= 1.1
                                team.addRepositoryPermissions(remoteTeam.repositories);
                                gitblit.updateTeamModel(teamname, team);
                            }
                        }
                    }
                }
            }
        }
    } catch (ForbiddenException e) {
    // ignore forbidden exceptions
    } catch (IOException e) {
        logger.warn(MessageFormat.format("Failed to retrieve USERS from federated gitblit ({0} @ {1})", registration.name, registration.url), e);
    }
    try {
        // mailing lists or push scripts without specifying users.
        if (userService != null) {
            Collection<TeamModel> teams = FederationUtils.getTeams(registration);
            if (teams != null && teams.size() > 0) {
                for (TeamModel team : teams) {
                    userService.updateTeamModel(team);
                }
            }
        }
    } catch (ForbiddenException e) {
    // ignore forbidden exceptions
    } catch (IOException e) {
        logger.warn(MessageFormat.format("Failed to retrieve TEAMS from federated gitblit ({0} @ {1})", registration.name, registration.url), e);
    }
    try {
        // Pull SETTINGS
        Map<String, String> settings = FederationUtils.getSettings(registration);
        if (settings != null && settings.size() > 0) {
            Properties properties = new Properties();
            properties.putAll(settings);
            FileOutputStream os = new FileOutputStream(new File(registrationFolderFile, registration.name + "_" + Constants.PROPERTIES_FILE));
            properties.store(os, null);
            os.close();
        }
    } catch (ForbiddenException e) {
    // ignore forbidden exceptions
    } catch (IOException e) {
        logger.warn(MessageFormat.format("Failed to retrieve SETTINGS from federated gitblit ({0} @ {1})", registration.name, registration.url), e);
    }
    try {
        // Pull SCRIPTS
        Map<String, String> scripts = FederationUtils.getScripts(registration);
        if (scripts != null && scripts.size() > 0) {
            for (Map.Entry<String, String> script : scripts.entrySet()) {
                String scriptName = script.getKey();
                if (scriptName.endsWith(".groovy")) {
                    scriptName = scriptName.substring(0, scriptName.indexOf(".groovy"));
                }
                File file = new File(registrationFolderFile, registration.name + "_" + scriptName + ".groovy");
                FileUtils.writeContent(file, script.getValue());
            }
        }
    } catch (ForbiddenException e) {
    // ignore forbidden exceptions
    } catch (IOException e) {
        logger.warn(MessageFormat.format("Failed to retrieve SCRIPTS from federated gitblit ({0} @ {1})", registration.name, registration.url), e);
    }
}
Also used : RefModel(com.gitblit.models.RefModel) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) RepositoryModel(com.gitblit.models.RepositoryModel) Properties(java.util.Properties) StoredConfig(org.eclipse.jgit.lib.StoredConfig) UserModel(com.gitblit.models.UserModel) TeamModel(com.gitblit.models.TeamModel) RevCommit(org.eclipse.jgit.revwalk.RevCommit) HashSet(java.util.HashSet) UsernamePasswordCredentialsProvider(org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider) ForbiddenException(com.gitblit.GitBlitException.ForbiddenException) ConfigUserService(com.gitblit.ConfigUserService) AccessPermission(com.gitblit.Constants.AccessPermission) UsernamePasswordCredentialsProvider(org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider) CredentialsProvider(org.eclipse.jgit.transport.CredentialsProvider) IOException(java.io.IOException) CloneResult(com.gitblit.utils.JGitUtils.CloneResult) Repository(org.eclipse.jgit.lib.Repository) IUserService(com.gitblit.IUserService) FileOutputStream(java.io.FileOutputStream) File(java.io.File) HashMap(java.util.HashMap) Map(java.util.Map)

Example 4 with IUserService

use of com.gitblit.IUserService in project gitblit by gitblit.

the class UserManager method start.

@Override
public UserManager start() {
    if (this.userService == null) {
        String realm = settings.getString(Keys.realm.userService, "${baseFolder}/users.conf");
        IUserService service = null;
        if (legacyBackingServices.containsKey(realm)) {
            // create the user service from the legacy config
            String realmKey = legacyBackingServices.get(realm);
            logger.warn("");
            logger.warn(Constants.BORDER2);
            logger.warn(" Key '{}' is obsolete!", realmKey);
            logger.warn(" Please set '{}={}'", Keys.realm.userService, settings.getString(realmKey, "${baseFolder}/users.conf"));
            logger.warn(Constants.BORDER2);
            logger.warn("");
            File realmFile = runtimeManager.getFileOrFolder(realmKey, "${baseFolder}/users.conf");
            service = createUserService(realmFile);
        } else {
            // either a file path OR a custom user service
            try {
                // check to see if this "file" is a custom user service class
                Class<?> realmClass = Class.forName(realm);
                service = (IUserService) realmClass.newInstance();
            } catch (ClassNotFoundException t) {
                // typical file path configuration
                File realmFile = runtimeManager.getFileOrFolder(Keys.realm.userService, "${baseFolder}/users.conf");
                service = createUserService(realmFile);
            } catch (InstantiationException | IllegalAccessException e) {
                logger.error("failed to instantiate user service {}: {}. Trying once again with IRuntimeManager constructor", realm, e.getMessage());
                //try once again with IRuntimeManager constructor. This adds support for subclasses of ConfigUserService and other custom IUserServices
                service = createIRuntimeManagerAwareUserService(realm);
            }
        }
        setUserService(service);
    }
    return this;
}
Also used : IUserService(com.gitblit.IUserService) File(java.io.File)

Example 5 with IUserService

use of com.gitblit.IUserService in project gitblit by gitblit.

the class AuthenticationManagerTest method newAuthenticationManager.

IAuthenticationManager newAuthenticationManager() {
    XssFilter xssFilter = new AllowXssFilter();
    RuntimeManager runtime = new RuntimeManager(getSettings(), xssFilter, GitBlitSuite.BASEFOLDER).start();
    users = new UserManager(runtime, null).start();
    final Map<String, UserModel> virtualUsers = new HashMap<String, UserModel>();
    users.setUserService(new IUserService() {

        @Override
        public void setup(IRuntimeManager runtimeManager) {
        }

        @Override
        public String getCookie(UserModel model) {
            return null;
        }

        @Override
        public UserModel getUserModel(char[] cookie) {
            return null;
        }

        @Override
        public UserModel getUserModel(String username) {
            return virtualUsers.get(username);
        }

        @Override
        public boolean updateUserModel(UserModel model) {
            virtualUsers.put(model.username, model);
            return true;
        }

        @Override
        public boolean updateUserModels(Collection<UserModel> models) {
            return false;
        }

        @Override
        public boolean updateUserModel(String username, UserModel model) {
            virtualUsers.put(username, model);
            return true;
        }

        @Override
        public boolean deleteUserModel(UserModel model) {
            return false;
        }

        @Override
        public boolean deleteUser(String username) {
            return false;
        }

        @Override
        public List<String> getAllUsernames() {
            return null;
        }

        @Override
        public List<UserModel> getAllUsers() {
            return null;
        }

        @Override
        public List<String> getAllTeamNames() {
            return null;
        }

        @Override
        public List<TeamModel> getAllTeams() {
            return null;
        }

        @Override
        public List<String> getTeamNamesForRepositoryRole(String role) {
            return null;
        }

        @Override
        public TeamModel getTeamModel(String teamname) {
            return null;
        }

        @Override
        public boolean updateTeamModel(TeamModel model) {
            return false;
        }

        @Override
        public boolean updateTeamModels(Collection<TeamModel> models) {
            return false;
        }

        @Override
        public boolean updateTeamModel(String teamname, TeamModel model) {
            return false;
        }

        @Override
        public boolean deleteTeamModel(TeamModel model) {
            return false;
        }

        @Override
        public boolean deleteTeam(String teamname) {
            return false;
        }

        @Override
        public List<String> getUsernamesForRepositoryRole(String role) {
            return null;
        }

        @Override
        public boolean renameRepositoryRole(String oldRole, String newRole) {
            return false;
        }

        @Override
        public boolean deleteRepositoryRole(String role) {
            return false;
        }
    });
    AuthenticationManager auth = new AuthenticationManager(runtime, users).start();
    return auth;
}
Also used : HashMap(java.util.HashMap) IRuntimeManager(com.gitblit.manager.IRuntimeManager) RuntimeManager(com.gitblit.manager.RuntimeManager) UserModel(com.gitblit.models.UserModel) IRuntimeManager(com.gitblit.manager.IRuntimeManager) AuthenticationManager(com.gitblit.manager.AuthenticationManager) IAuthenticationManager(com.gitblit.manager.IAuthenticationManager) TeamModel(com.gitblit.models.TeamModel) UserManager(com.gitblit.manager.UserManager) IUserService(com.gitblit.IUserService) AllowXssFilter(com.gitblit.utils.XssFilter.AllowXssFilter) XssFilter(com.gitblit.utils.XssFilter) AllowXssFilter(com.gitblit.utils.XssFilter.AllowXssFilter) List(java.util.List)

Aggregations

IUserService (com.gitblit.IUserService)6 ConfigUserService (com.gitblit.ConfigUserService)4 File (java.io.File)4 UserModel (com.gitblit.models.UserModel)3 TeamModel (com.gitblit.models.TeamModel)2 IOException (java.io.IOException)2 HashMap (java.util.HashMap)2 AccessPermission (com.gitblit.Constants.AccessPermission)1 FileSettings (com.gitblit.FileSettings)1 ForbiddenException (com.gitblit.GitBlitException.ForbiddenException)1 AuthenticationManager (com.gitblit.manager.AuthenticationManager)1 IAuthenticationManager (com.gitblit.manager.IAuthenticationManager)1 IRuntimeManager (com.gitblit.manager.IRuntimeManager)1 RuntimeManager (com.gitblit.manager.RuntimeManager)1 UserManager (com.gitblit.manager.UserManager)1 RefModel (com.gitblit.models.RefModel)1 RepositoryModel (com.gitblit.models.RepositoryModel)1 MailService (com.gitblit.service.MailService)1 CloneResult (com.gitblit.utils.JGitUtils.CloneResult)1 XssFilter (com.gitblit.utils.XssFilter)1