package org.cagrid.gaards.dorian.federation;
import gov.nih.nci.cagrid.common.FaultHelper;
import gov.nih.nci.cagrid.common.Utils;
import gov.nih.nci.cagrid.dorian.common.CommonUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.cagrid.gaards.dorian.ca.CertificateAuthority;
import org.cagrid.gaards.dorian.common.LoggingObject;
import org.cagrid.gaards.dorian.service.PropertyManager;
import org.cagrid.gaards.dorian.service.util.AddressValidator;
import org.cagrid.gaards.dorian.stubs.types.DorianInternalFault;
import org.cagrid.gaards.dorian.stubs.types.InvalidUserFault;
import org.cagrid.tools.database.Database;
import org.cagrid.tools.database.DatabaseException;
/**
* @author <A href="mailto:langella@bmi.osu.edu">Stephen Langella </A>
* @author <A href="mailto:oster@bmi.osu.edu">Scott Oster </A>
* @author <A href="mailto:hastings@bmi.osu.edu">Shannon Hastings </A>
* @version $Id: ArgumentManagerTable.java,v 1.2 2004/10/15 16:35:16 langella
* Exp $
*/
public class UserManager extends LoggingObject {
public static final String CANNOT_UPDATE_GRID_IDENTITY_ERROR = "Cannot update/change a user's Grid Identity.";
public static final String USERS_TABLE = "ifs_users";
public static final String GID_FIELD = "GID";
public static final String IDP_FIELD = "IDP_ID";
public static final String UID_FIELD = "UID";
public static final String STATUS_FIELD = "STATUS";
public static final String FIRST_NAME_FIELD = "FIRST_NAME";
public static final String LAST_NAME_FIELD = "LAST_NAME";
public static final String EMAIL_FIELD = "EMAIL";
private Database db;
private boolean dbBuilt = false;
private IdentityFederationProperties conf;
private TrustedIdPManager tm;
private FederationDefaults defaults;
private PropertyManager properties;
private Publisher publisher;
private CertificateAuthority ca;
public UserManager(Database db, IdentityFederationProperties conf, PropertyManager properties,
CertificateAuthority ca, TrustedIdPManager tm, Publisher publisher, FederationDefaults defaults) {
super();
this.db = db;
this.tm = tm;
this.defaults = defaults;
this.conf = conf;
this.properties = properties;
this.publisher = publisher;
this.ca = ca;
}
public String getIdentityAssignmentPolicy() {
return conf.getIdentityAssignmentPolicy();
}
public synchronized boolean determineIfUserExists(long idpId, String uid) throws DorianInternalFault {
buildDatabase();
Connection c = null;
boolean exists = false;
try {
c = db.getConnection();
PreparedStatement s = c.prepareStatement("select count(*) from " + USERS_TABLE + " WHERE " + IDP_FIELD
+ "= ? AND " + UID_FIELD + "= ?");
s.setLong(1, idpId);
s.setString(2, uid);
ResultSet rs = s.executeQuery();
if (rs.next()) {
int count = rs.getInt(1);
if (count > 0) {
exists = true;
}
}
rs.close();
s.close();
} catch (Exception e) {
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Database Error");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
return exists;
}
public String getCredentialsManagerUID(long idpId, String uid) {
return "IdPId=" + idpId + ":UID=" + uid;
}
public String getUserSubject(String caSubject, TrustedIdP idp, String uid) {
return getUserSubject(this.conf.getIdentityAssignmentPolicy(), caSubject, idp, uid);
}
public static String getUserSubject(String policy, String caSubject, TrustedIdP idp, String uid) {
int caindex = caSubject.lastIndexOf(",");
String caPreSub = caSubject.substring(0, caindex);
if (policy.equals(IdentityAssignmentPolicy.ID)) {
return caPreSub + ",OU=IdP [" + idp.getId() + "],CN=" + uid;
} else {
return caPreSub + ",OU=" + idp.getName() + ",CN=" + uid;
}
}
public synchronized GridUser getUser(long idpId, String uid) throws DorianInternalFault, InvalidUserFault {
this.buildDatabase();
GridUser user = new GridUser();
Connection c = null;
try {
c = db.getConnection();
PreparedStatement s = c.prepareStatement("select * from " + USERS_TABLE + " WHERE " + IDP_FIELD
+ "= ? AND " + UID_FIELD + "= ?");
s.setLong(1, idpId);
s.setString(2, uid);
ResultSet rs = s.executeQuery();
if (rs.next()) {
user.setIdPId(rs.getLong(IDP_FIELD));
user.setUID(rs.getString(UID_FIELD));
user.setGridId(rs.getString(GID_FIELD));
String firstName = rs.getString(FIRST_NAME_FIELD);
if ((firstName != null) && (!firstName.equalsIgnoreCase("null"))) {
user.setFirstName(firstName);
}
String lastName = rs.getString(LAST_NAME_FIELD);
if ((lastName != null) && (!lastName.equalsIgnoreCase("null"))) {
user.setLastName(lastName);
}
String email = rs.getString(EMAIL_FIELD);
if ((email != null) && (!email.equals("null"))) {
user.setEmail(email);
}
user.setUserStatus(GridUserStatus.fromValue(rs.getString(STATUS_FIELD)));
} else {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString("No such user " + getCredentialsManagerUID(user.getIdPId(), user.getUID()));
throw fault;
}
rs.close();
s.close();
} catch (InvalidUserFault iuf) {
throw iuf;
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Error, could not obtain the user "
+ getCredentialsManagerUID(user.getIdPId(), user.getUID()));
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
return user;
}
public synchronized GridUser getUser(String gridId) throws DorianInternalFault, InvalidUserFault {
this.buildDatabase();
GridUser user = new GridUser();
Connection c = null;
try {
c = db.getConnection();
PreparedStatement s = c.prepareStatement("select * from " + USERS_TABLE + " WHERE " + GID_FIELD + "= ?");
s.setString(1, gridId);
ResultSet rs = s.executeQuery();
if (rs.next()) {
user.setIdPId(rs.getLong(IDP_FIELD));
user.setUID(rs.getString(UID_FIELD));
user.setGridId(rs.getString(GID_FIELD));
String firstName = rs.getString(FIRST_NAME_FIELD);
if ((firstName != null) && (!firstName.equalsIgnoreCase("null"))) {
user.setFirstName(firstName);
}
String lastName = rs.getString(LAST_NAME_FIELD);
if ((lastName != null) && (!lastName.equalsIgnoreCase("null"))) {
user.setLastName(lastName);
}
String email = rs.getString(EMAIL_FIELD);
if ((email != null) && (!email.equalsIgnoreCase("null"))) {
user.setEmail(email);
}
user.setUserStatus(GridUserStatus.fromValue(rs.getString(STATUS_FIELD)));
} else {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString("No such user " + gridId);
throw fault;
}
rs.close();
s.close();
} catch (InvalidUserFault iuf) {
throw iuf;
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Error, could not obtain the user " + gridId);
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
return user;
}
public synchronized GridUserRecord getUserRecord(String gridId) throws DorianInternalFault, InvalidUserFault {
this.buildDatabase();
GridUserRecord user = new GridUserRecord();
Connection c = null;
try {
c = db.getConnection();
PreparedStatement s = c.prepareStatement("select " + GID_FIELD + "," + FIRST_NAME_FIELD + ","
+ LAST_NAME_FIELD + "," + EMAIL_FIELD + " from " + USERS_TABLE + " WHERE " + GID_FIELD + "= ?");
s.setString(1, gridId);
ResultSet rs = s.executeQuery();
if (rs.next()) {
user.setIdentity(rs.getString(GID_FIELD));
String firstName = rs.getString(FIRST_NAME_FIELD);
if ((firstName != null) && (!firstName.equalsIgnoreCase("null"))) {
user.setFirstName(firstName);
}
String lastName = rs.getString(LAST_NAME_FIELD);
if ((lastName != null) && (!lastName.equalsIgnoreCase("null"))) {
user.setLastName(lastName);
}
String email = rs.getString(EMAIL_FIELD);
if ((email != null) && (!email.equalsIgnoreCase("null"))) {
user.setEmail(email);
}
} else {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString("No such user " + gridId);
throw fault;
}
rs.close();
s.close();
} catch (InvalidUserFault iuf) {
throw iuf;
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Error, could not obtain the user " + gridId);
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
return user;
}
public synchronized GridUser[] getUsers(GridUserFilter filter) throws DorianInternalFault {
this.buildDatabase();
Connection c = null;
List<GridUser> users = new ArrayList<GridUser>();
try {
c = db.getConnection();
PreparedStatement s = null;
if (filter != null) {
s = c.prepareStatement("select * from " + USERS_TABLE + " WHERE " + IDP_FIELD + ">= ? AND "
+ IDP_FIELD + "<= ? AND " + UID_FIELD + " LIKE ? AND " + GID_FIELD + " LIKE ? AND " + STATUS_FIELD
+ " LIKE ? AND " + FIRST_NAME_FIELD + " LIKE ? AND " + LAST_NAME_FIELD + " LIKE ? AND "
+ EMAIL_FIELD + " LIKE ?");
if (filter.getIdPId() > 0) {
s.setLong(1, filter.getIdPId());
s.setLong(2, filter.getIdPId());
} else {
s.setLong(1, 0);
s.setLong(2, Long.MAX_VALUE);
}
if (filter.getUID() != null) {
s.setString(3, "%" + filter.getUID() + "%");
} else {
s.setString(3, "%");
}
if (filter.getGridId() != null) {
s.setString(4, "%" + filter.getGridId() + "%");
} else {
s.setString(4, "%");
}
if (filter.getUserStatus() != null) {
s.setString(5, filter.getUserStatus().getValue());
} else {
s.setString(5, "%");
}
if (filter.getFirstName() != null) {
s.setString(6, "%" + filter.getFirstName() + "%");
} else {
s.setString(6, "%");
}
if (filter.getLastName() != null) {
s.setString(7, "%" + filter.getLastName() + "%");
} else {
s.setString(7, "%");
}
if (filter.getEmail() != null) {
s.setString(8, "%" + filter.getEmail() + "%");
} else {
s.setString(8, "%");
}
} else {
s = c.prepareStatement("select * from " + USERS_TABLE);
}
ResultSet rs = s.executeQuery();
while (rs.next()) {
GridUser user = new GridUser();
user.setIdPId(rs.getLong(IDP_FIELD));
user.setUID(rs.getString(UID_FIELD));
user.setGridId(rs.getString(GID_FIELD));
String firstName = rs.getString(FIRST_NAME_FIELD);
if ((firstName != null) && (!firstName.equalsIgnoreCase("null"))) {
user.setFirstName(firstName);
}
String lastName = rs.getString(LAST_NAME_FIELD);
if ((lastName != null) && (!lastName.equalsIgnoreCase("null"))) {
user.setLastName(lastName);
}
String email = rs.getString(EMAIL_FIELD);
if ((email != null) && (!email.equals("null"))) {
user.setEmail(email);
}
user.setUserStatus(GridUserStatus.fromValue(rs.getString(STATUS_FIELD)));
users.add(user);
}
rs.close();
s.close();
GridUser[] list = new GridUser[users.size()];
for (int i = 0; i < list.length; i++) {
list[i] = (GridUser) users.get(i);
}
return list;
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Error, could not obtain a list of users");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
}
public synchronized List<GridUserRecord> getUsers(GridUserSearchCriteria filter) throws DorianInternalFault {
this.buildDatabase();
Connection c = null;
List<GridUserRecord> users = new ArrayList<GridUserRecord>();
try {
c = db.getConnection();
PreparedStatement s = null;
if (filter != null) {
s = c.prepareStatement("select " + GID_FIELD + "," + FIRST_NAME_FIELD + "," + LAST_NAME_FIELD + ","
+ EMAIL_FIELD + " from " + USERS_TABLE + " WHERE " + GID_FIELD + " LIKE ? AND " + FIRST_NAME_FIELD
+ " LIKE ? AND " + LAST_NAME_FIELD + " LIKE ? AND " + EMAIL_FIELD + " LIKE ? AND " + STATUS_FIELD
+ " = '" + GridUserStatus.Active + "'");
if (filter.getIdentity() != null) {
s.setString(1, "%" + filter.getIdentity() + "%");
} else {
s.setString(1, "%");
}
if (filter.getFirstName() != null) {
s.setString(2, "%" + filter.getFirstName() + "%");
} else {
s.setString(2, "%");
}
if (filter.getLastName() != null) {
s.setString(3, "%" + filter.getLastName() + "%");
} else {
s.setString(3, "%");
}
if (filter.getEmail() != null) {
s.setString(4, "%" + filter.getEmail() + "%");
} else {
s.setString(4, "%");
}
} else {
s = c.prepareStatement("select " + GID_FIELD + "," + FIRST_NAME_FIELD + "," + LAST_NAME_FIELD + ","
+ EMAIL_FIELD + " from " + USERS_TABLE);
}
ResultSet rs = s.executeQuery();
while (rs.next()) {
GridUserRecord user = new GridUserRecord();
user.setIdentity(rs.getString(GID_FIELD));
String firstName = rs.getString(FIRST_NAME_FIELD);
if ((firstName != null) && (!firstName.equalsIgnoreCase("null"))) {
user.setFirstName(firstName);
}
String lastName = rs.getString(LAST_NAME_FIELD);
if ((lastName != null) && (!lastName.equalsIgnoreCase("null"))) {
user.setLastName(lastName);
}
String email = rs.getString(EMAIL_FIELD);
if ((email != null) && (!email.equals("null"))) {
user.setEmail(email);
}
users.add(user);
}
rs.close();
s.close();
return users;
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Error, could not obtain a list of users");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
}
public synchronized GridUser addUser(TrustedIdP idp, GridUser user) throws DorianInternalFault, InvalidUserFault {
this.buildDatabase();
if (!determineIfUserExists(user.getIdPId(), user.getUID())) {
Connection c = null;
try {
String caSubject = ca.getCACertificate().getSubjectDN().getName();
user.setGridId(CommonUtils.subjectToIdentity(getUserSubject(caSubject, idp, user.getUID())));
user.setUserStatus(GridUserStatus.Pending);
try {
AddressValidator.validateEmail(user.getEmail());
} catch (IllegalArgumentException e) {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString(e.getMessage());
throw fault;
}
validateSpecifiedField("UID", user.getUID());
validateSpecifiedField("Grid Id", user.getGridId(), false);
validateSpecifiedField("First Name", user.getFirstName());
validateSpecifiedField("Last Name", user.getLastName());
c = db.getConnection();
PreparedStatement s = c.prepareStatement("INSERT INTO " + USERS_TABLE + " SET " + IDP_FIELD + "= ?,"
+ UID_FIELD + "= ?," + GID_FIELD + "= ?, " + STATUS_FIELD + "=?, " + FIRST_NAME_FIELD + "=?, "
+ LAST_NAME_FIELD + "= ?, EMAIL=?");
s.setLong(1, user.getIdPId());
s.setString(2, user.getUID());
s.setString(3, user.getGridId());
s.setString(4, user.getUserStatus().toString());
s.setString(5, user.getFirstName());
s.setString(6, user.getLastName());
s.setString(7, user.getEmail());
s.execute();
if (user.getUserStatus().equals(GridUserStatus.Suspended)) {
publisher.publishCRL();
}
} catch (InvalidUserFault iuf) {
throw iuf;
} catch (Exception e) {
try {
this.removeUser(user.getIdPId(), user.getUID());
} catch (Exception ex) {
}
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Error adding the user "
+ getCredentialsManagerUID(user.getIdPId(), user.getUID())
+ " to the IFS, an unexpected database error occurred.");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
} else {
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Error adding the user, " + getCredentialsManagerUID(user.getIdPId(), user.getUID())
+ ", the user already exists!!!");
throw fault;
}
return user;
}
public synchronized void updateUser(GridUser u) throws DorianInternalFault, InvalidUserFault {
this.buildDatabase();
String credId = getCredentialsManagerUID(u.getIdPId(), u.getUID());
boolean publishCRL = false;
if (determineIfUserExists(u.getIdPId(), u.getUID())) {
Connection c = null;
try {
GridUser curr = this.getUser(u.getIdPId(), u.getUID());
if ((u.getFirstName() != null) && (!u.getFirstName().equals(curr.getFirstName()))) {
validateSpecifiedField("First Name", u.getFirstName());
curr.setFirstName(u.getFirstName());
}
if ((u.getLastName() != null) && (!u.getLastName().equals(curr.getLastName()))) {
validateSpecifiedField("Last Name", u.getLastName());
curr.setLastName(u.getLastName());
}
if ((u.getEmail() != null) && (!u.getEmail().equals(curr.getEmail()))) {
try {
AddressValidator.validateEmail(u.getEmail());
} catch (IllegalArgumentException e) {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString(e.getMessage());
throw fault;
}
curr.setEmail(u.getEmail());
}
if ((u.getGridId() != null) && (!u.getGridId().equals(curr.getGridId()))) {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString(CANNOT_UPDATE_GRID_IDENTITY_ERROR);
throw fault;
}
if ((u.getUserStatus() != null) && (!u.getUserStatus().equals(curr.getUserStatus()))) {
if (accountCreated(curr.getUserStatus()) && !accountCreated(u.getUserStatus())) {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString("Error, cannot change " + credId
+ "'s status from a post-created account status (" + curr.getUserStatus()
+ ") to a pre-created account status (" + u.getUserStatus() + ").");
throw fault;
} else if (curr.getUserStatus().equals(GridUserStatus.Rejected)) {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString("Cannot change the status of account that has been rejected.");
throw fault;
}
if ((curr.getUserStatus().equals(GridUserStatus.Active))
&& (u.getUserStatus().equals(GridUserStatus.Suspended))) {
publishCRL = true;
} else if ((curr.getUserStatus().equals(GridUserStatus.Suspended))
&& (u.getUserStatus().equals(GridUserStatus.Active))) {
publishCRL = true;
}
curr.setUserStatus(u.getUserStatus());
}
c = db.getConnection();
PreparedStatement s = c.prepareStatement("UPDATE " + USERS_TABLE + " SET " + STATUS_FIELD + "=?, "
+ FIRST_NAME_FIELD + "=?, " + LAST_NAME_FIELD + "= ?, " + EMAIL_FIELD + "=? where " + IDP_FIELD
+ "= ? AND " + UID_FIELD + "= ?");
s.setString(1, curr.getUserStatus().getValue());
s.setString(2, curr.getFirstName());
s.setString(3, curr.getLastName());
s.setString(4, curr.getEmail());
s.setLong(5, curr.getIdPId());
s.setString(6, curr.getUID());
s.execute();
if (publishCRL) {
publisher.publishCRL();
}
} catch (InvalidUserFault e) {
throw e;
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Error updating the Grid user "
+ getCredentialsManagerUID(u.getIdPId(), u.getUID()) + ", an unexpected database error occurred.");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
} else {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString("Could not update user, the user " + credId + " does not exist.");
throw fault;
}
}
private boolean accountCreated(GridUserStatus status) {
if (status.equals(GridUserStatus.Pending)) {
return false;
} else if (status.equals(GridUserStatus.Rejected)) {
return false;
} else {
return true;
}
}
public synchronized void removeUser(GridUser user) throws DorianInternalFault, InvalidUserFault {
this.buildDatabase();
if (determineIfUserExists(user.getIdPId(), user.getUID())) {
this.removeUser(user.getIdPId(), user.getUID());
} else {
InvalidUserFault fault = new InvalidUserFault();
fault.setFaultString("Could not remove user, the specified user does not exist.");
throw fault;
}
}
public synchronized void removeUser(long idpId, String uid) throws DorianInternalFault {
this.buildDatabase();
Connection c = null;
try {
c = db.getConnection();
PreparedStatement s = c.prepareStatement("delete from " + USERS_TABLE + " WHERE " + IDP_FIELD + "= ? AND "
+ UID_FIELD + "= ?");
s.setLong(1, idpId);
s.setString(2, uid);
s.execute();
s.close();
} catch (Exception e) {
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Database Error - Could not remove user!!!");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
}
private void validateSpecifiedField(String type, String name, boolean validateLength) throws InvalidUserFault {
name = Utils.clean(name);
if (name == null) {
throw new IllegalArgumentException("No " + type + " specified.");
}
if (validateLength) {
if (name.length() > 255) {
throw new IllegalArgumentException("The " + type
+ " specified is too long, it must be less than 255 characters.");
}
}
}
private void validateSpecifiedField(String type, String name) throws InvalidUserFault {
validateSpecifiedField(type, name, true);
}
public void clearDatabase() throws DorianInternalFault {
try {
db.update("DROP TABLE IF EXISTS " + USERS_TABLE);
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("An unexpected database error occurred.");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
}
this.tm.clearDatabase();
this.dbBuilt = false;
}
public void buildDatabase() throws DorianInternalFault {
if (!dbBuilt) {
try {
if (!this.db.tableExists(USERS_TABLE)) {
String users = "CREATE TABLE " + USERS_TABLE + " (" + IDP_FIELD + " INT NOT NULL," + UID_FIELD
+ " VARCHAR(255) NOT NULL," + FIRST_NAME_FIELD + " VARCHAR(255) NOT NULL," + LAST_NAME_FIELD
+ " VARCHAR(255) NOT NULL," + GID_FIELD + " TEXT NOT NULL," + STATUS_FIELD
+ " VARCHAR(50) NOT NULL," + EMAIL_FIELD + " VARCHAR(255) NOT NULL, "
+ "INDEX document_index (" + UID_FIELD + "));";
db.update(users);
properties.setCurrentVersion();
try {
if (defaults.getDefaultIdP() != null) {
TrustedIdP idp = tm.addTrustedIdP(defaults.getDefaultIdP());
GridUser usr = defaults.getDefaultUser();
if (usr != null) {
usr.setIdPId(idp.getId());
this.addUser(idp, usr);
usr.setUserStatus(GridUserStatus.Active);
this.updateUser(usr);
} else {
DorianInternalFault fault = new DorianInternalFault();
fault
.setFaultString("Unexpected error initializing the User Manager, No initial IFS user specified.");
throw fault;
}
} else {
DorianInternalFault fault = new DorianInternalFault();
fault
.setFaultString("Unexpected error initializing the User Manager, No initial trusted IdP specified.");
throw fault;
}
} catch (DorianInternalFault e) {
throw e;
} catch (Exception e) {
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected error initializing the User Manager.");
FaultHelper helper = new FaultHelper(fault);
helper.addDescription(Utils.getExceptionMessage(e));
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
}
}
} catch (DatabaseException e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("An unexpected database error occurred.");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
}
this.dbBuilt = true;
}
}
public Set<String> getDisabledUsers() throws DorianInternalFault {
Set<String> users = new HashSet<String>();
this.buildDatabase();
Connection c = null;
try {
// First get all the users who's accounts are disabled.
c = db.getConnection();
Statement s = c.createStatement();
StringBuffer sql = new StringBuffer();
sql.append("select " + GID_FIELD + " from " + USERS_TABLE + " WHERE " + STATUS_FIELD + "='"
+ GridUserStatus.Suspended + "' OR " + STATUS_FIELD + "='" + GridUserStatus.Pending + "' OR "
+ STATUS_FIELD + "='" + GridUserStatus.Rejected + "'");
ResultSet rs = s.executeQuery(sql.toString());
while (rs.next()) {
String gid = (rs.getString(GID_FIELD));
if (!users.contains(gid)) {
users.add(gid);
}
}
rs.close();
s.close();
// Now get all the IdPs who are suspended.
TrustedIdP[] idp = this.tm.getSuspendedTrustedIdPs();
if (idp != null) {
for (int i = 0; i < idp.length; i++) {
Statement stmt = c.createStatement();
StringBuffer sb = new StringBuffer();
sb.append("select " + GID_FIELD + " from " + USERS_TABLE + " WHERE " + IDP_FIELD + "="
+ idp[i].getId());
ResultSet result = stmt.executeQuery(sb.toString());
while (result.next()) {
String gid = result.getString(GID_FIELD);
if (!users.contains(gid)) {
users.add(gid);
}
}
stmt.close();
result.close();
}
}
return users;
} catch (Exception e) {
logError(e.getMessage(), e);
DorianInternalFault fault = new DorianInternalFault();
fault.setFaultString("Unexpected Error, could not obtain a list of users");
FaultHelper helper = new FaultHelper(fault);
helper.addFaultCause(e);
fault = (DorianInternalFault) helper.getFault();
throw fault;
} finally {
db.releaseConnection(c);
}
}
}