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.

преди 13 години
преди 13 години
преди 13 години
преди 12 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
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. }