added administrative control of user photos - ability to replace or clear

a user's photo, keep the user from uploading a new one
This commit is contained in:
Eric J. Bowersox 2001-11-29 07:46:57 +00:00
parent 239321bb61
commit 004dcaf7ec
16 changed files with 728 additions and 40 deletions

View File

@ -262,6 +262,14 @@
<servlet-class>com.silverwrist.venice.servlets.MemberRedirect</servlet-class>
</servlet>
<servlet>
<servlet-name>adminuserphoto</servlet-name>
<description>
Changes the photo in a user's profile (uploads a new one).
</description>
<servlet-class>com.silverwrist.venice.servlets.AdminUserPhoto</servlet-class>
</servlet>
<!-- the following are test servlets, they should go away -->
<servlet>
@ -400,6 +408,11 @@
<url-pattern>/members</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>adminuserphoto</servlet-name>
<url-pattern>/adminuserphoto</url-pattern>
</servlet-mapping>
<!-- the following are test servlets, they should go away -->
<servlet-mapping>
<servlet-name>testformdata</servlet-name>

View File

@ -69,4 +69,8 @@ public interface AdminUserContext
public abstract Date getLastAccessDate();
public abstract AdminUserProperties getProperties() throws DataException;
public abstract void setProperties(AdminUserProperties props) throws DataException;
} // end interface AdminUserContext

View File

@ -0,0 +1,58 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
*
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.core;
public class AdminUserProperties extends UserProperties
{
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private boolean disallow_photo;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public AdminUserProperties()
{
super();
disallow_photo = false;
} // end constructor
/*--------------------------------------------------------------------------------
* Public getters/setters
*--------------------------------------------------------------------------------
*/
public final boolean getDisallowPhoto()
{
return disallow_photo;
} // end getDisplayPostPictures
public final void setDisallowPhoto(boolean b)
{
disallow_photo = b;
} // end setDisplayPostPictures
} // end class AdminUserProperties

View File

@ -126,4 +126,6 @@ public interface ContactInfo
public abstract void importVCard(VCard vc);
public abstract boolean canSetPhoto();
} // end interface ContactInfo

View File

@ -121,4 +121,6 @@ public interface UserContext extends SearchMode
public abstract void setProperties(UserProperties props) throws DataException;
public abstract boolean canSetUserPhoto() throws DataException;
} // end interface UserContext

View File

@ -17,7 +17,7 @@
*/
package com.silverwrist.venice.core;
public final class UserProperties
public class UserProperties
{
/*--------------------------------------------------------------------------------
* Attributes

View File

@ -21,6 +21,7 @@ import java.sql.*;
import java.util.*;
import org.apache.log4j.*;
import com.silverwrist.util.International;
import com.silverwrist.util.OptionSet;
import com.silverwrist.venice.core.*;
import com.silverwrist.venice.core.internals.*;
import com.silverwrist.venice.db.*;
@ -53,13 +54,14 @@ class AdminUserContextImpl implements AdminUserContext
private String description; // personal description
private Locale my_locale; // my default locale (cached)
private TimeZone my_tz; // my default timezone (cached)
private OptionSet flags = null; // option flags
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
protected AdminUserContextImpl(EnvUser env, ResultSet rs) throws SQLException
protected AdminUserContextImpl(Connection conn, EnvUser env, ResultSet rs) throws SQLException
{
this.env = env;
this.uid = rs.getInt("uid");
@ -74,8 +76,91 @@ class AdminUserContextImpl implements AdminUserContext
this.my_locale = International.get().createLocale(rs.getString("localeid"));
this.my_tz = TimeZone.getTimeZone(rs.getString("tzid"));
Statement stmt = conn.createStatement();
ResultSet rs2 = stmt.executeQuery("SELECT ndx, data FROM propuser WHERE uid = " + this.uid + ";");
while (rs2.next())
{ // load the properties...
switch (rs2.getInt(1))
{ // based on the property, do what is needed
case UserContextImpl.PROP_FLAGS:
flags = new OptionSet(rs2.getString(2));
break;
default:
break;
} // end switch
} // end while
} // end constructor
/*--------------------------------------------------------------------------------
* Internal operations
*--------------------------------------------------------------------------------
*/
private final void updateProperties(BitSet delta) throws DataException
{
Connection conn = null;
try
{ // get a connection and create a statement
conn = env.getConnection();
Statement stmt = conn.createStatement();
StringBuffer sql = new StringBuffer();
if (delta.get(UserContextImpl.PROP_FLAGS))
{ // store the flags
sql.append("UPDATE propuser SET data = '").append(flags.asString()).append("' WHERE uid = ");
sql.append(uid).append(" AND ndx = ").append(UserContextImpl.PROP_FLAGS).append(';');
stmt.executeUpdate(sql.toString());
sql.setLength(0);
} // end if
} // end try
catch (SQLException e)
{ // database error - this is a DataException
logger.error("DB error storing user properties: " + e.getMessage(),e);
throw new DataException("unable to save user properties: " + e.getMessage(),e);
} // end catch
finally
{ // make sure the connection is released before we go
env.releaseConnection(conn);
} // end finally
} // end updateProperties
private final void updateProperties() throws DataException
{
updateProperties(UserContextImpl.ALL_PROPS);
} // end updateProperties
private final AdminUserProperties createProperties()
{
AdminUserProperties rc = new AdminUserProperties();
rc.setDisplayPostPictures(flags.get(UserContextImpl.BF_POSTPICTURES));
rc.setDisallowPhoto(flags.get(UserContextImpl.BF_ADM_NOPHOTO));
return rc;
} // end createProperties
private final BitSet storeProperties(AdminUserProperties props)
{
BitSet rc = new BitSet();
if (flags.assign(UserContextImpl.BF_POSTPICTURES,props.getDisplayPostPictures()))
rc.set(UserContextImpl.PROP_FLAGS);
if (flags.assign(UserContextImpl.BF_ADM_NOPHOTO,props.getDisallowPhoto()))
rc.set(UserContextImpl.PROP_FLAGS);
return rc;
} // end storeProperties
/*--------------------------------------------------------------------------------
* Implementations from interface AdminUserContext
*--------------------------------------------------------------------------------
@ -282,9 +367,9 @@ class AdminUserContextImpl implements AdminUserContext
ContactInfoImpl rc;
if (contactid>=0)
rc = new ContactInfoImpl(env,contactid);
rc = new ContactInfoImpl(env,contactid,true);
else
rc = new ContactInfoImpl(uid);
rc = new ContactInfoImpl(uid,true);
return rc;
} // end getContactInfo
@ -477,6 +562,35 @@ class AdminUserContextImpl implements AdminUserContext
} // end getLastAccessDate
public AdminUserProperties getProperties() throws DataException
{
return createProperties();
} // end getProperties
public void setProperties(AdminUserProperties props) throws DataException
{
AdminUserProperties orig = createProperties();
BitSet delta = storeProperties(props);
if (delta.length()==0)
return;
boolean succeeded = false;
try
{ // update the properties in the database
updateProperties(delta);
succeeded = true;
} // end try
finally
{ // make sure the connection is released before we go
if (!succeeded)
storeProperties(orig);
} // end finally
} // end setProperties
/*--------------------------------------------------------------------------------
* Package-level static operations
*--------------------------------------------------------------------------------
@ -497,7 +611,7 @@ class AdminUserContextImpl implements AdminUserContext
if (rs.getBoolean("is_anon"))
throw new DataException("Cannot modify the defaults for the anonymous user.");
return new AdminUserContextImpl(env,rs);
return new AdminUserContextImpl(conn,env,rs);
} // end try
catch (SQLException e)
@ -530,7 +644,7 @@ class AdminUserContextImpl implements AdminUserContext
if (rs.getBoolean("is_anon"))
throw new DataException("Cannot modify the defaults for the anonymous user.");
return new AdminUserContextImpl(env,rs);
return new AdminUserContextImpl(conn,env,rs);
} // end try
catch (SQLException e)

View File

@ -468,9 +468,9 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
int id = getData().getContactID();
ContactInfo rc;
if (id>=0)
rc = new ContactInfoImpl(env,id);
rc = new ContactInfoImpl(env,id,true);
else
rc = new ContactInfoImpl(getData().getHostUID(),cid);
rc = new ContactInfoImpl(getData().getHostUID(),cid,true);
getData().touch();
return rc;

View File

@ -138,6 +138,7 @@ class ContactInfoImpl implements ContactInfo, Stashable
private java.util.Date last_update; // date of last update
private boolean is_modified = false; // have we modified this ContactInfo?
private ImageHook image_hook = null; // image hook object
private boolean can_set_photo; // can we set the user photo?
/*--------------------------------------------------------------------------------
* Constructors
@ -149,10 +150,11 @@ class ContactInfoImpl implements ContactInfo, Stashable
*
* @param owner_uid UID that owns this object.
*/
ContactInfoImpl(int owner_uid)
ContactInfoImpl(int owner_uid, boolean can_set_photo)
{
if (logger.isDebugEnabled())
logger.debug("new ContactInfoImpl (empty) for UID = " + owner_uid);
this.can_set_photo = can_set_photo;
makeEmpty(owner_uid,-1);
} // end constructor
@ -163,10 +165,11 @@ class ContactInfoImpl implements ContactInfo, Stashable
* @param owner_uid UID that owns this object.
* @param owner_cid Community ID that owns this object.
*/
ContactInfoImpl(int owner_uid, int owner_cid)
ContactInfoImpl(int owner_uid, int owner_cid, boolean can_set_photo)
{
if (logger.isDebugEnabled())
logger.debug("new ContactInfoImpl (empty) for UID = " + owner_uid + ", Community ID = " + owner_cid);
this.can_set_photo = can_set_photo;
makeEmpty(owner_uid,owner_cid);
} // end constructor
@ -178,10 +181,11 @@ class ContactInfoImpl implements ContactInfo, Stashable
* @param contactid ID of the contact to load.
* @exception DataException The contact could not be loaded for some reason.
*/
ContactInfoImpl(EnvEngine env, int contactid) throws DataException
ContactInfoImpl(EnvEngine env, int contactid, boolean can_set_photo) throws DataException
{
if (logger.isDebugEnabled())
logger.debug("new ContactInfoImpl (loading CID " + contactid + ")");
this.can_set_photo = can_set_photo;
Connection conn = null;
try
@ -571,6 +575,8 @@ class ContactInfoImpl implements ContactInfo, Stashable
public void setPhotoURL(String addr)
{
if (!can_set_photo)
return;
if ((addr!=null) && (addr.length()>255))
photo_url = addr.substring(0,255);
else
@ -582,6 +588,8 @@ class ContactInfoImpl implements ContactInfo, Stashable
public void setPhotoData(String prefix, String mimetype, int length, InputStream data)
{
if (!can_set_photo)
return;
if ((photo_url!=null) && (photo_url.startsWith(prefix)))
{ // extract the image ID and create an image hook object
int img_id = Integer.parseInt(photo_url.substring(prefix.length()));
@ -908,6 +916,12 @@ class ContactInfoImpl implements ContactInfo, Stashable
} // end importVCard
public boolean canSetPhoto()
{
return can_set_photo;
} // end canSetPhoto
/*--------------------------------------------------------------------------------
* Implementations from interface Stashable
*--------------------------------------------------------------------------------

View File

@ -36,12 +36,13 @@ class UserContextImpl implements UserContext, UserBackend
*/
// Property set indexes
private static final int PROP_FLAGS = 0; // flags
static final int PROP_FLAGS = 0; // flags
private static final BitSet ALL_PROPS; // BitSet representing all properties
static final BitSet ALL_PROPS; // BitSet representing all properties
// Boolean flag indexes
private static final int BF_POSTPICTURES = 0;
static final int BF_POSTPICTURES = 0;
static final int BF_ADM_NOPHOTO = 1;
private static Category logger = Category.getInstance(UserContextImpl.class);
@ -288,8 +289,8 @@ class UserContextImpl implements UserContext, UserBackend
} // end try
catch (SQLException e)
{ // database error - this is a DataException
logger.error("DB error storing community properties: " + e.getMessage(),e);
throw new DataException("unable to save community properties: " + e.getMessage(),e);
logger.error("DB error storing user properties: " + e.getMessage(),e);
throw new DataException("unable to save user properties: " + e.getMessage(),e);
} // end catch
finally
@ -581,11 +582,13 @@ class UserContextImpl implements UserContext, UserBackend
if (logger.isDebugEnabled())
logger.debug("getContactInfo() for UID " + uid);
if (flags==null)
loadPrefs();
ContactInfoImpl rc;
if (contactid>=0)
rc = new ContactInfoImpl(env,contactid);
rc = new ContactInfoImpl(env,contactid,!(flags.get(BF_ADM_NOPHOTO)));
else
rc = new ContactInfoImpl(uid);
rc = new ContactInfoImpl(uid,!(flags.get(BF_ADM_NOPHOTO)));
if (my_email==null)
my_email = rc.getEmail();
if (full_name==null)
@ -1416,6 +1419,14 @@ class UserContextImpl implements UserContext, UserBackend
} // end setProperties
public boolean canSetUserPhoto() throws DataException
{
if (flags==null)
loadPrefs();
return !(flags.get(BF_ADM_NOPHOTO));
} // end canSetUserPhoto
/*--------------------------------------------------------------------------------
* Implementations from interface UserBackend
*--------------------------------------------------------------------------------

View File

@ -489,8 +489,10 @@ public class Account extends VeniceServlet
{ // we're ready to update the user profile
dlg.loadValues(request); // load field values
boolean photo_flag = true;
try
{ // validate the dialog and reset profile info
photo_flag = user.canSetUserPhoto();
if (dlg.doDialog(user)) // need to reconfirm email address
throw new RedirectResult("account?cmd=V&tgt=" + URLEncoder.encode(tgt));
else
@ -499,7 +501,7 @@ public class Account extends VeniceServlet
} // end try
catch (ValidationException ve)
{ // there was a validation error...
dlg.resetOnError(ve.getMessage() + " Please try again.");
dlg.resetOnError(photo_flag,ve.getMessage() + " Please try again.");
} // end catch
catch (DataException de)

View File

@ -0,0 +1,203 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
*
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.servlets;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.log4j.*;
import com.silverwrist.util.StringUtil;
import com.silverwrist.util.ServletMultipartHandler;
import com.silverwrist.util.ServletMultipartException;
import com.silverwrist.util.image.*;
import com.silverwrist.venice.core.*;
import com.silverwrist.venice.except.*;
import com.silverwrist.venice.servlets.format.*;
public class AdminUserPhoto extends VeniceServlet
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
private static Category logger = Category.getInstance(AdminUserPhoto.class);
/*--------------------------------------------------------------------------------
* Overrides from class HttpServlet
*--------------------------------------------------------------------------------
*/
public String getServletInfo()
{
String rc = "AdminUserPhoto servlet - changes the user photo for a user\n"
+ "Part of the Venice Web Communities System\n";
return rc;
} // end getServletInfo
/*--------------------------------------------------------------------------------
* Overrides from class VeniceServlet
*--------------------------------------------------------------------------------
*/
protected VeniceContent doVeniceGet(HttpServletRequest request, VeniceEngine engine,
UserContext user, RenderData rdat)
throws ServletException, IOException, VeniceServletResult
{
try
{ // get the user to be modified
AdminOperations adm = user.getAdminInterface();
String s_uid = request.getParameter("uid");
if (s_uid==null)
throw new ErrorBox(null,"User ID parameter not found.","sysadmin?cmd=UF");
AdminUserContext admuser = adm.getUserContext(Integer.parseInt(s_uid));
if (request.getParameter("null")!=null)
{ // null the photo out and return
ContactInfo ci = admuser.getContactInfo();
ci.setPhotoURL(null);
admuser.putContactInfo(ci);
throw new RedirectResult("sysadmin?cmd=UM&uid=" + admuser.getUID());
} // end if
return new AdminUserPhotoData(engine,admuser,rdat);
} // end try
catch (AccessError ae)
{ // an access error generally means we're not an administrator
return new ErrorBox("Access Error","You do not have permission to administer the system.",null);
} // end catch
catch (DataException de)
{ // error pulling the audit records
return new ErrorBox("Database Error","Unable to retrieve user information: " + de.getMessage(),
"sysadmin?cmd=UF");
} // end catch
catch (NumberFormatException nfe)
{ // this is if we get a bogus UID
return new ErrorBox(null,"Invalid user ID parameter.","sysadmin?cmd=UF");
} // end catch
} // end doVeniceGet
protected VeniceContent doVenicePost(HttpServletRequest request, ServletMultipartHandler mphandler,
VeniceEngine engine, UserContext user, RenderData rdat)
throws ServletException, IOException, VeniceServletResult
{
AdminUserContext admuser;
try
{ // get the user to be modified
AdminOperations adm = user.getAdminInterface();
String s_uid = mphandler.getValue("uid");
if (s_uid==null)
throw new ErrorBox(null,"User ID parameter not found.","sysadmin?cmd=UF");
admuser = adm.getUserContext(Integer.parseInt(s_uid));
} // end try
catch (AccessError ae)
{ // an access error generally means we're not an administrator
return new ErrorBox("Access Error","You do not have permission to administer the system.",null);
} // end catch
catch (DataException de)
{ // error pulling the audit records
return new ErrorBox("Database Error","Unable to retrieve user information: " + de.getMessage(),
"sysadmin?cmd=UF");
} // end catch
catch (NumberFormatException nfe)
{ // this is if we get a bogus UID
return new ErrorBox(null,"Invalid user ID parameter.","sysadmin?cmd=UF");
} // end catch
if (isImageButtonClicked(mphandler,"cancel"))
throw new RedirectResult("sysadmin?cmd=UM&uid=" + admuser.getUID());
if (isImageButtonClicked(mphandler,"upload"))
{ // uploading the image here!
// also check on file parameter status
if (!(mphandler.isFileParam("thepic")))
{ // bogus file parameter
logger.error("Internal Error: 'thepic' should be a file param");
return new ErrorBox(null,"Internal Error: 'thepic' should be a file param",
"sysadmin?cmd=UM&uid=" + admuser.getUID());
} // end if
if (!(mphandler.getContentType("thepic").startsWith("image/")))
{ // must be an image type we uploaded!
logger.error("Error: 'thepic' not an image type");
return new ErrorBox(null,"You did not upload an image file. Try again.",
"sysadmin?cmd=UM&uid=" + admuser.getUID());
} // end if
try
{ // get the real picture (normalized to 100x100 size)
ImageLengthPair real_pic = ImageNormalizer.normalizeImage(mphandler.getFileContentStream("thepic"),
engine.getUserPhotoSize(),"jpeg");
// set the user photo data!
ContactInfo ci = admuser.getContactInfo();
ci.setPhotoData(request.getContextPath() + "/imagedata/","image/jpeg",real_pic.getLength(),
real_pic.getData());
admuser.putContactInfo(ci);
// Jump back to the profile form.
throw new RedirectResult("sysadmin?cmd=UM&uid=" + admuser.getUID());
} // end try
catch (ServletMultipartException smpe)
{ // the servlet multipart parser screwed up
logger.error("Servlet multipart error:",smpe);
return new ErrorBox(null,"Internal Error: " + smpe.getMessage(),
"sysadmin?cmd=UM&uid=" + admuser.getUID());
} // end catch
catch (ImageNormalizerException ine)
{ // the image was not valid
logger.error("Image normalizer error:",ine);
return new ErrorBox(null,ine.getMessage(),"admuserphoto?uid=" + admuser.getUID());
} // end catch
catch (DataException de)
{ // error in the database!
logger.error("DataException:",de);
return new ErrorBox("Database Error","Database error storing user photo: " + de.getMessage(),
"sysadmin?cmd=UM&uid=" + admuser.getUID());
} // end catch
} // end if
else
{ // the button must be wrong!
logger.error("no known button click on AdminUserPhoto.doPost");
return new ErrorBox("Internal Error","Unknown command button pressed",
"sysadmin?cmd=UM&uid=" + admuser.getUID());
} // end else
} // end doVenicePost
} // end class AdminUserPhoto

View File

@ -17,6 +17,8 @@
*/
package com.silverwrist.venice.servlets.format;
import java.io.Writer;
import java.io.IOException;
import java.util.*;
import com.silverwrist.util.*;
import com.silverwrist.venice.core.*;
@ -25,6 +27,74 @@ import com.silverwrist.venice.security.Role;
public class AdminModifyUserDialog extends ContentDialog
{
/*--------------------------------------------------------------------------------
* The photo URL control class.
*--------------------------------------------------------------------------------
*/
static class CDUserPhotoControl extends CDBaseFormField
{
private String linkURL;
public CDUserPhotoControl(String name, String caption, String linkURL)
{
super(name,caption,"(click to change)",false);
this.linkURL = linkURL;
} // end constructor
protected CDUserPhotoControl(CDUserPhotoControl other)
{
super(other);
this.linkURL = other.linkURL;
} // end constructor
protected void renderActualField(Writer out, RenderData rdat) throws IOException
{
if (isEnabled())
out.write("<A HREF=\"" + rdat.getEncodedServletPath(linkURL) + "\">");
String photo = getValue();
if (StringUtil.isStringEmpty(photo))
photo = rdat.getPhotoNotAvailURL();
out.write("<IMG SRC=\"" + photo + "\" ALT=\"\" BORDER=0 WIDTH=100 HEIGHT=100></A>");
if (isEnabled())
out.write("</A>");
} // end renderActualField
protected void validateContents(String value) throws ValidationException
{ // this is a do-nothing value
} // end validateContents
public CDFormField duplicate()
{
return new CDUserPhotoControl(this);
} // end clone
public void setLinkURL(String s)
{
linkURL = s;
} // end setLinkURL
} // end class CDUserPhotoControl
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
private static final String YES = "Y";
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private CDUserPhotoControl photo_control;
/*--------------------------------------------------------------------------------
* Constructors
*--------------------------------------------------------------------------------
@ -43,8 +113,9 @@ public class AdminModifyUserDialog extends ContentDialog
addFormField(new CDTextFormField("remind","Password reminder phrase",null,false,32,255));
addFormField(new CDRoleListFormField("base_lvl","Base security level",null,true,
Collections.EMPTY_LIST));
addFormField(new CDCheckBoxFormField("verify_email","E-mail address verified",null,"Y"));
addFormField(new CDCheckBoxFormField("lockout","Account locked out",null,"Y"));
addFormField(new CDCheckBoxFormField("verify_email","E-mail address verified",null,YES));
addFormField(new CDCheckBoxFormField("lockout","Account locked out",null,YES));
addFormField(new CDCheckBoxFormField("nophoto","Disallow photo uploads for this user",null,YES));
addFormField(new CDFormCategoryHeader("Name"));
addFormField(new CDTextFormField("prefix","Prefix","(Mr., Ms., etc.)",false,8,8));
addFormField(new CDTextFormField("first","First name",null,true,32,64));
@ -55,7 +126,7 @@ public class AdminModifyUserDialog extends ContentDialog
addFormField(new CDTextFormField("company","Company",null,false,32,255));
addFormField(new CDTextFormField("addr1","Address",null,false,32,255));
addFormField(new CDTextFormField("addr2","Address","(line 2)",false,32,255));
addFormField(new CDCheckBoxFormField("pvt_addr","Hide address in profile",null,"Y"));
addFormField(new CDCheckBoxFormField("pvt_addr","Hide address in profile",null,YES));
addFormField(new CDTextFormField("loc","City",null,true,32,64));
addFormField(new CDTextFormField("reg","State/Province",null,true,32,64));
addFormField(new CDTextFormField("pcode","Zip/Postal Code",null,true,32,64));
@ -63,16 +134,20 @@ public class AdminModifyUserDialog extends ContentDialog
addFormField(new CDFormCategoryHeader("Phone Numbers"));
addFormField(new CDTextFormField("phone","Telephone",null,false,32,32));
addFormField(new CDTextFormField("mobile","Mobile/cellphone",null,false,32,32));
addFormField(new CDCheckBoxFormField("pvt_phone","Hide phone/mobile numbers in profile",null,"Y"));
addFormField(new CDCheckBoxFormField("pvt_phone","Hide phone/mobile numbers in profile",null,YES));
addFormField(new CDTextFormField("fax","Fax",null,false,32,32));
addFormField(new CDCheckBoxFormField("pvt_fax","Hide fax number in profile",null,"Y"));
addFormField(new CDCheckBoxFormField("pvt_fax","Hide fax number in profile",null,YES));
addFormField(new CDFormCategoryHeader("Internet"));
addFormField(new CDEmailAddressFormField("email","E-mail address",null,true,32,255));
addFormField(new CDCheckBoxFormField("pvt_email","Hide e-mail address in profile",null,"Y"));
addFormField(new CDCheckBoxFormField("pvt_email","Hide e-mail address in profile",null,YES));
addFormField(new CDTextFormField("url","Home page","(URL)",false,32,255));
addFormField(new CDFormCategoryHeader("Personal"));
addFormField(new CDTextFormField("descr","Personal description",null,false,32,255));
photo_control = new CDUserPhotoControl("photo","User Photo","userphoto");
addFormField(photo_control);
addFormField(new CDFormCategoryHeader("User Preferences"));
addFormField(new CDCheckBoxFormField("pic_in_post","Display user photos next to conference posts",
"(where applicable)",YES));
addFormField(new CDLocaleListFormField("locale","Default locale","(for formatting dates/times)",true));
addFormField(new CDTimeZoneListFormField("tz","Default time zone",null,true));
addCommandButton(new CDImageButton("update","bn_update.gif","Update",80,24));
@ -83,6 +158,7 @@ public class AdminModifyUserDialog extends ContentDialog
protected AdminModifyUserDialog(AdminModifyUserDialog other)
{
super(other);
photo_control = (CDUserPhotoControl)modifyField("photo");
} // end AdminModifyUserDialog
@ -172,12 +248,15 @@ public class AdminModifyUserDialog extends ContentDialog
setFieldValue("base_lvl",String.valueOf(admuser.getBaseLevel()));
if (admuser.isEmailVerified())
setFieldValue("verify_email","Y");
setFieldValue("verify_email",YES);
if (admuser.isLockedOut())
setFieldValue("lockout","Y");
setFieldValue("lockout",YES);
ContactInfo ci = admuser.getContactInfo(); // get the main contact info
AdminUserProperties props = admuser.getProperties();
if (props.getDisallowPhoto())
setFieldValue("nophoto",YES);
setFieldValue("prefix",ci.getNamePrefix());
setFieldValue("first",ci.getGivenName());
char init = ci.getMiddleInitial();
@ -189,7 +268,7 @@ public class AdminModifyUserDialog extends ContentDialog
setFieldValue("addr1",ci.getAddressLine1());
setFieldValue("addr2",ci.getAddressLine2());
if (ci.getPrivateAddress())
setFieldValue("pvt_addr","Y");
setFieldValue("pvt_addr",YES);
setFieldValue("loc",ci.getLocality());
setFieldValue("reg",ci.getRegion());
setFieldValue("pcode",ci.getPostalCode());
@ -197,15 +276,19 @@ public class AdminModifyUserDialog extends ContentDialog
setFieldValue("phone",ci.getPhone());
setFieldValue("mobile",ci.getMobile());
if (ci.getPrivatePhone())
setFieldValue("pvt_phone","Y");
setFieldValue("pvt_phone",YES);
setFieldValue("fax",ci.getFax());
if (ci.getPrivateFax())
setFieldValue("pvt_fax","Y");
setFieldValue("pvt_fax",YES);
setFieldValue("email",ci.getEmail());
if (ci.getPrivateEmail())
setFieldValue("pvt_email","Y");
setFieldValue("pvt_email",YES);
setFieldValue("url",ci.getURL());
setFieldValue("descr",admuser.getDescription());
setFieldValue("photo",ci.getPhotoURL());
photo_control.setLinkURL("adminuserphoto?uid=" + admuser.getUID());
if (props.getDisplayPostPictures())
setFieldValue("pic_in_post",YES);
setFieldValue("locale",admuser.getLocale().toString());
setFieldValue("tz",admuser.getTimeZone().getID());
@ -215,8 +298,6 @@ public class AdminModifyUserDialog extends ContentDialog
{
validate(); // validate the dialog
final String yes = "Y"; // the "yes" string
try
{ // reset the base level
admuser.setBaseLevel(Integer.parseInt(getFieldValue("base_lvl")));
@ -233,12 +314,14 @@ public class AdminModifyUserDialog extends ContentDialog
if (!StringUtil.isStringEmpty(foo))
admuser.setPassword(foo,getFieldValue("remind"));
admuser.setEmailVerified(yes.equals(getFieldValue("verify_email")));
admuser.setLockedOut(yes.equals(getFieldValue("lockout")));
admuser.setEmailVerified(YES.equals(getFieldValue("verify_email")));
admuser.setLockedOut(YES.equals(getFieldValue("lockout")));
ContactInfo ci = admuser.getContactInfo(); // get the main contact info
AdminUserProperties props = admuser.getProperties();
// Reset all the contact info fields.
props.setDisallowPhoto(YES.equals(getFieldValue("nophoto")));
ci.setNamePrefix(getFieldValue("prefix"));
ci.setGivenName(getFieldValue("first"));
foo = getFieldValue("mid");
@ -251,22 +334,24 @@ public class AdminModifyUserDialog extends ContentDialog
ci.setCompany(getFieldValue("company"));
ci.setAddressLine1(getFieldValue("addr1"));
ci.setAddressLine2(getFieldValue("addr2"));
ci.setPrivateAddress(yes.equals(getFieldValue("pvt_addr")));
ci.setPrivateAddress(YES.equals(getFieldValue("pvt_addr")));
ci.setLocality(getFieldValue("loc"));
ci.setRegion(getFieldValue("reg"));
ci.setPostalCode(getFieldValue("pcode"));
ci.setCountry(getFieldValue("country"));
ci.setPhone(getFieldValue("phone"));
ci.setMobile(getFieldValue("mobile"));
ci.setPrivatePhone(yes.equals(getFieldValue("pvt_phone")));
ci.setPrivatePhone(YES.equals(getFieldValue("pvt_phone")));
ci.setFax(getFieldValue("fax"));
ci.setPrivateFax(yes.equals(getFieldValue("pvt_fax")));
ci.setPrivateFax(YES.equals(getFieldValue("pvt_fax")));
ci.setEmail(getFieldValue("email"));
ci.setPrivateEmail(yes.equals(getFieldValue("pvt_email")));
ci.setPrivateEmail(YES.equals(getFieldValue("pvt_email")));
ci.setURL(getFieldValue("url"));
props.setDisplayPostPictures(YES.equals(getFieldValue("pic_in_post")));
// Store the completed contact info.
admuser.putContactInfo(ci);
admuser.setProperties(props);
// Save off the user's description and preferences.
admuser.setDescription(getFieldValue("descr"));

View File

@ -0,0 +1,135 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
*
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.servlets.format;
import java.awt.Dimension;
import javax.servlet.*;
import javax.servlet.http.*;
import com.silverwrist.util.StringUtil;
import com.silverwrist.venice.core.*;
import com.silverwrist.venice.except.*;
public class AdminUserPhotoData implements JSPRender
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
// Attribute name for request attribute
protected static final String ATTR_NAME = "com.silverwrist.venice.content.AdminUserPhotoData";
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private Dimension photo_dims;
private String photo_url;
private int uid;
private String user_name;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public AdminUserPhotoData(VeniceEngine engine, AdminUserContext admuser, RenderData rdat)
throws DataException
{
photo_dims = engine.getUserPhotoSize();
photo_url = admuser.getContactInfo().getPhotoURL();
if (StringUtil.isStringEmpty(photo_url))
photo_url = rdat.getPhotoNotAvailURL();
this.uid = admuser.getUID();
this.user_name = admuser.getUserName();
} // end constructor
/*--------------------------------------------------------------------------------
* External static functions
*--------------------------------------------------------------------------------
*/
public static AdminUserPhotoData retrieve(ServletRequest request)
{
return (AdminUserPhotoData)(request.getAttribute(ATTR_NAME));
} // end retrieve
/*--------------------------------------------------------------------------------
* Implementations from interface VeniceContent
*--------------------------------------------------------------------------------
*/
public String getPageTitle(RenderData rdat)
{
return "Set User Photo";
} // end getPageTitle
public String getPageQID()
{
return null;
} // end getPageQID
/*--------------------------------------------------------------------------------
* Implementations from interface JSPRender
*--------------------------------------------------------------------------------
*/
public void store(ServletRequest request)
{
request.setAttribute(ATTR_NAME,this);
} // end store
public String getTargetJSPName()
{
return "admin_user_photo.jsp";
} // end getTargetJSPName
/*--------------------------------------------------------------------------------
* External operations
*--------------------------------------------------------------------------------
*/
public int getUID()
{
return uid;
} // end getUID
public String getUserName()
{
return user_name;
} // end getUserName
public String getPhotoTag(RenderData rdat)
{
StringBuffer buf = new StringBuffer("<IMG SRC=\"");
buf.append(photo_url).append("\" ALT=\"\" ALIGN=LEFT WIDTH=").append(photo_dims.width).append(" HEIGHT=");
buf.append(photo_dims.height).append(" HSPACE=6 VSPACE=0 BORDER=0>");
return buf.toString();
} // end getPhotoTag
} // end class AdminUserPhotoData

View File

@ -208,6 +208,7 @@ public class EditProfileDialog extends ContentDialog
ContactInfo ci = uc.getContactInfo(); // get the main contact info
UserProperties props = uc.getProperties(); // get the properties
setFieldEnabled("photo",ci.canSetPhoto());
setFieldValue("prefix",ci.getNamePrefix());
setFieldValue("first",ci.getGivenName());
char init = ci.getMiddleInitial();
@ -300,11 +301,12 @@ public class EditProfileDialog extends ContentDialog
} // end doDialog
public void resetOnError(String message)
public void resetOnError(boolean photo_flag, String message)
{
setErrorMessage(message);
setFieldValue("pass1",null);
setFieldValue("pass2",null);
setFieldEnabled("photo",photo_flag);
} // end resetOnError

View File

@ -0,0 +1,43 @@
<%--
The contents of this file are subject to the Mozilla Public License Version 1.1
(the "License"); you may not use this file except in compliance with the License.
You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
WARRANTY OF ANY KIND, either express or implied. See the License for the specific
language governing rights and limitations under the License.
The Original Code is the Venice Web Communities System.
The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
Contributor(s):
--%>
<%@ page import = "java.util.*" %>
<%@ page import = "com.silverwrist.util.StringUtil" %>
<%@ page import = "com.silverwrist.venice.core.*" %>
<%@ page import = "com.silverwrist.venice.servlets.Variables" %>
<%@ page import = "com.silverwrist.venice.servlets.format.*" %>
<%
AdminUserPhotoData data = AdminUserPhotoData.retrieve(request);
Variables.failIfNull(data);
RenderData rdat = RenderConfig.createRenderData(application,request,response);
%>
<% rdat.writeContentHeader(out,"Change User Photo","User: " + data.getUserName()); %>
<FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="<%= rdat.getEncodedServletPath("adminuserphoto") %>">
<DIV CLASS="content"><%= rdat.getStdFontTag(ColorSelectors.CONTENT_FOREGROUND,2) %>
<INPUT TYPE=HIDDEN NAME="uid" VALUE="<%= data.getUID() %>">
<%= data.getPhotoTag(rdat) %>
New user photo:<BR>
<INPUT TYPE="FILE" NAME="thepic"><P>
<INPUT TYPE=IMAGE SRC="<%= rdat.getFullImagePath("bn_upload.gif") %>" NAME="upload" ALT="Upload"
WIDTH=80 HEIGHT=24 BORDER=0>&nbsp;
<INPUT TYPE=IMAGE SRC="<%= rdat.getFullImagePath("bn_cancel.gif") %>" NAME="cancel" ALT="Cancel"
WIDTH=80 HEIGHT=24 BORDER=0><BR CLEAR=LEFT><P>
<B><A HREF="<%= rdat.getEncodedServletPath("adminuserphoto?null=true&uid=" + data.getUID()) %>">Click
here to clear user's photo</A></B>
</FONT></DIV>
</FORM>