/*
* 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.isis.viewer.wicket.ui.pages.accmngt.password_reset;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.isis.applib.services.userreg.UserRegistrationService;
import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.viewer.wicket.model.models.PageType;
import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
import org.apache.isis.viewer.wicket.ui.pages.accmngt.AccountConfirmationMap;
import de.agilecoders.wicket.core.markup.html.bootstrap.common.INotificationMessage;
import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationMessage;
/**
* A panel with a form for creation of new users
*/
public class PasswordResetPanel extends Panel {
/**
* Constructor
*
* @param id The component id
* @param uuid The unique id to find the user's email address
*/
public PasswordResetPanel(final String id, final String uuid) {
super(id);
StatelessForm<Void> form = new StatelessForm<>("passwordResetForm");
addOrReplace(form);
final PasswordTextField passwordField = new PasswordTextField("password", Model.of(""));
passwordField.setLabel(new ResourceModel("passwordLabel"));
form.add(passwordField);
final PasswordTextField confirmPasswordField = new PasswordTextField("confirmPassword", Model.of(""));
confirmPasswordField.setLabel(new ResourceModel("confirmPasswordLabel"));
form.add(confirmPasswordField);
form.add(new EqualPasswordInputValidator(passwordField, confirmPasswordField));
Button signUpButton = new Button("passwordResetSubmit") {
@Override
public void onSubmit() {
super.onSubmit();
final String password = confirmPasswordField.getModelObject();
final AccountConfirmationMap accountConfirmationMap = getApplication().getMetaData(AccountConfirmationMap.KEY);
Boolean passwordUpdated = getIsisSessionFactory().doInSession(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
String email = accountConfirmationMap.get(uuid);
UserRegistrationService userRegistrationService = getIsisSessionFactory().getServicesInjector()
.lookupServiceElseFail(UserRegistrationService.class);
return userRegistrationService.updatePasswordByEmail(email, password);
}
});
if (passwordUpdated) {
accountConfirmationMap.remove(uuid);
success(createPasswordChangeSuccessfulMessage());
} else {
error(getString("passwordChangeUnsuccessful"));
}
}
};
form.add(signUpButton);
}
private INotificationMessage createPasswordChangeSuccessfulMessage() {
Class<? extends Page> signInPage = pageClassRegistry.getPageClass(PageType.SIGN_IN);
CharSequence signInUrl = urlFor(signInPage, null);
Map<String, CharSequence> map = new HashMap<>();
map.put("signInUrl", signInUrl);
String passwordChangeSuccessful = getString("passwordChangeSuccessful", Model.ofMap(map));
NotificationMessage message = new NotificationMessage(Model.of(passwordChangeSuccessful));
message.escapeModelStrings(false);
return message;
}
@javax.inject.Inject // strangely, this isn't a @com.google.inject.Inject
private PageClassRegistry pageClassRegistry;
protected IsisSessionFactory getIsisSessionFactory() {
return IsisContext.getSessionFactory();
}
}