You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

EditRepositoryPage.java 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket.pages;
  17. import java.text.MessageFormat;
  18. import java.util.ArrayList;
  19. import java.util.Arrays;
  20. import java.util.Collections;
  21. import java.util.Date;
  22. import java.util.Iterator;
  23. import java.util.List;
  24. import java.util.Map;
  25. import org.apache.wicket.PageParameters;
  26. import org.apache.wicket.extensions.markup.html.form.palette.Palette;
  27. import org.apache.wicket.markup.html.form.CheckBox;
  28. import org.apache.wicket.markup.html.form.ChoiceRenderer;
  29. import org.apache.wicket.markup.html.form.DropDownChoice;
  30. import org.apache.wicket.markup.html.form.Form;
  31. import org.apache.wicket.markup.html.form.IChoiceRenderer;
  32. import org.apache.wicket.markup.html.form.TextField;
  33. import org.apache.wicket.model.CompoundPropertyModel;
  34. import org.apache.wicket.model.util.CollectionModel;
  35. import org.apache.wicket.model.util.ListModel;
  36. import com.gitblit.Constants.AccessRestrictionType;
  37. import com.gitblit.GitBlit;
  38. import com.gitblit.GitBlitException;
  39. import com.gitblit.Keys;
  40. import com.gitblit.utils.StringUtils;
  41. import com.gitblit.wicket.BasePage;
  42. import com.gitblit.wicket.GitBlitWebSession;
  43. import com.gitblit.wicket.WicketUtils;
  44. import com.gitblit.wicket.models.RepositoryModel;
  45. import com.gitblit.wicket.models.UserModel;
  46. public class EditRepositoryPage extends BasePage {
  47. private final boolean isCreate;
  48. private boolean isAdmin = false;
  49. public EditRepositoryPage() {
  50. // create constructor
  51. super();
  52. isCreate = true;
  53. setupPage(new RepositoryModel("", "", "", new Date()));
  54. }
  55. public EditRepositoryPage(PageParameters params) {
  56. // edit constructor
  57. super(params);
  58. isCreate = false;
  59. String name = WicketUtils.getRepositoryName(params);
  60. RepositoryModel model = GitBlit.self().getRepositoryModel(name);
  61. setupPage(model);
  62. }
  63. protected void setupPage(final RepositoryModel repositoryModel) {
  64. // ensure this user can create or edit this repository
  65. checkPermissions(repositoryModel);
  66. List<String> repositoryUsers = new ArrayList<String>();
  67. if (isCreate) {
  68. super.setupPage("", getString("gb.newRepository"));
  69. } else {
  70. super.setupPage("", getString("gb.edit"));
  71. if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
  72. repositoryUsers.addAll(GitBlit.self().getRepositoryUsers(repositoryModel));
  73. Collections.sort(repositoryUsers);
  74. }
  75. }
  76. final String oldName = repositoryModel.name;
  77. final Palette<String> usersPalette = new Palette<String>("users", new ListModel<String>(repositoryUsers), new CollectionModel<String>(GitBlit.self().getAllUsernames()), new ChoiceRenderer<String>("", ""), 10, false);
  78. CompoundPropertyModel<RepositoryModel> model = new CompoundPropertyModel<RepositoryModel>(repositoryModel);
  79. Form<RepositoryModel> form = new Form<RepositoryModel>("editForm", model) {
  80. private static final long serialVersionUID = 1L;
  81. @Override
  82. protected void onSubmit() {
  83. try {
  84. // confirm a repository name was entered
  85. if (StringUtils.isEmpty(repositoryModel.name)) {
  86. error("Please set repository name!");
  87. return;
  88. }
  89. // automatically convert backslashes to forward slashes
  90. repositoryModel.name = repositoryModel.name.replace('\\', '/');
  91. // confirm valid characters in repository name
  92. char[] validChars = { '/', '.', '_', '-' };
  93. for (char c : repositoryModel.name.toCharArray()) {
  94. if (!Character.isLetterOrDigit(c)) {
  95. boolean ok = false;
  96. for (char vc : validChars) {
  97. ok |= c == vc;
  98. }
  99. if (!ok) {
  100. error(MessageFormat.format("Illegal character ''{0}'' in repository name!", c));
  101. return;
  102. }
  103. }
  104. }
  105. // confirm access restriction selection
  106. if (repositoryModel.accessRestriction == null) {
  107. error("Please select access restriction!");
  108. return;
  109. }
  110. // save the repository
  111. GitBlit.self().editRepositoryModel(oldName, repositoryModel, isCreate);
  112. // save the repository access list
  113. if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
  114. Iterator<String> users = usersPalette.getSelectedChoices();
  115. List<String> repositoryUsers = new ArrayList<String>();
  116. while (users.hasNext()) {
  117. repositoryUsers.add(users.next());
  118. }
  119. // ensure the owner is added to the user list
  120. if (repositoryModel.owner != null && !repositoryUsers.contains(repositoryModel.owner)) {
  121. repositoryUsers.add(repositoryModel.owner);
  122. }
  123. GitBlit.self().setRepositoryUsers(repositoryModel, repositoryUsers);
  124. }
  125. } catch (GitBlitException e) {
  126. error(e.getMessage());
  127. return;
  128. }
  129. setRedirect(false);
  130. setResponsePage(RepositoriesPage.class);
  131. }
  132. };
  133. // field names reflective match RepositoryModel fields
  134. form.add(new TextField<String>("name").setEnabled(isCreate || isAdmin));
  135. form.add(new TextField<String>("description"));
  136. form.add(new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames()).setEnabled(GitBlitWebSession.get().canAdmin()));
  137. form.add(new DropDownChoice<AccessRestrictionType>("accessRestriction", Arrays.asList(AccessRestrictionType.values()), new AccessRestrictionRenderer()));
  138. form.add(new CheckBox("isFrozen"));
  139. form.add(new CheckBox("useTickets"));
  140. form.add(new CheckBox("useDocs"));
  141. form.add(new CheckBox("showRemoteBranches"));
  142. form.add(usersPalette);
  143. add(form);
  144. }
  145. /**
  146. * Unfortunately must repeat part of AuthorizaitonStrategy here because that
  147. * mechanism does not take PageParameters into consideration, only page
  148. * instantiation.
  149. *
  150. * Repository Owners should be able to edit their repository.
  151. */
  152. private void checkPermissions(RepositoryModel model) {
  153. boolean authenticateAdmin = GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, true);
  154. boolean allowAdmin = GitBlit.self().settings().getBoolean(Keys.web.allowAdministration, true);
  155. GitBlitWebSession session = GitBlitWebSession.get();
  156. UserModel user = session.getUser();
  157. if (allowAdmin) {
  158. if (authenticateAdmin) {
  159. if (user == null) {
  160. // No Login Available
  161. error("Administration requires a login", true);
  162. }
  163. if (isCreate) {
  164. // Create Repository
  165. if (!user.canAdmin()) {
  166. // Only Administrators May Create
  167. error("Only an administrator may create a repository", true);
  168. }
  169. } else {
  170. // Edit Repository
  171. if (user.canAdmin()) {
  172. // Admins can edit everything
  173. isAdmin = true;
  174. return;
  175. } else {
  176. if (!model.owner.equalsIgnoreCase(user.getUsername())) {
  177. // User is not an Admin nor Owner
  178. error("Only an administrator or the owner may edit a repository", true);
  179. }
  180. }
  181. }
  182. }
  183. } else {
  184. // No Administration Permitted
  185. error("Administration is disabled", true);
  186. }
  187. }
  188. private class AccessRestrictionRenderer implements IChoiceRenderer<AccessRestrictionType> {
  189. private static final long serialVersionUID = 1L;
  190. private final Map<AccessRestrictionType, String> map;
  191. public AccessRestrictionRenderer() {
  192. map = getAccessRestrictions();
  193. }
  194. @Override
  195. public String getDisplayValue(AccessRestrictionType type) {
  196. return map.get(type);
  197. }
  198. @Override
  199. public String getIdValue(AccessRestrictionType type, int index) {
  200. return Integer.toString(index);
  201. }
  202. }
  203. }