Author: vdegtyarev
Date: Fri Aug  9 08:30:56 2013
New Revision: 1512200

URL: http://svn.apache.org/r1512200
Log:
OPENMEETINGS-743 is fixed.  Forgotten your password email link works as 
expected. 

Added:
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.html
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
Modified:
    openmeetings/trunk/singlewebapp/WebContent/languages/russian.xml
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java

Modified: openmeetings/trunk/singlewebapp/WebContent/languages/russian.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/WebContent/languages/russian.xml?rev=1512200&r1=1512199&r2=1512200&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/WebContent/languages/russian.xml (original)
+++ openmeetings/trunk/singlewebapp/WebContent/languages/russian.xml Fri Aug  9 
08:30:56 2013
@@ -1011,7 +1011,7 @@ see http://openmeetings.apache.org/Langu
     <value>новый пароль</value>
   </string>
   <string id="329" name="resetpass">
-    <value>еще раз введите пароль</value>
+    <value>повторите пароль</value>
   </string>
   <string id="330" name="resetpass">
     <value>Вы ввели неидентичные пароли.</value>

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java?rev=1512200&r1=1512199&r2=1512200&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
 Fri Aug  9 08:30:56 2013
@@ -1293,7 +1293,7 @@ public class UserManager {
                
us.setResethash(cryptManager.getInstanceOfCrypt().createPassPhrase(
                                loginData));
                usersDao.update(us, -1L);
-               String reset_link = appLink + "?lzproxied=solo&hash="
+               String reset_link = appLink + "?hash="
                                + us.getResethash();
 
                String email = us.getAdresses().getEmail();

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java?rev=1512200&r1=1512199&r2=1512200&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
 Fri Aug  9 08:30:56 2013
@@ -26,6 +26,7 @@ import org.apache.openmeetings.remote.re
 import org.apache.openmeetings.web.pages.ActivatePage;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.openmeetings.web.pages.NotInitedPage;
+import org.apache.openmeetings.web.pages.ResetPage;
 import org.apache.openmeetings.web.pages.SwfPage;
 import org.apache.openmeetings.web.pages.auth.SignInPage;
 import org.apache.openmeetings.web.pages.install.InstallWizardPage;
@@ -106,6 +107,7 @@ public class Application extends Authent
                mountPage("install", InstallWizardPage.class);
                mountPage("signin", getSignInPageClass());
                mountPage("activate", ActivatePage.class);
+               mountPage("reset", ResetPage.class);
                mountResource("/recordings/mp4/${id}", new 
Mp4RecordingResourceReference());
                mountResource("/recordings/ogg/${id}", new 
OggRecordingResourceReference());
        }

Added: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.html
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.html?rev=1512200&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.html
 (added)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.html
 Fri Aug  9 08:30:56 2013
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+      http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+       <wicket:extend>
+               <div wicket:id="resetPassword"></div>
+       </wicket:extend>
+</html>

Added: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.java?rev=1512200&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.java
 (added)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/ResetPage.java
 Fri Aug  9 08:30:56 2013
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.pages;
+
+import org.apache.openmeetings.data.user.dao.UsersDao;
+import org.apache.openmeetings.persistence.beans.user.User;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.pages.auth.ResetPasswordDialog;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class ResetPage extends BaseNotInitedPage {
+       private static final long serialVersionUID = 1L;        
+       private final String RESET_PARAM = "hash";
+       
+       public ResetPage(PageParameters pp){
+               String resetHash = pp.get(RESET_PARAM).toString();
+               if (resetHash != null){
+                       Object user = 
Application.getBean(UsersDao.class).getUserByHash(resetHash);
+                       if (user instanceof User){
+                               add(new ResetPasswordDialog("resetPassword", 
(User)user));
+                       }
+               } else {
+                       
setResponsePage(Application.get().getSignInPageClass());                
+               }
+       }
+
+}

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html?rev=1512200&r1=1512199&r2=1512200&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
 Fri Aug  9 08:30:56 2013
@@ -40,5 +40,6 @@
                <span wicket:id="feedback"></span>
                <input type="submit" wicket:id="submit" 
class="invisible-form-component"/>
        </form>
+       <div wicket:id="confirmDialog"></div>
 </wicket:panel>
 </html>
\ No newline at end of file

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java?rev=1512200&r1=1512199&r2=1512200&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
 Fri Aug  9 08:30:56 2013
@@ -26,7 +26,7 @@ import java.util.List;
 import org.apache.openmeetings.data.user.UserManager;
 import org.apache.openmeetings.data.user.dao.UsersDao;
 import org.apache.openmeetings.web.app.WebSession;
-import org.apache.openmeetings.web.pages.SwfPage;
+import org.apache.openmeetings.web.pages.ResetPage;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -41,8 +41,13 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
+import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 
 public class ForgetPasswordDialog extends AbstractFormDialog<String> {
        private static final long serialVersionUID = 8494008571497363018L;
@@ -54,6 +59,7 @@ public class ForgetPasswordDialog extend
        private SignInDialog s;
        private String name;
        private Type type = Type.email;
+    final MessageDialog confirmDialog;
        
        enum Type {
                email
@@ -114,10 +120,29 @@ public class ForgetPasswordDialog extend
                                }
                        }
                });
+               confirmDialog = new MessageDialog("confirmDialog", 
WebSession.getString(312), WebSession.getString(321), DialogButtons.OK, 
DialogIcon.INFO){
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void onConfigure(JQueryBehavior behavior) {
+                               super.onConfigure(behavior);
+                       behavior.setOption("dialogClass", 
Options.asString("no-close"));
+                               behavior.setOption("closeOnEscape", false);
+                       }
+                       
+                       public void onClose(AjaxRequestTarget target, 
DialogButton button) {
+                               s.open(target);
+                       }
+               };
+               add(confirmDialog);
        }
 
        public void onClose(AjaxRequestTarget target, DialogButton button) {
-               s.open(target);
+               if (button.equals(send)){
+                       confirmDialog.open(target);
+               } else {
+                       s.open(target);
+               }
        }
 
        public void setSignInDialog(SignInDialog s) {
@@ -148,6 +173,6 @@ public class ForgetPasswordDialog extend
        protected void onSubmit(AjaxRequestTarget target) {
                //FIXME forgot password should be handled be Wicket
                getBean(UserManager.class).resetUser(type == Type.email ? name 
: "", type == Type.login ? name : ""
-                       , "" + getRequestCycle().urlFor(SwfPage.class, new 
PageParameters()));
+                       , WebSession.get().getBaseUrl() + 
getRequestCycle().urlFor(ResetPage.class, new 
PageParameters()).toString().substring(2));
        }
 }

Added: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html?rev=1512200&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
 (added)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
 Fri Aug  9 08:30:56 2013
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+      http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+<wicket:panel>
+       <form wicket:id="form">
+               <table>
+                       <tr>
+                               <td><label wicket:for="login"><wicket:ommessage 
key="314" /></label></td>
+                               <td><input type="text" readonly 
wicket:id="login" /></td>
+                       </tr>
+                       <tr>
+                               <td><label><wicket:ommessage key="328" 
/></label></td>
+                               <td><input type="password" wicket:id="password" 
/></td>
+                       </tr>
+                       <tr>
+                               <td><label><wicket:ommessage key="329" 
/></label></td>
+                               <td><input type="password" 
wicket:id="confirmPassword" /></td>
+                       </tr>
+               </table>
+               <span wicket:id="feedback"></span>
+               <input type="submit" wicket:id="submit" 
class="invisible-form-component"/>
+       </form>
+       <div wicket:id="confirmReset"></div>
+</wicket:panel>
+</html>
\ No newline at end of file

Added: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java?rev=1512200&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
 (added)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
 Fri Aug  9 08:30:56 2013
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.pages.auth;
+
+import static org.apache.openmeetings.utils.UserHelper.getMinPasswdLength;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static 
org.apache.wicket.validation.validator.StringValidator.minimumLength;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
+import org.apache.openmeetings.data.user.dao.UsersDao;
+import org.apache.openmeetings.persistence.beans.user.User;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.markup.head.CssContentHeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.PasswordTextField;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
+import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
+
+public class ResetPasswordDialog extends AbstractFormDialog<String> {
+       private static final long serialVersionUID = -523469331995677748L;
+       private DialogButton resetBtn = new 
DialogButton(WebSession.getString(327));
+       private Form<String> form;
+       private FeedbackPanel feedback = new FeedbackPanel("feedback");
+       private PasswordTextField password;
+       private final User user;
+    final MessageDialog confirmReset;
+
+       public ResetPasswordDialog(String id, final User user) {
+               super(id, WebSession.getString(325));
+               this.user = user;
+               add(form = new Form<String>("form"){
+                       private static final long serialVersionUID = 
-4553809631029292229L;
+                       private TextField<String> login;
+                       private PasswordTextField confirmPassword;
+                       {
+                               add(feedback.setOutputMarkupId(true));
+                               add(login = new TextField<String>("login", 
Model.of(user.getLogin())));
+                               login.setOutputMarkupId(true);
+                               add(password = new 
PasswordTextField("password", new Model<String>()));
+                               password.setOutputMarkupId(true);
+                               
password.setLabel(Model.of(WebSession.getString(328)));
+                               ConfigurationDao cfgDao = 
getBean(ConfigurationDao.class);
+                               
password.setRequired(false).add(minimumLength(getMinPasswdLength(cfgDao)));
+                               add(confirmPassword = new 
PasswordTextField("confirmPassword", new Model<String>()));
+                               confirmPassword.setOutputMarkupId(true);
+                               
confirmPassword.setLabel(Model.of(WebSession.getString(329)));
+                               
confirmPassword.setRequired(true).add(minimumLength(getMinPasswdLength(cfgDao)));
+
+                               add(new AjaxButton("submit") { //FAKE button so 
"submit-on-enter" works as expected
+                                       private static final long 
serialVersionUID = 5257502637636428620L;
+
+                                       @Override
+                                       protected void 
onSubmit(AjaxRequestTarget target, Form<?> form) {
+                                               
ResetPasswordDialog.this.onSubmit(target);
+                                       }
+                                       
+                                       @Override
+                                       protected void 
onError(AjaxRequestTarget target, Form<?> form) {
+                                               
ResetPasswordDialog.this.onError(target);
+                                       }
+                               });
+                       }
+
+                       @Override
+                       protected void onValidate() {
+                               String pass = password.getConvertedInput();
+                               if (pass != null && !pass.isEmpty() && 
!pass.equals(confirmPassword.getConvertedInput())) {
+                                       error(WebSession.getString(232));
+                               }
+                               super.onValidate();
+                       }
+                       
+               });
+               confirmReset = new MessageDialog("confirmReset", 
WebSession.getString(325), WebSession.getString(332), DialogButtons.OK, 
DialogIcon.INFO){
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void onConfigure(JQueryBehavior behavior) {
+                               super.onConfigure(behavior);
+                       behavior.setOption("dialogClass", 
Options.asString("no-close"));
+                               behavior.setOption("closeOnEscape", false);
+                       }
+                       
+                       public void onClose(AjaxRequestTarget target, 
DialogButton button) {
+                               
setResponsePage(Application.get().getSignInPageClass());
+                       }
+               };
+               add(confirmReset);
+       }
+       
+       @Override
+       public void renderHead(IHeaderResponse response) {
+               super.renderHead(response);
+               response.render(new CssContentHeaderItem(".no-close 
.ui-dialog-titlebar-close { display: none; }", "dialog-noclose", ""));
+       }
+       
+       public void onConfigure(JQueryBehavior behavior) {
+               super.onConfigure(behavior);
+        behavior.setOption("dialogClass", Options.asString("no-close"));
+               behavior.setOption("closeOnEscape", false);
+       }
+
+       @Override
+       protected List<DialogButton> getButtons() {
+               return Arrays.asList(resetBtn);
+       }
+       
+       @Override
+       protected DialogButton getSubmitButton() {
+               return resetBtn;
+       }
+
+       @Override
+       public Form<?> getForm() {
+               return form;
+       }
+
+       @Override
+       protected void onError(AjaxRequestTarget target) {
+               target.add(feedback);
+       }
+
+       @Override
+       protected void onSubmit(AjaxRequestTarget target) {
+               try {
+                       getBean(UsersDao.class).update(user, 
password.getConvertedInput(), user.getUser_id());
+               } catch (Exception e) {
+                       error(e.getMessage());
+               }
+       }
+       
+       @Override
+       public void onClose(AjaxRequestTarget target, DialogButton button) {
+               if (button.equals(resetBtn)){
+                       confirmReset.open(target);
+               } else {
+                       setResponsePage(Application.get().getSignInPageClass());
+               }
+       }
+       
+       @Override
+       protected void onInitialize() {
+               super.onInitialize();
+               add(new JQueryBehavior(JQueryWidget.getSelector(this), 
"dialog") {
+                       private static final long serialVersionUID = 
-8870674570404919597L;
+
+                       @Override
+            protected String $()
+            {
+                return this.$(Options.asString("open"));
+            }
+        });
+       }
+}


Reply via email to