]> source.dussan.org Git - gitblit.git/commitdiff
Change password feature (issue 1)
authorJames Moger <james.moger@gitblit.com>
Wed, 20 Jul 2011 20:01:58 +0000 (16:01 -0400)
committerJames Moger <james.moger@gitblit.com>
Wed, 20 Jul 2011 20:01:58 +0000 (16:01 -0400)
resources/gitblit.css
src/com/gitblit/wicket/GitBlitWebApp.properties
src/com/gitblit/wicket/pages/BasePage.html
src/com/gitblit/wicket/pages/BasePage.java
src/com/gitblit/wicket/pages/ChangePasswordPage.html [new file with mode: 0644]
src/com/gitblit/wicket/pages/ChangePasswordPage.java [new file with mode: 0644]

index e4d291a41721775ebe01f48bde2e9aaaa36ce245..061fef5c01ba5cf2aa8b75407f7fc42656e32bbd 100644 (file)
@@ -174,6 +174,10 @@ div.page_footer {
        font-style: italic;\r
 }\r
 \r
+span.userPanel a, span.userPanel a span {\r
+       font-size: 11px;        \r
+}\r
+\r
 div.page_nav {\r
        color: #ddd;\r
        background-color: #000070;\r
index 2ed61fa638e38c4fa4211d97c132d1bcaec0975a..dab5fa03e9493f7663d57144fca575c96c22e14a 100644 (file)
@@ -40,8 +40,8 @@ gb.pagePrevious prev
 gb.pageNext = next\r
 gb.head = HEAD\r
 gb.blame = blame\r
-gb.login = Login\r
-gb.logout = Logout\r
+gb.login = login\r
+gb.logout = logout\r
 gb.username = username\r
 gb.password = password\r
 gb.tagger = tagger\r
@@ -99,4 +99,6 @@ gb.blob = blob
 gb.commitActivityTrend = commit activity trend\r
 gb.commitActivityDOW = commit activity by day of week\r
 gb.commitActivityAuthors = primary authors by commit activity\r
-gb.feed = feed
\ No newline at end of file
+gb.feed = feed\r
+gb.cancel = cancel\r
+gb.changePassword = change password
\ No newline at end of file
index cc19fbccb634585f7373dec3f91664bc4a40c0c6..aaf3a35350f77b450d0e30777b11fd1cf0fef6f4 100644 (file)
                        <div wicket:id="userPanel">[user panel]</div>\r
                </div>\r
        </body>\r
+       \r
+       <!-- user fragment -->\r
+       <wicket:fragment wicket:id="userFragment">\r
+               <span class="userPanel" wicket:id="username"></span>\r
+               <span class="userPanel" wicket:id="loginLink"></span>\r
+               <span class="userPanel" wicket:id="separator"></span>\r
+               <span class="userPanel"><a wicket:id="changePasswordLink"><wicket:message key="gb.changePassword"></wicket:message></a></span>\r
+       </wicket:fragment>\r
+       \r
 </html>
\ No newline at end of file
index 06d5483737b65acd060a89a383d68bfa6d2ebe00..e95aee32f3ba4f5b7efed959c686fa6de054ff42 100644 (file)
@@ -22,12 +22,15 @@ import java.util.TimeZone;
 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
@@ -105,17 +108,12 @@ public abstract class BasePage extends WebPage {
                // 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
@@ -186,4 +184,34 @@ public abstract class BasePage extends WebPage {
                        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
diff --git a/src/com/gitblit/wicket/pages/ChangePasswordPage.html b/src/com/gitblit/wicket/pages/ChangePasswordPage.html
new file mode 100644 (file)
index 0000000..031352e
--- /dev/null
@@ -0,0 +1,40 @@
+<!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> &nbsp;</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> &nbsp;</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
diff --git a/src/com/gitblit/wicket/pages/ChangePasswordPage.java b/src/com/gitblit/wicket/pages/ChangePasswordPage.java
new file mode 100644 (file)
index 0000000..42cd2b7
--- /dev/null
@@ -0,0 +1,133 @@
+/*\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