diff --git a/src/com/silverwrist/util/StringUtil.java b/src/com/silverwrist/util/StringUtil.java index 5b4cc9c..2bccddf 100644 --- a/src/com/silverwrist/util/StringUtil.java +++ b/src/com/silverwrist/util/StringUtil.java @@ -49,7 +49,7 @@ public class StringUtil * @return The SQL-encoded equivalent of str. If str is * null, returns null. */ - public static String encodeStringSQL(String str) + public static final String encodeStringSQL(String str) { if (str==null) return null; // safety feature @@ -81,7 +81,7 @@ public class StringUtil * @return The HTML-encoded equivalent of str. If str is * null, returns null. */ - public static String encodeHTML(String str) + public static final String encodeHTML(String str) { if (str==null) return null; // safety feature @@ -134,7 +134,7 @@ public class StringUtil * @return true if the given string is null or a string of * length 0, false otherwise. */ - public static boolean isStringEmpty(String s) + public static final boolean isStringEmpty(String s) { return ((s==null) || (s.length()==0)); @@ -157,7 +157,7 @@ public class StringUtil * of the find string will be deleted. * @return The base string with all replacements made as detailed above. */ - public static String replaceAllInstances(String base, String find, String replace) + public static final String replaceAllInstances(String base, String find, String replace) { if ((base==null) || isStringEmpty(find)) return base; // safety feature @@ -204,7 +204,7 @@ public class StringUtil * base. * @return The base string with all variable substitutions made as detailed above. */ - public static String replaceAllVariables(String base, Map vars) + public static final String replaceAllVariables(String base, Map vars) { if ((base==null) || (vars==null) || (vars.size()==0)) return base; // safety feature @@ -244,5 +244,39 @@ public class StringUtil } // end replaceAllVariables + public static final String join(Object[] arr, String separator) + { + StringBuffer buf = null; + for (int i=0; i,)..."); + + if (base_role==null) + base_role = env.getDefaultRole("Global.NewUser"); + + // Create the user account. + ReturnNewUser rnu = UserContextImpl.createAccount(env,env.getUser().userRemoteAddress(),username, + password,reminder,verify_email,lockout,0,base_role, + description); + + // Need to create a normal user context here for just a minute to autojoin the communities. + UserContextImpl rc = new UserContextImpl(env); + rc.loadNewUser("0.0.0.0",rnu.getUserID(),base_role.getLevel(),username,0,rnu.getCreationDate(), + rnu.getCreationDate()); + rc.autoJoinCommunities(); + + // Now reload the user context and return it. + return AdminUserContextImpl.getAdminUserContext(env,rnu.getUserID()); + + } // end createNewAccount + } // end class AdminOperationsImpl diff --git a/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java b/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java index 9861f26..ef833f1 100644 --- a/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java +++ b/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java @@ -133,18 +133,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -185,18 +174,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -249,18 +227,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -301,18 +268,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -382,18 +338,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end if @@ -427,18 +372,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -481,18 +415,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -535,18 +458,7 @@ class AdminUserContextImpl implements AdminUserContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally diff --git a/src/com/silverwrist/venice/core/impl/CommunityCoreData.java b/src/com/silverwrist/venice/core/impl/CommunityCoreData.java index 9ee39a0..a9bc786 100644 --- a/src/com/silverwrist/venice/core/impl/CommunityCoreData.java +++ b/src/com/silverwrist/venice/core/impl/CommunityCoreData.java @@ -566,18 +566,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -682,18 +671,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -730,18 +708,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -778,18 +745,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -826,18 +782,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1023,18 +968,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1077,18 +1011,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1203,18 +1126,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1296,18 +1208,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1397,18 +1298,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1888,18 +1778,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -2091,18 +1970,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally diff --git a/src/com/silverwrist/venice/core/impl/ConferenceCommunityContextImpl.java b/src/com/silverwrist/venice/core/impl/ConferenceCommunityContextImpl.java index 2acce1b..024112d 100644 --- a/src/com/silverwrist/venice/core/impl/ConferenceCommunityContextImpl.java +++ b/src/com/silverwrist/venice/core/impl/ConferenceCommunityContextImpl.java @@ -450,18 +450,7 @@ class ConferenceCommunityContextImpl implements ConferenceCommunityContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -570,18 +559,7 @@ class ConferenceCommunityContextImpl implements ConferenceCommunityContext } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally diff --git a/src/com/silverwrist/venice/core/impl/ConferenceCoreData.java b/src/com/silverwrist/venice/core/impl/ConferenceCoreData.java index bce5cb6..a5c06c1 100644 --- a/src/com/silverwrist/venice/core/impl/ConferenceCoreData.java +++ b/src/com/silverwrist/venice/core/impl/ConferenceCoreData.java @@ -512,18 +512,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -568,18 +557,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -680,18 +658,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -768,18 +735,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -860,18 +816,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1021,18 +966,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1287,18 +1221,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1488,18 +1411,7 @@ class ConferenceCoreData implements ConferenceData } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally diff --git a/src/com/silverwrist/venice/core/impl/ContactInfoImpl.java b/src/com/silverwrist/venice/core/impl/ContactInfoImpl.java index 309c27d..32b1b48 100644 --- a/src/com/silverwrist/venice/core/impl/ContactInfoImpl.java +++ b/src/com/silverwrist/venice/core/impl/ContactInfoImpl.java @@ -21,10 +21,12 @@ import java.io.*; import java.sql.*; import java.util.*; import org.apache.log4j.*; +import com.silverwrist.util.StringUtil; import com.silverwrist.venice.core.*; import com.silverwrist.venice.core.internals.EnvEngine; import com.silverwrist.venice.db.*; import com.silverwrist.venice.except.*; +import com.silverwrist.venice.util.*; class ContactInfoImpl implements ContactInfo, Stashable { @@ -101,7 +103,7 @@ class ContactInfoImpl implements ContactInfo, Stashable *-------------------------------------------------------------------------------- */ - private static Category logger = Category.getInstance(ContactInfoImpl.class.getName()); + private static Category logger = Category.getInstance(ContactInfoImpl.class); /*-------------------------------------------------------------------------------- * Attributes @@ -691,6 +693,221 @@ class ContactInfoImpl implements ContactInfo, Stashable } // end getModified + public void importVCard(VCard vc) + { + // Import the easy fields first. + if (vc.getGivenName()!=null) + given_name = vc.getGivenName(); + if (vc.getFamilyName()!=null) + family_name = vc.getFamilyName(); + if (vc.getMiddleName()!=null) + { // modify the middle initial + String tmp = vc.getMiddleName(); + middle_initial = (StringUtil.isStringEmpty(tmp) ? ' ' : tmp.charAt(0)); + + } // end if + + if (vc.getPrefix()!=null) + prefix = vc.getPrefix(); + if (vc.getSuffix()!=null) + suffix = vc.getSuffix(); + if (vc.getOrganizationName()!=null) + company = vc.getOrganizationName(); + if (vc.getURL()!=null) + url = vc.getURL(); + + // Look for an address. + Boolean hide = null; + VCardAddress addr = vc.getPreferredAddress(); + if (addr!=null) + { // always hide the address if it's a home one + if (addr.isHomeAddress()) + hide = Boolean.TRUE; + + } // end if + if (addr==null) + addr = vc.getWorkAddress(); + if (addr==null) + { // get home address (and hide it) + addr = vc.getHomeAddress(); + if (addr!=null) + hide = Boolean.TRUE; + + } // end if + if (addr==null) + { // get any other address (and hide it) + addr = vc.getAnyAddress(); + if ((addr!=null) && addr.isHomeAddress()) + hide = Boolean.TRUE; + + } // end if + + if (addr!=null) + { // fill in the address values here + if (addr.getPOBox()!=null) + { // we have a PO Box... + if (addr.getExtension()!=null) + { // and we have an extension too! + if (addr.getStreet()!=null) + { // Address line 1 is PO Box + extension, line 2 is street + addr1 = "PO Box " + addr.getPOBox() + ", " + addr.getExtension(); + addr2 = addr.getStreet(); + + } // end if + else + { // Address line 1 is PO box, line 2 is extension + addr1 = "PO Box " + addr.getPOBox(); + addr2 = addr.getExtension(); + + } // end else + + } // end if + else + { // Address line 1 is PO Box, line 2 is street + addr1 = "PO Box " + addr.getPOBox(); + addr2 = addr.getStreet(); + + } // end else + + } // end if + else + { // PO Box not present + if (addr.getExtension()!=null) + { // Address line 1 is extension, line 2 is street + addr1 = addr.getExtension(); + addr2 = addr.getStreet(); + + } // end if + else + { // Address line 1 is street, line 2 is null + addr1 = addr.getStreet(); + addr2 = null; + + } // end else + + } // end else + + // Set the other fields. + if (addr.getLocality()!=null) + locality = addr.getLocality(); + if (addr.getRegion()!=null) + region = addr.getRegion(); + if (addr.getPostalCode()!=null) + postal_code = addr.getPostalCode(); + if ((addr.getCountry()!=null) && (addr.getCountry().length()==2)) + country = addr.getCountry().toUpperCase(); + + // Set hide flag if appropriate. + if (hide!=null) + private_addr = hide.booleanValue(); + + } // end if (loading address) + + // Figure out which phone number to put in. + hide = null; + VCardPhone p = vc.getPreferredPhone(); + if (p!=null) + { // hide the phone if it's a home phone + if (p.isHomePhone()) + hide = Boolean.TRUE; + + } // end if + if (p==null) + p = vc.getWorkPhone(); + if (p==null) + { // try the home phone (and hide it) + p = vc.getHomePhone(); + if (p!=null) + hide = Boolean.TRUE; + + } // end if + if (p==null) + { // now try and get any voice phone + p = vc.getVoicePhone(); + if ((p!=null) && p.isHomePhone()) + hide = Boolean.TRUE; + + } // end if + if (p==null) + { // now try and get any phone + p = vc.getAnyPhone(); + if ((p!=null) && (p.isHomePhone() || p.isCellPhone() || p.isPCSPhone())) + hide = Boolean.TRUE; + + } // end if + + if (p!=null) + phone = p.getNumber(); + + // now get the cellphone + p = vc.getCellPhone(); + if (p!=null) + mobile = p.getNumber(); + + if (hide!=null) // save hide value + private_phone = hide.booleanValue(); + + // now get the fax number + hide = null; + p = vc.getPreferredFax(); + if (p!=null) + { // hide the phone if it's a home phone + if (p.isHomePhone()) + hide = Boolean.TRUE; + + } // end if + if (p==null) + p = vc.getWorkFax(); + if (p==null) + { // try the home phone (and hide it) + p = vc.getHomeFax(); + if (p!=null) + hide = Boolean.TRUE; + + } // end if + if (p==null) + { // now try and get any fax + p = vc.getAnyFax(); + if ((p!=null) && (p.isHomePhone())) + hide = Boolean.TRUE; + + } // end if + + // save off the fax number + if (p!=null) + fax = p.getNumber(); + if (hide!=null) + private_fax = hide.booleanValue(); + + // Get the internet address we wish to use. + hide = null; + VCardEmail em = vc.getPreferredEmail(); + if (em!=null) + { // make sure the email is an Internet address! + if (!(em.isInternetEmail())) + em = null; + else if (em.isHomeEmail()) + hide = Boolean.TRUE; + + } // end if + if (em==null) + { // get an Internet email address somehow + em = vc.getInternetEmail(); + if ((em!=null) && em.isHomeEmail()) + hide = Boolean.TRUE; + + } // end if + + // Set the E-mail address. + if (em!=null) + email = em.getAddress(); + if (hide!=null) + private_email = hide.booleanValue(); + + is_modified = true; // we definitely modified things now! + + } // end importVCard + /*-------------------------------------------------------------------------------- * Implementations from interface Stashable *-------------------------------------------------------------------------------- diff --git a/src/com/silverwrist/venice/core/impl/TopicMessageUserContextImpl.java b/src/com/silverwrist/venice/core/impl/TopicMessageUserContextImpl.java index d776d94..c4b18b1 100644 --- a/src/com/silverwrist/venice/core/impl/TopicMessageUserContextImpl.java +++ b/src/com/silverwrist/venice/core/impl/TopicMessageUserContextImpl.java @@ -530,18 +530,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -659,18 +648,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -766,18 +744,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -946,18 +913,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1072,18 +1028,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally diff --git a/src/com/silverwrist/venice/core/impl/TopicUserContextImpl.java b/src/com/silverwrist/venice/core/impl/TopicUserContextImpl.java index 720e4de..108d6d4 100644 --- a/src/com/silverwrist/venice/core/impl/TopicUserContextImpl.java +++ b/src/com/silverwrist/venice/core/impl/TopicUserContextImpl.java @@ -324,18 +324,7 @@ class TopicUserContextImpl implements TopicContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -383,18 +372,7 @@ class TopicUserContextImpl implements TopicContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -813,18 +791,7 @@ class TopicUserContextImpl implements TopicContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -925,18 +892,7 @@ class TopicUserContextImpl implements TopicContext } // end catch finally { // make sure we release the connection before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally diff --git a/src/com/silverwrist/venice/core/impl/UserContextImpl.java b/src/com/silverwrist/venice/core/impl/UserContextImpl.java index 8ca704e..0cd9634 100644 --- a/src/com/silverwrist/venice/core/impl/UserContextImpl.java +++ b/src/com/silverwrist/venice/core/impl/UserContextImpl.java @@ -457,18 +457,7 @@ class UserContextImpl implements UserContext, UserBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end if @@ -493,7 +482,7 @@ class UserContextImpl implements UserContext, UserBackend { // the confirmation number is wrong logger.warn("...confirmation number incorrect"); ar = new AuditRecord(AuditRecord.VERIFY_FAIL,uid,remote_addr,"Invalid confirmation number"); - env.getEngine().saveAuditRecord(ar); + env.saveAuditRecord(ar); throw new AccessError("Confirmation number is incorrect. Please try again."); } // end if @@ -526,18 +515,7 @@ class UserContextImpl implements UserContext, UserBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end if @@ -591,18 +569,7 @@ class UserContextImpl implements UserContext, UserBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end if @@ -726,18 +693,7 @@ class UserContextImpl implements UserContext, UserBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end if @@ -838,18 +794,7 @@ class UserContextImpl implements UserContext, UserBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end finally @@ -1413,18 +1358,7 @@ class UserContextImpl implements UserContext, UserBackend } // end catch finally { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - + AuditRecord.store(conn,ar); env.releaseConnection(conn); } // end if @@ -1633,6 +1567,178 @@ class UserContextImpl implements UserContext, UserBackend } // end autoJoinCommunities + /*-------------------------------------------------------------------------------- + * External static operations + *-------------------------------------------------------------------------------- + */ + + static ReturnNewUser createAccount(EnvEngine env, String remote_addr, String username, String password, + String reminder, boolean verify_email, boolean lockout, int confirm_num, + Role base_role, String description) + throws AccessError, DataException + { + String encode_username = SQLUtil.encodeString(username); + int new_uid; // new user ID - return from this function + java.util.Date created; // date created - return from this function + Connection conn = null; + AuditRecord ar = null; + + try + { // first, lock a bunch of tables for the purpose of this operation + conn = env.getConnection(); + Statement stmt = conn.createStatement(); + stmt.executeUpdate("LOCK TABLES users WRITE, userprefs WRITE, propuser WRITE, sigmember WRITE, " + + "sideboxes WRITE, confhotlist WRITE;"); + + try + { // make sure the user account doesn't already exist + ResultSet rs = stmt.executeQuery("SELECT uid FROM users WHERE username = '" + encode_username + "';"); + if (rs.next()) + { // the user account already exists + logger.warn("username \"" + username + "\" already exists"); + throw new AccessError("That user name already exists. Please try again."); + + } // end if + + // Insert a new record for this user + PasswordHash phash = new PasswordHash(password); + StringBuffer sql = + new StringBuffer("INSERT INTO users (username, passhash, verify_email, lockout, email_confnum, " + + "base_lvl, created, lastaccess, passreminder, description) VALUES ('"); + sql.append(encode_username).append("', '").append(phash.toString()).append("', "); + sql.append(verify_email ? '1' : '0').append(", ").append(lockout ? '1' : '0').append(", "); + sql.append(confirm_num).append(", ").append(base_role.getLevel()).append(", '"); + created = new java.util.Date(); + sql.append(SQLUtil.encodeDate(created)).append("', '").append(SQLUtil.encodeDate(created)); + sql.append("', ").append(SQLUtil.encodeStringArg(reminder)).append(", "); + sql.append(SQLUtil.encodeStringArg(description)).append(");"); + stmt.executeUpdate(sql.toString()); + + // what is the new user ID? + rs = stmt.executeQuery("SELECT LAST_INSERT_ID();"); + if (!(rs.next())) + { // the readback failed... + logger.error("readback of new user's UID failed"); + throw new DataException("unable to read back new user ID"); + + } // end if + + new_uid = rs.getInt(1); + if (logger.isDebugEnabled()) + logger.debug("...created user \"" + username + "\" with UID " + new_uid); + + // add a UserPrefs record for this user, too + sql.setLength(0); + sql.append("INSERT INTO userprefs (uid) VALUES (").append(new_uid).append(");"); + stmt.executeUpdate(sql.toString()); + + if (logger.isDebugEnabled()) + logger.debug("...created userprefs"); + + // add a properties configuration for this user + rs = stmt.executeQuery("SELECT propuser.ndx, propuser.data FROM propuser, users WHERE " + + "propuser.uid = users.uid AND users.is_anon = 1;"); + sql.setLength(0); + while (rs.next()) + { // set up to insert into the propuser table + if (sql.length()==0) + sql.append("INSERT INTO propuser (uid, ndx, data) VALUES "); + else + sql.append(", "); + sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", '"); + sql.append(SQLUtil.encodeString(rs.getString(2))).append("')"); + + } // end while + + if (sql.length()>0) + { // execute the big update + sql.append(';'); + stmt.executeUpdate(sql.toString()); + + } // end if + + if (logger.isDebugEnabled()) + logger.debug("...created user properties"); + + // get the sidebox configuration for this user + rs = stmt.executeQuery("SELECT sideboxes.boxid, sideboxes.sequence FROM sideboxes, " + + "users WHERE sideboxes.uid = users.uid AND users.is_anon = 1;"); + sql.setLength(0); + while (rs.next()) + { // set up to insert into the sideboxes table + if (sql.length()==0) + sql.append("INSERT INTO sideboxes (uid, boxid, sequence) VALUES "); + else + sql.append(", "); + sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", "); + sql.append(rs.getInt(2)).append(')'); + + } // end while + + if (sql.length()>0) + { // execute the big update + sql.append(';'); + stmt.executeUpdate(sql.toString()); + + } // end if + + if (logger.isDebugEnabled()) + logger.debug("...loaded default sidebox config"); + + // get the hotlist configuration for this user + rs = stmt.executeQuery("SELECT confhotlist.sequence, confhotlist.sigid, confhotlist.confid FROM " + + "confhotlist, users WHERE confhotlist.uid = users.uid AND users.is_anon = 1;"); + sql.setLength(0); + while (rs.next()) + { // set up to insert into the confhotlist table + if (sql.length()==0) + sql.append("INSERT INTO confhotlist (uid, sequence, sigid, confid) VALUES "); + else + sql.append(", "); + sql.append('(').append(new_uid).append(", ").append(rs.getInt(1)).append(", ").append(rs.getInt(2)); + sql.append(", ").append(rs.getInt(3)).append(')'); + + } // end while + + if (sql.length()>0) + { // execute the big update + sql.append(';'); + stmt.executeUpdate(sql.toString()); + + } // end if + + if (logger.isDebugEnabled()) + logger.debug("...loaded default hotlist config"); + + } // end try + finally + { // make sure the tables get unlocked before we go + Statement ulk_stmt = conn.createStatement(); + ulk_stmt.executeUpdate("UNLOCK TABLES;"); + + } // end finally + + // the operation was a success - give back an audit record + ar = new AuditRecord(AuditRecord.ACCOUNT_CREATE,new_uid,remote_addr); + + } // end try + catch (SQLException e) + { // database error - this is a DataException + logger.error("DB error creating user: " + e.getMessage(),e); + throw new DataException("unable to create user record: " + e.getMessage(),e); + + } // end catch + finally + { // make sure the connection is released before we go + AuditRecord.store(conn,ar); + env.releaseConnection(conn); + + } // end finally + + return new ReturnNewUser(new_uid,created); + + } // end createAccount + /*-------------------------------------------------------------------------------- * Static initializer *-------------------------------------------------------------------------------- diff --git a/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java b/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java index 8b9b758..306caf2 100644 --- a/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java +++ b/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java @@ -1010,180 +1010,21 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend throws DataException, AccessError { checkInitialized(); - Connection conn = null; - AuditRecord ar = null; - String encode_username = SQLUtil.encodeString(username); Role new_role = global_security.getDefaultRole("Global.NewUser"); // email confirmation # is between 1000000 and 9999999 int confirm_num = getNewConfirmationNumber(); - int new_uid; - java.util.Date created = null; if (logger.isDebugEnabled()) logger.debug("createNewAccount(\"" + username + "\",,)..."); - - try - { // look to see if the user name is already present - conn = env.getConnection(); - Statement stmt = conn.createStatement(); - stmt.executeUpdate("LOCK TABLES users WRITE, userprefs WRITE, propuser WRITE, sigmember WRITE, " - + "sideboxes WRITE, confhotlist WRITE;"); - try - { // make sure the user name isn't there already - ResultSet rs = stmt.executeQuery("SELECT uid FROM users WHERE username = '" + encode_username + "';"); - if (rs.next()) - { // the user account already exists - logger.warn("username \"" + username + "\" already exists"); - throw new AccessError("That user name already exists. Please try again."); - } // end if - - // perform the insert of the user's new data - PasswordHash phash = new PasswordHash(password); - StringBuffer sql = new StringBuffer("INSERT INTO users (username, passhash, email_confnum, " - + "base_lvl, created, lastaccess, passreminder) VALUES ('"); - sql.append(encode_username).append("', '").append(phash.toString()).append("', "); - sql.append(confirm_num).append(", ").append(new_role.getLevel()).append(", '"); - created = new java.util.Date(); - sql.append(SQLUtil.encodeDate(created)).append("', '").append(SQLUtil.encodeDate(created)); - sql.append("', ").append(SQLUtil.encodeStringArg(reminder)).append(");"); - stmt.executeUpdate(sql.toString()); - - // what is the new user ID? - rs = stmt.executeQuery("SELECT LAST_INSERT_ID();"); - if (!(rs.next())) - { // the readback failed... - logger.error("readback of new user's UID failed"); - throw new DataException("unable to read back new user ID"); - - } // end if - - new_uid = rs.getInt(1); - if (logger.isDebugEnabled()) - logger.debug("...created user \"" + username + "\" with UID " + new_uid); - - // add a UserPrefs record for this user, too - sql.setLength(0); - sql.append("INSERT INTO userprefs (uid) VALUES (").append(new_uid).append(");"); - stmt.executeUpdate(sql.toString()); - - if (logger.isDebugEnabled()) - logger.debug("...created userprefs"); - - // add a properties configuration for this user - rs = stmt.executeQuery("SELECT propuser.ndx, propuser.data FROM propuser, users WHERE " - + "propuser.uid = users.uid AND users.is_anon = 1;"); - sql.setLength(0); - while (rs.next()) - { // set up to insert into the propuser table - if (sql.length()==0) - sql.append("INSERT INTO propuser (uid, ndx, data) VALUES "); - else - sql.append(", "); - sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", '"); - sql.append(SQLUtil.encodeString(rs.getString(2))).append("')"); - - } // end while - - if (sql.length()>0) - { // execute the big update - sql.append(';'); - stmt.executeUpdate(sql.toString()); - - } // end if - - if (logger.isDebugEnabled()) - logger.debug("...created user properties"); - - // get the sidebox configuration for this user - rs = stmt.executeQuery("SELECT sideboxes.boxid, sideboxes.sequence FROM sideboxes, " - + "users WHERE sideboxes.uid = users.uid AND users.is_anon = 1;"); - sql.setLength(0); - while (rs.next()) - { // set up to insert into the sideboxes table - if (sql.length()==0) - sql.append("INSERT INTO sideboxes (uid, boxid, sequence) VALUES "); - else - sql.append(", "); - sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", "); - sql.append(rs.getInt(2)).append(')'); - - } // end while - - if (sql.length()>0) - { // execute the big update - sql.append(';'); - stmt.executeUpdate(sql.toString()); - - } // end if - - if (logger.isDebugEnabled()) - logger.debug("...loaded default sidebox config"); - - // get the hotlist configuration for this user - rs = stmt.executeQuery("SELECT confhotlist.sequence, confhotlist.sigid, confhotlist.confid FROM " - + "confhotlist, users WHERE confhotlist.uid = users.uid AND users.is_anon = 1;"); - sql.setLength(0); - while (rs.next()) - { // set up to insert into the confhotlist table - if (sql.length()==0) - sql.append("INSERT INTO confhotlist (uid, sequence, sigid, confid) VALUES "); - else - sql.append(", "); - sql.append('(').append(new_uid).append(", ").append(rs.getInt(1)).append(", ").append(rs.getInt(2)); - sql.append(", ").append(rs.getInt(3)).append(')'); - - } // end while - - if (sql.length()>0) - { // execute the big update - sql.append(';'); - stmt.executeUpdate(sql.toString()); - - } // end if - - if (logger.isDebugEnabled()) - logger.debug("...loaded default hotlist config"); - - } // end try - finally - { // make sure the tables get unlocked before we go - Statement ulk_stmt = conn.createStatement(); - ulk_stmt.executeUpdate("UNLOCK TABLES;"); - - } // end finally - - // the operation was a success - give back an audit record - ar = new AuditRecord(AuditRecord.ACCOUNT_CREATE,new_uid,remote_addr); - - } // end try - catch (SQLException e) - { // database error - this is a DataException - logger.error("DB error creating user: " + e.getMessage(),e); - throw new DataException("unable to create user record: " + e.getMessage(),e); - - } // end catch - finally - { // make sure the connection is released before we go - try - { // save off the audit record before we go, though - if ((ar!=null) && (conn!=null)) - ar.store(conn); - - } // end try - catch (SQLException e) - { // we couldn't store the audit record! - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - - env.releaseConnection(conn); - - } // end finally + // Create the user account. + ReturnNewUser rnu = UserContextImpl.createAccount(env,remote_addr,username,password,reminder,false, + false,confirm_num,new_role,null); // create a new context for the user (they're now effectively logged in) UserContextImpl rc = new UserContextImpl(env); - rc.loadNewUser(remote_addr,new_uid,new_role.getLevel(),username,confirm_num,created,created); + rc.loadNewUser(remote_addr,rnu.getUserID(),new_role.getLevel(),username,confirm_num,rnu.getCreationDate(), + rnu.getCreationDate()); rc.autoJoinCommunities(); // EJB 4/14/2001 if (logger.isDebugEnabled()) logger.debug("...created new user context"); @@ -1731,33 +1572,6 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend } // end detachConferenceDataObject - public void saveAuditRecord(AuditRecord ar) - { - checkInitialized(); - Connection conn = null; - - if (ar==null) - return; // don't store a null record - - try - { // get a connection and use it to store the audit record - conn = env.getConnection(); - ar.store(conn); - - } // end try - catch (SQLException e) - { // just log an error if we screwed up - logger.error("DB error saving audit record: " + e.getMessage(),e); - - } // end catch - finally - { // make sure the connection is released before we go - env.releaseConnection(conn); - - } // end finally - - } // end saveAuditRecord - public void registerNewConference(ConferenceData conf) { checkInitialized(); diff --git a/src/com/silverwrist/venice/core/internals/EngineBackend.java b/src/com/silverwrist/venice/core/internals/EngineBackend.java index b749571..e4205f2 100644 --- a/src/com/silverwrist/venice/core/internals/EngineBackend.java +++ b/src/com/silverwrist/venice/core/internals/EngineBackend.java @@ -77,8 +77,6 @@ public interface EngineBackend public abstract void detachConferenceDataObject(int confid); - public abstract void saveAuditRecord(AuditRecord ar); - public abstract void registerNewConference(ConferenceData conf); public abstract HTMLChecker createCheckerObject(int type); diff --git a/src/com/silverwrist/venice/core/internals/EnvEngine.java b/src/com/silverwrist/venice/core/internals/EnvEngine.java index 39a6cb5..11755d8 100644 --- a/src/com/silverwrist/venice/core/internals/EnvEngine.java +++ b/src/com/silverwrist/venice/core/internals/EnvEngine.java @@ -20,6 +20,7 @@ package com.silverwrist.venice.core.internals; import java.sql.Connection; import java.sql.SQLException; import java.util.List; +import org.apache.log4j.*; import com.silverwrist.venice.core.SecurityInfo; import com.silverwrist.venice.db.*; import com.silverwrist.venice.except.AccessError; @@ -28,6 +29,13 @@ import com.silverwrist.venice.svc.ServiceControl; public class EnvEngine { + /*-------------------------------------------------------------------------------- + * Static data members + *-------------------------------------------------------------------------------- + */ + + private static Category logger = Category.getInstance(EnvEngine.class); + /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- @@ -141,4 +149,30 @@ public class EnvEngine } // end getSecurityInfo + public final void saveAuditRecord(AuditRecord ar) + { + Connection conn = null; + + if (ar==null) + return; // don't store a null record + + try + { // get a connection and use it to store the audit record + conn = datapool.getConnection(); + ar.store(conn); + + } // end try + catch (SQLException e) + { // just log an error if we screwed up + logger.error("DB error saving audit record: " + e.getMessage(),e); + + } // end catch + finally + { // make sure the connection is released before we go + datapool.releaseConnection(conn); + + } // end finally + + } // end saveAuditRecord + } // end class EnvEngine diff --git a/src/com/silverwrist/venice/core/internals/ReturnNewUser.java b/src/com/silverwrist/venice/core/internals/ReturnNewUser.java new file mode 100644 index 0000000..6c77444 --- /dev/null +++ b/src/com/silverwrist/venice/core/internals/ReturnNewUser.java @@ -0,0 +1,61 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.venice.core.internals; + +import java.util.Date; + +public class ReturnNewUser +{ + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private int uid; + private Date created; + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + public ReturnNewUser(int uid, Date created) + { + this.uid = uid; + this.created = created; + + } // end class ReturnNewUser + + /*-------------------------------------------------------------------------------- + * External getters + *-------------------------------------------------------------------------------- + */ + + public final int getUserID() + { + return uid; + + } // end getUserID + + public final Date getCreationDate() + { + return created; + + } // end getCreationDate + +} // end class ReturnNewUser diff --git a/src/com/silverwrist/venice/security/AuditRecord.java b/src/com/silverwrist/venice/security/AuditRecord.java index a00d0de..461ad20 100644 --- a/src/com/silverwrist/venice/security/AuditRecord.java +++ b/src/com/silverwrist/venice/security/AuditRecord.java @@ -19,6 +19,7 @@ package com.silverwrist.venice.security; import java.sql.*; import java.util.*; +import org.apache.log4j.*; import com.silverwrist.venice.db.SQLUtil; import com.silverwrist.venice.core.AuditData; import com.silverwrist.venice.except.DataException; @@ -104,6 +105,13 @@ public class AuditRecord implements AuditData } // end class DescrStringCache + /*-------------------------------------------------------------------------------- + * Static data members + *-------------------------------------------------------------------------------- + */ + + private static Category logger = Category.getInstance(AuditRecord.class); + /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- @@ -399,4 +407,20 @@ public class AuditRecord implements AuditData } // end getAuditRecordCount + public static void store(Connection conn, AuditRecord ar) + { + try + { // save off the audit record + if ((ar!=null) && (conn!=null)) + ar.store(conn); + + } // end try + catch (SQLException e) + { // we couldn't store the audit record! + logger.error("DB error saving audit record: " + e.getMessage(),e); + + } // end catch + + } // end store + } // end class AuditRecord diff --git a/src/com/silverwrist/venice/security/StaticSecurityMonitor.java b/src/com/silverwrist/venice/security/StaticSecurityMonitor.java index 55603f0..51332de 100644 --- a/src/com/silverwrist/venice/security/StaticSecurityMonitor.java +++ b/src/com/silverwrist/venice/security/StaticSecurityMonitor.java @@ -24,6 +24,7 @@ import com.silverwrist.util.DOMElementHelper; import com.silverwrist.venice.except.AccessError; import com.silverwrist.venice.except.ConfigException; import com.silverwrist.venice.svc.SecurityMonitorEnvironment; +import com.silverwrist.venice.util.XMLLoader; /** * A SecurityMonitor which is configured by means of XML data, supplied by means of a Venice @@ -118,28 +119,17 @@ public class StaticSecurityMonitor implements SecurityMonitor */ public StaticSecurityMonitor(Element cfg, SecurityMonitorEnvironment env) throws ConfigException { + XMLLoader loader = XMLLoader.get(); boolean set_root_monitor = false; - if (!(cfg.getTagName().equals("security-definition"))) - { // not the right kind of element! - logger.fatal("security monitor config is not a element"); - throw new ConfigException("configuration must be a ",cfg); - - } // end if - - DOMElementHelper root_h = new DOMElementHelper(cfg); - if (root_h.hasAttribute("id")) - id = cfg.getAttribute("id"); - else - { // no id= attribute? that's bad! - logger.fatal("security monitor has no id= attribute"); - throw new ConfigException(" must have an id= attribute",cfg); - - } // end else + loader.configVerifyTagName(cfg,"security-definition"); // verify the tag name + // Get the new security monitor's ID. + id = loader.configGetAttribute(cfg,"id"); if (logger.isDebugEnabled()) logger.debug("defining new StaticSecurityMonitor with id=" + id); + // Make sure this security monitor isn't already defined. if (env.isMonitorDefined(id)) { // the monitor with this ID has already been defined! logger.fatal("security monitor with id=" + id + " is already defined!"); @@ -147,8 +137,10 @@ public class StaticSecurityMonitor implements SecurityMonitor } // end if + // See if the security monitor has a parent attribute. + DOMElementHelper root_h = new DOMElementHelper(cfg); if (root_h.hasAttribute("parent")) - { // find our parent + { // get the parent and determine if it exists or not String parent_id = cfg.getAttribute("parent"); parent = env.getMonitor(parent_id); if (parent==null) @@ -158,19 +150,13 @@ public class StaticSecurityMonitor implements SecurityMonitor } // end if + // Determine the new scope for this security monitor. int my_scope = parent.getScopeInfo().getScope(); int my_offset = DEFAULT_SCOPE_OFFSET; + if (root_h.hasAttribute("offset")) - { // get the offset value and compare it - Integer tmp = root_h.getAttributeInt("offset"); - if (tmp==null) - { // the offset was not an integer value - bye now! - logger.fatal("offset= value was not an integer"); - throw new ConfigException("offset= attribute of must be an integer"); - - } // end if - - my_offset = tmp.intValue(); + { // load the offset attribute and make sure it's in range + my_offset = loader.configGetAttributeInt(cfg,"offset"); if (my_offset<1) { // the offset must be greater than or equal to 1! logger.fatal("offset= value (" + my_offset + ") was out of range"); @@ -180,6 +166,7 @@ public class StaticSecurityMonitor implements SecurityMonitor } // end if + // Determine the final scope and check its validity. my_scope += my_offset; if (!(ScopeInfo.isValidScope(my_scope))) { // resulting scope is out of range! @@ -191,7 +178,7 @@ public class StaticSecurityMonitor implements SecurityMonitor // allocate a scope info object with the new scope scope = new ScopeInfo(my_scope); - } // end if + } // end if (security monitor has parent) else { // this must be the root security monitor! if (env.isRootMonitorDefined()) @@ -206,7 +193,7 @@ public class StaticSecurityMonitor implements SecurityMonitor scope = new ScopeInfo(0); parent = PrimordialSecurityMonitor.get(); - } // end else + } // end else (security monitor is root) // get the defined roles Element sect = root_h.getSubElement("defined-roles"); @@ -268,19 +255,10 @@ public class StaticSecurityMonitor implements SecurityMonitor if ((n.getNodeType()==Node.ELEMENT_NODE) && (n.getNodeName().equals("list"))) { // create the role list and add it to the temporary map // but first, get the ID - DOMElementHelper hn = new DOMElementHelper((Element)n); - String list_id; - if (hn.hasAttribute("id")) - list_id = id + "." + hn.getElement().getAttribute("id"); - else - { // no id= attribute - can't do anything with this - logger.fatal(" element found with no id= attribute!"); - throw new ConfigException("no id= attribute on defined element",hn.getElement()); - - } // end else + String list_id = id + "." + loader.configGetAttribute((Element)n,"id"); // now actually build the list and insert it - List rlist = buildList(hn.getElement(),list_id,tmp_default_roles,tmp_static_permissions, + List rlist = buildList((Element)n,list_id,tmp_default_roles,tmp_static_permissions, tmp_dynamic_permissions); tmp_lists.put(list_id,rlist); @@ -357,99 +335,84 @@ public class StaticSecurityMonitor implements SecurityMonitor private Role createRole(Element e) throws ConfigException { - String symbol, text; + XMLLoader loader = XMLLoader.get(); + + // Get the role symbol and automagically scope it. + String symbol = id + "." + loader.configGetAttribute(e,"id"); + + // Look for the value. + String value_str = loader.configGetAttribute(e,"value").trim().toUpperCase(); int level; + if (value_str.equals("LMIN")) + level = scope.getLowBandLow(); + else if (value_str.equals("LMAX")) + level = scope.getLowBandHigh(); + else if (value_str.equals("HMIN")) + level = scope.getHighBandLow(); + else if (value_str.equals("HMAX")) + level = scope.getHighBandHigh(); + else if ( value_str.startsWith("L+") || value_str.startsWith("L-") || value_str.startsWith("H+") + || value_str.startsWith("H-")) + { // take the characters following the 2-character prefix and convert them to an integer + int offset; + try + { // convert the value and make sure it's not less than 0 + offset = Integer.parseInt(value_str.substring(2)); + if (offset<0) + { // don't want it less than zero here! + logger.fatal("offset value " + offset + " was out of range"); + throw new ConfigException("offset value= attribute for was out of range",e); + + } // end if - DOMElementHelper h = new DOMElementHelper(e); - if (h.hasAttribute("id")) - symbol = id + "." + e.getAttribute("id"); // symbols get automagically scoped + } // end try + catch (NumberFormatException nfe) + { // not a numeric offset value + logger.fatal("offset value \"" + value_str + "\" was not numeric"); + throw new ConfigException("offset value= attribute for was not properly numeric",e); + + } // end catch + + if (value_str.charAt(1)=='-') + offset = -offset; // compute as negative offset + try + { // now use the scope to compute the level! + level = scope.getLevel((value_str.charAt(0)=='H'),offset); + + } // end try + catch (IllegalArgumentException iae) + { // we landed with a value outside the scope! + logger.fatal("offset value \"" + value_str + "\" was not in the scope"); + throw new ConfigException("offset value= attribute for was not within the scope",e); + + } // end catch + + } // end else if else - { // no role defined - logger.fatal(" defined with no id= attribute!"); - throw new ConfigException("no id= attribute for a ",e); + { // just a straight numeric level + try + { // parse it out and give it a scope check + level = Integer.parseInt(value_str); + if (!(scope.isInScope(level))) + { // not in the right scope - can't help you, pal! + logger.fatal("level value \"" + level + "\" was not in the scope"); + throw new ConfigException("level value= attribute for was not within the scope",e); - } // end else + } // end if - if (h.hasAttribute("value")) - { // get the value and parse it out - String value_str = e.getAttribute("value").trim().toUpperCase(); - if (value_str.equals("LMIN")) - level = scope.getLowBandLow(); - else if (value_str.equals("LMAX")) - level = scope.getLowBandHigh(); - else if (value_str.equals("HMIN")) - level = scope.getHighBandLow(); - else if (value_str.equals("HMAX")) - level = scope.getHighBandHigh(); - else if ( value_str.startsWith("L+") || value_str.startsWith("L-") || value_str.startsWith("H+") - || value_str.startsWith("H-")) - { // take the characters following the 2-character prefix and convert them to an integer - int offset; - try - { // convert the value and make sure it's not less than 0 - offset = Integer.parseInt(value_str.substring(2)); - if (offset<0) - { // don't want it less than zero here! - logger.fatal("offset value " + offset + " was out of range"); - throw new ConfigException("offset value= attribute for was out of range",e); - - } // end if + } // end try + catch (NumberFormatException nfe) + { // the level was not numeric + logger.fatal("level value \"" + value_str + "\" was not numeric"); + throw new ConfigException("level value= attribute for was not properly numeric",e); - } // end try - catch (NumberFormatException nfe) - { // not a numeric offset value - logger.fatal("offset value \"" + value_str + "\" was not numeric"); - throw new ConfigException("offset value= attribute for was not properly numeric",e); - - } // end catch - - if (value_str.charAt(1)=='-') - offset = -offset; // compute as negative offset - try - { // now use the scope to compute the level! - level = scope.getLevel((value_str.charAt(0)=='H'),offset); - - } // end try - catch (IllegalArgumentException iae) - { // we landed with a value outside the scope! - logger.fatal("offset value \"" + value_str + "\" was not in the scope"); - throw new ConfigException("offset value= attribute for was not within the scope",e); - - } // end catch - - } // end else if - else - { // just a straight numeric level - try - { // parse it out and give it a scope check - level = Integer.parseInt(value_str); - if (!(scope.isInScope(level))) - { // not in the right scope - can't help you, pal! - logger.fatal("level value \"" + level + "\" was not in the scope"); - throw new ConfigException("level value= attribute for was not within the scope",e); - - } // end if - - } // end try - catch (NumberFormatException nfe) - { // the level was not numeric - logger.fatal("level value \"" + value_str + "\" was not numeric"); - throw new ConfigException("level value= attribute for was not properly numeric",e); - - } // end catch - - } // end else - - } // end if - else - { // no value defined for this role! - logger.fatal(" defined with no value= attribute!"); - throw new ConfigException("no value= attribute for a ",e); + } // end catch } // end else // Get the text; default to the symbol name if it doesn't exist. - text = h.getElementText(); + DOMElementHelper h = new DOMElementHelper(e); + String text = h.getElementText(); if (text==null) text = symbol; @@ -461,10 +424,13 @@ public class StaticSecurityMonitor implements SecurityMonitor private List buildList(Element elem, String listid, Map defaultrole, Map static_perm, Set dynamic_perm) throws ConfigException { + XMLLoader loader = XMLLoader.get(); + + // If there's a permission tag under this list, take it. DOMElementHelper h = new DOMElementHelper(elem); Element perm = h.getSubElement("permission"); if (perm!=null) - { // there's a permission associated with this list, find out what it is + { // Find out what the permission is. DOMElementHelper ph = new DOMElementHelper(perm); if (ph.hasAttribute("role")) { // look up the role and make sure it corresponds to one we know @@ -485,8 +451,9 @@ public class StaticSecurityMonitor implements SecurityMonitor dynamic_perm.add(listid); } // end if - // else there's no problem + // else just skip this check + // Begin loading the list elements. NodeList nl = elem.getChildNodes(); ArrayList rc = new ArrayList(nl.getLength()); boolean have_default = false; @@ -495,34 +462,25 @@ public class StaticSecurityMonitor implements SecurityMonitor Node n = nl.item(i); if ((n.getNodeType()==Node.ELEMENT_NODE) && (n.getNodeName().equals("element"))) { // look at the attributes of this element node - DOMElementHelper itmh = new DOMElementHelper((Element)n); - Role r = null; - if (itmh.hasAttribute("role")) - { // convert the string into a role - r = this.getRole(itmh.getElement().getAttribute("role")); - if (r==null) - { // the role is not defined! - logger.fatal("list role (" + itmh.getElement().getAttribute("role") + ") not defined"); - throw new ConfigException(" inside of did not use defined role!", - itmh.getElement()); - - } // end if + String rname = loader.configGetAttribute((Element)n,"role"); + Role r = this.getRole(rname); + if (r==null) + { // the role is not defined! + logger.fatal("list role (" + rname + ") not defined"); + throw new ConfigException(" inside of did not use defined role!",(Element)n); } // end if - else - { // no attribute present - logger.fatal(" defined with no role= attribute!"); - throw new ConfigException("no role= attribute for a list ",itmh.getElement()); - - } // end else rc.add(r); // add element to defining list - if (itmh.hasAttribute("default")) + + // Check and see if this item is a default. + DOMElementHelper nh = new DOMElementHelper((Element)n); + if (nh.hasAttribute("default")) { // this is a default item... if (have_default) { // but there can't be two defaults! logger.fatal("duplicate default= attributes in list nodes!"); - throw new ConfigException("duplicate default= attribute in list ",itmh.getElement()); + throw new ConfigException("duplicate default= attribute in list ",nh.getElement()); } // end if else @@ -547,55 +505,34 @@ public class StaticSecurityMonitor implements SecurityMonitor private void processDefault(Element elem, Map defaultrole) throws ConfigException { + XMLLoader loader = XMLLoader.get(); + // Start by getting the default ID. - DOMElementHelper h = new DOMElementHelper(elem); - String def_id = null; - if (h.hasAttribute("id")) - def_id = id + "." + elem.getAttribute("id"); - else - { // no id defined! - logger.fatal(" defined with no id= attribute!"); - throw new ConfigException("no id= attribute for a ",elem); + String def_id = id + "." + loader.configGetAttribute(elem,"id"); - } // end else - - Role r = null; - if (h.hasAttribute("role")) - { // get the role associated with the item - r = this.getRole(elem.getAttribute("role")); - if (r==null) - { // no role found - this is an error! - logger.fatal(" role (" + elem.getAttribute("role") + ") not defined"); - throw new ConfigException(" did not use defined role!",elem); - - } // end if + // Now get the associated default role. + Role r = this.getRole(loader.configGetAttribute(elem,"role")); + if (r==null) + { // no role found - this is an error! + logger.fatal(" role (" + elem.getAttribute("role") + ") not defined"); + throw new ConfigException(" did not use defined role!",elem); } // end if - else - { // no role defined! - logger.fatal(" defined with no id= attribute!"); - throw new ConfigException("no id= attribute for a ",elem); - - } // end else + // and save the default defaultrole.put(def_id,r); } // end processDefault private void processPermission(Element elem, Map static_perm, Set dynamic_perm) throws ConfigException { + XMLLoader loader = XMLLoader.get(); + // Start by getting the permission ID. + String perm_id = id + "." + loader.configGetAttribute(elem,"id"); + + // Now get the associated role, if any. DOMElementHelper h = new DOMElementHelper(elem); - String perm_id = null; - if (h.hasAttribute("id")) - perm_id = id + "." + elem.getAttribute("id"); - else - { // no id defined! - logger.fatal(" defined with no id= attribute!"); - throw new ConfigException("no id= attribute for a ",elem); - - } // end else - if (h.hasAttribute("role")) { // this is a static permission; try and get the associated role Role r = this.getRole(elem.getAttribute("role")); diff --git a/src/com/silverwrist/venice/servlets/SystemAdmin.java b/src/com/silverwrist/venice/servlets/SystemAdmin.java index 6e0e4ed..00f6c40 100644 --- a/src/com/silverwrist/venice/servlets/SystemAdmin.java +++ b/src/com/silverwrist/venice/servlets/SystemAdmin.java @@ -22,6 +22,8 @@ import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.log4j.*; +import com.silverwrist.util.ServletMultipartHandler; +import com.silverwrist.util.ServletMultipartException; import com.silverwrist.util.StringUtil; import com.silverwrist.venice.core.*; import com.silverwrist.venice.except.*; @@ -227,7 +229,24 @@ public class SystemAdmin extends VeniceServlet } // end catch - } // end if + } // end if ("G" command) + + if (cmd.equals("IMP")) + { // "IMP" = "Import Users" + try + { // get the import dialog + AdminImportUser rc = new AdminImportUser(user.getAdminInterface(),false); + setMyLocation(request,"sysadmin?cmd=IMP"); + return rc; + + } // end try + catch (AccessError ae) + { // an access error generally means we're not an administrator + return new ErrorBox("Access Error","You do not have permission to administer the system.",null); + + } // end catch + + } // end if ("IMP" command) // TODO: other command handling @@ -396,4 +415,60 @@ public class SystemAdmin extends VeniceServlet } // end doVenicePost + protected VeniceContent doVenicePost(HttpServletRequest request, ServletMultipartHandler mphandler, + VeniceEngine engine, UserContext user, RenderData rdat) + throws ServletException, IOException, VeniceServletResult + { + // decide what to do based on the "cmd" parameter + String cmd = getStandardCommandParam(mphandler); + if (logger.isDebugEnabled()) + logger.debug("SystemAdmin/doPost command value = " + cmd); + + if (cmd.equals("IMP")) + { // "IMP" = "Import User Accounts" + try + { // get the administrative interface and then check the buttons + AdminOperations adm = user.getAdminInterface(); + if (isImageButtonClicked(mphandler,"cancel")) + throw new RedirectResult("sysadmin"); // we decided not to bother - go back + if (!isImageButtonClicked(mphandler,"upload")) + { // the button must be wrong! + logger.error("no known button click on SystemAdmin.doPost, cmd=IMP"); + return new ErrorBox("Internal Error","Unknown command button pressed","sysadmin"); + + } // end if + + if (!(mphandler.isFileParam("idata"))) + return new ErrorBox("Internal Error","Invalid input file parameter.","sysadmin"); + + // create the view object and use it to execute the operation + AdminImportUser rc = new AdminImportUser(user.getAdminInterface(),true); + rc.execute(mphandler.getFileContentStream("idata")); + setMyLocation(request,"sysadmin?cmd=IMP"); + return rc; + + } // end try + catch (AccessError ae) + { // an access error generally means we're not an administrator + return new ErrorBox("Access Error","You do not have permission to administer the system.",null); + + } // end catch + catch (ServletMultipartException smpe) + { // error loading the data stream + return new ErrorBox("Internal Error","Error loading post data: " + smpe.getMessage(),"sysadmin"); + + } // end catch + + } // end if + + // TODO: other command handling + + if (!(user.hasAdminAccess())) + return new ErrorBox("Access Error","You do not have permission to administer the system.",null); + + setMyLocation(request,"sysadmin"); + return makeSystemAdminTop(); + + } // end doVenicePost + } // end class SystemAdmin diff --git a/src/com/silverwrist/venice/servlets/VeniceServlet.java b/src/com/silverwrist/venice/servlets/VeniceServlet.java index 29fea4e..50baae1 100644 --- a/src/com/silverwrist/venice/servlets/VeniceServlet.java +++ b/src/com/silverwrist/venice/servlets/VeniceServlet.java @@ -341,6 +341,18 @@ public abstract class VeniceServlet extends HttpServlet } // end getStandardCommandParam + protected final String getStandardCommandParam(ServletMultipartHandler mphandler) throws ErrorBox + { + if (mphandler.isFileParam("cmd")) + throw new ErrorBox(null,"Internal Error: command should be a normal param",null); + String foo = mphandler.getValue("cmd"); + if (foo==null) + return "???"; + else + return foo; + + } // end getStandardCommandParam + protected final void setMyLocation(ServletRequest request, String loc) { request.setAttribute(LOCATION_ATTR,loc); diff --git a/src/com/silverwrist/venice/servlets/format/AdminImportUser.java b/src/com/silverwrist/venice/servlets/format/AdminImportUser.java new file mode 100644 index 0000000..c3de9ab --- /dev/null +++ b/src/com/silverwrist/venice/servlets/format/AdminImportUser.java @@ -0,0 +1,315 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.venice.servlets.format; + +import java.io.*; +import java.util.*; +import javax.servlet.*; +import org.apache.log4j.*; +import org.w3c.dom.*; +import com.silverwrist.util.StringUtil; +import com.silverwrist.util.DOMElementHelper; +import com.silverwrist.venice.core.*; +import com.silverwrist.venice.except.*; +import com.silverwrist.venice.security.*; +import com.silverwrist.venice.util.*; + +public class AdminImportUser implements JSPRender +{ + /*-------------------------------------------------------------------------------- + * Static data members + *-------------------------------------------------------------------------------- + */ + + private static Category logger = Category.getInstance(AdminImportUser.class); + + // Attribute name for request attribute + protected static final String ATTR_NAME = "com.silverwrist.venice.content.AdminFindUser"; + + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private AdminOperations adm; + private boolean doing_it; + private int processed = 0; + private int errors = 0; + private String message = null; + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + public AdminImportUser(AdminOperations adm, boolean doing_it) + { + this.adm = adm; + this.doing_it = doing_it; + + } // end constructor + + /*-------------------------------------------------------------------------------- + * External static functions + *-------------------------------------------------------------------------------- + */ + + public static AdminImportUser retrieve(ServletRequest request) + { + return (AdminImportUser)(request.getAttribute(ATTR_NAME)); + + } // end retrieve + + /*-------------------------------------------------------------------------------- + * Implementations from interface VeniceContent + *-------------------------------------------------------------------------------- + */ + + public String getPageTitle(RenderData rdat) + { + return "Import User Accounts"; + + } // end getPageTitle + + public String getPageQID() + { + return null; + + } // end getPageQID + + /*-------------------------------------------------------------------------------- + * Implementations from interface JSPRender + *-------------------------------------------------------------------------------- + */ + + public void store(ServletRequest request) + { + request.setAttribute(ATTR_NAME,this); + + } // end store + + public String getTargetJSPName() + { + return (doing_it ? "import_results.jsp" : "import_form.jsp"); + + } // end getTargetJSPName + + /*-------------------------------------------------------------------------------- + * External operations + *-------------------------------------------------------------------------------- + */ + + public final void execute(InputStream xml_data) + { + XMLLoader loader = XMLLoader.get(); + Document xmldoc; + + try + { // load the XML data! + xmldoc = loader.loadPostData(xml_data); + + } // end try + catch (ValidationException e) + { // serious parser error! + message = "Error parsing XML: " + StringUtil.encodeHTML(e.getMessage()) + "\n"; + return; + + } // end catch + + Element root = xmldoc.getDocumentElement(); + if (!(root.getTagName().equals("venice-import-users"))) + { // wrong document type! + message = "XML Error: Document is not a <venice-import-users/> document\n"; + return; + + } // end if + + SecurityInfo sinf = adm.getSecurityInfo(); + Role default_role = sinf.getDefaultRole("Global.NewUser"); + ArrayList scroll = new ArrayList(); + NodeList nl = root.getChildNodes(); + for (int i=0; i element found"); + username = username.trim(); + if (!(IDUtils.isValidVeniceID(username))) + throw new ValidationException(" \"" + username + "\" is not a valid Venice ID"); + password = h.getSubElementText("password"); + if (password==null) + throw new ValidationException("no element found"); + password = password.trim(); + reminder = h.getSubElementText("password-reminder"); + if (reminder!=null) + reminder = reminder.trim(); + description = h.getSubElementText("description"); + if (description!=null) + description = description.trim(); + Element opts = h.getSubElement("options"); + if (opts!=null) + { // parse out the options + DOMElementHelper hopts = new DOMElementHelper(opts); + if (hopts.hasAttribute("role")) + { // get the role from the file and return it + r = sinf.getRole(opts.getAttribute("role")); + if (r==null) + throw new ValidationException("role not defined: " + opts.getAttribute("role")); + + } // end if + + confirm = hopts.hasAttribute("confirmed"); + locked = hopts.hasAttribute("locked"); + hideaddr = hopts.hasAttribute("hideaddr"); + hidephone = hopts.hasAttribute("hidephone"); + hidefax = hopts.hasAttribute("hidefax"); + hideemail = hopts.hasAttribute("hideemail"); + if (hopts.hasAttribute("zonehint")) + zonehint = opts.getAttribute("zonehint").trim(); + + } // end if + // else just leave things as the default + + opts = h.getSubElement("vCard"); + if (opts==null) + throw new ValidationException("no element found"); + vcard = new VCard(opts); + + } // end try + catch (ValidationException e) + { // record the error and continue + logger.error("caught ValidationException in build phase(" + id + ")",e); + String tmp = "Error in element \"" + StringUtil.encodeHTML(id) + "\": " + + StringUtil.encodeHTML(e.getMessage()); + scroll.add(tmp); + errors++; + continue; + + } // end catch + + // EXECUTE PHASE - make this user go! + try + { // create the user context + AdminUserContext uc = adm.createNewAccount(username,password,reminder,confirm,locked,r,description); + + // set up the contact info + ContactInfo ci = uc.getContactInfo(); + ci.setPrivateAddress(hideaddr); + ci.setPrivatePhone(hidephone); + ci.setPrivateFax(hidefax); + ci.setPrivateEmail(hideemail); + ci.importVCard(vcard); + uc.putContactInfo(ci); + + // set up the timezone + String tmp = vcard.getTimeZone(); + if (tmp!=null) + { // get a "generic" time zone and convert it to a real one + TimeZone zone_raw = TimeZone.getTimeZone("GMT" + tmp); + String[] ids = TimeZone.getAvailableIDs(zone_raw.getRawOffset()); + TimeZone zone = null; + if (ids.length>0) + { // OK, there's at least one time zone...which one do we pick? + if (zonehint!=null) + { // use the "zonehint" to get the right time zone + for (int j=0; (zone==null) && (j=0) + zone = TimeZone.getTimeZone(ids[j]); + + } // end if + + if (zone==null) + zone = TimeZone.getTimeZone(ids[0]); + + } // end if + else // just use the raw timezone + zone = zone_raw; + uc.setTimeZone(zone); + + } // end if + + } // end try + catch (AccessError ae) + { // caught an access error creating user + logger.error("caught AccessError in execute phase(" + id + ")",ae); + String tmp = "Unable to create \"" + username + "\" (element \"" + StringUtil.encodeHTML(id) + + "\"): " + StringUtil.encodeHTML(ae.getMessage()); + scroll.add(tmp); + errors++; + continue; + + } // end catch + catch (DataException de) + { // caught a database error creating the user + logger.error("caught DataException in execute phase(" + id + ")",de); + String tmp = "Unable to create \"" + username + "\" (element \"" + StringUtil.encodeHTML(id) + + "\"): database error: " + StringUtil.encodeHTML(de.getMessage()); + scroll.add(tmp); + errors++; + continue; + + } // end catch + + // this user was created successfully! + String tmp = "[id " + StringUtil.encodeHTML(id) + "] user \"" + username + "\" created successfully."; + scroll.add(tmp); + + } // end if + + } // end for + + // Gather the scroll items together to form the message. + message = StringUtil.join(scroll,"
\n"); + + } // end execute + + public final int getNumProcessed() + { + return processed; + + } // end getNumProcessed + + public final int getNumErrors() + { + return errors; + + } // end getNumErrors + + public final String getMessage() + { + return message; + + } // end getMessage + +} // end class AdminImportUser diff --git a/src/com/silverwrist/venice/servlets/format/SystemAdminTop.java b/src/com/silverwrist/venice/servlets/format/SystemAdminTop.java index b09fe3c..e0ef1af 100644 --- a/src/com/silverwrist/venice/servlets/format/SystemAdminTop.java +++ b/src/com/silverwrist/venice/servlets/format/SystemAdminTop.java @@ -35,6 +35,7 @@ public class SystemAdminTop extends ContentMenuPanel addChoice("View/Edit Banned Users","TODO"); addChoice("User Account Management","sysadmin?cmd=UF"); addChoice("System Audit Logs","sysadmin?cmd=A"); + addChoice("Import User Accounts","sysadmin?cmd=IMP"); } // end constructor diff --git a/src/com/silverwrist/venice/util/VCard.java b/src/com/silverwrist/venice/util/VCard.java new file mode 100644 index 0000000..8b13170 --- /dev/null +++ b/src/com/silverwrist/venice/util/VCard.java @@ -0,0 +1,527 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.venice.util; + +import java.util.*; +import org.apache.log4j.*; +import org.w3c.dom.*; +import com.silverwrist.util.*; +import com.silverwrist.venice.except.*; + +public class VCard +{ + /*-------------------------------------------------------------------------------- + * Static data members + *-------------------------------------------------------------------------------- + */ + + private static Category logger = Category.getInstance(VCard.class); + + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private String formatted_name = null; + private String family_name = null; + private String given_name = null; + private String middle_name = null; + private String prefix = null; + private String suffix = null; + private String nickname = null; + private ArrayList addresses = new ArrayList(); + private ArrayList phones = new ArrayList(); + private ArrayList email_addresses = new ArrayList(); + private String mailer = null; + private String timezone = null; + private String title = null; + private String role = null; + private String orgname = null; + private String note = null; + private String sort_string = null; + private String url = null; + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + public VCard(Element xml) throws ValidationException + { + if (!(xml.getTagName().equals("vCard"))) + { // not a vCard! + logger.error("top-level element should be , but it's <" + xml.getTagName() + "/>"); + throw new ValidationException("not a valid XML vCard"); + + } // end if + + boolean version_seen = false; + boolean fn_seen = false; + boolean n_seen = false; + NodeList nl = xml.getChildNodes(); + for (int i=0; i element is not yet supported"); + + } // end else if (not-supported element) + else + { // unrecognized tag element + logger.error("unrecognized tag <" + nm + "/> in vCard"); + throw new ValidationException("unrecognized element in vCard"); + + } // end else (other tags) + + } // end if + // else ignore it + + } // end for + + } // end constructor + + /*-------------------------------------------------------------------------------- + * Internal operations + *-------------------------------------------------------------------------------- + */ + + static final String cleanup(String data) + { + return ((data==null) ? null : data.trim()); + + } // end cleanup + + private static final String readElemText(Element elt) + { + DOMElementHelper h = new DOMElementHelper(elt); + return cleanup(h.getElementText()); + + } // end readElemText + + private static final String readTimeZoneText(Element elt) throws ValidationException + { + DOMElementHelper h = new DOMElementHelper(elt); + String s = h.getElementText(); + if (s==null) + return null; + s = s.trim(); + + // Validate that this is a proper ISO 8601 time zone offset. + boolean valid; + if (s.equals("Z") || s.equals("z")) + valid = true; // "Z" = Zulu time! + else + { // validate the offset string + valid = (s.length()>=3) && ((s.charAt(0)=='+') || (s.charAt(0)=='-')); + if (valid) + valid = ((s.charAt(1)>='0') && (s.charAt(1)<='9')); + if (valid) + valid = ((s.charAt(2)>='0') && (s.charAt(2)<='9')); + if (s.length()>3) + { // validate the last bit of the string + if (s.charAt(3)==':') // +hh:mm or -hh:mm + valid = ( (s.length()==6) && (s.charAt(4)>='0') && (s.charAt(4)<='9') && (s.charAt(5)>='0') + && (s.charAt(5)<='9')); + else // +hhmm or -hhmm + valid = ( (s.length()==5) && (s.charAt(3)>='0') && (s.charAt(3)<='9') && (s.charAt(4)>='0') + && (s.charAt(4)<='9')); + + } // end if + // else it's just a +hh or -hh notation + + } // end else + + if (!valid) + { // the time zone text is not valid + logger.error(" text invalid (" + s + ")"); + throw new ValidationException(" value is not a valid ISO 8601 time zone offset"); + + } // end if + + return s; + + } // end readTimeZoneText + + private VCardAddress findAddress(VCardAddress.Predicate pred) + { + Iterator it = addresses.iterator(); + while (it.hasNext()) + { // search for address matching the predicate + VCardAddress addr = (VCardAddress)(it.next()); + if (pred.test(addr)) + return addr; + + } // end while + + return null; + + } // end findAddress + + private VCardPhone findPhone(VCardPhone.Predicate pred) + { + Iterator it = phones.iterator(); + while (it.hasNext()) + { // search for phone number matching the predicate + VCardPhone p = (VCardPhone)(it.next()); + if (pred.test(p)) + return p; + + } // end while + + return null; + + } // end findPhone + + private VCardEmail findEmail(VCardEmail.Predicate pred) + { + Iterator it = email_addresses.iterator(); + while (it.hasNext()) + { // search for phone number matching the predicate + VCardEmail e = (VCardEmail)(it.next()); + if (pred.test(e)) + return e; + + } // end while + + return null; + + } // end findEmail + + /*-------------------------------------------------------------------------------- + * Public getters/setters + *-------------------------------------------------------------------------------- + */ + + public final String getFormattedName() + { + return formatted_name; + + } // end getFormattedName + + public final String getFamilyName() + { + return family_name; + + } // end getFamilyName + + public final String getGivenName() + { + return given_name; + + } // end getGivenName + + public final String getMiddleName() + { + return middle_name; + + } // end getMiddleName + + public final String getPrefix() + { + return prefix; + + } // end getPrefix + + public final String getSuffix() + { + return suffix; + + } // end getSuffix + + public final String getNickname() + { + return nickname; + + } // end getNickname + + public final String getMailer() + { + return mailer; + + } // end getMailer + + public final String getTimeZone() + { + return timezone; + + } // end getTimeZone + + public final String getTitle() + { + return title; + + } // end getTitle + + public final String getRole() + { + return role; + + } // end getRole + + public final String getOrganizationName() + { + return orgname; + + } // end getOrganizationName + + public final String getNote() + { + return note; + + } // end getNode + + public final String getSortString() + { + return sort_string; + + } // end getSortString + + public final String getURL() + { + return url; + + } // end getURL + + /*-------------------------------------------------------------------------------- + * External operations + *-------------------------------------------------------------------------------- + */ + + public final VCardAddress getPreferredAddress() + { + return findAddress(new VCardAddress.Predicate(){ + public final boolean test(VCardAddress addr) { return addr.isPreferred(); } + }); + + } // end getPreferredAddress + + public final VCardAddress getWorkAddress() + { + return findAddress(new VCardAddress.Predicate(){ + public final boolean test(VCardAddress addr) { return addr.isWorkAddress(); } + }); + + } // end getWorkAddress + + public final VCardAddress getHomeAddress() + { + return findAddress(new VCardAddress.Predicate(){ + public final boolean test(VCardAddress addr) { return addr.isHomeAddress(); } + }); + + } // end getHomeAddress + + public final VCardAddress getPreferredWorkAddress() + { + return findAddress(new VCardAddress.Predicate(){ + public final boolean test(VCardAddress addr) { return addr.isPreferred() && addr.isWorkAddress(); } + }); + + } // end getPreferredWorkAddress + + public final VCardAddress getPreferredHomeAddress() + { + return findAddress(new VCardAddress.Predicate(){ + public final boolean test(VCardAddress addr) { return addr.isPreferred() && addr.isHomeAddress(); } + }); + + } // end getPreferredHomeAddress + + public final VCardAddress getAnyAddress() + { + return (addresses.isEmpty() ? null : (VCardAddress)(addresses.get(0))); + + } // end getAnyAddress + + public final VCardPhone getPreferredPhone() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isPreferred(); } + }); + + } // end getPreferredPhone + + public final VCardPhone getVoicePhone() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isVoicePhone(); } + }); + + } // end getVoicePhone + + public final VCardPhone getHomePhone() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isHomePhone() && p.isVoicePhone(); } + }); + + } // end getHomePhone + + public final VCardPhone getWorkPhone() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isWorkPhone() && p.isVoicePhone(); } + }); + + } // end getWorkPhone + + public final VCardPhone getPreferredFax() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isPreferred() && p.isFax(); } + }); + + } // end getPreferredFax + + public final VCardPhone getHomeFax() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isHomePhone() && p.isFax(); } + }); + + } // end getHomeFax + + public final VCardPhone getWorkFax() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isWorkPhone() && p.isFax(); } + }); + + } // end getHomeFax + + public final VCardPhone getAnyFax() + { + return findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isFax(); } + }); + + } // end getAnyFax + + public final VCardPhone getCellPhone() + { + VCardPhone rc = findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isCellPhone(); } + }); + if (rc==null) + rc = findPhone(new VCardPhone.Predicate(){ + public final boolean test(VCardPhone p) { return p.isPCSPhone(); } + }); + return rc; + + } // end getHomeFax + + public final VCardPhone getAnyPhone() + { + return ((phones.isEmpty()) ? null : (VCardPhone)(phones.get(0))); + + } // end getAnyPhone + + public final VCardEmail getPreferredEmail() + { + return findEmail(new VCardEmail.Predicate(){ + public final boolean test(VCardEmail e) { return e.isPreferred(); } + }); + + } // end getPreferredEmail + + public final VCardEmail getInternetEmail() + { + return findEmail(new VCardEmail.Predicate(){ + public final boolean test(VCardEmail e) { return e.isInternetEmail(); } + }); + + } // end getInternetEmail + +} // end class VCard diff --git a/src/com/silverwrist/venice/util/VCardAddress.java b/src/com/silverwrist/venice/util/VCardAddress.java new file mode 100644 index 0000000..2dcc8be --- /dev/null +++ b/src/com/silverwrist/venice/util/VCardAddress.java @@ -0,0 +1,173 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.venice.util; + +import org.w3c.dom.*; +import com.silverwrist.util.*; +import com.silverwrist.venice.except.*; + +public class VCardAddress +{ + /*-------------------------------------------------------------------------------- + * Predicate class to use for searches + *-------------------------------------------------------------------------------- + */ + + static abstract class Predicate + { + public abstract boolean test(VCardAddress addr); + + } // end class Predicate + + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private boolean home_adr; + private boolean work_adr; + private boolean postal_adr; + private boolean parcel_adr; + private boolean domestic_adr; + private boolean intl_adr; + private boolean preferred; + private String pobox; + private String ext_address; + private String street; + private String locality; + private String region; + private String postal_code; + private String country; + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + VCardAddress(Element adr) throws ValidationException + { + DOMElementHelper h = new DOMElementHelper(adr); + home_adr = h.hasChildElement("HOME"); + work_adr = h.hasChildElement("WORK"); + postal_adr = h.hasChildElement("POSTAL"); + parcel_adr = h.hasChildElement("PARCEL"); + domestic_adr = h.hasChildElement("DOM"); + intl_adr = h.hasChildElement("INTL"); + if (domestic_adr && intl_adr) + throw new ValidationException("same address can't be both DOM and INTL"); + preferred = h.hasChildElement("PREF"); + pobox = VCard.cleanup(h.getSubElementText("POBOX")); + ext_address = VCard.cleanup(h.getSubElementText("EXTADR")); + street = VCard.cleanup(h.getSubElementText("STREET")); + locality = VCard.cleanup(h.getSubElementText("LOCALITY")); + region = VCard.cleanup(h.getSubElementText("REGION")); + postal_code = VCard.cleanup(h.getSubElementText("PCODE")); + country = VCard.cleanup(h.getSubElementText("CTRY")); + + } // end constructor + + /*-------------------------------------------------------------------------------- + * External getters/setters + *-------------------------------------------------------------------------------- + */ + + public final boolean isHomeAddress() + { + return home_adr; + + } // end isHomeAddress + + public final boolean isWorkAddress() + { + return work_adr; + + } // end isWorkAddress + + public final boolean isPostalAddress() + { + return postal_adr; + + } // end isPostalAddress + + public final boolean isParcelAddress() + { + return parcel_adr; + + } // end isParcelAddress + + public final boolean isDomesticAddress() + { + return domestic_adr; + + } // end isDomesticAddress + + public final boolean isInternationalAddress() + { + return intl_adr; + + } // end isInternationalAddress + + public final boolean isPreferred() + { + return preferred; + + } // end isPreferred + + public final String getPOBox() + { + return pobox; + + } // end getPOBox + + public final String getExtension() + { + return ext_address; + + } // end getExtension + + public final String getStreet() + { + return street; + + } // end getStreet + + public final String getLocality() + { + return locality; + + } // end getLocality + + public final String getRegion() + { + return region; + + } // end getRegion + + public final String getPostalCode() + { + return postal_code; + + } // end getPostalCode + + public final String getCountry() + { + return country; + + } // end getCountry + +} // end class VCardAddress diff --git a/src/com/silverwrist/venice/util/VCardEmail.java b/src/com/silverwrist/venice/util/VCardEmail.java new file mode 100644 index 0000000..c74835d --- /dev/null +++ b/src/com/silverwrist/venice/util/VCardEmail.java @@ -0,0 +1,111 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.venice.util; + +import org.w3c.dom.*; +import com.silverwrist.util.*; +import com.silverwrist.venice.except.*; + +public class VCardEmail +{ + /*-------------------------------------------------------------------------------- + * Predicate class to use for searches + *-------------------------------------------------------------------------------- + */ + + static abstract class Predicate + { + public abstract boolean test(VCardEmail e); + + } // end class Predicate + + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private boolean home_email; + private boolean work_email; + private boolean internet_email; + private boolean x400_email; + private boolean preferred; + private String address; + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + VCardEmail(Element elt) + { + DOMElementHelper h = new DOMElementHelper(elt); + home_email = h.hasChildElement("HOME"); + work_email = h.hasChildElement("WORK"); + internet_email = h.hasChildElement("INTERNET"); + x400_email = h.hasChildElement("X400"); + preferred = h.hasChildElement("PREF"); + if (!internet_email && !x400_email) + internet_email = true; // default + address = VCard.cleanup(h.getSubElementText("USERID")); + if (address==null) + address = VCard.cleanup(h.getElementText()); + + } // end constructor + + /*-------------------------------------------------------------------------------- + * External getters/setters + *-------------------------------------------------------------------------------- + */ + + public final boolean isHomeEmail() + { + return home_email; + + } // end isHomeEmail + + public final boolean isWorkEmail() + { + return work_email; + + } // end isHomeEmail + + public final boolean isInternetEmail() + { + return internet_email; + + } // end isInternetEmail + + public final boolean isX400Email() + { + return x400_email; + + } // end isX400Email + + public final boolean isPreferred() + { + return preferred; + + } // end isPreferred + + public final String getAddress() + { + return address; + + } // end getAddress + +} // end class VCardEmail diff --git a/src/com/silverwrist/venice/util/VCardPhone.java b/src/com/silverwrist/venice/util/VCardPhone.java new file mode 100644 index 0000000..1bd30a9 --- /dev/null +++ b/src/com/silverwrist/venice/util/VCardPhone.java @@ -0,0 +1,173 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.venice.util; + +import org.w3c.dom.*; +import com.silverwrist.util.*; +import com.silverwrist.venice.except.*; + +public class VCardPhone +{ + /*-------------------------------------------------------------------------------- + * Predicate class to use for searches + *-------------------------------------------------------------------------------- + */ + + static abstract class Predicate + { + public abstract boolean test(VCardPhone p); + + } // end class Predicate + + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private boolean home_phone; + private boolean work_phone; + private boolean voice_phone; + private boolean fax_phone; + private boolean pager; + private boolean message; + private boolean cell_phone; + private boolean video_phone; + private boolean bbs_phone; + private boolean modem_phone; + private boolean isdn_phone; + private boolean pcs_phone; + private boolean preferred; + private String number; + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + VCardPhone(Element elt) + { + DOMElementHelper h = new DOMElementHelper(elt); + home_phone = h.hasChildElement("HOME"); + work_phone = h.hasChildElement("WORK"); + voice_phone = h.hasChildElement("VOICE"); + fax_phone = h.hasChildElement("FAX"); + pager = h.hasChildElement("PAGER"); + message = h.hasChildElement("MSG"); + cell_phone = h.hasChildElement("CELL"); + video_phone = h.hasChildElement("VIDEO"); + bbs_phone = h.hasChildElement("BBS"); + modem_phone = h.hasChildElement("MODEM"); + isdn_phone = h.hasChildElement("ISDN"); + pcs_phone = h.hasChildElement("PCS"); + preferred = h.hasChildElement("PREF"); + number = VCard.cleanup(h.getSubElementText("NUMBER")); + if (number==null) + number = VCard.cleanup(h.getElementText()); + + } // end constructor + + /*-------------------------------------------------------------------------------- + * External getters/setters + *-------------------------------------------------------------------------------- + */ + + public final boolean isHomePhone() + { + return home_phone; + + } // end isHomePhone + + public final boolean isWorkPhone() + { + return work_phone; + + } // end isWorkPhone + + public final boolean isVoicePhone() + { + return voice_phone; + + } // end isVoicePhone + + public final boolean isFax() + { + return fax_phone; + + } // end isFax + + public final boolean isPager() + { + return pager; + + } // end isPager + + public final boolean isMessage() + { + return message; + + } // end isMessage + + public final boolean isCellPhone() + { + return cell_phone; + + } // end isCellPhone + + public final boolean isVideoPhone() + { + return video_phone; + + } // end isVideoPhone + + public final boolean isBBS() + { + return bbs_phone; + + } // end isBBS + + public final boolean isModemPhone() + { + return modem_phone; + + } // end isModemPhone + + public final boolean isISDNPhone() + { + return isdn_phone; + + } // end isISDNPhone + + public final boolean isPCSPhone() + { + return pcs_phone; + + } // end isPCSPhone + + public final boolean isPreferred() + { + return preferred; + + } // end isPreferred + + public final String getNumber() + { + return number; + + } // end getNumber + +} // end class VCardPhone diff --git a/src/com/silverwrist/venice/util/XMLLoader.java b/src/com/silverwrist/venice/util/XMLLoader.java index b6483f6..a7b42f2 100644 --- a/src/com/silverwrist/venice/util/XMLLoader.java +++ b/src/com/silverwrist/venice/util/XMLLoader.java @@ -111,6 +111,65 @@ public class XMLLoader } // end loadConfigDocument + public final Document loadPostData(InputStream stm) throws ValidationException + { + if (logger.isDebugEnabled()) + logger.debug("loadPostData()..."); + + try + { // create a simple DOM parser by using the Java XML parsing API + DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance(); + fac.setNamespaceAware(false); + fac.setValidating(false); + DocumentBuilder parser = fac.newDocumentBuilder(); + + // access the config file and parse it into our config data tree + Document rc = parser.parse(stm); + if (logger.isDebugEnabled()) + logger.debug("post data loaded successfully"); + return rc; + + } // end try + catch (FactoryConfigurationError fce) + { // if the document builder factory could not be created + logger.error("Parser factory configuration error: " + fce.getMessage(),fce); + throw new ValidationException("XML parser factory could not be created - " + fce.getMessage()); + + } // end catch + catch (ParserConfigurationException pce) + { // if the XML parser itself could not be created + logger.error("Parser configuration error: " + pce.getMessage(),pce); + throw new ValidationException("XML parser could not be created - " + pce.getMessage(),pce); + + } // end catch + catch (SAXException se) + { // if the XML parser choked on our document + if (se instanceof SAXParseException) + { // we have a detailed message - make a proper exception + SAXParseException spe = (SAXParseException)se; + logger.error("Error in post data [" + spe.getLineNumber() + "," + spe.getColumnNumber() + "]: " + + spe.getMessage(),spe); + throw new ValidationException("Error in post data: " + spe.getMessage() + " at line " + + spe.getLineNumber() + ", column " + spe.getColumnNumber(),spe); + + } // end if + else + { // generic exception - just send up a simple error message + logger.error("Error in post data: " + se.getMessage(),se); + throw new ValidationException("Error in post data - " + se.getMessage(),se); + + } // end else + + } // end catch + catch (IOException ioe) + { // error reading the post data itself out of the buffer + logger.error("IO error reading post data: " + ioe.getMessage(),ioe); + throw new ValidationException("unable to read post data - " + ioe.getMessage(),ioe); + + } // end catch + + } // end loadPostData + public final Element configGetRootElement(Document doc, String expected_name) throws ConfigException { Element rc = doc.getDocumentElement(); @@ -182,6 +241,15 @@ public class XMLLoader } // end configVerifyNodeName + public final void configVerifyTagName(Element tag, String name) throws ConfigException + { + if (tag.getTagName().equals(name)) + return; + logger.fatal("expected a <" + name + "/> element here, but got a <" + tag.getTagName() + "/>"); + throw new ConfigException("element must be a <" + name + "/>",tag); + + } // end configVerifyTagName + public final String configGetAttribute(Element elt, String attr_name) throws ConfigException { String rc = elt.getAttribute(attr_name); diff --git a/web/format/import_form.jsp b/web/format/import_form.jsp new file mode 100644 index 0000000..edfada9 --- /dev/null +++ b/web/format/import_form.jsp @@ -0,0 +1,42 @@ +<%-- + The contents of this file are subject to the Mozilla Public License Version 1.1 + (the "License"); you may not use this file except in compliance with the License. + You may obtain a copy of the License at . + + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + WARRANTY OF ANY KIND, either express or implied. See the License for the specific + language governing rights and limitations under the License. + + The Original Code is the Venice Web Communities System. + + The Initial Developer of the Original Code is Eric J. Bowersox , + for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + + Contributor(s): +--%> +<%@ page import = "java.util.*" %> +<%@ page import = "com.silverwrist.util.StringUtil" %> +<%@ page import = "com.silverwrist.venice.core.*" %> +<%@ page import = "com.silverwrist.venice.servlets.Variables" %> +<%@ page import = "com.silverwrist.venice.servlets.format.*" %> +<% + AdminImportUser data = AdminImportUser.retrieve(request); + Variables.failIfNull(data); + RenderData rdat = RenderConfig.createRenderData(application,request,response); +%> +<% rdat.writeContentHeader(out,"Import User Accounts",null); %> + +
"> +
<%= rdat.getStdFontTag(ColorSelectors.CONTENT_FOREGROUND,2) %> + + User import data:
+

+ " NAME="upload" ALT="Upload" + WIDTH=80 HEIGHT=24 BORDER=0>  + " NAME="cancel" ALT="Cancel" + WIDTH=80 HEIGHT=24 BORDER=0>


+ The user accounts are imported as an XML file. + <%-- TODO: put a description of the contents here, or a link to a DTD --%> +
+
\ No newline at end of file diff --git a/web/format/import_results.jsp b/web/format/import_results.jsp new file mode 100644 index 0000000..7f7cb32 --- /dev/null +++ b/web/format/import_results.jsp @@ -0,0 +1,34 @@ +<%-- + The contents of this file are subject to the Mozilla Public License Version 1.1 + (the "License"); you may not use this file except in compliance with the License. + You may obtain a copy of the License at . + + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + WARRANTY OF ANY KIND, either express or implied. See the License for the specific + language governing rights and limitations under the License. + + The Original Code is the Venice Web Communities System. + + The Initial Developer of the Original Code is Eric J. Bowersox , + for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + + Contributor(s): +--%> +<%@ page import = "java.util.*" %> +<%@ page import = "com.silverwrist.util.StringUtil" %> +<%@ page import = "com.silverwrist.venice.core.*" %> +<%@ page import = "com.silverwrist.venice.servlets.Variables" %> +<%@ page import = "com.silverwrist.venice.servlets.format.*" %> +<% + AdminImportUser data = AdminImportUser.retrieve(request); + Variables.failIfNull(data); + RenderData rdat = RenderConfig.createRenderData(application,request,response); +%> +<% rdat.writeContentHeader(out,"Results From Importing User Accounts",null); %> +
<%= rdat.getStdFontTag(ColorSelectors.CONTENT_FOREGROUND,2) %> + ">Return to System Administration Menu

+ Processed <%= data.getNumProcessed() %> record(s); <%= data.getNumErrors() %> + error(s) reported.


+ <%= data.getMessage() %> +