import javax.servlet.http.Cookie;\r
import javax.servlet.http.HttpServletRequest;\r
\r
+import org.apache.wicket.MarkupContainer;\r
import org.apache.wicket.PageParameters;\r
import org.apache.wicket.RestartResponseAtInterceptPageException;\r
import org.apache.wicket.RestartResponseException;\r
import org.apache.wicket.markup.html.WebPage;\r
import org.apache.wicket.markup.html.basic.Label;\r
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
+import org.apache.wicket.markup.html.panel.Fragment;\r
import org.apache.wicket.protocol.http.WebRequest;\r
import org.apache.wicket.protocol.http.WebResponse;\r
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;\r
// footer\r
if (GitBlit.getBoolean(Keys.web.authenticateViewPages, true)\r
|| GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {\r
- if (GitBlitWebSession.get().isLoggedIn()) {\r
- // logout\r
- add(new LinkPanel("userPanel", null, getString("gb.logout") + " "\r
- + GitBlitWebSession.get().getUser().toString(), LogoutPage.class));\r
- } else {\r
- // login\r
- add(new LinkPanel("userPanel", null, getString("gb.login"), LoginPage.class));\r
- }\r
+ UserFragment userFragment = new UserFragment("userPanel", "userFragment", BasePage.this);\r
+ add(userFragment);\r
} else {\r
add(new Label("userPanel", ""));\r
}\r
+\r
add(new Label("gbVersion", "v" + Constants.VERSION));\r
if (GitBlit.getBoolean(Keys.web.aggressiveHeapManagement, false)) {\r
System.gc();\r
throw new RestartResponseAtInterceptPageException(LoginPage.class);\r
}\r
}\r
+\r
+ /**\r
+ * Panel fragment for displaying login or logout/change_password links.\r
+ * \r
+ */\r
+ class UserFragment extends Fragment {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public UserFragment(String id, String markupId, MarkupContainer markupProvider) {\r
+ super(id, markupId, markupProvider);\r
+\r
+ if (GitBlitWebSession.get().isLoggedIn()) {\r
+ // username, logout, and change password\r
+ add(new Label("username", GitBlitWebSession.get().getUser().toString() + ":"));\r
+ add(new LinkPanel("loginLink", null, markupProvider.getString("gb.logout"),\r
+ LogoutPage.class));\r
+ // quick and dirty hack for showing a separator \r
+ add(new Label("separator", "|"));\r
+ add(new BookmarkablePageLink<Void>("changePasswordLink", ChangePasswordPage.class));\r
+ } else {\r
+ // login\r
+ add(new Label("username").setVisible(false));\r
+ add(new LinkPanel("loginLink", null, markupProvider.getString("gb.login"),\r
+ LoginPage.class));\r
+ add(new Label("separator").setVisible(false));\r
+ add(new Label("changePasswordLink").setVisible(false));\r
+ }\r
+ }\r
+ }\r
}\r
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" \r
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
+ xml:lang="en" \r
+ lang="en"> \r
+ \r
+ <!-- Head with Wicket-controlled resources in this package -->\r
+ <wicket:head>\r
+ <title wicket:id="title">[page title]</title>\r
+ <link rel="stylesheet" type="text/css" href="gitblit.css"/>\r
+ <link rel="shortcut icon" href="gitblt-favicon.png" type="image/png" />\r
+ </wicket:head>\r
+ \r
+ <body onload="document.getElementById('password').focus();">\r
+ <div>\r
+ <div style="padding-top: 10px;text-align:center;">\r
+ <img src="gitblt_25.png" alt="Gitblit"/><br/>\r
+ <div style="padding-top:30px;font-weight:bold;" wicket:id="name"></div>\r
+ </div>\r
+ <p/>\r
+ <form style="text-align:center;" wicket:id="passwordForm">\r
+ <center>\r
+ <table class="plain">\r
+ <tr>\r
+ <th><wicket:message key="gb.password"></wicket:message> </th>\r
+ <td class="edit"><input type="password" wicket:id="password" id="password" size="30" tabindex="1" /></td>\r
+ </tr>\r
+ <tr>\r
+ <th><wicket:message key="gb.confirmPassword"></wicket:message> </th>\r
+ <td class="edit"><input type="password" wicket:id="confirmPassword" size="30" tabindex="2" /></td>\r
+ </tr>\r
+ </table>\r
+ <input type="submit" wicket:message="value:gb.save" wicket:id="save" tabindex="3" />\r
+ <input type="submit" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="4" />\r
+ <div style="padding-top:10px;" wicket:id="feedback"></div>\r
+ </center>\r
+ </form> \r
+ </div>\r
+ </body>\r
+</html>
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket.pages;\r
+\r
+import java.text.MessageFormat;\r
+\r
+import org.apache.wicket.RestartResponseException;\r
+import org.apache.wicket.markup.html.WebPage;\r
+import org.apache.wicket.markup.html.basic.Label;\r
+import org.apache.wicket.markup.html.form.Button;\r
+import org.apache.wicket.markup.html.form.PasswordTextField;\r
+import org.apache.wicket.markup.html.form.StatelessForm;\r
+import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
+import org.apache.wicket.model.IModel;\r
+import org.apache.wicket.model.Model;\r
+import org.apache.wicket.protocol.http.WebResponse;\r
+\r
+import com.gitblit.Constants;\r
+import com.gitblit.GitBlit;\r
+import com.gitblit.GitBlitException;\r
+import com.gitblit.Keys;\r
+import com.gitblit.models.UserModel;\r
+import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.GitBlitWebSession;\r
+\r
+public class ChangePasswordPage extends WebPage {\r
+\r
+ IModel<String> password = new Model<String>("");\r
+ IModel<String> confirmPassword = new Model<String>("");\r
+\r
+ public ChangePasswordPage() {\r
+ super();\r
+\r
+ if (!GitBlitWebSession.get().isLoggedIn()) {\r
+ // Change password requires a login\r
+ throw new RestartResponseException(getApplication().getHomePage());\r
+ }\r
+\r
+ if (!GitBlit.getBoolean(Keys.web.authenticateAdminPages, true) && !GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {\r
+ // no authentication enabled\r
+ throw new RestartResponseException(getApplication().getHomePage());\r
+ }\r
+\r
+ add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));\r
+ add(new Label("name", getString("gb.changePassword") + ": "\r
+ + GitBlitWebSession.get().getUser().username));\r
+\r
+ StatelessForm<Void> form = new StatelessForm<Void>("passwordForm") {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ @Override\r
+ public void onSubmit() {\r
+ String password = ChangePasswordPage.this.password.getObject();\r
+ String confirmPassword = ChangePasswordPage.this.confirmPassword.getObject();\r
+ // ensure passwords match\r
+ if (!password.equals(confirmPassword)) {\r
+ error("Passwords do not match!");\r
+ return;\r
+ }\r
+\r
+ // ensure password satisfies minimum length requirement\r
+ int minLength = GitBlit.getInteger(Keys.realm.minPasswordLength, 5);\r
+ if (minLength < 4) {\r
+ minLength = 4;\r
+ }\r
+ if (password.length() < minLength) {\r
+ error(MessageFormat.format(\r
+ "Password is too short. Minimum length is {0} characters.", minLength));\r
+ return;\r
+ }\r
+\r
+ // convert to MD5 digest, if appropriate\r
+ String type = GitBlit.getString(Keys.realm.passwordStorage, "md5");\r
+ if (type.equalsIgnoreCase("md5")) {\r
+ // store MD5 digest of password\r
+ password = StringUtils.MD5_TYPE + StringUtils.getMD5(password);\r
+ }\r
+\r
+ UserModel user = GitBlitWebSession.get().getUser();\r
+ user.password = password;\r
+ try {\r
+ GitBlit.self().updateUserModel(user.username, user, false);\r
+ if (GitBlit.getBoolean(Keys.web.allowCookieAuthentication, false)) {\r
+ WebResponse response = (WebResponse) getRequestCycle().getResponse();\r
+ GitBlit.self().setCookie(response, user);\r
+ }\r
+ } catch (GitBlitException e) {\r
+ error(e.getMessage());\r
+ return;\r
+ }\r
+ setRedirect(false);\r
+ info("Password successfully changed.");\r
+ setResponsePage(RepositoriesPage.class);\r
+ }\r
+ };\r
+ PasswordTextField passwordField = new PasswordTextField("password", password);\r
+ passwordField.setResetPassword(false);\r
+ form.add(passwordField);\r
+ PasswordTextField confirmPasswordField = new PasswordTextField("confirmPassword",\r
+ confirmPassword);\r
+ confirmPasswordField.setResetPassword(false);\r
+ form.add(confirmPasswordField);\r
+ form.add(new FeedbackPanel("feedback"));\r
+ \r
+ form.add(new Button("save"));\r
+ Button cancel = new Button("cancel"){ \r
+ private static final long serialVersionUID = 1L;\r
+\r
+ @Override\r
+ public void onSubmit() {\r
+ setResponsePage(RepositoriesPage.class);\r
+ }\r
+ };\r
+ cancel.setDefaultFormProcessing(false);\r
+ form.add(cancel);\r
+ \r
+ add(form);\r
+ }\r
+}\r