From 8bc725871269aa47f8ef6db086a4cfedc75ef140 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Mon, 29 Oct 2012 09:19:03 -0400 Subject: [PATCH] Use repository swatch coloring in registrant permissions panel --- src/com/gitblit/wicket/pages/EditRepositoryPage.java | 139 ++++++++++++++++++++++++++++++--------------- 1 files changed, 92 insertions(+), 47 deletions(-) diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java index 572f650..1a2e63c 100644 --- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java +++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java @@ -36,6 +36,8 @@ import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.IChoiceRenderer; +import org.apache.wicket.markup.html.form.Radio; +import org.apache.wicket.markup.html.form.RadioGroup; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; @@ -47,10 +49,12 @@ import com.gitblit.Constants; import com.gitblit.Constants.AccessRestrictionType; +import com.gitblit.Constants.AuthorizationControl; import com.gitblit.Constants.FederationStrategy; import com.gitblit.GitBlit; import com.gitblit.GitBlitException; import com.gitblit.Keys; +import com.gitblit.models.RegistrantAccessPermission; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.ArrayUtils; @@ -59,6 +63,7 @@ import com.gitblit.wicket.StringChoiceRenderer; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.panels.BulletListPanel; +import com.gitblit.wicket.panels.RegistrantPermissionsPanel; public class EditRepositoryPage extends RootSubPage { @@ -75,7 +80,23 @@ RepositoryModel model = new RepositoryModel(); String restriction = GitBlit.getString(Keys.git.defaultAccessRestriction, null); model.accessRestriction = AccessRestrictionType.fromName(restriction); + String authorization = GitBlit.getString(Keys.git.defaultAuthorizationControl, null); + model.authorizationControl = AuthorizationControl.fromName(authorization); + + GitBlitWebSession session = GitBlitWebSession.get(); + UserModel user = session.getUser(); + if (user != null && user.canCreate() && !user.canAdmin()) { + // personal create permissions, inject personal repository path + model.name = user.getPersonalPath() + "/"; + model.projectPath = user.getPersonalPath(); + model.owner = user.username; + // personal repositories are private by default + model.accessRestriction = AccessRestrictionType.VIEW; + model.authorizationControl = AuthorizationControl.NAMED; + } + setupPage(model); + setStatelessHint(false); } public EditRepositoryPage(PageParameters params) { @@ -85,6 +106,7 @@ String name = WicketUtils.getRepositoryName(params); RepositoryModel model = GitBlit.self().getRepositoryModel(name); setupPage(model); + setStatelessHint(false); } protected void setupPage(final RepositoryModel repositoryModel) { @@ -93,18 +115,26 @@ List<String> indexedBranches = new ArrayList<String>(); List<String> federationSets = new ArrayList<String>(); - List<String> repositoryUsers = new ArrayList<String>(); - List<String> repositoryTeams = new ArrayList<String>(); + final List<RegistrantAccessPermission> repositoryUsers = new ArrayList<RegistrantAccessPermission>(); + final List<RegistrantAccessPermission> repositoryTeams = new ArrayList<RegistrantAccessPermission>(); List<String> preReceiveScripts = new ArrayList<String>(); List<String> postReceiveScripts = new ArrayList<String>(); + GitBlitWebSession session = GitBlitWebSession.get(); + final UserModel user = session.getUser() == null ? UserModel.ANONYMOUS : session.getUser(); + final boolean allowEditName = isCreate || isAdmin || repositoryModel.isUsersPersonalRepository(user.username); + if (isCreate) { - super.setupPage(getString("gb.newRepository"), ""); + if (user.canAdmin()) { + super.setupPage(getString("gb.newRepository"), ""); + } else { + super.setupPage(getString("gb.newRepository"), user.getDisplayName()); + } } else { super.setupPage(getString("gb.edit"), repositoryModel.name); if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) { - repositoryUsers.addAll(GitBlit.self().getRepositoryUsers(repositoryModel)); - repositoryTeams.addAll(GitBlit.self().getRepositoryTeams(repositoryModel)); + repositoryUsers.addAll(GitBlit.self().getUserAccessPermissions(repositoryModel)); + repositoryTeams.addAll(GitBlit.self().getTeamAccessPermissions(repositoryModel)); Collections.sort(repositoryUsers); } federationSets.addAll(repositoryModel.federationSets); @@ -114,15 +144,11 @@ } final String oldName = repositoryModel.name; - // users palette - final Palette<String> usersPalette = new Palette<String>("users", new ListModel<String>( - repositoryUsers), new CollectionModel<String>(GitBlit.self().getAllUsernames()), - new StringChoiceRenderer(), 10, false); - // teams palette - final Palette<String> teamsPalette = new Palette<String>("teams", new ListModel<String>( - repositoryTeams), new CollectionModel<String>(GitBlit.self().getAllTeamnames()), - new StringChoiceRenderer(), 8, false); + RegistrantPermissionsPanel usersPalette = new RegistrantPermissionsPanel("users", + GitBlit.self().getAllUsernames(), repositoryUsers, getAccessPermissions()); + RegistrantPermissionsPanel teamsPalette = new RegistrantPermissionsPanel("teams", + GitBlit.self().getAllTeamnames(), repositoryTeams, getAccessPermissions()); // indexed local branches palette List<String> allLocalBranches = new ArrayList<String>(); @@ -190,11 +216,14 @@ protected void onSubmit() { try { // confirm a repository name was entered - if (StringUtils.isEmpty(repositoryModel.name)) { + if (repositoryModel.name == null && StringUtils.isEmpty(repositoryModel.name)) { error(getString("gb.pleaseSetRepositoryName")); return; } - + + // ensure name is trimmed + repositoryModel.name = repositoryModel.name.trim(); + // automatically convert backslashes to forward slashes repositoryModel.name = repositoryModel.name.replace('\\', '/'); // Automatically replace // with / @@ -212,6 +241,9 @@ if (repositoryModel.name.contains("/../")) { error(getString("gb.illegalRelativeSlash")); return; + } + if (repositoryModel.name.endsWith("/")) { + repositoryModel.name = repositoryModel.name.substring(0, repositoryModel.name.length() - 1); } // confirm valid characters in repository name @@ -220,6 +252,22 @@ error(MessageFormat.format(getString("gb.illegalCharacterRepositoryName"), c)); return; + } + + if (user.canCreate() && !user.canAdmin() && allowEditName) { + // ensure repository name begins with the user's path + if (!repositoryModel.name.startsWith(user.getPersonalPath())) { + error(MessageFormat.format(getString("gb.illegalPersonalRepositoryLocation"), + user.getPersonalPath())); + return; + } + + if (repositoryModel.name.equals(user.getPersonalPath())) { + // reset path prefix and show error + repositoryModel.name = user.getPersonalPath() + "/"; + error(getString("gb.pleaseSetRepositoryName")); + return; + } } // confirm access restriction selection @@ -295,28 +343,10 @@ // save the repository GitBlit.self().updateRepositoryModel(oldName, repositoryModel, isCreate); - // repository access + // repository access permissions if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) { - // save the user access list - Iterator<String> users = usersPalette.getSelectedChoices(); - List<String> repositoryUsers = new ArrayList<String>(); - while (users.hasNext()) { - repositoryUsers.add(users.next()); - } - // ensure the owner is added to the user list - if (repositoryModel.owner != null - && !repositoryUsers.contains(repositoryModel.owner)) { - repositoryUsers.add(repositoryModel.owner); - } - GitBlit.self().setRepositoryUsers(repositoryModel, repositoryUsers); - - // save the team access list - Iterator<String> teams = teamsPalette.getSelectedChoices(); - List<String> repositoryTeams = new ArrayList<String>(); - while (teams.hasNext()) { - repositoryTeams.add(teams.next()); - } - GitBlit.self().setRepositoryTeams(repositoryModel, repositoryTeams); + GitBlit.self().setUserAccessPermissions(repositoryModel, repositoryUsers); + GitBlit.self().setTeamAccessPermissions(repositoryModel, repositoryTeams); } } catch (GitBlitException e) { error(e.getMessage()); @@ -331,10 +361,11 @@ form.add(new SimpleAttributeModifier("autocomplete", "off")); // field names reflective match RepositoryModel fields - form.add(new TextField<String>("name").setEnabled(isCreate || isAdmin)); + form.add(new TextField<String>("name").setEnabled(allowEditName)); form.add(new TextField<String>("description")); form.add(new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames()) .setEnabled(GitBlitWebSession.get().canAdmin())); + form.add(new CheckBox("allowForks")); form.add(new DropDownChoice<AccessRestrictionType>("accessRestriction", Arrays .asList(AccessRestrictionType.values()), new AccessRestrictionRenderer())); form.add(new CheckBox("isFrozen")); @@ -348,6 +379,10 @@ } form.add(new DropDownChoice<String>("HEAD", availableRefs).setEnabled(availableRefs.size() > 0)); + List<String> gcPeriods = Arrays.asList("1 day", "2 days", "3 days", "4 days", "5 days", "7 days", "10 days", "14 days"); + form.add(new DropDownChoice<String>("gcPeriod", gcPeriods)); + form.add(new TextField<String>("gcThreshold")); + // federation strategies - remove ORIGIN choice if this repository has // no origin. List<FederationStrategy> federationStrategies = new ArrayList<FederationStrategy>( @@ -358,7 +393,7 @@ form.add(new DropDownChoice<FederationStrategy>("federationStrategy", federationStrategies, new FederationTypeRenderer())); form.add(new CheckBox("useTickets")); - form.add(new CheckBox("useDocs")); + form.add(new CheckBox("useDocs")); form.add(new CheckBox("showRemoteBranches")); form.add(new CheckBox("showReadme")); form.add(new CheckBox("skipSizeCalculation")); @@ -367,14 +402,24 @@ : StringUtils.flattenStrings(repositoryModel.mailingLists, " ")); form.add(new TextField<String>("mailingLists", mailingLists)); form.add(indexedBranchesPalette); + + RadioGroup<AuthorizationControl> group = new RadioGroup<AuthorizationControl>("authorizationControl"); + Radio<AuthorizationControl> allowAuthenticated = new Radio<AuthorizationControl>("allowAuthenticated", new Model<AuthorizationControl>(AuthorizationControl.AUTHENTICATED)); + Radio<AuthorizationControl> allowNamed = new Radio<AuthorizationControl>("allowNamed", new Model<AuthorizationControl>(AuthorizationControl.NAMED)); + group.add(allowAuthenticated); + group.add(allowNamed); + form.add(group); + + form.add(new CheckBox("verifyCommitter")); + form.add(usersPalette); form.add(teamsPalette); form.add(federationSetsPalette); form.add(preReceivePalette); - form.add(new BulletListPanel("inheritedPreReceive", "inherited", GitBlit.self() + form.add(new BulletListPanel("inheritedPreReceive", getString("gb.inherited"), GitBlit.self() .getPreReceiveScriptsInherited(repositoryModel))); form.add(postReceivePalette); - form.add(new BulletListPanel("inheritedPostReceive", "inherited", GitBlit.self() + form.add(new BulletListPanel("inheritedPostReceive", getString("gb.inherited"), GitBlit.self() .getPostReceiveScriptsInherited(repositoryModel))); WebMarkupContainer customFieldsSection = new WebMarkupContainer("customFieldsSection"); @@ -414,31 +459,31 @@ if (authenticateAdmin) { if (user == null) { // No Login Available - error("Administration requires a login", true); + error(getString("gb.errorAdminLoginRequired"), true); } if (isCreate) { // Create Repository - if (!user.canAdmin) { - // Only Administrators May Create - error("Only an administrator may create a repository", true); + if (!user.canCreate() && !user.canAdmin()) { + // Only administrators or permitted users may create + error(getString("gb.errorOnlyAdminMayCreateRepository"), true); } } else { // Edit Repository - if (user.canAdmin) { + if (user.canAdmin()) { // Admins can edit everything isAdmin = true; return; } else { if (!model.owner.equalsIgnoreCase(user.username)) { // User is not an Admin nor Owner - error("Only an administrator or the owner may edit a repository", true); + error(getString("gb.errorOnlyAdminOrOwnerMayEditRepository"), true); } } } } } else { // No Administration Permitted - error("Administration is disabled", true); + error(getString("gb.errorAdministrationDisabled"), true); } } -- Gitblit v1.9.1