added "date of birth" as a users table field, added appropriate code to core

to get and set it, added "date" dialog field and updated registration,
profile, and admin modify to use it to change a user's date of birth; added
BDAY support to vCards and rigged user import/export to take it into account;
cleaned up a few other matters while I was in that particular code
This commit is contained in:
Eric J. Bowersox 2004-06-30 07:10:05 +00:00
parent 50c76b3dc7
commit 5c0f841ab7
26 changed files with 1270 additions and 511 deletions

View File

@ -490,6 +490,8 @@ To create a new account, please enter your information below.
<countrylist name="country" capt="Country" required="true"/> <countrylist name="country" capt="Country" required="true"/>
<header capt="E-Mail"/> <header capt="E-Mail"/>
<email name="email" capt="E-mail address" required="true" size="32" maxlength="255"/> <email name="email" capt="E-mail address" required="true" size="32" maxlength="255"/>
<header capt="Other Information"/>
<date name="dob" capt="Date of birth" years="-100"/>
<header capt="Account Information"/> <header capt="Account Information"/>
<veniceid name="user" capt="User name" required="true" size="32" maxlength="64"/> <veniceid name="user" capt="User name" required="true" size="32" maxlength="64"/>
<password name="pass1" capt="Password" required="true" size="32" maxlength="128"/> <password name="pass1" capt="Password" required="true" size="32" maxlength="128"/>
@ -549,6 +551,7 @@ will be fully validated. If you have not received your confirmation within a fe
<checkbox name="pvt_email" capt="Hide E-mail address in profile"/> <checkbox name="pvt_email" capt="Hide E-mail address in profile"/>
<text name="url" capt="Home Page" capt2="(URL)" size="32" maxlength="255"/> <text name="url" capt="Home Page" capt2="(URL)" size="32" maxlength="255"/>
<header capt="Personal"/> <header capt="Personal"/>
<date name="dob" capt="Date of birth" years="-100"/>
<text name="descr" capt="Personal description" size="32" maxlength="255"/> <text name="descr" capt="Personal description" size="32" maxlength="255"/>
<userphoto name="photo" capt="User Photo" link="profile_photo.js.vs" type="servlet"/> <userphoto name="photo" capt="User Photo" link="profile_photo.js.vs" type="servlet"/>
<header capt="User Preferences"/> <header capt="User Preferences"/>
@ -708,6 +711,7 @@ the community's host, or via an invitation e-mail message. Please enter it in th
<checkbox name="pvt_email" capt="Hide E-mail address in profile"/> <checkbox name="pvt_email" capt="Hide E-mail address in profile"/>
<text name="url" capt="Home Page" capt2="(URL)" size="32" maxlength="255"/> <text name="url" capt="Home Page" capt2="(URL)" size="32" maxlength="255"/>
<header capt="Personal"/> <header capt="Personal"/>
<date name="dob" capt="Date of birth" years="-100"/>
<text name="descr" capt="Personal description" size="32" maxlength="255"/> <text name="descr" capt="Personal description" size="32" maxlength="255"/>
<userphoto name="photo" capt="User Photo" link="sysadmin/modify_photo.js.vs" type="servlet"/> <userphoto name="photo" capt="User Photo" link="sysadmin/modify_photo.js.vs" type="servlet"/>
<header capt="User Preferences"/> <header capt="User Preferences"/>

View File

@ -84,7 +84,7 @@ if (op=="create")
// Create the new user account and set up its initial context. // Create the new user account and set up its initial context.
uc = rinput.engine.createNewAccount(rinput.sourceAddress,dlg.getValue("user"),dlg.getValue("pass1"), uc = rinput.engine.createNewAccount(rinput.sourceAddress,dlg.getValue("user"),dlg.getValue("pass1"),
dlg.getValue("remind")); dlg.getValue("remind"),dlg.getValue("dob"));
// Set up the account's contact info. // Set up the account's contact info.
ci = uc.getContactInfo(); ci = uc.getContactInfo();

View File

@ -8,9 +8,9 @@
// //
// The Original Code is the Venice Web Communities System. // The Original Code is the Venice Web Communities System.
// //
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, // The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are // for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
// Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. // Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
// //
// Contributor(s): // Contributor(s):
@ -74,6 +74,7 @@ if ("GET"==rinput.verb)
if (ci.privateEmail) if (ci.privateEmail)
dlg.setValue("pvt_email",1); dlg.setValue("pvt_email",1);
dlg.setValue("url",ci.URL); dlg.setValue("url",ci.URL);
dlg.setValue("dob",user.dateOfBirth);
dlg.setValue("descr",user.description); dlg.setValue("descr",user.description);
dlg.setValue("photo",ci.photoURL); dlg.setValue("photo",ci.photoURL);
dlg.sendMessage("photo","setLinkURL","profile_photo.js.vs?tgt=" + vlib.encodeURL(target)); dlg.sendMessage("photo","setLinkURL","profile_photo.js.vs?tgt=" + vlib.encodeURL(target));
@ -175,6 +176,7 @@ if (op=="update")
user.properties = props; user.properties = props;
// Save off the user's description and preferences. // Save off the user's description and preferences.
user.dateOfBirth = dlg.getValue("dob");
user.description = dlg.getValue("descr"); user.description = dlg.getValue("descr");
user.locale = dlg.getValue("locale"); user.locale = dlg.getValue("locale");
user.timeZone = dlg.getValue("tz"); user.timeZone = dlg.getValue("tz");

View File

@ -8,9 +8,9 @@
// //
// The Original Code is the Venice Web Communities System. // The Original Code is the Venice Web Communities System.
// //
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, // The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are // for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
// Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. // Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
// //
// Contributor(s): // Contributor(s):
@ -115,6 +115,7 @@ if ("GET"==rinput.verb)
if (ci.privateEmail) if (ci.privateEmail)
dlg.setValue("pvt_email",1); dlg.setValue("pvt_email",1);
dlg.setValue("url",ci.URL); dlg.setValue("url",ci.URL);
dlg.setValue("dob",admuser.dateOfBirth);
dlg.setValue("descr",admuser.description); dlg.setValue("descr",admuser.description);
dlg.setValue("photo",ci.photoURL); dlg.setValue("photo",ci.photoURL);
if (props.displayPostPictures) if (props.displayPostPictures)
@ -233,6 +234,7 @@ if (op=="update")
admuser.properties = props; admuser.properties = props;
// Save off the user's description and preferences. // Save off the user's description and preferences.
admuser.dateOfBirth = dlg.getValue("dob");
admuser.description = dlg.getValue("descr"); admuser.description = dlg.getValue("descr");
admuser.locale = dlg.getValue("locale"); admuser.locale = dlg.getValue("locale");
admuser.timeZone = dlg.getValue("tz"); admuser.timeZone = dlg.getValue("tz");

View File

@ -90,6 +90,7 @@ CREATE TABLE users (
lastaccess DATETIME, lastaccess DATETIME,
passreminder VARCHAR(255) DEFAULT '', passreminder VARCHAR(255) DEFAULT '',
description VARCHAR(255), description VARCHAR(255),
dob DATE,
UNIQUE INDEX username_x (username) UNIQUE INDEX username_x (username)
); );

View File

@ -24,40 +24,38 @@ import com.silverwrist.venice.security.Role;
public interface AdminOperations public interface AdminOperations
{ {
public abstract SecurityInfo getSecurityInfo(); public SecurityInfo getSecurityInfo();
public abstract List getAllowedRoleList(); public List getAllowedRoleList();
public abstract List getAuditRecords(int offset, int count) throws DataException; public List getAuditRecords(int offset, int count) throws DataException;
public abstract int getAuditRecordCount() throws DataException; public int getAuditRecordCount() throws DataException;
public abstract AdminUserContext getUserContext(int uid) throws DataException; public AdminUserContext getUserContext(int uid) throws DataException;
public abstract AdminUserContext getUserContext(String username) throws DataException; public AdminUserContext getUserContext(String username) throws DataException;
public abstract CommunityContext getCommunityContext(int cid) throws DataException; public CommunityContext getCommunityContext(int cid) throws DataException;
public abstract CommunityContext getCommunityContext(String alias) throws DataException; public CommunityContext getCommunityContext(String alias) throws DataException;
public abstract GlobalProperties getProperties(); public GlobalProperties getProperties();
public abstract void setProperties(GlobalProperties props) throws DataException; public void setProperties(GlobalProperties props) throws DataException;
public abstract AdminUserContext createNewAccount(String username, String password, boolean prehashed, public AdminUserContext createNewAccount(String username, String password, boolean prehashed, String reminder,
String reminder, boolean verify_email, boolean lockout, boolean verify_email, boolean lockout, Role base_role, String description,
Role base_role, String description, boolean auto_join) java.sql.Date dob, boolean auto_join) throws DataException, AccessError;
throws DataException, AccessError;
public abstract List getIPBanInfo() throws DataException; public List getIPBanInfo() throws DataException;
public abstract IPBanInfo getIPBanInfo(int id) throws DataException; public IPBanInfo getIPBanInfo(int id) throws DataException;
public abstract void enableIPBan(int id, boolean enab) throws DataException; public void enableIPBan(int id, boolean enab) throws DataException;
public abstract void removeIPBan(int id) throws DataException; public void removeIPBan(int id) throws DataException;
public abstract void addIPBan(String address, String mask, java.util.Date expires, String message) public void addIPBan(String address, String mask, java.util.Date expires, String message) throws DataException;
throws DataException;
} // end interface AdminOperations } // end interface AdminOperations

View File

@ -27,54 +27,58 @@ import com.silverwrist.venice.security.Role;
public interface AdminUserContext public interface AdminUserContext
{ {
public abstract int getUID(); public int getUID();
public abstract String getUserName(); public String getUserName();
public abstract int getContactID(); public int getContactID();
public abstract String getDescription(); public String getDescription();
public abstract void setDescription(String new_descr) throws DataException; public void setDescription(String new_descr) throws DataException;
public abstract int getBaseLevel(); public int getBaseLevel();
public abstract void setBaseLevel(int new_level) throws DataException; public void setBaseLevel(int new_level) throws DataException;
public abstract Role getBaseRole(); public Role getBaseRole();
public abstract void setBaseRole(Role new_role) throws DataException; public void setBaseRole(Role new_role) throws DataException;
public abstract boolean isEmailVerified(); public boolean isEmailVerified();
public abstract void setEmailVerified(boolean flag) throws DataException; public void setEmailVerified(boolean flag) throws DataException;
public abstract boolean isLockedOut(); public boolean isLockedOut();
public abstract void setLockedOut(boolean flag) throws DataException; public void setLockedOut(boolean flag) throws DataException;
public abstract ContactInfo getContactInfo() throws DataException; public ContactInfo getContactInfo() throws DataException;
public abstract void putContactInfo(ContactInfo ci) throws DataException; public void putContactInfo(ContactInfo ci) throws DataException;
public abstract void setPassword(String password, String reminder) throws DataException; public void setPassword(String password, String reminder) throws DataException;
public abstract Locale getLocale(); public Locale getLocale();
public abstract void setLocale(Locale locale) throws DataException; public void setLocale(Locale locale) throws DataException;
public abstract TimeZone getTimeZone(); public TimeZone getTimeZone();
public abstract void setTimeZone(TimeZone timezone) throws DataException; public void setTimeZone(TimeZone timezone) throws DataException;
public abstract Date getCreationDate(); public Date getCreationDate();
public abstract Date getLastAccessDate(); public Date getLastAccessDate();
public abstract AdminUserProperties getProperties() throws DataException; public AdminUserProperties getProperties() throws DataException;
public abstract void setProperties(AdminUserProperties props) throws DataException; public void setProperties(AdminUserProperties props) throws DataException;
public abstract void export(Writer xml) throws IOException, DataException; public void export(Writer xml) throws IOException, DataException;
public java.sql.Date getDateOfBirth();
public void setDateOfBirth(java.sql.Date date) throws DataException;
} // end interface AdminUserContext } // end interface AdminUserContext

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -26,106 +26,109 @@ import com.silverwrist.venice.except.EmailException;
public interface UserContext extends SearchMode public interface UserContext extends SearchMode
{ {
public abstract int getUID(); public int getUID();
public abstract String getUserName(); public String getUserName();
public abstract int getContactID(); public int getContactID();
public abstract String getDescription(); public String getDescription();
public abstract boolean isLoggedIn(); public boolean isLoggedIn();
public abstract boolean isEmailVerified(); public boolean isEmailVerified();
public abstract void authenticate(String username, String password) public void authenticate(String username, String password) throws AccessError, DataException;
throws AccessError, DataException;
public abstract void confirmEmail(int conf_num) throws AccessError, DataException; public void confirmEmail(int conf_num) throws AccessError, DataException;
public abstract void resendEmailConfirmation() throws DataException, EmailException; public void resendEmailConfirmation() throws DataException, EmailException;
public abstract ContactInfo getContactInfo() throws DataException; public ContactInfo getContactInfo() throws DataException;
public abstract boolean putContactInfo(ContactInfo ci) throws DataException, EmailException; public boolean putContactInfo(ContactInfo ci) throws DataException, EmailException;
public abstract UserProfile getProfile(String xusername) throws DataException; public UserProfile getProfile(String xusername) throws DataException;
public abstract UserProfile getProfile(int xuid) throws DataException; public UserProfile getProfile(int xuid) throws DataException;
public abstract void setPassword(String password, String reminder) throws DataException; public void setPassword(String password, String reminder) throws DataException;
public abstract void setDescription(String new_descr) throws DataException; public void setDescription(String new_descr) throws DataException;
public abstract List getMemberCommunities() throws DataException; public List getMemberCommunities() throws DataException;
public abstract CommunityContext getCommunityContext(int cid) throws DataException; public CommunityContext getCommunityContext(int cid) throws DataException;
public abstract CommunityContext getCommunityContext(String alias) throws DataException; public CommunityContext getCommunityContext(String alias) throws DataException;
public abstract List getRootCategoryList() throws DataException; public List getRootCategoryList() throws DataException;
public abstract CategoryDescriptor getCategoryDescriptor(int catid) throws DataException; public CategoryDescriptor getCategoryDescriptor(int catid) throws DataException;
public abstract List searchForCommunities(int field, int mode, String term, int offset, int count) public List searchForCommunities(int field, int mode, String term, int offset, int count)
throws DataException; throws DataException;
public abstract int getSearchCommunityCount(int field, int mode, String term) throws DataException; public int getSearchCommunityCount(int field, int mode, String term) throws DataException;
public abstract List getCommunitiesInCategory(int catid, int offset, int count) throws DataException; public List getCommunitiesInCategory(int catid, int offset, int count) throws DataException;
public abstract List getCommunitiesInCategory(CategoryDescriptor cat, int offset, int count) public List getCommunitiesInCategory(CategoryDescriptor cat, int offset, int count)
throws DataException; throws DataException;
public abstract int getNumCommunitiesInCategory(int catid) throws DataException; public int getNumCommunitiesInCategory(int catid) throws DataException;
public abstract int getNumCommunitiesInCategory(CategoryDescriptor cat) throws DataException; public int getNumCommunitiesInCategory(CategoryDescriptor cat) throws DataException;
public abstract List searchForCategories(int mode, String term, int offset, int count) throws DataException; public List searchForCategories(int mode, String term, int offset, int count) throws DataException;
public abstract int getSearchCategoryCount(int mode, String term) throws DataException; public int getSearchCategoryCount(int mode, String term) throws DataException;
public abstract CommunityContext createCommunity(String name, String alias, String language, String synopsis, public CommunityContext createCommunity(String name, String alias, String language, String synopsis,
String rules, String joinkey, int hide_mode) String rules, String joinkey, int hide_mode)
throws DataException, AccessError; throws DataException, AccessError;
public abstract boolean canCreateCommunity(); public boolean canCreateCommunity();
public abstract List getSideBoxList() throws DataException; public List getSideBoxList() throws DataException;
public abstract void addSideBox(int id) throws DataException; public void addSideBox(int id) throws DataException;
public abstract List getConferenceHotlist() throws DataException; public List getConferenceHotlist() throws DataException;
public abstract boolean hasAdminAccess(); public boolean hasAdminAccess();
public abstract AdminOperations getAdminInterface() throws AccessError; public AdminOperations getAdminInterface() throws AccessError;
public abstract Locale getLocale() throws DataException; public Locale getLocale() throws DataException;
public abstract void setLocale(Locale locale) throws DataException; public void setLocale(Locale locale) throws DataException;
public abstract TimeZone getTimeZone() throws DataException; public TimeZone getTimeZone() throws DataException;
public abstract void setTimeZone(TimeZone timezone) throws DataException; public void setTimeZone(TimeZone timezone) throws DataException;
public abstract String getAuthenticationToken() throws AccessError, DataException; public String getAuthenticationToken() throws AccessError, DataException;
public abstract boolean authenticateWithToken(String token) throws DataException; public boolean authenticateWithToken(String token) throws DataException;
public abstract Advertisement selectAd(); public Advertisement selectAd();
public abstract boolean displayPostPictures() throws DataException; public boolean displayPostPictures() throws DataException;
public abstract UserProperties getProperties() throws DataException; public UserProperties getProperties() throws DataException;
public abstract void setProperties(UserProperties props) throws DataException; public void setProperties(UserProperties props) throws DataException;
public abstract boolean canSetUserPhoto() throws DataException; public boolean canSetUserPhoto() throws DataException;
public abstract List searchPosts(String search_terms, int offset, int count) throws DataException; public List searchPosts(String search_terms, int offset, int count) throws DataException;
public abstract int getSearchPostCount(String search_terms) throws DataException; public int getSearchPostCount(String search_terms) throws DataException;
public java.sql.Date getDateOfBirth();
public void setDateOfBirth(java.sql.Date date) throws DataException;
} // end interface UserContext } // end interface UserContext

View File

@ -29,68 +29,65 @@ import com.silverwrist.venice.htmlcheck.HTMLChecker;
public interface VeniceEngine extends SearchMode, ServiceGroup public interface VeniceEngine extends SearchMode, ServiceGroup
{ {
public abstract void initialize(Document config, String app_root) throws ConfigException, DataException; public void initialize(Document config, String app_root) throws ConfigException, DataException;
public abstract void shutdown() throws ConfigException; public void shutdown() throws ConfigException;
public abstract UserContext createUserContext(String remote_addr) throws DataException; public UserContext createUserContext(String remote_addr) throws DataException;
public abstract String getEmailAddressForUser(String username) throws DataException, AccessError; public String getEmailAddressForUser(String username) throws DataException, AccessError;
public abstract void sendPasswordReminder(String username) public void sendPasswordReminder(String username) throws DataException, AccessError, EmailException;
throws DataException, AccessError, EmailException;
public abstract void completePasswordChange(int uid, int authentication) public void completePasswordChange(int uid, int authentication) throws DataException, AccessError, EmailException;
throws DataException, AccessError, EmailException;
public abstract UserContext createNewAccount(String remote_addr, String username, String password, public UserContext createNewAccount(String remote_addr, String username, String password,
String reminder) throws DataException, AccessError; String reminder, java.sql.Date dob) throws DataException, AccessError;
public abstract boolean aliasExists(String alias, int exist_cid); public boolean aliasExists(String alias, int exist_cid);
public abstract boolean isValidCategoryID(int catid); public boolean isValidCategoryID(int catid);
public abstract List searchForUsers(int field, int mode, String term, int offset, int count) public List searchForUsers(int field, int mode, String term, int offset, int count) throws DataException;
throws DataException;
public abstract int getSearchUserCount(int field, int mode, String term) throws DataException; public int getSearchUserCount(int field, int mode, String term) throws DataException;
public abstract int getStdNumSearchResults(); public int getStdNumSearchResults();
public abstract boolean isEmailAddressBanned(String email); public boolean isEmailAddressBanned(String email);
public abstract boolean confAliasExists(String alias); public boolean confAliasExists(String alias);
public abstract HTMLChecker getEscapingChecker(); public HTMLChecker getEscapingChecker();
public abstract int getNumPostsPerPage(); public int getNumPostsPerPage();
public abstract int getNumOldPostsBeforeNew(); public int getNumOldPostsBeforeNew();
public abstract int getMaxNumConferenceMembersDisplay(); public int getMaxNumConferenceMembersDisplay();
public abstract int getMaxNumCommunityMembersDisplay(); public int getMaxNumCommunityMembersDisplay();
public abstract List getMasterSideBoxList(); public List getMasterSideBoxList();
public abstract List getPublishedMessages(boolean all) throws DataException; public List getPublishedMessages(boolean all) throws DataException;
public abstract int getNumAuditRecordsPerPage(); public int getNumAuditRecordsPerPage();
public abstract Advertisement getAdByID(int id); public Advertisement getAdByID(int id);
public abstract Advertisement selectAd(); public Advertisement selectAd();
public abstract BinaryData loadImage(int id) throws DataException; public BinaryData loadImage(int id) throws DataException;
public abstract Dimension getUserPhotoSize(); public Dimension getUserPhotoSize();
public abstract Dimension getCommunityLogoSize(); public Dimension getCommunityLogoSize();
public abstract SecurityInfo getSecurityInfo(); public SecurityInfo getSecurityInfo();
public abstract boolean useCategories(); public boolean useCategories();
public abstract String testIPBan(String ip_address) throws DataException; public String testIPBan(String ip_address) throws DataException;
} // end interface VeniceEngine } // end interface VeniceEngine

View File

@ -278,7 +278,7 @@ class AdminOperationsImpl implements AdminOperations
public AdminUserContext createNewAccount(String username, String password, boolean prehashed, String reminder, public AdminUserContext createNewAccount(String username, String password, boolean prehashed, String reminder,
boolean verify_email, boolean lockout, Role base_role, boolean verify_email, boolean lockout, Role base_role,
String description, boolean auto_join) String description, java.sql.Date dob, boolean auto_join)
throws DataException, AccessError throws DataException, AccessError
{ {
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
@ -289,13 +289,13 @@ class AdminOperationsImpl implements AdminOperations
// Create the user account. // Create the user account.
ReturnNewUser rnu = UserContextImpl.createAccount(env,env.getRemoteAddress(),username,password,prehashed,reminder, ReturnNewUser rnu = UserContextImpl.createAccount(env,env.getRemoteAddress(),username,password,prehashed,reminder,
verify_email,lockout,0,base_role,description); verify_email,lockout,0,base_role,description,dob);
if (auto_join) if (auto_join)
{ // Need to create a normal user context here for just a minute to autojoin the communities. { // Need to create a normal user context here for just a minute to autojoin the communities.
UserContextImpl rc = new UserContextImpl(globalsite,env); UserContextImpl rc = new UserContextImpl(globalsite,env);
rc.loadNewUser("0.0.0.0",rnu.getUserID(),base_role.getLevel(),username,0,rnu.getCreationDate(), rc.loadNewUser("0.0.0.0",rnu.getUserID(),base_role.getLevel(),username,0,rnu.getCreationDate(),
rnu.getCreationDate()); rnu.getCreationDate(),dob);
rc.autoJoinCommunities(); rc.autoJoinCommunities();
} // end if } // end if

View File

@ -54,6 +54,7 @@ class AdminUserContextImpl implements AdminUserContext
private java.util.Date created; // when was this user created? (GMT) private java.util.Date created; // when was this user created? (GMT)
private java.util.Date last_access; // when did we last log in? (GMT) private java.util.Date last_access; // when did we last log in? (GMT)
private String description; // personal description private String description; // personal description
private java.sql.Date m_dob; // date of birth
private Locale my_locale; // my default locale (cached) private Locale my_locale; // my default locale (cached)
private TimeZone my_tz; // my default timezone (cached) private TimeZone my_tz; // my default timezone (cached)
private OptionSet flags = null; // option flags private OptionSet flags = null; // option flags
@ -75,15 +76,17 @@ class AdminUserContextImpl implements AdminUserContext
this.created = SQLUtil.getFullDateTime(rs,"created"); this.created = SQLUtil.getFullDateTime(rs,"created");
this.last_access = SQLUtil.getFullDateTime(rs,"lastaccess"); this.last_access = SQLUtil.getFullDateTime(rs,"lastaccess");
this.description = rs.getString("description"); this.description = rs.getString("description");
this.m_dob = rs.getDate("dob");
this.my_locale = International.get().createLocale(rs.getString("localeid")); this.my_locale = International.get().createLocale(rs.getString("localeid"));
this.my_tz = TimeZone.getTimeZone(rs.getString("tzid")); this.my_tz = TimeZone.getTimeZone(rs.getString("tzid"));
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // get user properties { // get user properties
stmt = conn.createStatement(); stmt = conn.prepareStatement("SELECT ndx, data FROM propuser WHERE uid = ?;");
ResultSet rs2 = stmt.executeQuery("SELECT ndx, data FROM propuser WHERE uid = " + this.uid + ";"); stmt.setInt(1,uid);
ResultSet rs2 = stmt.executeQuery();
while (rs2.next()) while (rs2.next())
{ // load the properties... { // load the properties...
switch (rs2.getInt(1)) switch (rs2.getInt(1))
@ -116,19 +119,18 @@ class AdminUserContextImpl implements AdminUserContext
private final void updateProperties(BitSet delta) throws DataException private final void updateProperties(BitSet delta) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // get a connection and create a statement { // get a connection and create a statement
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement();
StringBuffer sql = new StringBuffer();
if (delta.get(UserContextImpl.PROP_FLAGS)) if (delta.get(UserContextImpl.PROP_FLAGS))
{ // store the flags { // store the flags
sql.append("UPDATE propuser SET data = '").append(flags.asString()).append("' WHERE uid = "); stmt = conn.prepareStatement("UPDATE propuser SET data = ? WHERE uid = ? AND ndx = ?;");
sql.append(uid).append(" AND ndx = ").append(UserContextImpl.PROP_FLAGS).append(';'); stmt.setString(1,flags.asString());
stmt.executeUpdate(sql.toString()); stmt.setInt(2,uid);
sql.setLength(0); stmt.setInt(3,UserContextImpl.PROP_FLAGS);
stmt.executeUpdate();
} // end if } // end if
@ -211,7 +213,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setDescription(String new_descr) throws DataException public void setDescription(String new_descr) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
if (new_descr.equals(description)) if (new_descr.equals(description))
@ -220,11 +222,10 @@ class AdminUserContextImpl implements AdminUserContext
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET description = ? WHERE uid = ?;");
StringBuffer sql = new StringBuffer("UPDATE users SET description = '"); stmt.setString(1,new_descr);
sql.append(SQLUtil.encodeString(new_descr)).append("' WHERE uid = ").append(uid).append(';'); stmt.setInt(2,uid);
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
description = new_descr; // change stored information description = new_descr; // change stored information
ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=description"); ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=description");
@ -254,7 +255,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setBaseLevel(int new_level) throws DataException public void setBaseLevel(int new_level) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
if (level==new_level) if (level==new_level)
@ -263,11 +264,10 @@ class AdminUserContextImpl implements AdminUserContext
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET base_lvl = ? WHERE uid = ?;");
StringBuffer sql = new StringBuffer("UPDATE users SET base_lvl = "); stmt.setInt(1,new_level);
sql.append(new_level).append(" WHERE uid = ").append(uid).append(';'); stmt.setInt(2,uid);
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
level = new_level; level = new_level;
ar = env.newAudit(AuditRecord.ADMIN_SET_SECURITY,"uid=" + uid,"level=" + new_level); ar = env.newAudit(AuditRecord.ADMIN_SET_SECURITY,"uid=" + uid,"level=" + new_level);
@ -309,7 +309,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setEmailVerified(boolean flag) throws DataException public void setEmailVerified(boolean flag) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
if (flag==email_verified) if (flag==email_verified)
@ -318,11 +318,10 @@ class AdminUserContextImpl implements AdminUserContext
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET verify_email = ? WHERE uid = ?;");
StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = "); stmt.setInt(1,flag ? 1 : 0);
sql.append(flag ? '1' : '0').append(" WHERE uid = ").append(uid).append(';'); stmt.setInt(2,uid);
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
email_verified = flag; email_verified = flag;
ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=verify_email"); ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=verify_email");
@ -352,7 +351,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setLockedOut(boolean flag) throws DataException public void setLockedOut(boolean flag) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
if (flag==lockout) if (flag==lockout)
@ -361,11 +360,10 @@ class AdminUserContextImpl implements AdminUserContext
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET lockout = ? WHERE uid = ?;");
StringBuffer sql = new StringBuffer("UPDATE users SET lockout = "); stmt.setInt(1,flag ? 1 : 0);
sql.append(flag ? '1' : '0').append(" WHERE uid = ").append(uid).append(';'); stmt.setInt(2,uid);
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
lockout = flag; lockout = flag;
ar = env.newAudit(AuditRecord.ADMIN_LOCK_OUT,"uid=" + uid,flag ? "locked" : "unlocked"); ar = env.newAudit(AuditRecord.ADMIN_LOCK_OUT,"uid=" + uid,flag ? "locked" : "unlocked");
@ -459,18 +457,17 @@ class AdminUserContextImpl implements AdminUserContext
public void setPassword(String password, String reminder) throws DataException public void setPassword(String password, String reminder) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET passhash = ?, passreminder = ?, access_tries = 0 WHERE uid = ?;");
String hash_value = Generator.hashPassword(password); stmt.setString(1,Generator.hashPassword(password));
StringBuffer sql = new StringBuffer("UPDATE users SET passhash = '"); stmt.setString(2,reminder);
sql.append(hash_value).append("', passreminder = '").append(SQLUtil.encodeString(reminder)); stmt.setInt(3,uid);
sql.append("', access_tries = 0 WHERE uid = ").append(uid).append(';'); stmt.executeUpdate();
stmt.executeUpdate(sql.toString());
// record an audit record for this user // record an audit record for this user
ar = env.newAudit(AuditRecord.ADMIN_PASSWORD_CHANGE,"uid=" + uid); ar = env.newAudit(AuditRecord.ADMIN_PASSWORD_CHANGE,"uid=" + uid);
@ -501,20 +498,20 @@ class AdminUserContextImpl implements AdminUserContext
public void setLocale(Locale locale) throws DataException public void setLocale(Locale locale) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement();
// create the update statement // create the update statement
StringBuffer sql = new StringBuffer("UPDATE userprefs SET localeid = '"); stmt = conn.prepareStatement("UPDATE userprefs SET localeid = ? WHERE uid = ?;");
sql.append(SQLUtil.encodeString(locale.toString())).append("' WHERE uid = ").append(uid).append(';'); stmt.setString(1,locale.toString());
stmt.setInt(2,uid);
// execute the statement // execute the statement
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
// replace the locale here // replace the locale here
my_locale = locale; my_locale = locale;
@ -546,20 +543,20 @@ class AdminUserContextImpl implements AdminUserContext
public void setTimeZone(TimeZone timezone) throws DataException public void setTimeZone(TimeZone timezone) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement();
// create the update statement // create the update statement
StringBuffer sql = new StringBuffer("UPDATE userprefs SET tzid = '"); stmt = conn.prepareStatement("UPDATE userprefs SET tzid = ? WHERE uid = ?;");
sql.append(SQLUtil.encodeString(timezone.getID())).append("' WHERE uid = ").append(uid).append(';'); stmt.setString(1,timezone.getID());
stmt.setInt(2,uid);
// execute the statement // execute the statement
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
// replace the locale here // replace the locale here
my_tz = timezone; my_tz = timezone;
@ -724,6 +721,7 @@ class AdminUserContextImpl implements AdminUserContext
// get the vCard info and serialize it // get the vCard info and serialize it
BuildVCard bvc = ci.getVCardBuilder(); BuildVCard bvc = ci.getVCardBuilder();
bvc.setBirthday(m_dob);
bvc.setTimeZone(my_tz); bvc.setTimeZone(my_tz);
bvc.create().exportXML(xml); bvc.create().exportXML(xml);
@ -743,6 +741,48 @@ class AdminUserContextImpl implements AdminUserContext
} // end export } // end export
public java.sql.Date getDateOfBirth()
{
return m_dob;
} // end getDateOfBirth
public void setDateOfBirth(java.sql.Date date) throws DataException
{
Connection conn = null;
PreparedStatement stmt = null;
AuditRecord ar = null;
if (date.equals(m_dob))
return;
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
stmt = conn.prepareStatement("UPDATE users SET dob = ? WHERE uid = ?;");
stmt.setDate(1,date);
stmt.setInt(2,uid);
stmt.executeUpdate();
m_dob = date; // change stored information
ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=dob");
} // end try
catch (SQLException e)
{ // turn SQLException into data exception
logger.error("DB error changing date of birth: " + e.getMessage(),e);
throw new DataException("Unable to set user date of birth: " + e.getMessage(),e);
} // end catch
finally
{ // make sure the connection is released before we go
SQLUtil.shutdown(stmt);
AuditRecord.store(conn,ar);
SQLUtil.shutdown(conn);
} // end finally
} // end setDateOfBirth
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Package-level static operations * Package-level static operations
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
@ -751,14 +791,15 @@ class AdminUserContextImpl implements AdminUserContext
static AdminUserContext getAdminUserContext(EnvUser env, int uid) throws DataException static AdminUserContext getAdminUserContext(EnvUser env, int uid) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // get a database connection { // get a database connection
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement(); stmt = conn.prepareStatement("SELECT * FROM users INNER JOIN userprefs ON users.uid = userprefs.uid "
ResultSet rs = stmt.executeQuery("SELECT * FROM users INNER JOIN userprefs " + "WHERE users.uid = ?;");
+ "ON users.uid = userprefs.uid WHERE users.uid = " + uid + ";"); stmt.setInt(1,uid);
ResultSet rs = stmt.executeQuery();
if (!(rs.next())) if (!(rs.next()))
throw new DataException("The user with UID #" + uid + " was not found."); throw new DataException("The user with UID #" + uid + " was not found.");
if (rs.getBoolean("is_anon")) if (rs.getBoolean("is_anon"))
@ -785,15 +826,15 @@ class AdminUserContextImpl implements AdminUserContext
static AdminUserContext getAdminUserContext(EnvUser env, String username) throws DataException static AdminUserContext getAdminUserContext(EnvUser env, String username) throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // get a database connection { // get a database connection
conn = env.getConnection(); conn = env.getConnection();
stmt = conn.createStatement(); stmt = conn.prepareStatement("SELECT * FROM users INNER JOIN userprefs ON users.uid = userprefs.uid "
ResultSet rs = stmt.executeQuery("SELECT * FROM users INNER JOIN userprefs " + "WHERE users.username = ?;");
+ "ON users.uid = userprefs.uid WHERE users.username = '" stmt.setString(1,username);
+ SQLUtil.encodeString(username) + "';"); ResultSet rs = stmt.executeQuery();
if (!(rs.next())) if (!(rs.next()))
throw new DataException("The user '" + username + "' was not found."); throw new DataException("The user '" + username + "' was not found.");
if (rs.getBoolean("is_anon")) if (rs.getBoolean("is_anon"))

View File

@ -70,7 +70,8 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
private String username; // the user name we're using private String username; // the user name we're using
private java.util.Date created; // when was this user created? (GMT) private java.util.Date created; // when was this user created? (GMT)
private java.util.Date last_access; // when did we last log in? (GMT) private java.util.Date last_access; // when did we last log in? (GMT)
private String description; // personal description private String m_description; // personal description
private java.sql.Date m_dob; // date of birth
private String my_email = null; // my email address (cached) private String my_email = null; // my email address (cached)
private String my_pseud = null; // my pseud (cached) private String my_pseud = null; // my pseud (cached)
private String full_name = null; // my full name (cached) private String full_name = null; // my full name (cached)
@ -110,7 +111,8 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
created = SQLUtil.getFullDateTime(rs,"created"); created = SQLUtil.getFullDateTime(rs,"created");
last_access = SQLUtil.getFullDateTime(rs,"lastaccess"); last_access = SQLUtil.getFullDateTime(rs,"lastaccess");
// skip field "passreminder" // skip field "passreminder"
description = rs.getString("description"); m_description = rs.getString("description");
m_dob = rs.getDate("dob");
// purge any "cached" fields that may be left over // purge any "cached" fields that may be left over
my_email = null; my_email = null;
@ -222,19 +224,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("autoJoinCommunities (uid " + uid + ", level " + level + ")"); logger.debug("autoJoinCommunities (uid " + uid + ", level " + level + ")");
Statement stmt = null; PreparedStatement stmt = null, stmt2 = null;
try try
{ // See which communities we are eligible to autojoin. { // See which communities we are eligible to autojoin.
stmt = conn.createStatement(); stmt = conn.prepareStatement("SELECT sigmember.sigid, sigmember.locked FROM users, sigmember, sigs "
StringBuffer sql = + "WHERE sigmember.uid = users.uid AND sigmember.sigid = sigs.sigid "
new StringBuffer("SELECT sigmember.sigid, sigmember.locked FROM users, sigmember, sigs " + "AND users.is_anon = 1 AND sigs.join_lvl <= ?;");
+ "WHERE sigmember.uid = users.uid AND sigmember.sigid = sigs.sigid " stmt.setInt(1,level);
+ "AND users.is_anon = 1 AND sigs.join_lvl <= "); ResultSet rs = stmt.executeQuery();
sql.append(level).append(';');
if (logger.isDebugEnabled())
logger.debug("SQL: " + sql.toString());
ResultSet rs = stmt.executeQuery(sql.toString());
// Save the community IDs returned into temporary array lists. // Save the community IDs returned into temporary array lists.
ArrayList tmp_cid = new ArrayList(); ArrayList tmp_cid = new ArrayList();
@ -247,41 +245,34 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end while } // end while
// Figure out which of those communities we haven't joined yet and set up to autojoin them. // Figure out which of those communities we haven't joined yet and set up to autojoin them.
sql.setLength(0); stmt = conn.prepareStatement("SELECT sigid FROM sigmember WHERE sigid = ? AND uid = ?;");
stmt2 = conn.prepareStatement("INSERT INTO sigmember (sigid, uid, granted_lvl, locked) VALUES (?, ?, ?, ?);");
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class,"Community")); SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class,"Community"));
int new_level = smon.getDefaultRole("Community.NewUser").getLevel(); int new_level = smon.getDefaultRole("Community.NewUser").getLevel();
for (int i=0; i<tmp_cid.size(); i++) for (int i=0; i<tmp_cid.size(); i++)
{ // see if the user is already a member of this community { // see if the user is already a member of this community
Integer x_cid = (Integer)(tmp_cid.get(i)); Integer x_cid = (Integer)(tmp_cid.get(i));
rs = stmt.executeQuery("SELECT sigid FROM sigmember WHERE sigid = " + x_cid + " AND uid = " + uid stmt.setInt(1,x_cid.intValue());
+ ";"); stmt.setInt(2,uid);
rs = stmt.executeQuery();
if (!(rs.next())) if (!(rs.next()))
{ // tack this information onto the end of our big "INSERT" command { // tack this information onto the end of our big "INSERT" command
Boolean x_locked = (Boolean)(tmp_locked.get(i)); Boolean x_locked = (Boolean)(tmp_locked.get(i));
if (sql.length()==0) stmt2.setInt(1,x_cid.intValue());
sql.append("INSERT INTO sigmember (sigid, uid, granted_lvl, locked) VALUES "); stmt2.setInt(2,uid);
else stmt2.setInt(3,new_level);
sql.append(", "); stmt2.setInt(4,x_locked.booleanValue() ? 1 : 0);
sql.append("(").append(x_cid).append(", ").append(uid).append(", ").append(new_level).append(", "); stmt2.executeUpdate();
sql.append(x_locked.booleanValue() ? '1' : '0').append(")");
} // end if } // end if
} // end for } // end for
if (sql.length()>0)
{ // execute the big update
sql.append(';');
if (logger.isDebugEnabled())
logger.debug("SQL: " + sql.toString());
stmt.executeUpdate(sql.toString());
} // end if
} // end try } // end try
finally finally
{ // shut down the statement to conserve resources { // shut down the statement to conserve resources
SQLUtil.shutdown(stmt); SQLUtil.shutdown(stmt);
SQLUtil.shutdown(stmt2);
} // end finally } // end finally
@ -376,7 +367,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
public String getDescription() public String getDescription()
{ {
return description; return m_description;
} // end getDescription } // end getDescription
@ -407,15 +398,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
logger.debug("authenticate(): authenticating user \"" + username + "\"..."); logger.debug("authenticate(): authenticating user \"" + username + "\"...");
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
{ // look for a user name matching this user record { // look for a user name matching this user record
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement(); stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ?;");
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username = '" stmt.setString(1,username);
+ SQLUtil.encodeString(username) + "';"); ResultSet rs = stmt.executeQuery();
if (!(rs.next())) if (!(rs.next()))
{ // user not found { // user not found
@ -460,11 +451,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
// we're authenticated - load the user data into the context // we're authenticated - load the user data into the context
loadUserData(rs); loadUserData(rs);
rs.close();
// update the "last access" time in the database // update the "last access" time in the database
stmt.close();
stmt = conn.prepareStatement("UPDATE users SET lastaccess = ? WHERE uid = ?;");
java.util.Date mydate = new java.util.Date(); java.util.Date mydate = new java.util.Date();
stmt.executeUpdate("UPDATE users SET lastaccess = '" + SQLUtil.encodeDate(mydate) SQLUtil.setFullDateTime(stmt,1,mydate);
+ "' WHERE uid = " + uid + ";"); stmt.setInt(2,uid);
stmt.executeUpdate();
// update the "last access" time in this object // update the "last access" time in this object
last_access = mydate; last_access = mydate;
@ -516,17 +511,17 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if } // end if
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class)); SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class));
Role new_role = smon.getDefaultRole("Global.AfterVerify"); Role new_role = smon.getDefaultRole("Global.AfterVerify");
try try
{ // get a connection and set the user's status to reflect the verification { // get a connection and set the user's status to reflect the verification
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET verify_email = 1, base_lvl = ? WHERE uid = ?;");
StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = 1, base_lvl = "); stmt.setInt(1,new_role.getLevel());
sql.append(new_role.getLevel()).append(" WHERE uid = ").append(uid).append(';'); stmt.setInt(2,uid);
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
email_verified = true; email_verified = true;
level = new_role.getLevel(); level = new_role.getLevel();
@ -569,22 +564,21 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
getContactInfo(); // forces my_email to be updated getContactInfo(); // forces my_email to be updated
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
{ // need to change the user's email confirmation number first { // need to change the user's email confirmation number first
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement();
// generate new confirmation number // generate new confirmation number
int new_confirm_num = Generator.get().getNewConfirmationNumber(); int new_confirm_num = Generator.get().getNewConfirmationNumber();
// create an SQL statement to reset the user account information, and execute it // create an SQL statement to reset the user account information, and execute it
StringBuffer sql = new StringBuffer("UPDATE users SET email_confnum = "); stmt = conn.prepareStatement("UPDATE users SET email_confnum = ? WHERE uid = ?;");
sql.append(new_confirm_num).append(" WHERE uid = ").append(uid).append(';'); stmt.setInt(1,new_confirm_num);
stmt.executeUpdate(sql.toString()); stmt.setInt(2,uid);
stmt.executeUpdate();
confirm_num = new_confirm_num; // save changed value confirm_num = new_confirm_num; // save changed value
// now send the email confirmation! // now send the email confirmation!
@ -694,14 +688,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class)); SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class));
Role new_role = smon.getDefaultRole("Global.Unverified"); Role new_role = smon.getDefaultRole("Global.Unverified");
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // create an SQL statement to reset the user account information, and execute it { // create an SQL statement to reset the user account information, and execute it
StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = 0, email_confnum = "); stmt = conn.prepareStatement("UPDATE users SET verify_email = 0, email_confnum = ?, base_lvl = ? "
sql.append(new_confirm_num).append(", base_lvl = ").append(new_role.getLevel()); + "WHERE uid = ?;");
sql.append(" WHERE uid = ").append(uid).append(';'); stmt.setInt(1,new_confirm_num);
stmt = conn.createStatement(); stmt.setInt(2,new_role.getLevel());
stmt.executeUpdate(sql.toString()); stmt.setInt(3,uid);
stmt.executeUpdate();
} // end try } // end try
finally finally
@ -816,18 +811,17 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if } // end if
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET passhash = ?, passreminder = ? WHERE uid = ?;");
String hash_value = Generator.hashPassword(password); stmt.setString(1,Generator.hashPassword(password));
StringBuffer sql = new StringBuffer("UPDATE users SET passhash = '"); stmt.setString(2,reminder);
sql.append(hash_value).append("', passreminder = '").append(SQLUtil.encodeString(reminder)); stmt.setInt(3,uid);
sql.append("' WHERE uid = ").append(uid).append(';'); stmt.executeUpdate();
stmt.executeUpdate(sql.toString());
// record an audit record for this user // record an audit record for this user
ar = new AuditRecord(AuditRecord.PASSWORD_CHANGE,uid,remote_addr); ar = new AuditRecord(AuditRecord.PASSWORD_CHANGE,uid,remote_addr);
@ -859,17 +853,16 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if } // end if
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET description = ? WHERE uid = ?;");
StringBuffer sql = new StringBuffer("UPDATE users SET description = '"); stmt.setString(1,new_descr);
sql.append(SQLUtil.encodeString(new_descr)).append("' WHERE uid = ").append(uid).append(';'); stmt.setInt(2,uid);
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
m_description = new_descr; // change stored information
description = new_descr; // change stored information
} // end try } // end try
catch (SQLException e) catch (SQLException e)
@ -1018,17 +1011,17 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
public List getSideBoxList() throws DataException public List getSideBoxList() throws DataException
{ {
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
ArrayList rc = new ArrayList(); ArrayList rc = new ArrayList();
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement();
// retrieve the necessary rows from the sideboxes table // retrieve the necessary rows from the sideboxes table
ResultSet rs = stmt.executeQuery("SELECT boxid, sequence FROM sideboxes WHERE uid = " + uid stmt = conn.prepareStatement("SELECT boxid, sequence FROM sideboxes WHERE uid = ? ORDER BY sequence;");
+ " ORDER BY sequence;"); stmt.setInt(1,uid);
ResultSet rs = stmt.executeQuery();
while (rs.next()) while (rs.next())
{ // create the implementation objects and return them all { // create the implementation objects and return them all
SideBoxDescriptor sbd = SideBoxDescriptor sbd =
@ -1063,6 +1056,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
Connection conn = null; Connection conn = null;
Statement stmt = null; Statement stmt = null;
PreparedStatement pstmt = null;
try try
{ // retrieve a connection { // retrieve a connection
@ -1072,25 +1066,29 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
stmt.executeUpdate("LOCK TABLES sideboxes WRITE;"); stmt.executeUpdate("LOCK TABLES sideboxes WRITE;");
try try
{ // do a quickie query to see if we're already in the sidebox list { // do a quickie query to see if we're already in the sidebox list
StringBuffer sql = new StringBuffer("SELECT sequence FROM sideboxes WHERE uid = "); pstmt = conn.prepareStatement("SELECT sequence FROM sideboxes WHERE uid = ? AND boxid = ?;");
sql.append(uid).append(" AND boxid = ").append(id).append(';'); pstmt.setInt(1,uid);
ResultSet rs = stmt.executeQuery(sql.toString()); pstmt.setInt(2,id);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) if (rs.next())
return; // already in sidebox list - this is a no-op return; // already in sidebox list - this is a no-op
// find a sequence number for the new entry // find a sequence number for the new entry
sql.setLength(0); pstmt.close();
sql.append("SELECT MAX(sequence) FROM sideboxes WHERE uid = ").append(uid).append(';'); pstmt = conn.prepareStatement("SELECT MAX(sequence) FROM sideboxes WHERE uid = ?;");
rs = stmt.executeQuery(sql.toString()); pstmt.setInt(1,uid);
rs = pstmt.executeQuery();
if (!(rs.next())) if (!(rs.next()))
throw new InternalStateError("bogus query result on addSideBox"); throw new InternalStateError("bogus query result on addSideBox");
int new_sequence = rs.getInt(1) + 100; int new_sequence = rs.getInt(1) + 100;
// add the new record // add the new record
sql.setLength(0); pstmt.close();
sql.append("INSERT INTO sideboxes (uid, sequence, boxid) VALUES (").append(uid).append(", "); pstmt = conn.prepareStatement("INSERT INTO sideboxes (uid, sequence, boxid) VALUES (?, ?, ?);");
sql.append(new_sequence).append(", ").append(id).append(");"); pstmt.setInt(1,uid);
stmt.executeUpdate(sql.toString()); pstmt.setInt(2,new_sequence);
pstmt.setInt(3,id);
pstmt.executeUpdate();
} // end try } // end try
finally finally
@ -1108,6 +1106,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end catch } // end catch
finally finally
{ // make sure we release the connection before we go { // make sure we release the connection before we go
SQLUtil.shutdown(pstmt);
SQLUtil.shutdown(stmt); SQLUtil.shutdown(stmt);
SQLUtil.shutdown(conn); SQLUtil.shutdown(conn);
@ -1236,15 +1235,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
// Generate a random authentication string and poke it into the database for this user. // Generate a random authentication string and poke it into the database for this user.
String tokenauth = Generator.get().generateRandomAuthString(); String tokenauth = Generator.get().generateRandomAuthString();
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // retrieve a connection from the data pool { // retrieve a connection from the data pool
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement(); stmt = conn.prepareStatement("UPDATE users SET tokenauth = ? WHERE uid = ?;");
StringBuffer sql = new StringBuffer("UPDATE users SET tokenauth = '"); stmt.setString(1,tokenauth);
sql.append(tokenauth).append("' WHERE uid = ").append(uid).append(';'); stmt.setInt(2,uid);
stmt.executeUpdate(sql.toString()); stmt.executeUpdate();
} // end try } // end try
catch (SQLException e) catch (SQLException e)
@ -1363,14 +1362,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
logger.debug("Authenticating user ID#" + pending_uid); logger.debug("Authenticating user ID#" + pending_uid);
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
{ // look for a user record matching this user ID { // look for a user record matching this user ID
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement(); stmt = conn.prepareStatement("SELECT * FROM users WHERE uid = ?;");
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE uid = " + pending_uid + ";"); stmt.setInt(1,pending_uid);
ResultSet rs = stmt.executeQuery();
if (!(rs.next())) if (!(rs.next()))
{ // user not found { // user not found
@ -1412,9 +1412,11 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
loadUserData(rs); loadUserData(rs);
// update the "last access" time in the database // update the "last access" time in the database
stmt = conn.prepareStatement("UPDATE users SET lastaccess = ? WHERE uid = ?;");
java.util.Date mydate = new java.util.Date(); java.util.Date mydate = new java.util.Date();
stmt.executeUpdate("UPDATE users SET lastaccess = '" + SQLUtil.encodeDate(mydate) SQLUtil.setFullDateTime(stmt,1,mydate);
+ "' WHERE uid = " + uid + ";"); stmt.setInt(2,uid);
stmt.executeUpdate();
// update the "last access" time in this object // update the "last access" time in this object
last_access = mydate; last_access = mydate;
@ -1514,32 +1516,32 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
ServiceToken conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference"); ServiceToken conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference");
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
ArrayList rc = new ArrayList(); ArrayList rc = new ArrayList();
try try
{ // get a database connection { // get a database connection
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
TopicMessageFoundHelper helper = new TopicMessageFoundHelper(conn); TopicMessageFoundHelper helper = new TopicMessageFoundHelper(conn);
stmt = conn.createStatement();
// create the SQL statement // create the SQL statement
StringBuffer sql = stmt = conn.prepareStatement("SELECT s.sigid, c.confid, t.topicid, t.num, p.postid, p.num, p.creator_uid, "
new StringBuffer("SELECT s.sigid, c.confid, t.topicid, t.num, p.postid, p.num, p.creator_uid, " + "p.posted, p.linecount, d.data FROM confs c, sigtoconf s, topics t, posts p, "
+ "p.posted, p.linecount, d.data FROM confs c, sigtoconf s, topics t, posts p, " + "postdata d, users u, sigmember m, sigftrs f LEFT JOIN confmember x "
+ "postdata d, users u, sigmember m, sigftrs f LEFT JOIN confmember x " + "ON (c.confid = x.confid AND u.uid = x.uid) WHERE u.uid = ? AND "
+ "ON (c.confid = x.confid AND u.uid = x.uid) WHERE u.uid = "); + "s.sigid = m.sigid AND m.uid = u.uid AND s.sigid = f.sigid AND f.ftr_code = ? "
sql.append(uid); + " AND c.confid = s.confid AND GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl,"
sql.append(" AND s.sigid = m.sigid AND m.uid = u.uid AND s.sigid = f.sigid AND f.ftr_code = "); + "IFNULL(x.granted_lvl,0)) >= c.read_lvl AND t.confid = c.confid AND "
sql.append(conf_token.getIndex()); + "t.topicid = p.topicid AND p.scribble_uid IS NULL AND p.postid = d.postid "
sql.append(" AND c.confid = s.confid AND GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl," + "AND MATCH(d.data) AGAINST (?) LIMIT ?, ?;");
+ "IFNULL(x.granted_lvl,0)) >= c.read_lvl AND t.confid = c.confid AND t.topicid = p.topicid " stmt.setInt(1,uid);
+ "AND p.scribble_uid IS NULL AND p.postid = d.postid AND MATCH(d.data) AGAINST ("); stmt.setInt(2,conf_token.getIndex());
sql.append(SQLUtil.encodeStringArg(search_terms)).append(") LIMIT ").append(offset).append(", "); stmt.setString(3,search_terms);
sql.append(count+1).append(';'); stmt.setInt(4,offset);
stmt.setInt(5,count + 1);
// execute the query and load the results into the return arraylist // execute the query and load the results into the return arraylist
ResultSet rs = stmt.executeQuery(sql.toString()); ResultSet rs = stmt.executeQuery();
while (rs.next()) while (rs.next())
rc.add(new TopicMessageFoundImpl(helper,rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(4), rc.add(new TopicMessageFoundImpl(helper,rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(4),
rs.getLong(5),rs.getInt(6),rs.getInt(7), rs.getLong(5),rs.getInt(6),rs.getInt(7),
@ -1575,28 +1577,26 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
ServiceToken conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference"); ServiceToken conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference");
Connection conn = null; Connection conn = null;
Statement stmt = null; PreparedStatement stmt = null;
try try
{ // get a database connection { // get a database connection
conn = globalsite.getConnection(null); conn = globalsite.getConnection(null);
stmt = conn.createStatement();
// create the SQL statement // create the SQL statement
StringBuffer sql = stmt = conn.prepareStatement("SELECT COUNT(*) FROM confs c, sigtoconf s, topics t, posts p, postdata d, "
new StringBuffer("SELECT COUNT(*) FROM confs c, sigtoconf s, topics t, posts p, postdata d, " + "users u, sigmember m, sigftrs f LEFT JOIN confmember x ON (c.confid = x.confid "
+ "users u, sigmember m, sigftrs f LEFT JOIN confmember x ON (c.confid = x.confid " + "AND u.uid = x.uid) WHERE u.uid = ? AND s.sigid = m.sigid AND m.uid = u.uid "
+ "AND u.uid = x.uid) WHERE u.uid = "); + "AND s.sigid = f.sigid AND f.ftr_code = ? AND c.confid = s.confid AND "
sql.append(uid); + "GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl,IFNULL(x.granted_lvl,0)) "
sql.append(" AND s.sigid = m.sigid AND m.uid = u.uid AND s.sigid = f.sigid AND f.ftr_code = "); + ">= c.read_lvl AND t.confid = c.confid AND t.topicid = p.topicid AND "
sql.append(conf_token.getIndex()); + "p.scribble_uid IS NULL AND p.postid = d.postid AND MATCH(d.data) AGAINST (?);");
sql.append(" AND c.confid = s.confid AND GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl," stmt.setInt(1,uid);
+ "IFNULL(x.granted_lvl,0)) >= c.read_lvl AND t.confid = c.confid AND t.topicid = p.topicid " stmt.setInt(2,conf_token.getIndex());
+ "AND p.scribble_uid IS NULL AND p.postid = d.postid AND MATCH(d.data) AGAINST ("); stmt.setString(3,search_terms);
sql.append(SQLUtil.encodeStringArg(search_terms)).append(");");
// execute the query and load the results // execute the query and load the results
ResultSet rs = stmt.executeQuery(sql.toString()); ResultSet rs = stmt.executeQuery();
if (!(rs.next())) if (!(rs.next()))
throw new InternalStateError("query failure in UserContextImpl.getSearchPostCount!"); throw new InternalStateError("query failure in UserContextImpl.getSearchPostCount!");
return rs.getInt(1); return rs.getInt(1);
@ -1617,6 +1617,49 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end getSearchPostCount } // end getSearchPostCount
public java.sql.Date getDateOfBirth()
{
return m_dob;
} // end getDateOfBirth
public void setDateOfBirth(java.sql.Date date) throws DataException
{
if (is_anon)
{ // trying to change Anonymous Honyak's (nonexistent) date of birth?
logger.error("cannot change date of birth of anonymous account");
throw new DataException("The anonymous account cannot change its date of birth.");
} // end if
Connection conn = null;
PreparedStatement stmt = null;
try
{ // retrieve a connection from the data pool
conn = globalsite.getConnection(null);
stmt = conn.prepareStatement("UPDATE users SET dob = ? WHERE uid = ?;");
stmt.setDate(1,date);
stmt.setInt(2,uid);
stmt.executeUpdate();
m_dob = date; // change stored information
} // end try
catch (SQLException e)
{ // turn SQLException into data exception
logger.error("DB error changing date of birth: " + e.getMessage(),e);
throw new DataException("Unable to set user date of birth: " + e.getMessage(),e);
} // end catch
finally
{ // make sure the connection is released before we go
SQLUtil.shutdown(stmt);
SQLUtil.shutdown(conn);
} // end finally
} // end setDateOfBirth
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Implementations from interface ServiceProvider * Implementations from interface ServiceProvider
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
@ -1755,7 +1798,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end loadAnonymous } // end loadAnonymous
void loadNewUser(String remote_addr, int uid, int level, String username, int confirm_num, void loadNewUser(String remote_addr, int uid, int level, String username, int confirm_num,
java.util.Date created, java.util.Date last_access) java.util.Date created, java.util.Date last_access, java.sql.Date dob)
{ {
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("loadNewUser() on UserContext: addr " + remote_addr + ", uid " + uid + ", level " logger.debug("loadNewUser() on UserContext: addr " + remote_addr + ", uid " + uid + ", level "
@ -1769,6 +1812,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
this.confirm_num = confirm_num; this.confirm_num = confirm_num;
this.created = created; this.created = created;
this.last_access = last_access; this.last_access = last_access;
m_dob = dob;
} // end loadNewUser } // end loadNewUser
@ -1803,14 +1847,14 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
static final ReturnNewUser createAccount(EnvEngine env, String remote_addr, String username, String password, static final ReturnNewUser createAccount(EnvEngine env, String remote_addr, String username, String password,
boolean prehashed, String reminder, boolean verify_email, boolean lockout, boolean prehashed, String reminder, boolean verify_email, boolean lockout,
int confirm_num, Role base_role, String description) int confirm_num, Role base_role, String description, java.sql.Date dob)
throws AccessError, DataException throws AccessError, DataException
{ {
String encode_username = SQLUtil.encodeString(username);
int new_uid; // new user ID - return from this function int new_uid; // new user ID - return from this function
java.util.Date created; // date created - return from this function java.util.Date created; // date created - return from this function
Connection conn = null; Connection conn = null;
Statement stmt = null; Statement stmt = null;
PreparedStatement pstmt = null;
AuditRecord ar = null; AuditRecord ar = null;
try try
@ -1822,7 +1866,9 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
try try
{ // make sure the user account doesn't already exist { // make sure the user account doesn't already exist
ResultSet rs = stmt.executeQuery("SELECT uid FROM users WHERE username = '" + encode_username + "';"); pstmt = conn.prepareStatement("SELECT uid FROM users WHERE username = ?;");
pstmt.setString(1,username);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) if (rs.next())
{ // the user account already exists { // the user account already exists
logger.warn("username \"" + username + "\" already exists"); logger.warn("username \"" + username + "\" already exists");
@ -1830,21 +1876,27 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if } // end if
SQLUtil.shutdown(rs); rs.close();
// Insert a new record for this user // Insert a new record for this user
String hash_value = (prehashed ? password : Generator.hashPassword(password)); String hash_value = (prehashed ? password : Generator.hashPassword(password));
StringBuffer sql = pstmt.close();
new StringBuffer("INSERT INTO users (username, passhash, verify_email, lockout, email_confnum, " pstmt = conn.prepareStatement("INSERT INTO users (username, passhash, verify_email, lockout, email_confnum, "
+ "base_lvl, created, lastaccess, passreminder, description) VALUES ('"); + "base_lvl, created, lastaccess, passreminder, description, dob) VALUES "
sql.append(encode_username).append("', '").append(hash_value).append("', "); + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
sql.append(verify_email ? '1' : '0').append(", ").append(lockout ? '1' : '0').append(", "); pstmt.setString(1,username);
sql.append(confirm_num).append(", ").append(base_role.getLevel()).append(", '"); pstmt.setString(2,hash_value);
pstmt.setInt(3,verify_email ? 1 : 0);
pstmt.setInt(4,lockout ? 1 : 0);
pstmt.setInt(5,confirm_num);
pstmt.setInt(6,base_role.getLevel());
created = new java.util.Date(); created = new java.util.Date();
sql.append(SQLUtil.encodeDate(created)).append("', '").append(SQLUtil.encodeDate(created)); SQLUtil.setFullDateTime(pstmt,7,created);
sql.append("', ").append(SQLUtil.encodeStringArg(reminder)).append(", "); SQLUtil.setFullDateTime(pstmt,8,created);
sql.append(SQLUtil.encodeStringArg(description)).append(");"); pstmt.setString(9,reminder);
stmt.executeUpdate(sql.toString()); pstmt.setString(10,description);
pstmt.setDate(11,dob);
pstmt.executeUpdate();
// what is the new user ID? // what is the new user ID?
rs = stmt.executeQuery("SELECT LAST_INSERT_ID();"); rs = stmt.executeQuery("SELECT LAST_INSERT_ID();");
@ -1858,12 +1910,13 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
new_uid = rs.getInt(1); new_uid = rs.getInt(1);
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("...created user \"" + username + "\" with UID " + new_uid); logger.debug("...created user \"" + username + "\" with UID " + new_uid);
SQLUtil.shutdown(rs); rs.close();
// add a UserPrefs record for this user, too // add a UserPrefs record for this user, too
sql.setLength(0); pstmt.close();
sql.append("INSERT INTO userprefs (uid) VALUES (").append(new_uid).append(");"); pstmt = conn.prepareStatement("INSERT INTO userprefs (uid) VALUES (?);");
stmt.executeUpdate(sql.toString()); pstmt.setInt(1,new_uid);
pstmt.executeUpdate();
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("...created userprefs"); logger.debug("...created userprefs");
@ -1871,75 +1924,52 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
// add a properties configuration for this user // add a properties configuration for this user
rs = stmt.executeQuery("SELECT propuser.ndx, propuser.data FROM propuser, users WHERE " rs = stmt.executeQuery("SELECT propuser.ndx, propuser.data FROM propuser, users WHERE "
+ "propuser.uid = users.uid AND users.is_anon = 1;"); + "propuser.uid = users.uid AND users.is_anon = 1;");
sql.setLength(0); pstmt.close();
pstmt = conn.prepareStatement("INSERT INTO propuser (uid, ndx, data) VALUES (?, ?, ?);");
while (rs.next()) while (rs.next())
{ // set up to insert into the propuser table { // set up to insert into the propuser table
if (sql.length()==0) pstmt.setInt(1,new_uid);
sql.append("INSERT INTO propuser (uid, ndx, data) VALUES "); pstmt.setInt(2,rs.getInt(1));
else pstmt.setString(3,rs.getString(2));
sql.append(", "); pstmt.executeUpdate();
sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", '");
sql.append(SQLUtil.encodeString(rs.getString(2))).append("')");
} // end while } // end while
if (sql.length()>0)
{ // execute the big update
sql.append(';');
stmt.executeUpdate(sql.toString());
} // end if
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("...created user properties"); logger.debug("...created user properties");
// get the sidebox configuration for this user // get the sidebox configuration for this user
rs = stmt.executeQuery("SELECT sideboxes.boxid, sideboxes.sequence FROM sideboxes, " rs = stmt.executeQuery("SELECT sideboxes.boxid, sideboxes.sequence FROM sideboxes, "
+ "users WHERE sideboxes.uid = users.uid AND users.is_anon = 1;"); + "users WHERE sideboxes.uid = users.uid AND users.is_anon = 1;");
sql.setLength(0); pstmt.close();
pstmt = conn.prepareStatement("INSERT INTO sideboxes (uid, boxid, sequence) VALUES (?, ?, ?);");
while (rs.next()) while (rs.next())
{ // set up to insert into the sideboxes table { // set up to insert into the sideboxes table
if (sql.length()==0) pstmt.setInt(1,new_uid);
sql.append("INSERT INTO sideboxes (uid, boxid, sequence) VALUES "); pstmt.setInt(2,rs.getInt(1));
else pstmt.setInt(3,rs.getInt(2));
sql.append(", "); pstmt.executeUpdate();
sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", ");
sql.append(rs.getInt(2)).append(')');
} // end while } // end while
if (sql.length()>0)
{ // execute the big update
sql.append(';');
stmt.executeUpdate(sql.toString());
} // end if
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("...loaded default sidebox config"); logger.debug("...loaded default sidebox config");
// get the hotlist configuration for this user // get the hotlist configuration for this user
rs = stmt.executeQuery("SELECT confhotlist.sequence, confhotlist.sigid, confhotlist.confid FROM " rs = stmt.executeQuery("SELECT confhotlist.sequence, confhotlist.sigid, confhotlist.confid FROM "
+ "confhotlist, users WHERE confhotlist.uid = users.uid AND users.is_anon = 1;"); + "confhotlist, users WHERE confhotlist.uid = users.uid AND users.is_anon = 1;");
sql.setLength(0); pstmt.close();
pstmt = conn.prepareStatement("INSERT INTO confhotlist (uid, sequence, sigid, confid) VALUES (?, ?, ?, ?);");
while (rs.next()) while (rs.next())
{ // set up to insert into the confhotlist table { // set up to insert into the confhotlist table
if (sql.length()==0) pstmt.setInt(1,new_uid);
sql.append("INSERT INTO confhotlist (uid, sequence, sigid, confid) VALUES "); pstmt.setInt(2,rs.getInt(1));
else pstmt.setInt(3,rs.getInt(2));
sql.append(", "); pstmt.setInt(4,rs.getInt(3));
sql.append('(').append(new_uid).append(", ").append(rs.getInt(1)).append(", ").append(rs.getInt(2)); pstmt.executeUpdate();
sql.append(", ").append(rs.getInt(3)).append(')');
} // end while } // end while
if (sql.length()>0)
{ // execute the big update
sql.append(';');
stmt.executeUpdate(sql.toString());
} // end if
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("...loaded default hotlist config"); logger.debug("...loaded default hotlist config");
@ -1962,6 +1992,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end catch } // end catch
finally finally
{ // make sure the connection is released before we go { // make sure the connection is released before we go
SQLUtil.shutdown(pstmt);
SQLUtil.shutdown(stmt); SQLUtil.shutdown(stmt);
AuditRecord.store(conn,ar); AuditRecord.store(conn,ar);
SQLUtil.shutdown(conn); SQLUtil.shutdown(conn);

View File

@ -858,8 +858,8 @@ public class VeniceEngineImpl implements VeniceEngine, ServiceProvider, EngineBa
} // end completePasswordChange } // end completePasswordChange
public UserContext createNewAccount(String remote_addr, String username, String password, String reminder) public UserContext createNewAccount(String remote_addr, String username, String password, String reminder,
throws DataException, AccessError java.sql.Date dob) throws DataException, AccessError
{ {
checkInitialized(); checkInitialized();
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class)); SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class));
@ -872,12 +872,12 @@ public class VeniceEngineImpl implements VeniceEngine, ServiceProvider, EngineBa
// Create the user account. // Create the user account.
ReturnNewUser rnu = UserContextImpl.createAccount(env,remote_addr,username,password,false,reminder,false, ReturnNewUser rnu = UserContextImpl.createAccount(env,remote_addr,username,password,false,reminder,false,
false,confirm_num,new_role,null); false,confirm_num,new_role,null,dob);
// 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(globalsite,env); UserContextImpl rc = new UserContextImpl(globalsite,env);
rc.loadNewUser(remote_addr,rnu.getUserID(),new_role.getLevel(),username,confirm_num,rnu.getCreationDate(), rc.loadNewUser(remote_addr,rnu.getUserID(),new_role.getLevel(),username,confirm_num,rnu.getCreationDate(),
rnu.getCreationDate()); rnu.getCreationDate(),dob);
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");

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -21,6 +21,6 @@ import java.io.IOException;
public interface RenderDirect public interface RenderDirect
{ {
public abstract void render(RequestOutput out) throws IOException; public void render(RequestOutput out) throws IOException;
} // end interface RenderDirect } // end interface RenderDirect

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -48,7 +48,7 @@ public interface RequestInput extends ServiceProvider
* @return A <CODE>String</CODE> specifying the real path, or <CODE>null</CODE> if the translation cannot * @return A <CODE>String</CODE> specifying the real path, or <CODE>null</CODE> if the translation cannot
* be performed. * be performed.
*/ */
public abstract String mapPath(String s); public String mapPath(String s);
/** /**
* Returns the portion of the request URI that indicates the context of the request, i.e. the servlet * Returns the portion of the request URI that indicates the context of the request, i.e. the servlet
@ -58,7 +58,7 @@ public interface RequestInput extends ServiceProvider
* @return A <CODE>String</CODE> specifying the portion of the request URI that indicates the context * @return A <CODE>String</CODE> specifying the portion of the request URI that indicates the context
* of the request. * of the request.
*/ */
public abstract String getContextPath(); public String getContextPath();
/** /**
* Returns the part of this request's URI that calls the servlet. This includes either the servlet name * Returns the part of this request's URI that calls the servlet. This includes either the servlet name
@ -67,7 +67,7 @@ public interface RequestInput extends ServiceProvider
* @return A <CODE>String</CODE> containing the name or path of the servlet being called, as specified * @return A <CODE>String</CODE> containing the name or path of the servlet being called, as specified
* in the request URI. * in the request URI.
*/ */
public abstract String getServletPath(); public String getServletPath();
/** /**
* Returns any extra path information associated with the URI the client sent when it made this request. * Returns any extra path information associated with the URI the client sent when it made this request.
@ -79,7 +79,7 @@ public interface RequestInput extends ServiceProvider
* but before the query string in the request URI; or <CODE>null</CODE> if the URI does not * but before the query string in the request URI; or <CODE>null</CODE> if the URI does not
* have any extra path information. * have any extra path information.
*/ */
public abstract String getPathInfo(); public String getPathInfo();
/** /**
* Returns the query string that is contained in the request URI after the path. This method returns * Returns the query string that is contained in the request URI after the path. This method returns
@ -88,21 +88,21 @@ public interface RequestInput extends ServiceProvider
* @return A <CODE>String</CODE> containing the query string or <CODE>null</CODE> if the URI contains * @return A <CODE>String</CODE> containing the query string or <CODE>null</CODE> if the URI contains
* no query string. * no query string.
*/ */
public abstract String getQueryString(); public String getQueryString();
/** /**
* Returns the name of the HTTP method with which this request was made, for example, GET, POST, or PUT. * Returns the name of the HTTP method with which this request was made, for example, GET, POST, or PUT.
* *
* @return A <CODE>String</CODE> specifying the name of the method with which this request was made. * @return A <CODE>String</CODE> specifying the name of the method with which this request was made.
*/ */
public abstract String getVerb(); public String getVerb();
/** /**
* Returns the Internet Protocol (IP) address of the client that sent the request. * Returns the Internet Protocol (IP) address of the client that sent the request.
* *
* @return A <CODE>String</CODE> containing the IP address of the client that sent the request. * @return A <CODE>String</CODE> containing the IP address of the client that sent the request.
*/ */
public abstract String getSourceAddress(); public String getSourceAddress();
/** /**
* Returns <CODE>true</CODE> if the request parameter with the specified name is defined, * Returns <CODE>true</CODE> if the request parameter with the specified name is defined,
@ -112,7 +112,7 @@ public interface RequestInput extends ServiceProvider
* @param name Parameter name to be checked. * @param name Parameter name to be checked.
* @return See above. * @return See above.
*/ */
public abstract boolean hasParameter(String name); public boolean hasParameter(String name);
/** /**
* Returns the value of a request parameter as a <CODE>String</CODE>, or <CODE>null</CODE> if the * Returns the value of a request parameter as a <CODE>String</CODE>, or <CODE>null</CODE> if the
@ -127,7 +127,7 @@ public interface RequestInput extends ServiceProvider
* @return A <CODE>String</CODE> representing the single value of the parameter. * @return A <CODE>String</CODE> representing the single value of the parameter.
* @see #getParameterValues(java.lang.String) * @see #getParameterValues(java.lang.String)
*/ */
public abstract String getParameter(String name); public String getParameter(String name);
/** /**
* Returns the value of a request parameter as a <CODE>int</CODE>, or a specified default value if * Returns the value of a request parameter as a <CODE>int</CODE>, or a specified default value if
@ -140,7 +140,7 @@ public interface RequestInput extends ServiceProvider
* @param default_value The default value to use for the parameter if the specified parameter does not exist. * @param default_value The default value to use for the parameter if the specified parameter does not exist.
* @return An <CODE>int</CODE> representing the single value of the parameter. * @return An <CODE>int</CODE> representing the single value of the parameter.
*/ */
public abstract int getParameterInt(String name, int default_value); public int getParameterInt(String name, int default_value);
/** /**
* Returns the value of a request parameter as a <CODE>short</CODE>, or a specified default value if * Returns the value of a request parameter as a <CODE>short</CODE>, or a specified default value if
@ -153,7 +153,7 @@ public interface RequestInput extends ServiceProvider
* @param default_value The default value to use for the parameter if the specified parameter does not exist. * @param default_value The default value to use for the parameter if the specified parameter does not exist.
* @return A <CODE>short</CODE> representing the single value of the parameter. * @return A <CODE>short</CODE> representing the single value of the parameter.
*/ */
public abstract short getParameterShort(String name, short default_value); public short getParameterShort(String name, short default_value);
/** /**
* Returns the value of a request parameter as a <CODE>long</CODE>, or a specified default value if * Returns the value of a request parameter as a <CODE>long</CODE>, or a specified default value if
@ -166,7 +166,7 @@ public interface RequestInput extends ServiceProvider
* @param default_value The default value to use for the parameter if the specified parameter does not exist. * @param default_value The default value to use for the parameter if the specified parameter does not exist.
* @return A <CODE>long</CODE> representing the single value of the parameter. * @return A <CODE>long</CODE> representing the single value of the parameter.
*/ */
public abstract long getParameterLong(String name, long default_value); public long getParameterLong(String name, long default_value);
/** /**
* Returns an <CODE>Enumeration</CODE> of <CODE>String</CODE> objects containing the names of the * Returns an <CODE>Enumeration</CODE> of <CODE>String</CODE> objects containing the names of the
@ -177,7 +177,7 @@ public interface RequestInput extends ServiceProvider
* containing the name of a request parameter, or an empty <CODE>Enumeration</CODE> if the * containing the name of a request parameter, or an empty <CODE>Enumeration</CODE> if the
* request has no parameters. * request has no parameters.
*/ */
public abstract Enumeration getParameterNames(); public Enumeration getParameterNames();
/** /**
* Returns an array of <CODE>String</CODE> objects containing all of the values the given request * Returns an array of <CODE>String</CODE> objects containing all of the values the given request
@ -188,7 +188,7 @@ public interface RequestInput extends ServiceProvider
* @return An array of <CODE>String</CODE> objects containing the parameter's values. * @return An array of <CODE>String</CODE> objects containing the parameter's values.
* @see #getParameter(java.lang.String) * @see #getParameter(java.lang.String)
*/ */
public abstract String[] getParameterValues(String name); public String[] getParameterValues(String name);
/** /**
* Returns <CODE>true</CODE> if the specified parameter is a file parameter, <CODE>false</CODE> if * Returns <CODE>true</CODE> if the specified parameter is a file parameter, <CODE>false</CODE> if
@ -197,7 +197,7 @@ public interface RequestInput extends ServiceProvider
* @param name A <CODE>String</CODE> containing the name of the parameter to test. * @param name A <CODE>String</CODE> containing the name of the parameter to test.
* @return See above. * @return See above.
*/ */
public abstract boolean isFileParam(String name); public boolean isFileParam(String name);
/** /**
* Returns the MIME type of the specified parameter. If the type cannot be determined, the return * Returns the MIME type of the specified parameter. If the type cannot be determined, the return
@ -208,7 +208,7 @@ public interface RequestInput extends ServiceProvider
* @param name A <CODE>String</CODE> containing the name of the parameter to test. * @param name A <CODE>String</CODE> containing the name of the parameter to test.
* @return See above. * @return See above.
*/ */
public abstract String getParameterType(String name); public String getParameterType(String name);
/** /**
* Returns the size in bytes of the specified parameter. If the size cannot be determined, the return * Returns the size in bytes of the specified parameter. If the size cannot be determined, the return
@ -219,7 +219,7 @@ public interface RequestInput extends ServiceProvider
* @param name A <CODE>String</CODE> containing the name of the parameter to test. * @param name A <CODE>String</CODE> containing the name of the parameter to test.
* @return See above. * @return See above.
*/ */
public abstract int getParameterSize(String name); public int getParameterSize(String name);
/** /**
* Returns an <CODE>InputStream</CODE> reading from the data of the named file parameter. If the * Returns an <CODE>InputStream</CODE> reading from the data of the named file parameter. If the
@ -230,7 +230,7 @@ public interface RequestInput extends ServiceProvider
* @exception com.silverwrist.util.ServletMultipartException If there is a problem retrieving * @exception com.silverwrist.util.ServletMultipartException If there is a problem retrieving
* the parameter data stream. * the parameter data stream.
*/ */
public abstract InputStream getParameterDataStream(String name) throws ServletMultipartException; public InputStream getParameterDataStream(String name) throws ServletMultipartException;
/** /**
* Returns <CODE>true</CODE> if the parameter set reflects the clicking of an image button with a * Returns <CODE>true</CODE> if the parameter set reflects the clicking of an image button with a
@ -239,7 +239,7 @@ public interface RequestInput extends ServiceProvider
* @param name A <CODE>String</CODE> containing the name of the image button to test. * @param name A <CODE>String</CODE> containing the name of the image button to test.
* @return See above. * @return See above.
*/ */
public abstract boolean isImageButtonClicked(String name); public boolean isImageButtonClicked(String name);
/** /**
* Returns the application-level attribute with the given name, or <CODE>null</CODE> if there is no * Returns the application-level attribute with the given name, or <CODE>null</CODE> if there is no
@ -249,7 +249,7 @@ public interface RequestInput extends ServiceProvider
* @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> if no * @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> if no
* attribute exists matching the given name. * attribute exists matching the given name.
*/ */
public abstract Object getAppAttribute(String name); public Object getAppAttribute(String name);
/** /**
* Sets the application-level attribute with the given name. * Sets the application-level attribute with the given name.
@ -258,7 +258,7 @@ public interface RequestInput extends ServiceProvider
* @param o The object to be bound as the value of that attribute, or <CODE>null</CODE> if the binding * @param o The object to be bound as the value of that attribute, or <CODE>null</CODE> if the binding
* is to be removed. * is to be removed.
*/ */
public abstract void setAppAttribute(String name, Object o); public void setAppAttribute(String name, Object o);
/** /**
* Returns the session-level attribute with the given name, or <CODE>null</CODE> if there is no * Returns the session-level attribute with the given name, or <CODE>null</CODE> if there is no
@ -268,7 +268,7 @@ public interface RequestInput extends ServiceProvider
* @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> if no * @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> if no
* attribute exists matching the given name. * attribute exists matching the given name.
*/ */
public abstract Object getSessionAttribute(String name); public Object getSessionAttribute(String name);
/** /**
* Sets the session-level attribute with the given name. * Sets the session-level attribute with the given name.
@ -277,7 +277,7 @@ public interface RequestInput extends ServiceProvider
* @param o The object to be bound as the value of that attribute, or <CODE>null</CODE> if the binding * @param o The object to be bound as the value of that attribute, or <CODE>null</CODE> if the binding
* is to be removed. * is to be removed.
*/ */
public abstract void setSessionAttribute(String name, Object o); public void setSessionAttribute(String name, Object o);
/** /**
* Returns the request-level attribute with the given name, or <CODE>null</CODE> if there is no * Returns the request-level attribute with the given name, or <CODE>null</CODE> if there is no
@ -287,7 +287,7 @@ public interface RequestInput extends ServiceProvider
* @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> if no * @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> if no
* attribute exists matching the given name. * attribute exists matching the given name.
*/ */
public abstract Object getRequestAttribute(String name); public Object getRequestAttribute(String name);
/** /**
* Sets the request-level attribute with the given name. * Sets the request-level attribute with the given name.
@ -296,21 +296,21 @@ public interface RequestInput extends ServiceProvider
* @param o The object to be bound as the value of that attribute, or <CODE>null</CODE> if the binding * @param o The object to be bound as the value of that attribute, or <CODE>null</CODE> if the binding
* is to be removed. * is to be removed.
*/ */
public abstract void setRequestAttribute(String name, Object o); public void setRequestAttribute(String name, Object o);
/** /**
* Returns the instance of the Venice engine associated with the application. * Returns the instance of the Venice engine associated with the application.
* *
* @return See above. * @return See above.
*/ */
public abstract VeniceEngine getEngine(); public VeniceEngine getEngine();
/** /**
* Returns the instance of the Venice user object associated with the session. * Returns the instance of the Venice user object associated with the session.
* *
* @return See above. * @return See above.
*/ */
public abstract UserContext getUser(); public UserContext getUser();
/** /**
* Returns the current servlet location. This is used, for instance, as the context to return to * Returns the current servlet location. This is used, for instance, as the context to return to
@ -318,7 +318,7 @@ public interface RequestInput extends ServiceProvider
* *
* @return The current servlet location. * @return The current servlet location.
*/ */
public abstract String getLocation(); public String getLocation();
/** /**
* Sets the &quot;current&quot; servlet location that is displayed. This is used, for instance, * Sets the &quot;current&quot; servlet location that is displayed. This is used, for instance,
@ -326,7 +326,7 @@ public interface RequestInput extends ServiceProvider
* *
* @param str The new location to be set. * @param str The new location to be set.
*/ */
public abstract void setLocation(String str); public void setLocation(String str);
/** /**
* Returns <CODE>true</CODE> if the &quot;Log In&quot; link is to be displayed on the outer frame, * Returns <CODE>true</CODE> if the &quot;Log In&quot; link is to be displayed on the outer frame,
@ -334,7 +334,7 @@ public interface RequestInput extends ServiceProvider
* *
* @return See above. * @return See above.
*/ */
public abstract boolean getDisplayLogin(); public boolean getDisplayLogin();
/** /**
* Sets whether or not the &quot;Log In&quot; link is to be displayed on the outer frame. * Sets whether or not the &quot;Log In&quot; link is to be displayed on the outer frame.
@ -342,26 +342,26 @@ public interface RequestInput extends ServiceProvider
* @param val <CODE>true</CODE> to display the &quot;Log In&quot; link on the outer frame, * @param val <CODE>true</CODE> to display the &quot;Log In&quot; link on the outer frame,
* <CODE>false</CODE> to omit it. * <CODE>false</CODE> to omit it.
*/ */
public abstract void setDisplayLogin(boolean val); public void setDisplayLogin(boolean val);
public abstract MenuComponent getMenu(String name); public MenuComponent getMenu(String name);
public abstract MenuComponent getMenu(String name, Map vars); public MenuComponent getMenu(String name, Map vars);
public abstract Dialog getDialog(String name); public Dialog getDialog(String name);
public abstract Content[] getSideBoxes() throws AccessError, DataException; public Content[] getSideBoxes() throws AccessError, DataException;
public abstract CommunityContext getCommunity(); public CommunityContext getCommunity();
public abstract CommunityContext getCommunity(boolean required, String on_error) throws ErrorBox; public CommunityContext getCommunity(boolean required, String on_error) throws ErrorBox;
public abstract String getDefaultServletAddress(CommunityContext comm); public String getDefaultServletAddress(CommunityContext comm);
public abstract void registerCleanup(AutoCleanup ac); public void registerCleanup(AutoCleanup ac);
public abstract String getConfigProperty(String name); public String getConfigProperty(String name);
public abstract String getConfigProperty(String name, String default_val); public String getConfigProperty(String name, String default_val);
} // end interface RequestInput } // end interface RequestInput

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -24,32 +24,32 @@ import com.silverwrist.venice.util.ServiceProvider;
public interface RequestOutput extends ServiceProvider, LinkTypes public interface RequestOutput extends ServiceProvider, LinkTypes
{ {
public abstract Writer getWriter() throws IOException; public Writer getWriter() throws IOException;
public abstract void write(String s) throws IOException; public void write(String s) throws IOException;
public abstract void writeStackTrace(Throwable t) throws IOException; public void writeStackTrace(Throwable t) throws IOException;
public abstract void flush() throws IOException; public void flush() throws IOException;
public abstract void output(Content c) throws IOException, ServletException; public void output(Content c) throws IOException, ServletException;
public abstract void output(Writer out, Content c) throws IOException, ServletException; public void output(Writer out, Content c) throws IOException, ServletException;
public abstract void writeFrameHead(Writer out, Content c) throws IOException; public void writeFrameHead(Writer out, Content c) throws IOException;
public abstract void writeFrameHead(Content c) throws IOException; public void writeFrameHead(Content c) throws IOException;
public abstract void writeSiteImageTag(Writer out) throws IOException; public void writeSiteImageTag(Writer out) throws IOException;
public abstract void writeSiteImageTag() throws IOException; public void writeSiteImageTag() throws IOException;
public abstract void writeVeniceLogo(Writer out) throws IOException; public void writeVeniceLogo(Writer out) throws IOException;
public abstract void writeVeniceLogo() throws IOException; public void writeVeniceLogo() throws IOException;
public abstract void writeContentHeader(Writer out, String primary, String secondary) throws IOException; public void writeContentHeader(Writer out, String primary, String secondary) throws IOException;
public abstract void writeContentHeader(String primary, String secondary) throws IOException; public void writeContentHeader(String primary, String secondary) throws IOException;
} // end interface RequestOutput } // end interface RequestOutput

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -103,9 +103,9 @@ public abstract class BaseDialogField implements DialogField
out.write(" " + StringUtil.encodeHTML(caption2)); out.write(" " + StringUtil.encodeHTML(caption2));
if (!reverse) if (!reverse)
out.write(":"); out.write(":");
out.write("</FONT>"); out.write("</font>");
if (required) if (required)
out.write(html.getFontTag("red","content") + "*</FONT>"); out.write(html.getFontTag("red","content") + "*</font>");
} // end renderCaption } // end renderCaption
@ -150,17 +150,17 @@ public abstract class BaseDialogField implements DialogField
public void render(RequestOutput out) throws IOException public void render(RequestOutput out) throws IOException
{ {
out.write("<TR VALIGN=MIDDLE>\n<TD ALIGN=RIGHT CLASS=\"content\">"); out.write("<tr valign=\"middle\">\n<td align=\"right\" class=\"content\">");
if (reverse) if (reverse)
renderField(out); renderField(out);
else else
renderCaption(out); renderCaption(out);
out.write("</TD>\n<TD ALIGN=LEFT CLASS=\"content\">"); out.write("</td>\n<td align=\"left\" class=\"content\">");
if (reverse) if (reverse)
renderCaption(out); renderCaption(out);
else else
renderField(out); renderField(out);
out.write("</TD>\n</TR>\n"); out.write("</td>\n</tr>\n");
} // end render } // end render

View File

@ -0,0 +1,592 @@
/*
* 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@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.ui.dlg;
import java.io.IOException;
import java.text.*;
import java.util.*;
import org.apache.log4j.*;
import org.apache.regexp.*;
import org.w3c.dom.*;
import com.silverwrist.util.*;
import com.silverwrist.venice.except.*;
import com.silverwrist.venice.ui.*;
import com.silverwrist.venice.ui.helpers.HTMLRendering;
import com.silverwrist.venice.util.XMLLoader;
public class DateField implements DialogField
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
public static final String TAGNAME = "date";
private static Logger logger = Logger.getLogger(DateField.class);
private static final int FLD_MONTH = 1;
private static final int FLD_DAY = 2;
private static final int FLD_YEAR = 3;
private static REProgram YRANGE = null;
private static REProgram YPLUS = null;
private static REProgram YMINUS = null;
private static REProgram YPLUSMINUS = null;
private static REProgram YMINUSPLUS = null;
private static REProgram YSOLO = null;
private static Hashtable s_locale_ordering = new Hashtable();
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private String m_name; // field name (parameter name)
private String m_caption; // primary caption
private String m_caption2; // secondary caption
private boolean m_required; // is this field required?
private boolean m_enabled; // are we enabled?
private int m_year_start; // first year for dropdown
private int m_year_stop; // last year for dropdown
private java.sql.Date m_value = null; // selected date
private int m_ndx_month = -1; // index of selected month
private int m_ndx_day = -1; // index of selected day
private int m_ndx_year = -1; // index of selected year
private boolean m_input_error = false; // input error?
/*--------------------------------------------------------------------------------
* Constructors
*--------------------------------------------------------------------------------
*/
public DateField(String name, String caption, String caption2, boolean required, boolean enabled, int year_start,
int year_stop)
{
m_name = name;
m_caption = caption;
m_caption2 = caption2;
m_required = required;
m_enabled = enabled;
m_year_start = year_start;
m_year_stop = year_stop;
} // end constructor
public DateField(Element elt) throws ConfigException
{
XMLLoader loader = XMLLoader.get();
m_name = loader.configGetAttribute(elt,"name");
m_caption = loader.configGetAttribute(elt,"capt");
m_caption2 = elt.getAttribute("capt2");
DOMElementHelper h = new DOMElementHelper(elt);
m_required = h.hasAttribute("required");
m_enabled = !(h.hasAttribute("disabled"));
String countdir = elt.getAttribute("direction");
if (StringUtil.isStringEmpty(countdir))
countdir = "down";
else if (!(countdir.equalsIgnoreCase("up") || countdir.equalsIgnoreCase("down")))
throw new ConfigException("<date/> direction= attribute must be 'up' or 'down'",elt);
int y1, y2;
String yearspec = elt.getAttribute("years");
if (StringUtil.isStringEmpty(yearspec))
{ // use a 70 year span back from the current year
Calendar cal = Calendar.getInstance();
y1 = cal.get(Calendar.YEAR);
y2 = y1 - 70;
} // end if
else
{ // now recognize what the field value is
do
{ // attempt to recognize a range
RE re = new RE(YRANGE);
if (re.match(yearspec))
{ // got a year range
y1 = Integer.parseInt(re.getParen(1));
y2 = Integer.parseInt(re.getParen(2));
break;
} // end if
Calendar cal = Calendar.getInstance();
re = new RE(YPLUS);
if (re.match(yearspec))
{ // +number - range from current year forward some years
y1 = cal.get(Calendar.YEAR);
y2 = y1 + Integer.parseInt(re.getParen(1));
break;
} // end if
re = new RE(YMINUS);
if (re.match(yearspec))
{ // -number - range from current year backward some years
y1 = cal.get(Calendar.YEAR);
y2 = y1 - Integer.parseInt(re.getParen(1));
break;
} // end if
re = new RE(YPLUSMINUS);
if (re.match(yearspec))
{ // +number -number - brackets around the current year
int foo = cal.get(Calendar.YEAR);
y1 = foo + Integer.parseInt(re.getParen(1));
y2 = foo - Integer.parseInt(re.getParen(2));
break;
} // end if
re = new RE(YMINUSPLUS);
if (re.match(yearspec))
{ // -number +number - brackets around the current year
int foo = cal.get(Calendar.YEAR);
y1 = foo - Integer.parseInt(re.getParen(1));
y2 = foo + Integer.parseInt(re.getParen(2));
break;
} // end if
re = new RE(YSOLO);
if (re.match(yearspec))
{ // solo number - one end of year spec, current year being the other
y1 = cal.get(Calendar.YEAR);
y2 = Integer.parseInt(re.getParen(1));
break;
} // end if
throw new ConfigException("<date/> years= attribute: invalid syntax",elt);
} while (false); // end do
} // end else
if (countdir.equalsIgnoreCase("down"))
{ // organize for counting downward
m_year_start = Math.max(y1,y2);
m_year_stop = Math.min(y1,y2);
} // end if
else
{ // organize for counting upward
m_year_start = Math.min(y1,y2);
m_year_stop = Math.max(y1,y2);
} // end else
} // end constructor
protected DateField(DateField other)
{
m_name = other.m_name;
m_caption = other.m_caption;
m_caption2 = other.m_caption2;
m_required = other.m_required;
m_enabled = other.m_enabled;
m_year_start = other.m_year_start;
m_year_stop = other.m_year_stop;
} // end constructor
/*--------------------------------------------------------------------------------
* Internal operations
*--------------------------------------------------------------------------------
*/
private static final int[] getDateFieldOrdering(Locale locale)
{
int[] rc = (int[])(s_locale_ordering.get(locale));
if (rc!=null)
return rc;
// We determine the date format by encoding the date September 18, 2003, into "short"
// date format, then measuring the relative positions of the digits 9, 8, and 3.
// It's severely hackish, but there seems to be no Java API whereby we can directly
// get this information.
DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT,locale);
Calendar cal = fmt.getCalendar();
cal.set(Calendar.YEAR,2003);
cal.set(Calendar.MONTH,Calendar.SEPTEMBER);
cal.set(Calendar.DAY_OF_MONTH,18);
String s = fmt.format(cal.getTime());
int pday = s.indexOf('8');
int pmonth = s.indexOf('9');
int pyear = s.indexOf('3');
rc = new int[3];
if (pday<pmonth)
{ // day before month
if (pday<pyear)
{ // we're definitely DAY first
rc[0] = FLD_DAY;
if (pmonth<pyear)
{ // D-M-Y (Euro standard)
rc[1] = FLD_MONTH;
rc[2] = FLD_YEAR;
} // end if
else
{ // D-Y-M? Well, OK...
rc[1] = FLD_YEAR;
rc[2] = FLD_MONTH;
} // end else
} // end if
else
{ // day before month, but after year - Y-D-M? OK...
rc[0] = FLD_YEAR;
rc[1] = FLD_DAY;
rc[2] = FLD_MONTH;
} // end else
} // end if
else
{ // month before day
if (pmonth<pyear)
{ // definitely MONTH first...
rc[0] = FLD_MONTH;
if (pday<pyear)
{ // M-D-Y (American standard)
rc[1] = FLD_DAY;
rc[2] = FLD_YEAR;
} // end if
else
{ // M-Y-D? OK...
rc[1] = FLD_YEAR;
rc[2] = FLD_DAY;
} // end else
} // end if
else
{ // month before day, but after year - Y-M-D (Japanese standard)
rc[0] = FLD_YEAR;
rc[1] = FLD_MONTH;
rc[2] = FLD_DAY;
} // end else
} // end else
s_locale_ordering.put(locale,rc);
return rc;
} // end getDateFieldOrdering
private final void renderDropDown(int which, RequestOutput out) throws IOException
{
HTMLRendering html = (HTMLRendering)(out.queryService(HTMLRendering.class));
Calendar cal = Calendar.getInstance(TimeZone.getDefault(),html.getLocale());
if (which==FLD_MONTH)
{ // render the "month" field
out.write("<select class=\"content\" name=\"" + m_name + "_month\" size=\"1\"");
if (!m_enabled)
out.write(" disabled=\"disabled\"");
out.write("><option value=\"-1\"");
if (m_ndx_month==-1)
out.write(" selected=\"selected\"");
out.write(">---</option>");
DateFormatSymbols syms = new DateFormatSymbols(html.getLocale());
String[] months = syms.getMonths();
for (int i=cal.getMinimum(Calendar.MONTH); i<=cal.getMaximum(Calendar.MONTH); i++)
{ // write the choices
out.write("<option value=\"" + i + "\"");
if (m_ndx_month==i)
out.write(" selected=\"selected\"");
out.write(">" + StringUtil.encodeHTML(months[i]) + "</option>");
} // end for
out.write("</select>\n");
} // end if
else if (which==FLD_DAY)
{ // render the "day" field
out.write("<select class=\"content\" name=\"" + m_name + "_day\" size=\"1\"");
if (!m_enabled)
out.write(" disabled=\"disabled\"");
out.write("><option value=\"-1\"");
if (m_ndx_day==-1)
out.write(" selected=\"selected\"");
out.write(">---</option>");
for (int i=cal.getMinimum(Calendar.DAY_OF_MONTH); i<=cal.getMaximum(Calendar.DAY_OF_MONTH); i++)
{ // write the day values
out.write("<option value=\"" + i + "\"");
if (m_ndx_day==i)
out.write(" selected=\"selected\"");
out.write(">" + i + "</option>");
} // end for
out.write("</select>\n");
} // end if
else if (which==FLD_YEAR)
{ // render the "year" drop down
out.write("<select class=\"content\" name=\"" + m_name + "_year\" size=\"1\"");
if (!m_enabled)
out.write(" disabled=\"disabled\"");
out.write("><option value=\"-1\"");
if (m_ndx_year==-1)
out.write(" selected=\"selected\"");
out.write(">---</option>");
int step = ((m_year_start>m_year_stop) ? -1 : 1);
for (int i=m_year_start; i!=m_year_stop; i+=step)
{ // write out years
out.write("<option value=\"" + i + "\"");
if (m_ndx_year==i)
out.write(" selected=\"selected\"");
out.write(">" + i + "</option>");
} // end for
// write the last year value
out.write("<option value=\"" + m_year_stop + "\"");
if (m_ndx_year==m_year_stop)
out.write(" selected=\"selected\"");
out.write(">" + m_year_stop + "</option></select>\n");
} // end else if
} // end renderDropDown
/*--------------------------------------------------------------------------------
* Implementations from interface RenderDirect
*--------------------------------------------------------------------------------
*/
public void render(RequestOutput out) throws IOException
{
HTMLRendering html = (HTMLRendering)(out.queryService(HTMLRendering.class));
Calendar cal = Calendar.getInstance(TimeZone.getDefault(),html.getLocale());
if ((m_value!=null) && !m_input_error)
{ // split date into month, day, and year
cal.setTime(m_value);
if (m_ndx_month==-1)
m_ndx_month = cal.get(Calendar.MONTH);
if (m_ndx_day==-1)
m_ndx_day = cal.get(Calendar.DAY_OF_MONTH);
if (m_ndx_year==-1)
m_ndx_year = cal.get(Calendar.YEAR);
} // end if
else // everything is not set
m_ndx_month = m_ndx_day = m_ndx_year = -1;
// write the caption and the basic table framework
out.write("<tr valign=\"middle\">\n<td align=\"right\" class=\"content\">");
out.write(html.getFontTag(m_enabled ? html.CONTENT_FOREGROUND : html.CONTENT_DISABLED,"content"));
out.write(StringUtil.encodeHTML(m_caption));
if (!(StringUtil.isStringEmpty(m_caption2)))
out.write(" " + StringUtil.encodeHTML(m_caption2));
out.write(":</font>");
if (m_required)
out.write(html.getFontTag("red","content") + "*</font>");
out.write("</td>\n<td align=\"left\" class=\"content\">");
// write the drop-down list boxes
int[] order = getDateFieldOrdering(html.getLocale());
renderDropDown(order[0],out);
out.write("&nbsp;\n");
renderDropDown(order[1],out);
out.write("&nbsp;\n");
renderDropDown(order[2],out);
// finish up
out.write("</td>\n</tr>\n");
} // end render
/*--------------------------------------------------------------------------------
* Implementations from interface DialogField
*--------------------------------------------------------------------------------
*/
public String getName()
{
return m_name;
} // end getName
public Object getValue()
{
return m_value;
} // end getValue
public void setValue(Object o)
{
if (o==null)
m_value = null;
else if (o instanceof java.sql.Date)
m_value = (java.sql.Date)(((java.sql.Date)o).clone());
else if (o instanceof java.util.Date)
m_value = new java.sql.Date(((java.util.Date)o).getTime());
else if (o instanceof Calendar)
m_value = new java.sql.Date(((Calendar)o).getTimeInMillis());
else if (o instanceof Number)
m_value = new java.sql.Date(((Number)o).longValue());
else
throw new IllegalArgumentException("cannot convert argument to java.sql.Date");
if (logger.isDebugEnabled())
logger.debug("Set date: " + m_value);
m_ndx_month = m_ndx_day = m_ndx_year = -1; // kill indexes
m_input_error = false;
} // end setValue
public void setValueFrom(RequestInput ri)
{
m_ndx_month = ri.getParameterInt(m_name + "_month",-1);
m_ndx_day = ri.getParameterInt(m_name + "_day",-1);
m_ndx_year = ri.getParameterInt(m_name + "_year",-1);
if (logger.isDebugEnabled())
logger.debug("Raw input: M=" + m_ndx_month + ", D=" + m_ndx_day + ", Y=" + m_ndx_year);
if ((m_ndx_month==-1) || (m_ndx_day==-1) || (m_ndx_year==-1))
{ // the date is to be treated as "unspecified"
logger.debug("Killing the kittens!");
m_value = null;
m_ndx_month = m_ndx_day = m_ndx_year = -1; // kill indexes
m_input_error = false;
return;
} // end if
HTMLRendering html = (HTMLRendering)(ri.queryService(HTMLRendering.class));
Calendar cal = Calendar.getInstance(TimeZone.getDefault(),html.getLocale());
cal.clear();
cal.setLenient(false);
m_input_error = false;
try
{ // set the calendar and create the actual value
cal.set(Calendar.YEAR,m_ndx_year);
cal.set(Calendar.MONTH,m_ndx_month);
cal.set(Calendar.DAY_OF_MONTH,m_ndx_day);
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
m_value = new java.sql.Date(cal.getTimeInMillis());
if (logger.isDebugEnabled())
logger.debug("Verified date: " + m_value);
} // end try
catch (IllegalArgumentException e)
{ // set error flag and recompute value with relaxed rules
m_input_error = true;
cal.clear();
cal.setLenient(true);
cal.set(Calendar.YEAR,m_ndx_year);
cal.set(Calendar.MONTH,m_ndx_month);
cal.set(Calendar.DAY_OF_MONTH,m_ndx_day);
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
m_value = new java.sql.Date(cal.getTimeInMillis());
if (logger.isDebugEnabled())
logger.debug("UN-Verified date: " + m_value);
} // end catch
} // end setValueFrom
public boolean isRequired()
{
return m_required;
} // end isRequired
public boolean isFile()
{
return false;
} // end isFile
public boolean isHidden()
{
return false;
} // end isHidden
public void validate() throws ValidationException
{
if (m_required && (m_value==null))
throw new ValidationException("The '" + m_caption + "' field is required.");
if (m_input_error)
throw new ValidationException("Invalid date entered in the '" + m_caption + "' field.");
} // end validate
public boolean isEnabled()
{
return m_enabled;
} // end isEnabled
public void setEnabled(boolean flag)
{
m_enabled = flag;
} // end setEnabled
public Object sendMessage(String msg, Object data)
{
return null;
} // end sendMessage
public DialogField duplicate()
{
return new DateField(this);
} // end duplicate
/*--------------------------------------------------------------------------------
* Static initializer
*--------------------------------------------------------------------------------
*/
static
{
RECompiler compiler = new RECompiler();
try
{ // compile all local regular expressions
YRANGE = compiler.compile("^\\s*(\\d+)\\s*-\\s*(\\d+)\\s*$");
YPLUS = compiler.compile("^\\s*\\+\\s*(\\d+)\\s*$");
YMINUS = compiler.compile("^\\s*-\\s*(\\d+)\\s*$");
YPLUSMINUS = compiler.compile("^\\s*\\+\\s*(\\d+)\\s*-\\s*(\\d+)\\s*$");
YMINUSPLUS = compiler.compile("^\\s*-\\s*(\\d+)\\s*\\+\\s*(\\d+)\\s*$");
YSOLO = compiler.compile("^\\s*(\\d+)\\s*$");
} // end try
catch (RESyntaxException e)
{ // whoops!
logger.fatal("Regexp Syntax Error",e);
} // end catch
} // end static initializer
} // end class DateField

View File

@ -31,13 +31,13 @@ public class DialogElementLoader
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
private static Category logger = Category.getInstance(DialogElementLoader.class); private static Logger logger = Logger.getLogger(DialogElementLoader.class);
private static DialogElementLoader self = null; private static DialogElementLoader self = null;
private static final Class[] init_classes = { private static final Class[] init_classes = {
CategoryHeader.class, CheckBoxField.class, CommunityLogoField.class, CountryListField.class, CategoryHeader.class, CheckBoxField.class, CommunityLogoField.class, CountryListField.class,
EMailAddressField.class, HiddenField.class, ImageButton.class, IntegerField.class, DateField.class, EMailAddressField.class, HiddenField.class, ImageButton.class, IntegerField.class,
IPAddressField.class, LanguageListField.class, LocaleListField.class, PasswordField.class, IPAddressField.class, LanguageListField.class, LocaleListField.class, PasswordField.class,
RoleListField.class, StaticPickListField.class, TextField.class, TimeZoneListField.class, RoleListField.class, StaticPickListField.class, TextField.class, TimeZoneListField.class,
UserPhotoField.class, VeniceIDField.class UserPhotoField.class, VeniceIDField.class

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -23,28 +23,28 @@ import com.silverwrist.venice.ui.RequestInput;
public interface DialogField extends RenderDirect public interface DialogField extends RenderDirect
{ {
public abstract String getName(); public String getName();
public abstract Object getValue(); public Object getValue();
public abstract void setValue(Object o); public void setValue(Object o);
public abstract void setValueFrom(RequestInput ri); public void setValueFrom(RequestInput ri);
public abstract boolean isRequired(); public boolean isRequired();
public abstract boolean isFile(); public boolean isFile();
public abstract boolean isHidden(); public boolean isHidden();
public abstract void validate() throws ValidationException; public void validate() throws ValidationException;
public abstract boolean isEnabled(); public boolean isEnabled();
public abstract void setEnabled(boolean flag); public void setEnabled(boolean flag);
public abstract Object sendMessage(String msg, Object data); public Object sendMessage(String msg, Object data);
public abstract DialogField duplicate(); public DialogField duplicate();
} // end interface DialogField } // end interface DialogField

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -75,9 +75,9 @@ public abstract class PickListField extends BaseDialogField
protected void renderField(RequestOutput out) throws IOException protected void renderField(RequestOutput out) throws IOException
{ {
out.write("<SELECT CLASS=\"content\" NAME=\"" + getName() + "\" SIZE=1"); out.write("<select class=\"content\" name=\"" + getName() + "\" size=\"1\"");
if (!isEnabled()) if (!isEnabled())
out.write(" DISABLED"); out.write(" disabled=\"disabled\"");
out.write(">\n"); out.write(">\n");
Iterator it = choices.iterator(); Iterator it = choices.iterator();
String val = getStringValue(); String val = getStringValue();
@ -85,14 +85,14 @@ public abstract class PickListField extends BaseDialogField
{ // loop through the list and render the choices { // loop through the list and render the choices
Object ch = it.next(); Object ch = it.next();
String ch_name = getChoiceName(ch); String ch_name = getChoiceName(ch);
out.write("<OPTION VALUE=\"" + ch_name + "\""); out.write("<option value=\"" + ch_name + "\"");
if (ch_name.equals(val)) if (ch_name.equals(val))
out.write(" SELECTED"); out.write(" selected=\"selected\"");
out.write(">" + StringUtil.encodeHTML(getChoiceValue(ch)) + "</OPTION>\n"); out.write(">" + StringUtil.encodeHTML(getChoiceValue(ch)) + "</option>\n");
} // end while } // end while
out.write("</SELECT>\n"); // all done out.write("</select>\n"); // all done
} // end render } // end render

View File

@ -9,64 +9,70 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2002-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
package com.silverwrist.venice.ui.helpers; package com.silverwrist.venice.ui.helpers;
import java.awt.Dimension; import java.awt.Dimension;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import com.silverwrist.venice.ui.ColorSelectors; import com.silverwrist.venice.ui.ColorSelectors;
import com.silverwrist.venice.ui.LinkTypes; import com.silverwrist.venice.ui.LinkTypes;
public interface HTMLRendering extends ColorSelectors, LinkTypes public interface HTMLRendering extends ColorSelectors, LinkTypes
{ {
public abstract String getColor(int selector); public String getColor(int selector);
public abstract String getColor(String name); public String getColor(String name);
public abstract boolean useHTMLComments(); public boolean useHTMLComments();
public abstract String formatURL(String url, int type); public String formatURL(String url, int type);
public abstract String formatDate(Date date); public String formatDate(Date date);
public abstract String getFontTag(int colorsel, int size); public String getFontTag(int colorsel, int size);
public abstract String getFontTag(String color, int size); public String getFontTag(String color, int size);
public abstract String getFontTag(int colorsel, String size); public String getFontTag(int colorsel, String size);
public abstract String getFontTag(String color, String size); public String getFontTag(String color, String size);
public abstract int convertLinkType(String str); public int convertLinkType(String str);
public abstract String getStockMessage(String key); public String getStockMessage(String key);
public abstract String getStockMessage(String key, Map vars); public String getStockMessage(String key, Map vars);
public abstract String getStaticPath(String s); public String getStaticPath(String s);
public abstract String getExternalStaticPath(String s); public String getExternalStaticPath(String s);
public abstract String getImagePath(String s); public String getImagePath(String s);
public abstract String getButtonVisual(String id); public String getButtonVisual(String id);
public abstract String getButtonInput(String id); public String getButtonInput(String id);
public abstract String getUserPhotoTag(String url); public String getUserPhotoTag(String url);
public abstract String getUserPhotoTag(String url, Dimension size); public String getUserPhotoTag(String url, Dimension size);
public abstract String getActivityString(Date date); public String getActivityString(Date date);
public abstract String getCommunityLogoTag(String url); public String getCommunityLogoTag(String url);
public abstract String expandServletPath(String spath); public String expandServletPath(String spath);
public Calendar getCalendar();
public Locale getLocale();
} // end interface HTMLRendering } // end interface HTMLRendering

View File

@ -241,7 +241,7 @@ public class ImportHelper
try try
{ // create the user context { // create the user context
AdminUserContext uc = adm.createNewAccount(username,password,prehashed,reminder,confirm,locked,r, AdminUserContext uc = adm.createNewAccount(username,password,prehashed,reminder,confirm,locked,r,
description,autojoin); description,vcard.getBirthday(),autojoin);
// set up the contact info // set up the contact info
ContactInfo ci = uc.getContactInfo(); ContactInfo ci = uc.getContactInfo();

View File

@ -656,7 +656,10 @@ public class RequestImpl implements RequestInput
{ // read the user's preferred locale { // read the user's preferred locale
try try
{ // get the user default locale { // get the user default locale
my_locale = session.getUser().getLocale(); if (session.getUser()!=null)
my_locale = session.getUser().getLocale();
else
my_locale = Locale.getDefault();
} // end try } // end try
catch (DataException de) catch (DataException de)
@ -2248,6 +2251,18 @@ class HTMLRenderingImpl implements HTMLRendering
} // end expandServletPath } // end expandServletPath
public Calendar getCalendar()
{
return new GregorianCalendar(req.getTimeZone(),req.getLocale());
} // end getCalendar
public Locale getLocale()
{
return req.getLocale();
} // end getLocale
} // end class HTMLRenderingImpl } // end class HTMLRenderingImpl
class ScriptSupportImpl implements ScriptSupport class ScriptSupportImpl implements ScriptSupport

View File

@ -45,6 +45,7 @@ public class BuildVCard
private String note = null; private String note = null;
private String sort_string = null; private String sort_string = null;
private String url = null; private String url = null;
private java.sql.Date m_bday = null;
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Constructor * Constructor
@ -315,6 +316,18 @@ public class BuildVCard
} // end setURL } // end setURL
public final java.sql.Date getBirthday()
{
return m_bday;
} // end getBirthday
public final void setBirthday(java.sql.Date d)
{
m_bday = d;
} // end setBirthday
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* External operations * External operations
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
@ -340,13 +353,14 @@ public class BuildVCard
note = null; note = null;
sort_string = null; sort_string = null;
url = null; url = null;
m_bday = null;
} // end reset } // end reset
public VCard create() public VCard create()
{ {
return new VCard(realFormattedName(),family_name,given_name,middle_name,prefix,suffix,nickname,addresses,phones, return new VCard(realFormattedName(),family_name,given_name,middle_name,prefix,suffix,nickname,addresses,phones,
email_addresses,mailer,timezone,title,role,orgname,note,sort_string,url); email_addresses,mailer,timezone,title,role,orgname,note,sort_string,url,m_bday);
} // end create } // end create

View File

@ -18,6 +18,7 @@
package com.silverwrist.venice.util; package com.silverwrist.venice.util;
import java.io.*; import java.io.*;
import java.text.*;
import java.util.*; import java.util.*;
import org.apache.log4j.*; import org.apache.log4j.*;
import org.w3c.dom.*; import org.w3c.dom.*;
@ -33,6 +34,9 @@ public class VCard
private static Category logger = Category.getInstance(VCard.class); private static Category logger = Category.getInstance(VCard.class);
private static final DateFormat ISO_EXTENDED = new SimpleDateFormat("yyyy-MM-dd");
private static final DateFormat ISO_STD = new SimpleDateFormat("yyyyMMdd");
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Attributes * Attributes
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
@ -56,6 +60,7 @@ public class VCard
private String note = null; private String note = null;
private String sort_string = null; private String sort_string = null;
private String url = null; private String url = null;
private java.sql.Date m_bday = null;
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Constructors * Constructors
@ -64,7 +69,8 @@ public class VCard
VCard(String formatted_name, String family_name, String given_name, String middle_name, String prefix, String suffix, VCard(String formatted_name, String family_name, String given_name, String middle_name, String prefix, String suffix,
String nickname, Collection addresses, Collection phones, Collection email_addresses, String mailer, String nickname, Collection addresses, Collection phones, Collection email_addresses, String mailer,
String timezone, String title, String role, String orgname, String note, String sort_string, String url) String timezone, String title, String role, String orgname, String note, String sort_string, String url,
java.sql.Date bday)
{ {
this.formatted_name = formatted_name; this.formatted_name = formatted_name;
this.family_name = family_name; this.family_name = family_name;
@ -84,6 +90,7 @@ public class VCard
this.note = note; this.note = note;
this.sort_string = sort_string; this.sort_string = sort_string;
this.url = url; this.url = url;
m_bday = bday;
} // end constructor } // end constructor
@ -176,10 +183,11 @@ public class VCard
sort_string = readElemText((Element)n); sort_string = readElemText((Element)n);
else if (nm.equals("URL")) else if (nm.equals("URL"))
url = readElemText((Element)n); url = readElemText((Element)n);
else if ( nm.equals("PHOTO") || nm.equals("BDAY") || nm.equals("LABEL") || nm.equals("GEO") else if (nm.equals("BDAY"))
|| nm.equals("LOGO") || nm.equals("AGENT") || nm.equals("CATEGORIES") || nm.equals("PRODID") m_bday = readDateValue((Element)n);
|| nm.equals("REV") || nm.equals("SOUND") || nm.equals("UID") || nm.equals("CLASS") else if ( nm.equals("PHOTO") || nm.equals("LABEL") || nm.equals("GEO") || nm.equals("LOGO")
|| nm.equals("KEY")) || 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 { // a catch-all for elements that we don't support yet
logger.warn("vCard <" + nm + "/> element is not yet supported"); logger.warn("vCard <" + nm + "/> element is not yet supported");
@ -265,6 +273,39 @@ public class VCard
} // end readTimeZoneText } // end readTimeZoneText
private static final java.sql.Date readDateValue(Element elt) throws ValidationException
{
DOMElementHelper h = new DOMElementHelper(elt);
String s = h.getElementText();
if (s==null)
return null;
s = s.trim();
java.util.Date tmp;
try
{ // try parsing via extended first
tmp = ISO_EXTENDED.parse(s);
return new java.sql.Date(tmp.getTime());
} // end try
catch (ParseException e)
{ // do nothing, just fall through and try again
} // end catch
try
{ // now try parsing with standard format
tmp = ISO_STD.parse(s);
return new java.sql.Date(tmp.getTime());
} // end try
catch (ParseException e)
{ // NOW bail out of here!
throw new ValidationException("date value could not be parsed");
} // end catch
} // end readDateValue
private VCardAddress findAddress(VCardAddress.Predicate pred) private VCardAddress findAddress(VCardAddress.Predicate pred)
{ {
Iterator it = addresses.iterator(); Iterator it = addresses.iterator();
@ -405,6 +446,12 @@ public class VCard
} // end getURL } // end getURL
public final java.sql.Date getBirthday()
{
return m_bday;
} // end getBirthday
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* External operations * External operations
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
@ -650,6 +697,8 @@ public class VCard
xml_writer.write("<SORTSTR>" + sort_string + "</SORTSTR>\n"); xml_writer.write("<SORTSTR>" + sort_string + "</SORTSTR>\n");
if (!StringUtil.isStringEmpty(url)) if (!StringUtil.isStringEmpty(url))
xml_writer.write("<URL>" + url + "</URL>\n"); xml_writer.write("<URL>" + url + "</URL>\n");
if (m_bday!=null)
xml_writer.write("<BDAY>" + ISO_EXTENDED.format(m_bday) + "</BDAY>\n");
xml_writer.write("</vCard>\n"); xml_writer.write("</vCard>\n");
} // end exportXML } // end exportXML