in jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultUserManager.java [178:246]
public void setUserProfile( final Context context, final UserProfile profile ) throws DuplicateUserException, WikiException {
final Session session = context.getWikiSession();
// Verify user is allowed to save profile!
final Permission p = new WikiPermission( m_engine.getApplicationName(), WikiPermission.EDIT_PROFILE_ACTION );
if ( !m_engine.getManager( AuthorizationManager.class ).checkPermission( session, p ) ) {
throw new WikiSecurityException( "You are not allowed to save wiki profiles." );
}
// Check if profile is new, and see if container allows creation
final boolean newProfile = profile.isNew();
// Check if another user profile already has the fullname or loginname
final UserProfile oldProfile = getUserProfile( session );
final boolean nameChanged = ( oldProfile != null && oldProfile.getFullname() != null ) &&
!( oldProfile.getFullname().equals( profile.getFullname() ) &&
oldProfile.getLoginName().equals( profile.getLoginName() ) );
UserProfile otherProfile;
try {
otherProfile = getUserDatabase().findByLoginName( profile.getLoginName() );
if( otherProfile != null && !otherProfile.equals( oldProfile ) ) {
throw new DuplicateUserException( "security.error.login.taken", profile.getLoginName() );
}
} catch( final NoSuchPrincipalException e ) {
}
try {
otherProfile = getUserDatabase().findByFullName( profile.getFullname() );
if( otherProfile != null && !otherProfile.equals( oldProfile ) ) {
throw new DuplicateUserException( "security.error.fullname.taken", profile.getFullname() );
}
} catch( final NoSuchPrincipalException e ) {
}
// For new accounts, create approval workflow for user profile save.
if( newProfile && oldProfile != null && oldProfile.isNew() ) {
startUserProfileCreationWorkflow( context, profile );
// If the profile doesn't need approval, then just log the user in
try {
final AuthenticationManager mgr = m_engine.getManager( AuthenticationManager.class );
if( !mgr.isContainerAuthenticated() ) {
mgr.login( session, null, profile.getLoginName(), profile.getPassword() );
}
} catch( final WikiException e ) {
throw new WikiSecurityException( e.getMessage(), e );
}
// Alert all listeners that the profile changed...
// ...this will cause credentials to be reloaded in the wiki session
fireEvent( WikiSecurityEvent.PROFILE_SAVE, session, profile );
} else { // For existing accounts, just save the profile
// If login name changed, rename it first
if( nameChanged && !oldProfile.getLoginName().equals( profile.getLoginName() ) ) {
getUserDatabase().rename( oldProfile.getLoginName(), profile.getLoginName() );
}
// Now, save the profile (userdatabase will take care of timestamps for us)
getUserDatabase().save( profile );
if( nameChanged ) {
// Fire an event if the login name or full name changed
final UserProfile[] profiles = new UserProfile[] { oldProfile, profile };
fireEvent( WikiSecurityEvent.PROFILE_NAME_CHANGED, session, profiles );
} else {
// Fire an event that says we have new a new profile (new principals)
fireEvent( WikiSecurityEvent.PROFILE_SAVE, session, profile );
}
}
}