added emergency fix to display a "login or create" dialog for all AccessErrors

thrown by the engine when trying to view a conference/topic/post and the user
is not logged in
This commit is contained in:
Eric J. Bowersox
2001-12-14 17:14:10 +00:00
parent ae129e5410
commit 0bbd01e385
18 changed files with 290 additions and 26 deletions

View File

@@ -278,5 +278,48 @@ public class StringUtil
} // end join
} // end class StringUtil
public static final List splitList(String data, String delims)
{
if ((data==null) || (delims==null))
return Collections.EMPTY_LIST;
ArrayList rc = new ArrayList();
StringBuffer buf = new StringBuffer();
boolean accumulate = false;
for (int i=0; i<data.length(); i++)
{ // look at each character in turn
char ch = data.charAt(i);
if (delims.indexOf(ch)>=0)
{ // delimiter character - flush the string if we have one
if (accumulate)
{ // flush the buffer
rc.add(buf.toString());
buf.setLength(0);
accumulate = false;
} // end if
} // end if
else
{ // ordinary character - accumulate it
accumulate = true;
buf.append(ch);
} // end else
} // end for
if (rc.isEmpty())
return Collections.EMPTY_LIST;
else
return Collections.unmodifiableList(rc);
} // end splitList
public static final String[] splitArray(String data, String delims)
{
List tmp = splitList(data,delims);
return (String[])(tmp.toArray(new String[0]));
} // end splitArray
} // end class StringUtil

View File

@@ -164,6 +164,8 @@ public interface CommunityContext extends SearchMode
public abstract void delete() throws DataException, AccessError;
public abstract void deleteCommunity() throws DataException, AccessError;
public abstract void sendInvitation(String address, String personal_message)
throws AccessError, DataException, EmailException;

View File

@@ -147,6 +147,8 @@ public interface ConferenceContext
public abstract void delete() throws DataException, AccessError;
public abstract void deleteConference() throws DataException, AccessError;
public abstract boolean canDeleteConference();
public abstract boolean isInHotlist();

View File

@@ -21,6 +21,8 @@ public interface SideBoxDescriptor
{
public abstract int getID();
public abstract int getSideBoxID();
public abstract int getSequence();
public abstract String getTitle(boolean anonymous);

View File

@@ -81,6 +81,8 @@ public interface TopicContext
public abstract void delete() throws DataException, AccessError;
public abstract void deleteTopic() throws DataException, AccessError;
public abstract List getActivePosters(int skip, int limit) throws DataException, AccessError;
public abstract List getActivePosters(int limit) throws DataException, AccessError;

View File

@@ -1193,6 +1193,12 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
} // end delete
public void deleteCommunity() throws DataException, AccessError
{
this.delete();
} // end delete
public void sendInvitation(String address, String personal_message)
throws AccessError, DataException, EmailException
{

View File

@@ -875,7 +875,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
{
if (!(getConferenceData().canReadConference(level)))
{ // the luser can't even read the conference...
logger.error("getTopic(): user not permitted to change membership");
logger.error("getTopic(): user not permitted to read");
throw new AccessError("You are not permitted to read this conference.");
} // end if
@@ -1253,6 +1253,12 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
} // end delete
public void deleteConference() throws DataException, AccessError
{
this.delete();
} // end deleteConference
public boolean canDeleteConference()
{
ConferenceCommunityContext c = getConferenceDataNE();

View File

@@ -66,6 +66,12 @@ class SideBoxDescriptorImpl implements UserSideBoxDescriptor
} // end getID
public int getSideBoxID()
{
return parent.getID();
} // end getSideBoxID
public int getSequence()
{
return sequence;

View File

@@ -958,6 +958,12 @@ class TopicUserContextImpl implements TopicContext
} // end delete
public void deleteTopic() throws DataException, AccessError
{
this.delete();
} // end deleteTopic
public List getActivePosters(int skip, int limit) throws DataException
{
Connection conn = null;

View File

@@ -84,6 +84,12 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
} // end getID
public int getSideBoxID()
{
return id;
} // end getSideBoxID
public int getSequence()
{
return -1;

View File

@@ -72,9 +72,10 @@ public class AuditRecord implements AuditData
if (rc==null)
{ // OK, get it from the database
ResultSet rs = stmt.executeQuery("SELECT username FROM users WHERE uid = " + uid + ";");
if (!(rs.next()))
throw new DataException("user name not found for UID " + uid);
rc = rs.getString(1);
if (rs.next())
rc = rs.getString(1);
else
rc = "(UID #" + uid + ")";
uname_cache.put(uid_x,rc);
} // end if
@@ -92,9 +93,10 @@ public class AuditRecord implements AuditData
if (rc==null)
{ // OK, get it from the database
ResultSet rs = stmt.executeQuery("SELECT signame FROM sigs WHERE sigid = " + cid + ";");
if (!(rs.next()))
throw new DataException("community name not found for community ID " + cid);
rc = rs.getString(1);
if (rs.next())
rc = rs.getString(1);
else
rc = "(CID #" + cid + ")";
commname_cache.put(cid_x,rc);
} // end if

View File

@@ -318,7 +318,7 @@ public class CommunityOperations extends VeniceServlet
if (user.isLoggedIn())
return new ErrorBox("Community Error","You are not permitted to create communities.","top");
else
return new ErrorBox("Community Error","You must be logged in to create a new community.","top");
return new LogInOrCreate("sigops?cmd=C");
} // end if

View File

@@ -348,14 +348,15 @@ public class ConfDisplay extends VeniceServlet
ConferenceContext conf = getConferenceParameter(request,comm,true,"top");
// get the topic, if we have it
TopicContext topic = getTopicParameter(request,conf,false,"top");
TopicContext topic = getTopicParameter(request,user,conf,false,"top",
"confdisp?" + request.getQueryString());
if (topic!=null)
{ // we're handling messages within a single topic
if (logger.isDebugEnabled())
logger.debug("MODE: display messages in topic");
String on_error = "confdisp?sig=" + comm.getCommunityID() + "&conf=" + conf.getConfID();
setMyLocation(request,on_error + "&topic=" + topic.getTopicNumber());
setMyLocation(request,on_error + "&top=" + topic.getTopicNumber());
// if this request is restoring the number of unread posts in another topic, try to do so
boolean do_readnew = restorePosts(request,conf,topic);
@@ -380,7 +381,10 @@ public class ConfDisplay extends VeniceServlet
} // end catch
catch (AccessError ae)
{ // we were unable to retrieve the message list
return new ErrorBox("Access Error",ae.getMessage(),on_error);
if (user.isLoggedIn())
return new ErrorBox("Access Error",ae.getMessage(),on_error);
else
return new LogInOrCreate(getMyLocation(request));
} // end catch
@@ -393,7 +397,7 @@ public class ConfDisplay extends VeniceServlet
String my_location = "confdisp?sig=" + comm.getCommunityID() + "&conf=" + conf.getConfID();
boolean read_new = !(StringUtil.isStringEmpty(request.getParameter("rnm")));
if (read_new)
my_location += "&rn=1";
my_location += "&rnm=1";
setMyLocation(request,my_location);
// get any changes to view or sort options
@@ -441,7 +445,10 @@ public class ConfDisplay extends VeniceServlet
} // end catch
catch (AccessError ae)
{ // we were unable to retrieve the message list
return new ErrorBox("Access Error",ae.getMessage(),on_error);
if (user.isLoggedIn())
return new ErrorBox("Access Error",ae.getMessage(),on_error);
else
return new LogInOrCreate(getMyLocation(request));
} // end catch
@@ -462,7 +469,10 @@ public class ConfDisplay extends VeniceServlet
} // end catch
catch (AccessError ae)
{ // we were unable to retrieve the topic list
return new ErrorBox("Access Error",ae.getMessage(),on_error);
if (user.isLoggedIn())
return new ErrorBox("Access Error",ae.getMessage(),on_error);
else
return new LogInOrCreate(getMyLocation(request));
} // end catch

View File

@@ -710,8 +710,8 @@ public class ConfOperations extends VeniceServlet
String message = "You are about to permanently delete the \"" + conf.getName() + "\" conference! "
+ "Are you sure you want to do this?";
return new ConfirmBox(request,DELETE_CONFIRM_ATTR,DELETE_CONFIRM_PARAM,"Delete Conference",message,
"confops?sig=" + comm.getCommunityID() + "&conf=" + conf.getConfID() + "&cmd=DEL",
on_error);
"confops?sig=" + comm.getCommunityID() + "&conf=" + conf.getConfID()
+ "&cmd=DEL",on_error);
} // end else
@@ -732,7 +732,14 @@ public class ConfOperations extends VeniceServlet
} // end catch
catch (AccessError ae)
{ // some lack of access is causing problems
return new ErrorBox("Access Error",ae.getMessage(),on_error);
if (user.isLoggedIn())
return new ErrorBox("Access Error",ae.getMessage(),on_error);
else
{ // they might need to log in first
setMyLocation(request,"confops?sig=" + comm.getCommunityID());
return new LogInOrCreate("confops?sig=" + comm.getCommunityID());
} // end else
} // end catch

View File

@@ -108,8 +108,9 @@ public abstract class VeniceServlet extends HttpServlet
} // end getCommunityParameter
private static TopicContext getTopicParameter(String str, ConferenceContext conf, boolean required,
String on_error) throws ErrorBox
private static TopicContext getTopicParameter(String str, UserContext user, ConferenceContext conf,
boolean required, String on_error, String target)
throws ErrorBox, LogInOrCreate
{
if (StringUtil.isStringEmpty(str))
{ // there's no topic parameter
@@ -153,6 +154,9 @@ public abstract class VeniceServlet extends HttpServlet
} // end catch
catch (AccessError ae)
{ // these all get handled in pretty much the same way
logger.error("getTopicParameter(): Access error retrieving topic parameter");
if ((user!=null) && (target!=null) && !(user.isLoggedIn()))
throw new LogInOrCreate(target);
throw new ErrorBox("Access Error",ae.getMessage(),on_error);
} // end catch
@@ -454,19 +458,29 @@ public abstract class VeniceServlet extends HttpServlet
} // end getConferenceParameter
protected final static TopicContext getTopicParameter(ServletRequest request, ConferenceContext conf,
boolean required, String on_error) throws ErrorBox
boolean required, String on_error)
throws ErrorBox, LogInOrCreate
{
return getTopicParameter(request.getParameter("top"),conf,required,on_error);
return getTopicParameter(request.getParameter("top"),null,conf,required,on_error,null);
} // end getTopicParameter
protected final static TopicContext getTopicParameter(ServletRequest request, UserContext user,
ConferenceContext conf, boolean required,
String on_error, String target)
throws ErrorBox, LogInOrCreate
{
return getTopicParameter(request.getParameter("top"),user,conf,required,on_error,target);
} // end getTopicParameter
protected final static TopicContext getTopicParameter(ServletMultipartHandler mphandler,
ConferenceContext conf, boolean required,
String on_error) throws ErrorBox
String on_error) throws ErrorBox, LogInOrCreate
{
if (mphandler.isFileParam("top"))
throw new ErrorBox(null,"Internal Error: topic should be a normal param",on_error);
return getTopicParameter(mphandler.getValue("top"),conf,required,on_error);
return getTopicParameter(mphandler.getValue("top"),null,conf,required,on_error,null);
} // end getTopicParameter
@@ -511,10 +525,16 @@ public abstract class VeniceServlet extends HttpServlet
*--------------------------------------------------------------------------------
*/
protected String getMyLocation(HttpServletRequest request)
{
return (String)(request.getAttribute(LOCATION_ATTR));
} // end getMyLocation
protected String getMyLocation(HttpServletRequest request, VeniceEngine engine, UserContext user,
RenderData rdat)
{
return (String)(request.getAttribute(LOCATION_ATTR));
return getMyLocation(request);
} // end getMyLocation

View File

@@ -0,0 +1,112 @@
/*
* 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.net.URLEncoder;
import java.io.Writer;
import java.io.IOException;
import javax.servlet.*;
import com.silverwrist.util.StringUtil;
import com.silverwrist.venice.servlets.VeniceServletResult;
public class LogInOrCreate extends VeniceServletResult implements JSPRender, ColorSelectors
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
// Attribute name for request attribute
protected static final String ATTR_NAME = "com.silverwrist.venice.content.LogInOrCreate";
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private String target;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public LogInOrCreate(String target)
{
super();
this.target = target;
} // end constructor
/*--------------------------------------------------------------------------------
* External static functions
*--------------------------------------------------------------------------------
*/
public static LogInOrCreate retrieve(ServletRequest request)
{
return (LogInOrCreate)(request.getAttribute(ATTR_NAME));
} // end retrieve
/*--------------------------------------------------------------------------------
* Implementations from interface VeniceContent
*--------------------------------------------------------------------------------
*/
public String getPageTitle(RenderData rdat)
{
return "Log In or Create Account";
} // 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 "login_or_create.jsp";
} // end getTargetJSPName
/*--------------------------------------------------------------------------------
* External operations
*--------------------------------------------------------------------------------
*/
public String getTargetURL(RenderData rdat, String base_URL)
{
return rdat.getEncodedServletPath(base_URL + URLEncoder.encode(target));
} // end getTargetURL
} // end class LogInOrCreate