/*
* HeadsUp Agile
* Copyright 2009-2017 Heads Up Development Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.headsupdev.agile.app.admin;
import org.headsupdev.agile.api.Project;
import org.headsupdev.agile.security.permission.AccountCreatePermission;
import org.headsupdev.agile.storage.StoredProject;
import org.apache.wicket.markup.html.CSSPackageResource;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.PageParameters;
import org.headsupdev.agile.web.HeadsUpPage;
import org.headsupdev.agile.web.MountPoint;
import org.headsupdev.agile.api.Permission;
import org.headsupdev.agile.api.User;
import org.headsupdev.agile.storage.StoredUser;
import org.headsupdev.agile.storage.MemberRole;
import org.headsupdev.agile.storage.TesterRole;
import org.headsupdev.agile.web.components.OnePressSubmitButton;
import java.util.HashSet;
import java.util.Set;
/**
* Create account page
*
* @author Andrew Williams
* @version $Id$
* @since 1.0
*/
@MountPoint( "add-account" )
public class AddAccount
extends HeadsUpPage
{
public Permission getRequiredPermission()
{
return new AccountCreatePermission();
}
public void layout()
{
super.layout();
add( CSSPackageResource.getHeaderContribution( getClass(), "admin.css" ));
add( new CreateUserForm( "create" ) );
}
protected boolean isSetupPage()
{
return true;
}
@Override
public String getTitle()
{
return "Add Account";
}
class CreateUserForm extends Form
{
String username, password, password2, email, telephone;
String firstname, lastname = "";
boolean tester;
public CreateUserForm( String id )
{
super(id);
TextField userField = new TextField( "username", new PropertyModel( this, "username" ) );
add( userField.setRequired( true ) );
add( new TextField( "firstname", new PropertyModel( this, "firstname" ) ) );
add( new TextField( "lastname", new PropertyModel( this, "lastname" ) ) );
add( new TextField( "email", new PropertyModel( this, "email" ) ).setRequired( true ) );
add( new TextField<String>( "telephone", new PropertyModel<String>( this, "telephone" ) ) );
PasswordTextField pass, pass2;
pass = new PasswordTextField( "password", new PropertyModel( this, "password" ) );
pass2 = new PasswordTextField( "password2", new PropertyModel( this, "password2" ) );
add( pass.setRequired( true ) );
add( pass2.setRequired( true ) );
add( new CheckBox( "tester", new PropertyModel( this, "tester" ) ) );
add( new EqualPasswordInputValidator( pass, pass2 ) );
add( new OnePressSubmitButton( "submitUser" ) );
}
public void onSubmit()
{
User exists = getSecurityManager().getUserByUsername( username );
if ( exists != null )
{
info( "An account with username " + username + " already exists" );
return;
}
StoredUser created = new StoredUser( username );
created.setPassword( password );
created.setEmail( email );
created.setTelephone( telephone );
created.setFirstname( firstname );
created.setLastname( lastname );
if ( tester )
{
created.addRole( getSecurityManager().getRoleById( ( new TesterRole() ).getId() ) );
}
else
{
// add the user to all loaded projects
created.addRole( getSecurityManager().getRoleById( ( new MemberRole() ).getId() ) );
HashSet<Project> allProjects = new HashSet<Project>( getStorage().getProjects() );
allProjects.add( StoredProject.getDefault() );
created.setProjects( allProjects );
// bi-directional relationship
for ( Project project : allProjects )
{
project.getUsers().add( created );
}
// and force them into the "all" project too
Set<User> defaultProjectMembers = StoredProject.getDefault().getUsers();
defaultProjectMembers.add( created );
StoredProject.setDefaultProjectMembers( defaultProjectMembers );
}
( (AdminApplication) getHeadsUpApplication() ).addUser( created );
PageParameters params = new PageParameters();
params.add( "username", created.getUsername() );
setResponsePage( getPageClass( "account" ), params );
}
public String getUsername()
{
return username;
}
public void setUsername( String username )
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword( String password )
{
this.password = password;
}
public String getPassword2()
{
return password2;
}
public void setPassword2( String password2 )
{
this.password2 = password2;
}
public String getEmail()
{
return email;
}
public void setEmail( String email )
{
this.email = email;
}
public String getTelephone()
{
return telephone;
}
public void setTelephone( String telephone )
{
this.telephone = telephone;
}
public String getFirstname()
{
return firstname;
}
public void setFirstname( String firstname )
{
this.firstname = firstname;
}
public String getLastname()
{
return lastname;
}
public void setLastname( String lastname )
{
this.lastname = lastname;
}
public boolean isTester()
{
return tester;
}
public void setTester( boolean tester )
{
this.tester = tester;
}
}
}