implemented the system administrator function "Import User Accounts," allowing
a sysadmin to create mass quantities of user accounts automatically by uploading an XML file
This commit is contained in:
		
							parent
							
								
									f5a5009932
								
							
						
					
					
						commit
						4e251e72e1
					
				@ -49,7 +49,7 @@ public class StringUtil
 | 
			
		||||
   * @return The SQL-encoded equivalent of <CODE>str</CODE>.  If <CODE>str</CODE> is
 | 
			
		||||
   *         <B><CODE>null</CODE></B>, returns <B><CODE>null</CODE></B>.
 | 
			
		||||
   */
 | 
			
		||||
  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 <CODE>str</CODE>.  If <CODE>str</CODE> is
 | 
			
		||||
   *         <B><CODE>null</CODE></B>, returns <B><CODE>null</CODE></B>.
 | 
			
		||||
   */
 | 
			
		||||
  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 <B><CODE>true</CODE></B> if the given string is <B><CODE>null</CODE></B> or a string of
 | 
			
		||||
   *         length 0, <B><CODE>false</CODE></B> 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 <CODE>find</CODE> string will be deleted.
 | 
			
		||||
   * @return The <CODE>base</CODE> 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
 | 
			
		||||
   *             <CODE>base</CODE>.
 | 
			
		||||
   * @return The <CODE>base</CODE> 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<arr.length; i++)
 | 
			
		||||
    { // put it all together
 | 
			
		||||
      if (buf==null)
 | 
			
		||||
	buf = new StringBuffer(arr[i].toString());
 | 
			
		||||
      else
 | 
			
		||||
	buf.append(separator).append(arr[i].toString());
 | 
			
		||||
 | 
			
		||||
    } // end for
 | 
			
		||||
 | 
			
		||||
    return (buf==null) ? null : buf.toString();
 | 
			
		||||
 | 
			
		||||
  } // end join
 | 
			
		||||
 | 
			
		||||
  public static final String join(List l, String separator)
 | 
			
		||||
  {
 | 
			
		||||
    StringBuffer buf = null;
 | 
			
		||||
    Iterator it = l.iterator();
 | 
			
		||||
    while (it.hasNext())
 | 
			
		||||
    { // put it all together
 | 
			
		||||
      Object o = it.next();
 | 
			
		||||
      if (buf==null)
 | 
			
		||||
	buf = new StringBuffer(o.toString());
 | 
			
		||||
      else
 | 
			
		||||
	buf.append(separator).append(o.toString());
 | 
			
		||||
 | 
			
		||||
    } // end for
 | 
			
		||||
 | 
			
		||||
    return (buf==null) ? null : buf.toString();
 | 
			
		||||
 | 
			
		||||
  } // end join
 | 
			
		||||
 | 
			
		||||
} // end class StringUtil
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,9 @@
 | 
			
		||||
package com.silverwrist.venice.core;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import com.silverwrist.venice.except.AccessError;
 | 
			
		||||
import com.silverwrist.venice.except.DataException;
 | 
			
		||||
import com.silverwrist.venice.security.Role;
 | 
			
		||||
 | 
			
		||||
public interface AdminOperations
 | 
			
		||||
{
 | 
			
		||||
@ -38,4 +40,8 @@ public interface AdminOperations
 | 
			
		||||
 | 
			
		||||
  public abstract void setProperties(GlobalProperties props) throws DataException;
 | 
			
		||||
 | 
			
		||||
  public abstract AdminUserContext createNewAccount(String username, String password, String reminder,
 | 
			
		||||
						    boolean verify_email, boolean lockout, Role base_role,
 | 
			
		||||
						    String description) throws DataException, AccessError;
 | 
			
		||||
 | 
			
		||||
} // end interface AdminOperations
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ package com.silverwrist.venice.core;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.sql.Connection;
 | 
			
		||||
import com.silverwrist.venice.util.VCard;
 | 
			
		||||
 | 
			
		||||
public interface ContactInfo
 | 
			
		||||
{
 | 
			
		||||
@ -123,4 +124,6 @@ public interface ContactInfo
 | 
			
		||||
 | 
			
		||||
  public abstract boolean getModified();
 | 
			
		||||
 | 
			
		||||
  public abstract void importVCard(VCard vc);
 | 
			
		||||
 | 
			
		||||
} // end interface ContactInfo
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ import com.silverwrist.venice.core.internals.*;
 | 
			
		||||
import com.silverwrist.venice.db.*;
 | 
			
		||||
import com.silverwrist.venice.except.*;
 | 
			
		||||
import com.silverwrist.venice.security.AuditRecord;
 | 
			
		||||
import com.silverwrist.venice.security.Role;
 | 
			
		||||
 | 
			
		||||
class AdminOperationsImpl implements AdminOperations
 | 
			
		||||
{
 | 
			
		||||
@ -151,4 +152,30 @@ class AdminOperationsImpl implements AdminOperations
 | 
			
		||||
 | 
			
		||||
  } // end setProperties
 | 
			
		||||
 | 
			
		||||
  public AdminUserContext createNewAccount(String username, String password, String reminder,
 | 
			
		||||
					   boolean verify_email, boolean lockout, Role base_role,
 | 
			
		||||
					   String description) throws DataException, AccessError
 | 
			
		||||
  {
 | 
			
		||||
    if (logger.isDebugEnabled())
 | 
			
		||||
      logger.debug("createNewAccount(\"" + username + "\",<password>,<reminder>)...");
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@ -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 + "\",<password>,<reminder>)...");
 | 
			
		||||
      
 | 
			
		||||
    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();
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										61
									
								
								src/com/silverwrist/venice/core/internals/ReturnNewUser.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/com/silverwrist/venice/core/internals/ReturnNewUser.java
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <erbo@silcom.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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 <CODE>SecurityMonitor</CODE> 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 <security-definition/> element");
 | 
			
		||||
      throw new ConfigException("configuration must be a <security-definition/>",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("<security-definition/> 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 <security-definition/> 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("<list/> element found with no id= attribute!");
 | 
			
		||||
	    throw new ConfigException("no id= attribute on defined <list/> 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 <role/> 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 <role/> 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 <role/> was not within the scope",e);
 | 
			
		||||
 | 
			
		||||
      } // end catch
 | 
			
		||||
 | 
			
		||||
    } // end else if
 | 
			
		||||
    else
 | 
			
		||||
    { // no role defined
 | 
			
		||||
      logger.fatal("<role/> defined with no id= attribute!");
 | 
			
		||||
      throw new ConfigException("no id= attribute for a <role/>",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 <role/> 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 <role/> 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 <role/> 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 <role/> 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 <role/> 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 <role/> 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 <role/> was not properly numeric",e);
 | 
			
		||||
 | 
			
		||||
	} // end catch
 | 
			
		||||
 | 
			
		||||
      } // end else
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
    { // no value defined for this role!
 | 
			
		||||
      logger.fatal("<role/> defined with no value= attribute!");
 | 
			
		||||
      throw new ConfigException("no value= attribute for a <role/>",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 <element/> role (" + itmh.getElement().getAttribute("role") + ") not defined");
 | 
			
		||||
	    throw new ConfigException("<element/> inside of <list/> 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 <element/> role (" + rname + ") not defined");
 | 
			
		||||
	  throw new ConfigException("<element/> inside of <list/> did not use defined role!",(Element)n);
 | 
			
		||||
 | 
			
		||||
	} // end if
 | 
			
		||||
	else
 | 
			
		||||
	{ // no attribute present
 | 
			
		||||
	  logger.fatal("<element/> defined with no role= attribute!");
 | 
			
		||||
	  throw new ConfigException("no role= attribute for a list <element/>",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 <element/> nodes!");
 | 
			
		||||
	    throw new ConfigException("duplicate default= attribute in list <element/>",itmh.getElement());
 | 
			
		||||
	    throw new ConfigException("duplicate default= attribute in list <element/>",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("<default/> defined with no id= attribute!");
 | 
			
		||||
      throw new ConfigException("no id= attribute for a <default/>",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("<default/> role (" + elem.getAttribute("role") + ") not defined");
 | 
			
		||||
	throw new ConfigException("<default/> 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("<default/> role (" + elem.getAttribute("role") + ") not defined");
 | 
			
		||||
      throw new ConfigException("<default/> did not use defined role!",elem);
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
    { // no role defined!
 | 
			
		||||
      logger.fatal("<default/> defined with no id= attribute!");
 | 
			
		||||
      throw new ConfigException("no id= attribute for a <default/>",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("<permission/> defined with no id= attribute!");
 | 
			
		||||
      throw new ConfigException("no id= attribute for a <permission/>",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"));
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										315
									
								
								src/com/silverwrist/venice/servlets/format/AdminImportUser.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										315
									
								
								src/com/silverwrist/venice/servlets/format/AdminImportUser.java
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <erbo@silcom.com>,
 | 
			
		||||
 * 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 = "<B>Error parsing XML: " + StringUtil.encodeHTML(e.getMessage()) + "</B>\n";
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
    } // end catch
 | 
			
		||||
 | 
			
		||||
    Element root = xmldoc.getDocumentElement();
 | 
			
		||||
    if (!(root.getTagName().equals("venice-import-users")))
 | 
			
		||||
    { // wrong document type!
 | 
			
		||||
      message = "<B>XML Error: Document is not a <venice-import-users/> document</B>\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<nl.getLength(); i++)
 | 
			
		||||
    { // get each node from the list, see if it's a Venice user
 | 
			
		||||
      Node n = nl.item(i);
 | 
			
		||||
      if ((n.getNodeType()==Node.ELEMENT_NODE) && n.getNodeName().equals("venice-user"))
 | 
			
		||||
      { // this is a Venice user record - first parse it out into binary data
 | 
			
		||||
	processed++;
 | 
			
		||||
	DOMElementHelper h = new DOMElementHelper((Element)n);
 | 
			
		||||
	String id = h.getElement().getAttribute("id");
 | 
			
		||||
	String username = null, password = null, reminder = null, description = null;
 | 
			
		||||
	String zonehint = null;
 | 
			
		||||
	Role r = default_role;
 | 
			
		||||
	boolean confirm = false, locked = false, hideaddr = false, hidephone = false, hidefax = false;
 | 
			
		||||
	boolean hideemail = false;
 | 
			
		||||
	VCard vcard = null;
 | 
			
		||||
 | 
			
		||||
	// BUILD PHASE - Build the data to be used for this user.
 | 
			
		||||
	try
 | 
			
		||||
	{ // parse out the info
 | 
			
		||||
	  username = h.getSubElementText("username");
 | 
			
		||||
	  if (username==null)
 | 
			
		||||
	    throw new ValidationException("no <username/> element found");
 | 
			
		||||
	  username = username.trim();
 | 
			
		||||
	  if (!(IDUtils.isValidVeniceID(username)))
 | 
			
		||||
	    throw new ValidationException("<username/> \"" + username + "\" is not a valid Venice ID");
 | 
			
		||||
	  password = h.getSubElementText("password");
 | 
			
		||||
	  if (password==null)
 | 
			
		||||
	    throw new ValidationException("no <password/> 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 <vCard/> 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 = "<B>Error in element \"" + StringUtil.encodeHTML(id) + "\":</B> "
 | 
			
		||||
	             + 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<ids.length); j++)
 | 
			
		||||
		  if (ids[j].indexOf(zonehint)>=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 = "<B>Unable to create \"" + username + "\" (element \"" + StringUtil.encodeHTML(id)
 | 
			
		||||
	             + "\"):</B> " + 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 = "<B>Unable to create \"" + username + "\" (element \"" + StringUtil.encodeHTML(id)
 | 
			
		||||
	             + "\"):</B> 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,"<BR>\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
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										527
									
								
								src/com/silverwrist/venice/util/VCard.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								src/com/silverwrist/venice/util/VCard.java
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <erbo@silcom.com>,
 | 
			
		||||
 * 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 <vCard/>, 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<nl.getLength(); i++)
 | 
			
		||||
    { // read off each node from the list in turn
 | 
			
		||||
      Node n = nl.item(i);
 | 
			
		||||
      if (n.getNodeType()==Node.ELEMENT_NODE)
 | 
			
		||||
      { // get its name and compare it to one of the defined vCard node names
 | 
			
		||||
	String nm = n.getNodeName();
 | 
			
		||||
	if (nm.equals("VERSION"))
 | 
			
		||||
	{ // Version tag - must contain "2.0" to be compliant
 | 
			
		||||
	  if (version_seen)
 | 
			
		||||
	    throw new ValidationException("double VERSION element seen in vCard");
 | 
			
		||||
	  version_seen = true;
 | 
			
		||||
	  DOMElementHelper h = new DOMElementHelper((Element)n);
 | 
			
		||||
	  String verstr = h.getElementText();
 | 
			
		||||
	  if (verstr==null)
 | 
			
		||||
	    throw new ValidationException("invalid vCard version");
 | 
			
		||||
	  if (logger.isDebugEnabled())
 | 
			
		||||
	    logger.debug("vCard VERSION = " + verstr.trim());
 | 
			
		||||
	  if (!(verstr.trim().equals("2.0")))
 | 
			
		||||
	    throw new ValidationException("invalid vCard version: " + verstr.trim());
 | 
			
		||||
	    
 | 
			
		||||
	} // end if ("VERSION" element)
 | 
			
		||||
	else if (nm.equals("FN"))
 | 
			
		||||
	{ // Formatted Name tag
 | 
			
		||||
	  if (fn_seen)
 | 
			
		||||
	    throw new ValidationException("double FN element seen in vCard");
 | 
			
		||||
	  fn_seen = true;
 | 
			
		||||
	  formatted_name = readElemText((Element)n);
 | 
			
		||||
	  if (logger.isDebugEnabled())
 | 
			
		||||
	    logger.debug("vCard FN = " + formatted_name);
 | 
			
		||||
 | 
			
		||||
	} // end else if ("FN" element)
 | 
			
		||||
	else if (nm.equals("N"))
 | 
			
		||||
	{ // Structured Name tag
 | 
			
		||||
	  if (n_seen)
 | 
			
		||||
	    throw new ValidationException("double N element seen in vCard");
 | 
			
		||||
	  n_seen = true;
 | 
			
		||||
	  DOMElementHelper h = new DOMElementHelper((Element)n);
 | 
			
		||||
	  family_name = cleanup(h.getSubElementText("FAMILY"));
 | 
			
		||||
	  given_name = cleanup(h.getSubElementText("GIVEN"));
 | 
			
		||||
	  middle_name = cleanup(h.getSubElementText("MIDDLE"));
 | 
			
		||||
	  prefix = cleanup(h.getSubElementText("PREFIX"));
 | 
			
		||||
	  suffix = cleanup(h.getSubElementText("SUFFIX"));
 | 
			
		||||
	  if (logger.isDebugEnabled())
 | 
			
		||||
	    logger.debug("vCard N = (pfx=" + prefix + ", given=" + given_name + ", middle=" + middle_name
 | 
			
		||||
			 + ", family=" + family_name + ", sfx=" + suffix + ")");
 | 
			
		||||
 | 
			
		||||
	} // end else if ("N" element)
 | 
			
		||||
	else if (nm.equals("NICKNAME"))  // nickname (simple)
 | 
			
		||||
	  nickname = readElemText((Element)n);
 | 
			
		||||
	else if (nm.equals("ADR"))       // address record
 | 
			
		||||
	  addresses.add(new VCardAddress((Element)n));
 | 
			
		||||
	else if (nm.equals("TEL"))       // phone number record
 | 
			
		||||
	  phones.add(new VCardPhone((Element)n));
 | 
			
		||||
	else if (nm.equals("EMAIL"))
 | 
			
		||||
	  email_addresses.add(new VCardEmail((Element)n));
 | 
			
		||||
	else if (nm.equals("MAILER"))
 | 
			
		||||
	  mailer = readElemText((Element)n);
 | 
			
		||||
	else if (nm.equals("TZ"))
 | 
			
		||||
	  timezone = readTimeZoneText((Element)n);
 | 
			
		||||
	else if (nm.equals("TITLE"))
 | 
			
		||||
	  title = readElemText((Element)n);
 | 
			
		||||
	else if (nm.equals("ROLE"))
 | 
			
		||||
	  role = readElemText((Element)n);
 | 
			
		||||
	else if (nm.equals("ORG"))
 | 
			
		||||
	{ // Organization element - get the organization name
 | 
			
		||||
	  DOMElementHelper h = new DOMElementHelper((Element)n);
 | 
			
		||||
	  orgname = h.getSubElementText("ORGNAME");
 | 
			
		||||
	  // we don't support ORGUNIT elements yet
 | 
			
		||||
 | 
			
		||||
	} // end else if ("ORG" element)
 | 
			
		||||
	else if (nm.equals("NOTE"))
 | 
			
		||||
	  note = readElemText((Element)n);
 | 
			
		||||
	else if (nm.equals("SORTSTR") || nm.equals("SORT-STRING"))
 | 
			
		||||
	  sort_string = readElemText((Element)n);
 | 
			
		||||
	else if (nm.equals("URL"))
 | 
			
		||||
	  url = readElemText((Element)n);
 | 
			
		||||
	else if (   nm.equals("PHOTO") || nm.equals("BDAY") || nm.equals("LABEL") || nm.equals("GEO")
 | 
			
		||||
		 || nm.equals("LOGO") || nm.equals("AGENT") || nm.equals("CATEGORIES") || nm.equals("PRODID")
 | 
			
		||||
		 || nm.equals("REV") || nm.equals("SOUND") || nm.equals("UID") || nm.equals("CLASS")
 | 
			
		||||
		 || nm.equals("KEY"))
 | 
			
		||||
	{ // a catch-all for elements that we don't support yet
 | 
			
		||||
	  logger.warn("vCard <" + nm + "/> 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("<TZ/> text invalid (" + s + ")");
 | 
			
		||||
      throw new ValidationException("<TZ/> 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
 | 
			
		||||
							
								
								
									
										173
									
								
								src/com/silverwrist/venice/util/VCardAddress.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								src/com/silverwrist/venice/util/VCardAddress.java
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <erbo@silcom.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
							
								
								
									
										111
									
								
								src/com/silverwrist/venice/util/VCardEmail.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								src/com/silverwrist/venice/util/VCardEmail.java
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <erbo@silcom.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
							
								
								
									
										173
									
								
								src/com/silverwrist/venice/util/VCardPhone.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								src/com/silverwrist/venice/util/VCardPhone.java
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <erbo@silcom.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										42
									
								
								web/format/import_form.jsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								web/format/import_form.jsp
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 | 
			
		||||
  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 <erbo@silcom.com>,
 | 
			
		||||
  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); %>
 | 
			
		||||
 | 
			
		||||
<FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="<%= rdat.getEncodedServletPath("sysadmin") %>">
 | 
			
		||||
  <DIV CLASS="content"><%= rdat.getStdFontTag(ColorSelectors.CONTENT_FOREGROUND,2) %>
 | 
			
		||||
    <INPUT TYPE=HIDDEN NAME="cmd" VALUE="IMP">
 | 
			
		||||
    User import data:<BR>
 | 
			
		||||
    <INPUT TYPE="FILE" NAME="idata"><P>
 | 
			
		||||
    <INPUT TYPE=IMAGE SRC="<%= rdat.getFullImagePath("bn_upload.gif") %>" NAME="upload" ALT="Upload"
 | 
			
		||||
     WIDTH=80 HEIGHT=24 BORDER=0> 
 | 
			
		||||
    <INPUT TYPE=IMAGE SRC="<%= rdat.getFullImagePath("bn_cancel.gif") %>" NAME="cancel" ALT="Cancel"
 | 
			
		||||
     WIDTH=80 HEIGHT=24 BORDER=0><HR>
 | 
			
		||||
    The user accounts are imported as an XML file.
 | 
			
		||||
    <%-- TODO: put a description of the contents here, or a link to a DTD --%>
 | 
			
		||||
  </FONT></DIV>
 | 
			
		||||
</FORM>
 | 
			
		||||
							
								
								
									
										34
									
								
								web/format/import_results.jsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								web/format/import_results.jsp
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 | 
			
		||||
  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 <erbo@silcom.com>,
 | 
			
		||||
  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); %>
 | 
			
		||||
<DIV CLASS="content"><%= rdat.getStdFontTag(ColorSelectors.CONTENT_FOREGROUND,2) %>
 | 
			
		||||
  <A HREF="<%= rdat.getEncodedServletPath("sysadmin") %>">Return to System Administration Menu</A><P>
 | 
			
		||||
  <FONT SIZE=+1><B>Processed <%= data.getNumProcessed() %> record(s); <%= data.getNumErrors() %>
 | 
			
		||||
  error(s) reported.</B></FONT><HR>
 | 
			
		||||
  <%= data.getMessage() %>
 | 
			
		||||
</FONT></DIV>
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user