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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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;
  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>(
  78. repositoryUsers), new CollectionModel<String>(GitBlit.self().getAllUsernames()),
  79. new ChoiceRenderer<String>("", ""), 10, false);
  80. CompoundPropertyModel<RepositoryModel> model = new CompoundPropertyModel<RepositoryModel>(
  81. repositoryModel);
  82. Form<RepositoryModel> form = new Form<RepositoryModel>("editForm", model) {
  83. private static final long serialVersionUID = 1L;
  84. @Override
  85. protected void onSubmit() {
  86. try {
  87. // confirm a repository name was entered
  88. if (StringUtils.isEmpty(repositoryModel.name)) {
  89. error("Please set repository name!");
  90. return;
  91. }
  92. // automatically convert backslashes to forward slashes
  93. repositoryModel.name = repositoryModel.name.replace('\\', '/');
  94. // confirm valid characters in repository name
  95. char[] validChars = { '/', '.', '_', '-' };
  96. for (char c : repositoryModel.name.toCharArray()) {
  97. if (!Character.isLetterOrDigit(c)) {
  98. boolean ok = false;
  99. for (char vc : validChars) {
  100. ok |= c == vc;
  101. }
  102. if (!ok) {
  103. error(MessageFormat.format(
  104. "Illegal character ''{0}'' in repository name!", c));
  105. return;
  106. }
  107. }
  108. }
  109. // confirm access restriction selection
  110. if (repositoryModel.accessRestriction == null) {
  111. error("Please select access restriction!");
  112. return;
  113. }
  114. // save the repository
  115. GitBlit.self().editRepositoryModel(oldName, repositoryModel, isCreate);
  116. // save the repository access list
  117. if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
  118. Iterator<String> users = usersPalette.getSelectedChoices();
  119. List<String> repositoryUsers = new ArrayList<String>();
  120. while (users.hasNext()) {
  121. repositoryUsers.add(users.next());
  122. }
  123. // ensure the owner is added to the user list
  124. if (repositoryModel.owner != null
  125. && !repositoryUsers.contains(repositoryModel.owner)) {
  126. repositoryUsers.add(repositoryModel.owner);
  127. }
  128. GitBlit.self().setRepositoryUsers(repositoryModel, repositoryUsers);
  129. }
  130. } catch (GitBlitException e) {
  131. error(e.getMessage());
  132. return;
  133. }
  134. setRedirect(false);
  135. setResponsePage(RepositoriesPage.class);
  136. }
  137. };
  138. // field names reflective match RepositoryModel fields
  139. form.add(new TextField<String>("name").setEnabled(isCreate || isAdmin));
  140. form.add(new TextField<String>("description"));
  141. form.add(new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames())
  142. .setEnabled(GitBlitWebSession.get().canAdmin()));
  143. form.add(new DropDownChoice<AccessRestrictionType>("accessRestriction", Arrays
  144. .asList(AccessRestrictionType.values()), new AccessRestrictionRenderer()));
  145. form.add(new CheckBox("isFrozen"));
  146. form.add(new CheckBox("useTickets"));
  147. form.add(new CheckBox("useDocs"));
  148. form.add(new CheckBox("showRemoteBranches"));
  149. form.add(usersPalette);
  150. add(form);
  151. }
  152. /**
  153. * Unfortunately must repeat part of AuthorizaitonStrategy here because that
  154. * mechanism does not take PageParameters into consideration, only page
  155. * instantiation.
  156. *
  157. * Repository Owners should be able to edit their repository.
  158. */
  159. private void checkPermissions(RepositoryModel model) {
  160. boolean authenticateAdmin = GitBlit.getBoolean(Keys.web.authenticateAdminPages, true);
  161. boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, true);
  162. GitBlitWebSession session = GitBlitWebSession.get();
  163. UserModel user = session.getUser();
  164. if (allowAdmin) {
  165. if (authenticateAdmin) {
  166. if (user == null) {
  167. // No Login Available
  168. error("Administration requires a login", true);
  169. }
  170. if (isCreate) {
  171. // Create Repository
  172. if (!user.canAdmin) {
  173. // Only Administrators May Create
  174. error("Only an administrator may create a repository", true);
  175. }
  176. } else {
  177. // Edit Repository
  178. if (user.canAdmin) {
  179. // Admins can edit everything
  180. isAdmin = true;
  181. return;
  182. } else {
  183. if (!model.owner.equalsIgnoreCase(user.username)) {
  184. // User is not an Admin nor Owner
  185. error("Only an administrator or the owner may edit a repository", true);
  186. }
  187. }
  188. }
  189. }
  190. } else {
  191. // No Administration Permitted
  192. error("Administration is disabled", true);
  193. }
  194. }
  195. private class AccessRestrictionRenderer implements IChoiceRenderer<AccessRestrictionType> {
  196. private static final long serialVersionUID = 1L;
  197. private final Map<AccessRestrictionType, String> map;
  198. public AccessRestrictionRenderer() {
  199. map = getAccessRestrictions();
  200. }
  201. @Override
  202. public String getDisplayValue(AccessRestrictionType type) {
  203. return map.get(type);
  204. }
  205. @Override
  206. public String getIdValue(AccessRestrictionType type, int index) {
  207. return Integer.toString(index);
  208. }
  209. }
  210. }