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
|
* @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>.
|
* <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)
|
if (str==null)
|
||||||
return null; // safety feature
|
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
|
* @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>.
|
* <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)
|
if (str==null)
|
||||||
return null; // safety feature
|
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
|
* @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.
|
* 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));
|
return ((s==null) || (s.length()==0));
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ public class StringUtil
|
||||||
* of the <CODE>find</CODE> string will be deleted.
|
* of the <CODE>find</CODE> string will be deleted.
|
||||||
* @return The <CODE>base</CODE> string with all replacements made as detailed above.
|
* @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))
|
if ((base==null) || isStringEmpty(find))
|
||||||
return base; // safety feature
|
return base; // safety feature
|
||||||
|
@ -204,7 +204,7 @@ public class StringUtil
|
||||||
* <CODE>base</CODE>.
|
* <CODE>base</CODE>.
|
||||||
* @return The <CODE>base</CODE> string with all variable substitutions made as detailed above.
|
* @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))
|
if ((base==null) || (vars==null) || (vars.size()==0))
|
||||||
return base; // safety feature
|
return base; // safety feature
|
||||||
|
@ -244,5 +244,39 @@ public class StringUtil
|
||||||
|
|
||||||
} // end replaceAllVariables
|
} // 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
|
} // end class StringUtil
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,9 @@
|
||||||
package com.silverwrist.venice.core;
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import com.silverwrist.venice.except.AccessError;
|
||||||
import com.silverwrist.venice.except.DataException;
|
import com.silverwrist.venice.except.DataException;
|
||||||
|
import com.silverwrist.venice.security.Role;
|
||||||
|
|
||||||
public interface AdminOperations
|
public interface AdminOperations
|
||||||
{
|
{
|
||||||
|
@ -38,4 +40,8 @@ public interface AdminOperations
|
||||||
|
|
||||||
public abstract void setProperties(GlobalProperties props) throws DataException;
|
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
|
} // end interface AdminOperations
|
||||||
|
|
|
@ -20,6 +20,7 @@ package com.silverwrist.venice.core;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
import com.silverwrist.venice.util.VCard;
|
||||||
|
|
||||||
public interface ContactInfo
|
public interface ContactInfo
|
||||||
{
|
{
|
||||||
|
@ -123,4 +124,6 @@ public interface ContactInfo
|
||||||
|
|
||||||
public abstract boolean getModified();
|
public abstract boolean getModified();
|
||||||
|
|
||||||
|
public abstract void importVCard(VCard vc);
|
||||||
|
|
||||||
} // end interface ContactInfo
|
} // end interface ContactInfo
|
||||||
|
|
|
@ -25,6 +25,7 @@ import com.silverwrist.venice.core.internals.*;
|
||||||
import com.silverwrist.venice.db.*;
|
import com.silverwrist.venice.db.*;
|
||||||
import com.silverwrist.venice.except.*;
|
import com.silverwrist.venice.except.*;
|
||||||
import com.silverwrist.venice.security.AuditRecord;
|
import com.silverwrist.venice.security.AuditRecord;
|
||||||
|
import com.silverwrist.venice.security.Role;
|
||||||
|
|
||||||
class AdminOperationsImpl implements AdminOperations
|
class AdminOperationsImpl implements AdminOperations
|
||||||
{
|
{
|
||||||
|
@ -151,4 +152,30 @@ class AdminOperationsImpl implements AdminOperations
|
||||||
|
|
||||||
} // end setProperties
|
} // 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
|
} // end class AdminOperationsImpl
|
||||||
|
|
|
@ -133,18 +133,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -185,18 +174,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -249,18 +227,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -301,18 +268,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -382,18 +338,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -427,18 +372,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -481,18 +415,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -535,18 +458,7 @@ class AdminUserContextImpl implements AdminUserContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
|
|
@ -566,18 +566,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -682,18 +671,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -730,18 +708,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -778,18 +745,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -826,18 +782,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1023,18 +968,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1077,18 +1011,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1203,18 +1126,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1296,18 +1208,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1397,18 +1298,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1888,18 +1778,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -2091,18 +1970,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
|
|
@ -450,18 +450,7 @@ class ConferenceCommunityContextImpl implements ConferenceCommunityContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -570,18 +559,7 @@ class ConferenceCommunityContextImpl implements ConferenceCommunityContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
|
|
@ -512,18 +512,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -568,18 +557,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -680,18 +658,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -768,18 +735,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -860,18 +816,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1021,18 +966,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1287,18 +1221,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1488,18 +1411,7 @@ class ConferenceCoreData implements ConferenceData
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
|
|
@ -21,10 +21,12 @@ import java.io.*;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import org.apache.log4j.*;
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.util.StringUtil;
|
||||||
import com.silverwrist.venice.core.*;
|
import com.silverwrist.venice.core.*;
|
||||||
import com.silverwrist.venice.core.internals.EnvEngine;
|
import com.silverwrist.venice.core.internals.EnvEngine;
|
||||||
import com.silverwrist.venice.db.*;
|
import com.silverwrist.venice.db.*;
|
||||||
import com.silverwrist.venice.except.*;
|
import com.silverwrist.venice.except.*;
|
||||||
|
import com.silverwrist.venice.util.*;
|
||||||
|
|
||||||
class ContactInfoImpl implements ContactInfo, Stashable
|
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
|
* Attributes
|
||||||
|
@ -691,6 +693,221 @@ class ContactInfoImpl implements ContactInfo, Stashable
|
||||||
|
|
||||||
} // end getModified
|
} // 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
|
* Implementations from interface Stashable
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -530,18 +530,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -659,18 +648,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -766,18 +744,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -946,18 +913,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1072,18 +1028,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
|
|
@ -324,18 +324,7 @@ class TopicUserContextImpl implements TopicContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -383,18 +372,7 @@ class TopicUserContextImpl implements TopicContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -813,18 +791,7 @@ class TopicUserContextImpl implements TopicContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -925,18 +892,7 @@ class TopicUserContextImpl implements TopicContext
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure we release the connection before we go
|
{ // make sure we release the connection before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
|
|
@ -457,18 +457,7 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -493,7 +482,7 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
{ // the confirmation number is wrong
|
{ // the confirmation number is wrong
|
||||||
logger.warn("...confirmation number incorrect");
|
logger.warn("...confirmation number incorrect");
|
||||||
ar = new AuditRecord(AuditRecord.VERIFY_FAIL,uid,remote_addr,"Invalid confirmation number");
|
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.");
|
throw new AccessError("Confirmation number is incorrect. Please try again.");
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -526,18 +515,7 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -591,18 +569,7 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -726,18 +693,7 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -838,18 +794,7 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end finally
|
} // end finally
|
||||||
|
@ -1413,18 +1358,7 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
} // end catch
|
} // end catch
|
||||||
finally
|
finally
|
||||||
{ // make sure the connection is released before we go
|
{ // make sure the connection is released before we go
|
||||||
try
|
AuditRecord.store(conn,ar);
|
||||||
{ // 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);
|
env.releaseConnection(conn);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -1633,6 +1567,178 @@ class UserContextImpl implements UserContext, UserBackend
|
||||||
|
|
||||||
} // end autoJoinCommunities
|
} // 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
|
* Static initializer
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -1010,180 +1010,21 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
||||||
throws DataException, AccessError
|
throws DataException, AccessError
|
||||||
{
|
{
|
||||||
checkInitialized();
|
checkInitialized();
|
||||||
Connection conn = null;
|
|
||||||
AuditRecord ar = null;
|
|
||||||
String encode_username = SQLUtil.encodeString(username);
|
|
||||||
Role new_role = global_security.getDefaultRole("Global.NewUser");
|
Role new_role = global_security.getDefaultRole("Global.NewUser");
|
||||||
// email confirmation # is between 1000000 and 9999999
|
// email confirmation # is between 1000000 and 9999999
|
||||||
int confirm_num = getNewConfirmationNumber();
|
int confirm_num = getNewConfirmationNumber();
|
||||||
int new_uid;
|
|
||||||
java.util.Date created = null;
|
|
||||||
|
|
||||||
if (logger.isDebugEnabled())
|
if (logger.isDebugEnabled())
|
||||||
logger.debug("createNewAccount(\"" + username + "\",<password>,<reminder>)...");
|
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
|
// Create the user account.
|
||||||
|
ReturnNewUser rnu = UserContextImpl.createAccount(env,remote_addr,username,password,reminder,false,
|
||||||
// perform the insert of the user's new data
|
false,confirm_num,new_role,null);
|
||||||
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 a new context for the user (they're now effectively logged in)
|
// create a new context for the user (they're now effectively logged in)
|
||||||
UserContextImpl rc = new UserContextImpl(env);
|
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
|
rc.autoJoinCommunities(); // EJB 4/14/2001
|
||||||
if (logger.isDebugEnabled())
|
if (logger.isDebugEnabled())
|
||||||
logger.debug("...created new user context");
|
logger.debug("...created new user context");
|
||||||
|
@ -1731,33 +1572,6 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
||||||
|
|
||||||
} // end detachConferenceDataObject
|
} // 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)
|
public void registerNewConference(ConferenceData conf)
|
||||||
{
|
{
|
||||||
checkInitialized();
|
checkInitialized();
|
||||||
|
|
|
@ -77,8 +77,6 @@ public interface EngineBackend
|
||||||
|
|
||||||
public abstract void detachConferenceDataObject(int confid);
|
public abstract void detachConferenceDataObject(int confid);
|
||||||
|
|
||||||
public abstract void saveAuditRecord(AuditRecord ar);
|
|
||||||
|
|
||||||
public abstract void registerNewConference(ConferenceData conf);
|
public abstract void registerNewConference(ConferenceData conf);
|
||||||
|
|
||||||
public abstract HTMLChecker createCheckerObject(int type);
|
public abstract HTMLChecker createCheckerObject(int type);
|
||||||
|
|
|
@ -20,6 +20,7 @@ package com.silverwrist.venice.core.internals;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.apache.log4j.*;
|
||||||
import com.silverwrist.venice.core.SecurityInfo;
|
import com.silverwrist.venice.core.SecurityInfo;
|
||||||
import com.silverwrist.venice.db.*;
|
import com.silverwrist.venice.db.*;
|
||||||
import com.silverwrist.venice.except.AccessError;
|
import com.silverwrist.venice.except.AccessError;
|
||||||
|
@ -28,6 +29,13 @@ import com.silverwrist.venice.svc.ServiceControl;
|
||||||
|
|
||||||
public class EnvEngine
|
public class EnvEngine
|
||||||
{
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(EnvEngine.class);
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* Attributes
|
* Attributes
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
|
@ -141,4 +149,30 @@ public class EnvEngine
|
||||||
|
|
||||||
} // end getSecurityInfo
|
} // 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
|
} // 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.sql.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
import com.silverwrist.venice.db.SQLUtil;
|
import com.silverwrist.venice.db.SQLUtil;
|
||||||
import com.silverwrist.venice.core.AuditData;
|
import com.silverwrist.venice.core.AuditData;
|
||||||
import com.silverwrist.venice.except.DataException;
|
import com.silverwrist.venice.except.DataException;
|
||||||
|
@ -104,6 +105,13 @@ public class AuditRecord implements AuditData
|
||||||
|
|
||||||
} // end class DescrStringCache
|
} // end class DescrStringCache
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(AuditRecord.class);
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* Attributes
|
* Attributes
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
|
@ -399,4 +407,20 @@ public class AuditRecord implements AuditData
|
||||||
|
|
||||||
} // end getAuditRecordCount
|
} // 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
|
} // end class AuditRecord
|
||||||
|
|
|
@ -24,6 +24,7 @@ import com.silverwrist.util.DOMElementHelper;
|
||||||
import com.silverwrist.venice.except.AccessError;
|
import com.silverwrist.venice.except.AccessError;
|
||||||
import com.silverwrist.venice.except.ConfigException;
|
import com.silverwrist.venice.except.ConfigException;
|
||||||
import com.silverwrist.venice.svc.SecurityMonitorEnvironment;
|
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
|
* 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
|
public StaticSecurityMonitor(Element cfg, SecurityMonitorEnvironment env) throws ConfigException
|
||||||
{
|
{
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
boolean set_root_monitor = false;
|
boolean set_root_monitor = false;
|
||||||
|
|
||||||
if (!(cfg.getTagName().equals("security-definition")))
|
loader.configVerifyTagName(cfg,"security-definition"); // verify the tag name
|
||||||
{ // 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
|
|
||||||
|
|
||||||
|
// Get the new security monitor's ID.
|
||||||
|
id = loader.configGetAttribute(cfg,"id");
|
||||||
if (logger.isDebugEnabled())
|
if (logger.isDebugEnabled())
|
||||||
logger.debug("defining new StaticSecurityMonitor with id=" + id);
|
logger.debug("defining new StaticSecurityMonitor with id=" + id);
|
||||||
|
|
||||||
|
// Make sure this security monitor isn't already defined.
|
||||||
if (env.isMonitorDefined(id))
|
if (env.isMonitorDefined(id))
|
||||||
{ // the monitor with this ID has already been defined!
|
{ // the monitor with this ID has already been defined!
|
||||||
logger.fatal("security monitor with id=" + id + " is already defined!");
|
logger.fatal("security monitor with id=" + id + " is already defined!");
|
||||||
|
@ -147,8 +137,10 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
|
||||||
|
// See if the security monitor has a parent attribute.
|
||||||
|
DOMElementHelper root_h = new DOMElementHelper(cfg);
|
||||||
if (root_h.hasAttribute("parent"))
|
if (root_h.hasAttribute("parent"))
|
||||||
{ // find our parent
|
{ // get the parent and determine if it exists or not
|
||||||
String parent_id = cfg.getAttribute("parent");
|
String parent_id = cfg.getAttribute("parent");
|
||||||
parent = env.getMonitor(parent_id);
|
parent = env.getMonitor(parent_id);
|
||||||
if (parent==null)
|
if (parent==null)
|
||||||
|
@ -158,19 +150,13 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
|
||||||
|
// Determine the new scope for this security monitor.
|
||||||
int my_scope = parent.getScopeInfo().getScope();
|
int my_scope = parent.getScopeInfo().getScope();
|
||||||
int my_offset = DEFAULT_SCOPE_OFFSET;
|
int my_offset = DEFAULT_SCOPE_OFFSET;
|
||||||
|
|
||||||
if (root_h.hasAttribute("offset"))
|
if (root_h.hasAttribute("offset"))
|
||||||
{ // get the offset value and compare it
|
{ // load the offset attribute and make sure it's in range
|
||||||
Integer tmp = root_h.getAttributeInt("offset");
|
my_offset = loader.configGetAttributeInt(cfg,"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();
|
|
||||||
if (my_offset<1)
|
if (my_offset<1)
|
||||||
{ // the offset must be greater than or equal to 1!
|
{ // the offset must be greater than or equal to 1!
|
||||||
logger.fatal("offset= value (" + my_offset + ") was out of range");
|
logger.fatal("offset= value (" + my_offset + ") was out of range");
|
||||||
|
@ -180,6 +166,7 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
|
||||||
|
// Determine the final scope and check its validity.
|
||||||
my_scope += my_offset;
|
my_scope += my_offset;
|
||||||
if (!(ScopeInfo.isValidScope(my_scope)))
|
if (!(ScopeInfo.isValidScope(my_scope)))
|
||||||
{ // resulting scope is out of range!
|
{ // resulting scope is out of range!
|
||||||
|
@ -191,7 +178,7 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
// allocate a scope info object with the new scope
|
// allocate a scope info object with the new scope
|
||||||
scope = new ScopeInfo(my_scope);
|
scope = new ScopeInfo(my_scope);
|
||||||
|
|
||||||
} // end if
|
} // end if (security monitor has parent)
|
||||||
else
|
else
|
||||||
{ // this must be the root security monitor!
|
{ // this must be the root security monitor!
|
||||||
if (env.isRootMonitorDefined())
|
if (env.isRootMonitorDefined())
|
||||||
|
@ -206,7 +193,7 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
scope = new ScopeInfo(0);
|
scope = new ScopeInfo(0);
|
||||||
parent = PrimordialSecurityMonitor.get();
|
parent = PrimordialSecurityMonitor.get();
|
||||||
|
|
||||||
} // end else
|
} // end else (security monitor is root)
|
||||||
|
|
||||||
// get the defined roles
|
// get the defined roles
|
||||||
Element sect = root_h.getSubElement("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")))
|
if ((n.getNodeType()==Node.ELEMENT_NODE) && (n.getNodeName().equals("list")))
|
||||||
{ // create the role list and add it to the temporary map
|
{ // create the role list and add it to the temporary map
|
||||||
// but first, get the ID
|
// but first, get the ID
|
||||||
DOMElementHelper hn = new DOMElementHelper((Element)n);
|
String list_id = id + "." + loader.configGetAttribute((Element)n,"id");
|
||||||
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
|
|
||||||
|
|
||||||
// now actually build the list and insert it
|
// 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_dynamic_permissions);
|
||||||
tmp_lists.put(list_id,rlist);
|
tmp_lists.put(list_id,rlist);
|
||||||
|
|
||||||
|
@ -357,99 +335,84 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
|
|
||||||
private Role createRole(Element e) throws ConfigException
|
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;
|
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);
|
} // end try
|
||||||
if (h.hasAttribute("id"))
|
catch (NumberFormatException nfe)
|
||||||
symbol = id + "." + e.getAttribute("id"); // symbols get automagically scoped
|
{ // 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
|
else
|
||||||
{ // no role defined
|
{ // just a straight numeric level
|
||||||
logger.fatal("<role/> defined with no id= attribute!");
|
try
|
||||||
throw new ConfigException("no id= attribute for a <role/>",e);
|
{ // 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"))
|
} // end try
|
||||||
{ // get the value and parse it out
|
catch (NumberFormatException nfe)
|
||||||
String value_str = e.getAttribute("value").trim().toUpperCase();
|
{ // the level was not numeric
|
||||||
if (value_str.equals("LMIN"))
|
logger.fatal("level value \"" + value_str + "\" was not numeric");
|
||||||
level = scope.getLowBandLow();
|
throw new ConfigException("level value= attribute for <role/> was not properly numeric",e);
|
||||||
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
|
} // end catch
|
||||||
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 else
|
} // end else
|
||||||
|
|
||||||
// Get the text; default to the symbol name if it doesn't exist.
|
// 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)
|
if (text==null)
|
||||||
text = symbol;
|
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)
|
private List buildList(Element elem, String listid, Map defaultrole, Map static_perm, Set dynamic_perm)
|
||||||
throws ConfigException
|
throws ConfigException
|
||||||
{
|
{
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
|
||||||
|
// If there's a permission tag under this list, take it.
|
||||||
DOMElementHelper h = new DOMElementHelper(elem);
|
DOMElementHelper h = new DOMElementHelper(elem);
|
||||||
Element perm = h.getSubElement("permission");
|
Element perm = h.getSubElement("permission");
|
||||||
if (perm!=null)
|
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);
|
DOMElementHelper ph = new DOMElementHelper(perm);
|
||||||
if (ph.hasAttribute("role"))
|
if (ph.hasAttribute("role"))
|
||||||
{ // look up the role and make sure it corresponds to one we know
|
{ // 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);
|
dynamic_perm.add(listid);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
// else there's no problem
|
// else just skip this check
|
||||||
|
|
||||||
|
// Begin loading the list elements.
|
||||||
NodeList nl = elem.getChildNodes();
|
NodeList nl = elem.getChildNodes();
|
||||||
ArrayList rc = new ArrayList(nl.getLength());
|
ArrayList rc = new ArrayList(nl.getLength());
|
||||||
boolean have_default = false;
|
boolean have_default = false;
|
||||||
|
@ -495,34 +462,25 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
Node n = nl.item(i);
|
Node n = nl.item(i);
|
||||||
if ((n.getNodeType()==Node.ELEMENT_NODE) && (n.getNodeName().equals("element")))
|
if ((n.getNodeType()==Node.ELEMENT_NODE) && (n.getNodeName().equals("element")))
|
||||||
{ // look at the attributes of this element node
|
{ // look at the attributes of this element node
|
||||||
DOMElementHelper itmh = new DOMElementHelper((Element)n);
|
String rname = loader.configGetAttribute((Element)n,"role");
|
||||||
Role r = null;
|
Role r = this.getRole(rname);
|
||||||
if (itmh.hasAttribute("role"))
|
if (r==null)
|
||||||
{ // convert the string into a role
|
{ // the role is not defined!
|
||||||
r = this.getRole(itmh.getElement().getAttribute("role"));
|
logger.fatal("list <element/> role (" + rname + ") not defined");
|
||||||
if (r==null)
|
throw new ConfigException("<element/> inside of <list/> did not use defined role!",(Element)n);
|
||||||
{ // 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
|
|
||||||
|
|
||||||
} // end if
|
} // 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
|
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...
|
{ // this is a default item...
|
||||||
if (have_default)
|
if (have_default)
|
||||||
{ // but there can't be two defaults!
|
{ // but there can't be two defaults!
|
||||||
logger.fatal("duplicate default= attributes in list <element/> nodes!");
|
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
|
} // end if
|
||||||
else
|
else
|
||||||
|
@ -547,55 +505,34 @@ public class StaticSecurityMonitor implements SecurityMonitor
|
||||||
|
|
||||||
private void processDefault(Element elem, Map defaultrole) throws ConfigException
|
private void processDefault(Element elem, Map defaultrole) throws ConfigException
|
||||||
{
|
{
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
|
||||||
// Start by getting the default ID.
|
// Start by getting the default ID.
|
||||||
DOMElementHelper h = new DOMElementHelper(elem);
|
String def_id = id + "." + loader.configGetAttribute(elem,"id");
|
||||||
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);
|
|
||||||
|
|
||||||
} // end else
|
// Now get the associated default role.
|
||||||
|
Role r = this.getRole(loader.configGetAttribute(elem,"role"));
|
||||||
Role r = null;
|
if (r==null)
|
||||||
if (h.hasAttribute("role"))
|
{ // no role found - this is an error!
|
||||||
{ // get the role associated with the item
|
logger.fatal("<default/> role (" + elem.getAttribute("role") + ") not defined");
|
||||||
r = this.getRole(elem.getAttribute("role"));
|
throw new ConfigException("<default/> did not use defined role!",elem);
|
||||||
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
|
|
||||||
|
|
||||||
} // end if
|
} // 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);
|
defaultrole.put(def_id,r);
|
||||||
|
|
||||||
} // end processDefault
|
} // end processDefault
|
||||||
|
|
||||||
private void processPermission(Element elem, Map static_perm, Set dynamic_perm) throws ConfigException
|
private void processPermission(Element elem, Map static_perm, Set dynamic_perm) throws ConfigException
|
||||||
{
|
{
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
|
||||||
// Start by getting the permission ID.
|
// 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);
|
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"))
|
if (h.hasAttribute("role"))
|
||||||
{ // this is a static permission; try and get the associated role
|
{ // this is a static permission; try and get the associated role
|
||||||
Role r = this.getRole(elem.getAttribute("role"));
|
Role r = this.getRole(elem.getAttribute("role"));
|
||||||
|
|
|
@ -22,6 +22,8 @@ import java.util.*;
|
||||||
import javax.servlet.*;
|
import javax.servlet.*;
|
||||||
import javax.servlet.http.*;
|
import javax.servlet.http.*;
|
||||||
import org.apache.log4j.*;
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.util.ServletMultipartHandler;
|
||||||
|
import com.silverwrist.util.ServletMultipartException;
|
||||||
import com.silverwrist.util.StringUtil;
|
import com.silverwrist.util.StringUtil;
|
||||||
import com.silverwrist.venice.core.*;
|
import com.silverwrist.venice.core.*;
|
||||||
import com.silverwrist.venice.except.*;
|
import com.silverwrist.venice.except.*;
|
||||||
|
@ -227,7 +229,24 @@ public class SystemAdmin extends VeniceServlet
|
||||||
|
|
||||||
} // end catch
|
} // 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
|
// TODO: other command handling
|
||||||
|
|
||||||
|
@ -396,4 +415,60 @@ public class SystemAdmin extends VeniceServlet
|
||||||
|
|
||||||
} // end doVenicePost
|
} // 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
|
} // end class SystemAdmin
|
||||||
|
|
|
@ -341,6 +341,18 @@ public abstract class VeniceServlet extends HttpServlet
|
||||||
|
|
||||||
} // end getStandardCommandParam
|
} // 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)
|
protected final void setMyLocation(ServletRequest request, String loc)
|
||||||
{
|
{
|
||||||
request.setAttribute(LOCATION_ATTR,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("View/Edit Banned Users","TODO");
|
||||||
addChoice("User Account Management","sysadmin?cmd=UF");
|
addChoice("User Account Management","sysadmin?cmd=UF");
|
||||||
addChoice("System Audit Logs","sysadmin?cmd=A");
|
addChoice("System Audit Logs","sysadmin?cmd=A");
|
||||||
|
addChoice("Import User Accounts","sysadmin?cmd=IMP");
|
||||||
|
|
||||||
} // end constructor
|
} // 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
|
} // 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
|
public final Element configGetRootElement(Document doc, String expected_name) throws ConfigException
|
||||||
{
|
{
|
||||||
Element rc = doc.getDocumentElement();
|
Element rc = doc.getDocumentElement();
|
||||||
|
@ -182,6 +241,15 @@ public class XMLLoader
|
||||||
|
|
||||||
} // end configVerifyNodeName
|
} // 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
|
public final String configGetAttribute(Element elt, String attr_name) throws ConfigException
|
||||||
{
|
{
|
||||||
String rc = elt.getAttribute(attr_name);
|
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…
Reference in New Issue
Block a user