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.

EditUserPage.java 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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.Collections;
  20. import java.util.Iterator;
  21. import java.util.List;
  22. import org.apache.wicket.PageParameters;
  23. import org.apache.wicket.behavior.SimpleAttributeModifier;
  24. import org.apache.wicket.extensions.markup.html.form.palette.Palette;
  25. import org.apache.wicket.markup.html.form.Button;
  26. import org.apache.wicket.markup.html.form.CheckBox;
  27. import org.apache.wicket.markup.html.form.Form;
  28. import org.apache.wicket.markup.html.form.PasswordTextField;
  29. import org.apache.wicket.markup.html.form.TextField;
  30. import org.apache.wicket.model.CompoundPropertyModel;
  31. import org.apache.wicket.model.Model;
  32. import org.apache.wicket.model.util.CollectionModel;
  33. import org.apache.wicket.model.util.ListModel;
  34. import com.gitblit.Constants.AccessRestrictionType;
  35. import com.gitblit.GitBlit;
  36. import com.gitblit.GitBlitException;
  37. import com.gitblit.Keys;
  38. import com.gitblit.models.RepositoryModel;
  39. import com.gitblit.models.TeamModel;
  40. import com.gitblit.models.UserModel;
  41. import com.gitblit.utils.StringUtils;
  42. import com.gitblit.wicket.RequiresAdminRole;
  43. import com.gitblit.wicket.StringChoiceRenderer;
  44. import com.gitblit.wicket.WicketUtils;
  45. @RequiresAdminRole
  46. public class EditUserPage extends RootSubPage {
  47. private final boolean isCreate;
  48. public EditUserPage() {
  49. // create constructor
  50. super();
  51. if (!GitBlit.self().supportsCredentialChanges()) {
  52. error(MessageFormat.format(getString("gb.userServiceDoesNotPermitAddUser"),
  53. GitBlit.getString(Keys.realm.userService, "users.conf")), true);
  54. }
  55. isCreate = true;
  56. setupPage(new UserModel(""));
  57. }
  58. public EditUserPage(PageParameters params) {
  59. // edit constructor
  60. super(params);
  61. isCreate = false;
  62. String name = WicketUtils.getUsername(params);
  63. UserModel model = GitBlit.self().getUserModel(name);
  64. setupPage(model);
  65. }
  66. protected void setupPage(final UserModel userModel) {
  67. if (isCreate) {
  68. super.setupPage(getString("gb.newUser"), "");
  69. } else {
  70. super.setupPage(getString("gb.edit"), userModel.username);
  71. }
  72. final Model<String> confirmPassword = new Model<String>(
  73. StringUtils.isEmpty(userModel.password) ? "" : userModel.password);
  74. CompoundPropertyModel<UserModel> model = new CompoundPropertyModel<UserModel>(userModel);
  75. List<String> repos = new ArrayList<String>();
  76. for (String repo : GitBlit.self().getRepositoryList()) {
  77. RepositoryModel repositoryModel = GitBlit.self().getRepositoryModel(repo);
  78. if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
  79. repos.add(repo);
  80. }
  81. }
  82. List<String> userTeams = new ArrayList<String>();
  83. for (TeamModel team : userModel.teams) {
  84. userTeams.add(team.name);
  85. }
  86. Collections.sort(userTeams);
  87. final String oldName = userModel.username;
  88. final Palette<String> repositories = new Palette<String>("repositories",
  89. new ListModel<String>(new ArrayList<String>(userModel.repositories)),
  90. new CollectionModel<String>(repos), new StringChoiceRenderer(), 10, false);
  91. final Palette<String> teams = new Palette<String>("teams", new ListModel<String>(
  92. new ArrayList<String>(userTeams)), new CollectionModel<String>(GitBlit.self()
  93. .getAllTeamnames()), new StringChoiceRenderer(), 10, false);
  94. Form<UserModel> form = new Form<UserModel>("editForm", model) {
  95. private static final long serialVersionUID = 1L;
  96. /*
  97. * (non-Javadoc)
  98. *
  99. * @see org.apache.wicket.markup.html.form.Form#onSubmit()
  100. */
  101. @Override
  102. protected void onSubmit() {
  103. if (StringUtils.isEmpty(userModel.username)) {
  104. error(getString("gb.pleaseSetUsername"));
  105. return;
  106. }
  107. // force username to lower-case
  108. userModel.username = userModel.username.toLowerCase();
  109. String username = userModel.username;
  110. if (isCreate) {
  111. UserModel model = GitBlit.self().getUserModel(username);
  112. if (model != null) {
  113. error(MessageFormat.format(getString("gb.usernameUnavailable"), username));
  114. return;
  115. }
  116. }
  117. boolean rename = !StringUtils.isEmpty(oldName)
  118. && !oldName.equalsIgnoreCase(username);
  119. if (GitBlit.self().supportsCredentialChanges()) {
  120. if (!userModel.password.equals(confirmPassword.getObject())) {
  121. error(getString("gb.passwordsDoNotMatch"));
  122. return;
  123. }
  124. String password = userModel.password;
  125. if (!password.toUpperCase().startsWith(StringUtils.MD5_TYPE)
  126. && !password.toUpperCase().startsWith(StringUtils.COMBINED_MD5_TYPE)) {
  127. // This is a plain text password.
  128. // Check length.
  129. int minLength = GitBlit.getInteger(Keys.realm.minPasswordLength, 5);
  130. if (minLength < 4) {
  131. minLength = 4;
  132. }
  133. if (password.trim().length() < minLength) {
  134. error(MessageFormat.format(getString("gb.passwordTooShort"),
  135. minLength));
  136. return;
  137. }
  138. // Optionally store the password MD5 digest.
  139. String type = GitBlit.getString(Keys.realm.passwordStorage, "md5");
  140. if (type.equalsIgnoreCase("md5")) {
  141. // store MD5 digest of password
  142. userModel.password = StringUtils.MD5_TYPE
  143. + StringUtils.getMD5(userModel.password);
  144. } else if (type.equalsIgnoreCase("combined-md5")) {
  145. // store MD5 digest of username+password
  146. userModel.password = StringUtils.COMBINED_MD5_TYPE
  147. + StringUtils.getMD5(username + userModel.password);
  148. }
  149. } else if (rename
  150. && password.toUpperCase().startsWith(StringUtils.COMBINED_MD5_TYPE)) {
  151. error(getString("gb.combinedMd5Rename"));
  152. return;
  153. }
  154. }
  155. Iterator<String> selectedRepositories = repositories.getSelectedChoices();
  156. List<String> repos = new ArrayList<String>();
  157. while (selectedRepositories.hasNext()) {
  158. repos.add(selectedRepositories.next().toLowerCase());
  159. }
  160. userModel.repositories.clear();
  161. userModel.repositories.addAll(repos);
  162. Iterator<String> selectedTeams = teams.getSelectedChoices();
  163. userModel.teams.clear();
  164. while (selectedTeams.hasNext()) {
  165. TeamModel team = GitBlit.self().getTeamModel(selectedTeams.next());
  166. if (team == null) {
  167. continue;
  168. }
  169. userModel.teams.add(team);
  170. }
  171. try {
  172. GitBlit.self().updateUserModel(oldName, userModel, isCreate);
  173. } catch (GitBlitException e) {
  174. error(e.getMessage());
  175. return;
  176. }
  177. setRedirect(false);
  178. if (isCreate) {
  179. // create another user
  180. info(MessageFormat.format(getString("gb.userCreated"),
  181. userModel.username));
  182. setResponsePage(EditUserPage.class);
  183. } else {
  184. // back to users page
  185. setResponsePage(UsersPage.class);
  186. }
  187. }
  188. };
  189. // do not let the browser pre-populate these fields
  190. form.add(new SimpleAttributeModifier("autocomplete", "off"));
  191. // not all user services support manipulating username and password
  192. boolean editCredentials = GitBlit.self().supportsCredentialChanges();
  193. // not all user services support manipulating display name
  194. boolean editDisplayName = GitBlit.self().supportsDisplayNameChanges();
  195. // not all user services support manipulating email address
  196. boolean editEmailAddress = GitBlit.self().supportsEmailAddressChanges();
  197. // not all user services support manipulating team memberships
  198. boolean editTeams = GitBlit.self().supportsTeamMembershipChanges();
  199. // field names reflective match UserModel fields
  200. form.add(new TextField<String>("username").setEnabled(editCredentials));
  201. PasswordTextField passwordField = new PasswordTextField("password");
  202. passwordField.setResetPassword(false);
  203. form.add(passwordField.setEnabled(editCredentials));
  204. PasswordTextField confirmPasswordField = new PasswordTextField("confirmPassword",
  205. confirmPassword);
  206. confirmPasswordField.setResetPassword(false);
  207. form.add(confirmPasswordField.setEnabled(editCredentials));
  208. form.add(new TextField<String>("displayName").setEnabled(editDisplayName));
  209. form.add(new TextField<String>("emailAddress").setEnabled(editEmailAddress));
  210. form.add(new CheckBox("canAdmin"));
  211. form.add(new CheckBox("canFork"));
  212. form.add(new CheckBox("excludeFromFederation"));
  213. form.add(repositories);
  214. form.add(teams.setEnabled(editTeams));
  215. form.add(new Button("save"));
  216. Button cancel = new Button("cancel") {
  217. private static final long serialVersionUID = 1L;
  218. @Override
  219. public void onSubmit() {
  220. setResponsePage(UsersPage.class);
  221. }
  222. };
  223. cancel.setDefaultFormProcessing(false);
  224. form.add(cancel);
  225. add(form);
  226. }
  227. }