def render_admin_panel(self, req, category, page, path_info):
        req.perm.require('REPOSITORY_CREATE')

        if req.method == 'POST':
            repo_name = req.args['name']
            perms = self.read_config()
            if repo_name in perms:
                add_warning(
                    req,
                    _('A repository named %s already exists; maybe you just need to tell Trac about it using the Repositories panel?'
                      ))
                req.redirect(req.href.admin(category, page))
            perms[repo_name] = repo_perms = {}
            trac_user = getpass.getuser()
            for perm in ['R', 'W', '+']:
                repo_perms[perm] = [trac_user]
            utils.save_file(self.gitolite_admin_ssh_path, 'conf/gitolite.conf',
                            utils.to_string(perms),
                            _('Adding new repository %s' % repo_name))
            add_notice(
                req,
                _('Repository "%s" has been created.  Now you should give some users permissions on it using the Version Control Permissions panel.'
                  % repo_name))
            req.redirect(req.href.admin(category, page))

        data = {'repos': sorted(self.read_config())}
        return 'admin_repository_gitolite.html', data
    def render_admin_panel(self, req, category, page, path_info):
        req.perm.require('VERSIONCONTROL_ADMIN')

        if req.method == 'POST':
            perms = {}
            for setting in req.args:
                try:
                    setting = json.loads(setting)
                except ValueError:
                    continue
                if not isinstance(setting, dict) or 'perm' not in setting or 'user' not in setting or 'repo' not in setting:
                    continue
                repo = setting['repo']; perm = setting['perm']; user = setting['user']
                if repo not in perms:
                    perms[repo] = {}
                if perm not in perms[repo]:
                    perms[repo][perm] = []
                if user not in perms[repo][perm]:
                    perms[repo][perm].append(user)

            gitolite_admin_perms = perms.get(self.gitolite_admin_real_reponame, {})
            if (self.gitolite_admin_system_user not in gitolite_admin_perms.get('R', []) or
                self.gitolite_admin_system_user not in gitolite_admin_perms.get('W', [])):
                add_warning(req, _('Read and write permissions on the gitolite admin repo must not be revoked for user %s -- otherwise this plugin will no longer work!' % self.gitolite_admin_system_user))
                req.redirect(req.href.admin(category, page))

            utils.save_file(self.gitolite_admin_ssh_path, 'conf/gitolite.conf', 
                            utils.to_string(perms),
                            _('Updating repository permissions'))

            add_notice(req, _('The permissions have been updated.'))
            req.redirect(req.href.admin(category, page))

        perms = self.read_config()

        users_listed_in_perms = set()
        flattened_perms = set()

        for p in perms.values():
            for perm in p:
                flattened_perms.add(perm)
                users_listed_in_perms.update(p[perm])
        flattened_perms = list(flattened_perms)
        def sort_perms(perms):
            tail = []
            ## Ensure the + goes last
            if '+' in perms:
                perms.remove("+")
                tail.append("+")
            perms = sorted(perms)
            perms.extend(tail)
            return perms
        flattened_perms = sort_perms(flattened_perms)

        users = sorted(list(set(list(self.get_users()) + list(users_listed_in_perms))))
        data = {'repositories': perms, 'permissions': flattened_perms, 
                'users': users,
                'sort_perms': sort_perms}
        return 'admin_repository_permissions.html', data
    def render_admin_panel(self, req, category, page, path_info):
        req.perm.require('REPOSITORY_CREATE')

        if req.method == 'POST':
            repo_name = req.args['name']
            perms = self.read_config()
            if repo_name in perms:
                add_warning(req, _('A repository named %s already exists; maybe you just need to tell Trac about it using the Repositories panel?'))
                req.redirect(req.href.admin(category, page))
            perms[repo_name] = repo_perms = {}
            trac_user = getpass.getuser()
            for perm in ['R', 'W', '+']:
                repo_perms[perm] = [trac_user]
            utils.save_file(self.gitolite_admin_ssh_path, 'conf/gitolite.conf',
                            utils.to_string(perms),
                            _('Adding new repository %s' % repo_name),self.admin_home_path)
            add_notice(req, _('Repository "%s" has been created.  Now you should give some users permissions on it using the Version Control Permissions panel.' % repo_name))
            req.redirect(req.href.admin(category, page))

        data = {'repos': sorted(self.read_config())}
        return 'admin_repository_gitolite.html', data
Exemplo n.º 4
0
    def render_admin_panel(self, req, category, page, path_info):
        req.perm.require('VERSIONCONTROL_ADMIN')

        if req.method == 'POST':
            perms_old, groups, inverse_groups = self.read_config()
            perms = {}
            for setting in req.args:
                try:
                    setting = json.loads(setting)
                except ValueError:
                    continue
                if not isinstance(setting, dict) or 'perm' not in setting or 'user' not in setting or 'repo' not in setting:
                    continue
                repo = setting['repo']; perm = setting['perm']; user = setting['user']
                if repo not in perms:
                    perms[repo] = {}
                if perm not in perms[repo]:
                    perms[repo][perm] = []
                if user not in perms[repo][perm]:
                    perms[repo][perm].append(user)

            perms[self.gitolite_admin_real_reponame] = perms_old.get(self.gitolite_admin_real_reponame, {})
            gitolite_admin_perms = perms.get(self.gitolite_admin_real_reponame, {})
            if (self.gitolite_admin_system_user not in gitolite_admin_perms.get('R', []) or
                self.gitolite_admin_system_user not in gitolite_admin_perms.get('W', [])):
                add_warning(req, _('Read and write permissions on the gitolite admin repo must not be revoked for user %s -- otherwise this plugin will no longer work!' % self.gitolite_admin_system_user))
                req.redirect(req.href.admin(category, page))

            utils.save_file(self.gitolite_admin_ssh_path, 'conf/gitolite.conf', 
                            utils.to_string(perms, groups),
                            _('Updating repository permissions'))

            add_notice(req, _('The permissions have been updated.'))
            req.redirect(req.href.admin(category, page))

        perms, groups, inverse_groups = self.read_config()

        users_listed_in_perms = set()
        for perm in perms.values():
            for userlist in perm.values():
                users_listed_in_perms.update(userlist)
        users = sorted(list(set(list(self.get_users()) + list(users_listed_in_perms) + groups.keys() + ['@all'])))

        repos_perms = {}
        for repo in perms:
            if repo != "gitolite-admin":
                users_listed_in_perms = set()
                if repo not in repos_perms:
                    repos_perms[repo] = {}
                    for permission_class in ("W", "R", "0"):
                        repos_perms[repo][permission_class] = {"g": [], "u": []}
                    repos_perms[repo]["perms"] = perms[repo]

                for permission_class in ("W", "R"):
                    for user in perms[repo].get(permission_class, []):
                        if user not in users_listed_in_perms:
                            if user.startswith("@"):
                                repos_perms[repo][permission_class]["g"].append(user)
                            else:
                                repos_perms[repo][permission_class]["u"].append(user)
                            users_listed_in_perms.add(user)
                for user in users:
                    if user not in users_listed_in_perms:
                        if user.startswith("@"):
                            repos_perms[repo]["0"]["g"].append(user)
                        else:
                            repos_perms[repo]["0"]["u"].append(user)

        flattened_perms = set()
        for p in perms.values():
            for perm in p:
                flattened_perms.add(perm)
        flattened_perms = list(flattened_perms)
        def sort_perms(perms):
            tail = []
            ## Ensure the + goes last
            if '+' in perms:
                perms.remove("+")
                tail.append("+")
            perms = sorted(perms)
            perms.extend(tail)
            return perms
        flattened_perms = sort_perms(flattened_perms)

        data = {'permissions': flattened_perms, 
                'repos_perms': repos_perms,
                'groups': groups,
                'inverse_groups': inverse_groups}
        return 'admin_repository_permissions.html', data
Exemplo n.º 5
0
    def render_admin_panel(self, req, category, page, path_info):
        req.perm.require('VERSIONCONTROL_ADMIN')

        if req.method == 'POST':
            perms = {}
            for setting in req.args:
                try:
                    setting = json.loads(setting)
                except ValueError:
                    continue
                if not isinstance(
                        setting, dict
                ) or 'perm' not in setting or 'user' not in setting or 'repo' not in setting:
                    continue
                repo = setting['repo']
                perm = setting['perm']
                user = setting['user']
                if repo not in perms:
                    perms[repo] = {}
                if perm not in perms[repo]:
                    perms[repo][perm] = []
                if user not in perms[repo][perm]:
                    perms[repo][perm].append(user)

            gitolite_admin_perms = perms.get(self.gitolite_admin_real_reponame,
                                             {})
            if (self.gitolite_admin_system_user
                    not in gitolite_admin_perms.get('R', [])
                    or self.gitolite_admin_system_user
                    not in gitolite_admin_perms.get('W', [])):
                add_warning(
                    req,
                    _('Read and write permissions on the gitolite admin repo must not be revoked for user %s -- otherwise this plugin will no longer work!'
                      % self.gitolite_admin_system_user))
                req.redirect(req.href.admin(category, page))

            utils.save_file(self.gitolite_admin_ssh_path, 'conf/gitolite.conf',
                            utils.to_string(perms),
                            _('Updating repository permissions'))

            add_notice(req, _('The permissions have been updated.'))
            req.redirect(req.href.admin(category, page))

        perms = self.read_config()

        users_listed_in_perms = set()
        flattened_perms = set()

        for p in perms.values():
            for perm in p:
                flattened_perms.add(perm)
                users_listed_in_perms.update(p[perm])
        flattened_perms = list(flattened_perms)

        def sort_perms(perms):
            tail = []
            ## Ensure the + goes last
            if '+' in perms:
                perms.remove("+")
                tail.append("+")
            perms = sorted(perms)
            perms.extend(tail)
            return perms

        flattened_perms = sort_perms(flattened_perms)

        users = sorted(
            list(set(list(self.get_users()) + list(users_listed_in_perms))))
        data = {
            'repositories': perms,
            'permissions': flattened_perms,
            'users': users,
            'sort_perms': sort_perms
        }
        return 'admin_repository_permissions.html', data