package com.eucalyptus.accounts;
import java.util.List;
import org.apache.commons.collections.EnumerationUtils;
import org.apache.log4j.Logger;
import com.eucalyptus.auth.GroupExistsException;
import com.eucalyptus.auth.Groups;
import com.eucalyptus.auth.NoSuchGroupException;
import com.eucalyptus.auth.NoSuchUserException;
import com.eucalyptus.auth.UserExistsException;
import com.eucalyptus.auth.UserInfo;
import com.eucalyptus.auth.Users;
import com.eucalyptus.auth.principal.Group;
import com.eucalyptus.auth.principal.User;
import com.eucalyptus.entities.EntityWrapper;
import com.eucalyptus.util.EucalyptusCloudException;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import edu.ucsb.eucalyptus.msgs.AddGroupResponseType;
import edu.ucsb.eucalyptus.msgs.AddGroupType;
import edu.ucsb.eucalyptus.msgs.AddUserResponseType;
import edu.ucsb.eucalyptus.msgs.AddUserType;
import edu.ucsb.eucalyptus.msgs.DeleteGroupResponseType;
import edu.ucsb.eucalyptus.msgs.DeleteGroupType;
import edu.ucsb.eucalyptus.msgs.DeleteUserResponseType;
import edu.ucsb.eucalyptus.msgs.DeleteUserType;
import edu.ucsb.eucalyptus.msgs.DescribeGroupsResponseType;
import edu.ucsb.eucalyptus.msgs.DescribeGroupsType;
import edu.ucsb.eucalyptus.msgs.DescribeUsersResponseType;
import edu.ucsb.eucalyptus.msgs.DescribeUsersType;
import edu.ucsb.eucalyptus.msgs.GroupInfoType;
import edu.ucsb.eucalyptus.msgs.UserInfoType;
public class Accounts {
private static Logger LOG = Logger.getLogger( Accounts.class );
public DescribeUsersResponseType describeUsers( DescribeUsersType request ) {
DescribeUsersResponseType reply = request.getReply( );
final EntityWrapper<UserInfo> db = EntityWrapper.get( new UserInfo( ) );
Function<User, UserInfoType> mapUser = new Function<User, UserInfoType>( ) {
@Override
public UserInfoType apply( User u ) {
UserInfo otherInfo;
try {
otherInfo = db.getUnique( new UserInfo( u.getName( ) ) );
return new UserInfoType( u, otherInfo.getEmail( ), otherInfo.getConfirmationCode( ) );
} catch ( EucalyptusCloudException e ) {
return new UserInfoType( u, null, null );
}
}
};
List<UserInfoType> userList = reply.getUsers( );
if ( request.getUserNames( ).isEmpty( ) ) {
List<User> allUsers = Users.listAllUsers( );
List<UserInfoType> allUserInfo = Lists.transform( allUsers, mapUser );
userList.addAll( allUserInfo );
} else {
for ( String name : request.getUserNames( ) ) {
try {
User user = Users.lookupUser( name );
UserInfoType userInfo = mapUser.apply( user );
userList.add( userInfo );
} catch ( NoSuchUserException e ) {}
}
}
db.commit( );
return reply;
}
public AddUserResponseType addUser( AddUserType request ) throws EucalyptusCloudException {
AddUserResponseType reply = request.getReply( );
reply.set_return( false );
String userName = request.getUserName( );
String email = request.getEmail( );
boolean admin = request.getAdmin( );
try {
User u = null;
if ( email == null ) {
u = Users.addUser( userName, admin, true );
} else {
u = Users.addUser( userName, admin, false );
}
} catch ( UserExistsException e1 ) {
throw new EucalyptusCloudException( "User already exists: " + userName );
}
reply.set_return( true );
return reply;
}
public DeleteUserResponseType deleteUser( DeleteUserType request ) throws EucalyptusCloudException {
DeleteUserResponseType reply = request.getReply( );
reply.set_return( false );
try {
Users.deleteUser( request.getUserName( ) );
} catch ( NoSuchUserException e ) {
throw new EucalyptusCloudException( "No such user exists: " + request.getUserName( ), e );
} catch ( UnsupportedOperationException e ) {
throw new EucalyptusCloudException( "System is configured to be read only.", e );
}
reply.set_return( true );
return reply;
}
public DeleteGroupResponseType deleteUser( DeleteGroupType request ) throws EucalyptusCloudException {
DeleteGroupResponseType reply = request.getReply( );
reply.set_return( false );
try {
Groups.deleteGroup( request.getGroupName( ) );
} catch ( NoSuchGroupException e ) {
throw new EucalyptusCloudException( "No such group exists: " + request.getGroupName( ), e );
} catch ( UnsupportedOperationException e ) {
throw new EucalyptusCloudException( "System is configured to be read only.", e );
}
reply.set_return( true );
return reply;
}
public DescribeGroupsResponseType describeGroups( DescribeGroupsType request ) {
DescribeGroupsResponseType reply = request.getReply( );
List<Group> groups = Groups.listAllGroups( );
for ( Group g : groups ) {
GroupInfoType groupinfo = new GroupInfoType( g.getName( ) );
for ( User u : ( List<User> ) EnumerationUtils.toList( g.members( ) ) ) {
groupinfo.getUsers( ).add( u.getName( ) );
}
reply.getGroups( ).add( groupinfo );
}
return reply;
}
public AddGroupResponseType addGroup( AddGroupType request ) throws EucalyptusCloudException {
AddGroupResponseType reply = request.getReply( );
try {
Groups.addGroup( request.getGroupName( ) );
reply.set_return( true );
} catch ( GroupExistsException e ) {
throw new EucalyptusCloudException( "Group already exists: " + request.getGroupName( ), e );
}
return reply;
}
}