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")); + } + }); + } +}