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:
parent
ae129e5410
commit
0bbd01e385
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -66,6 +66,12 @@ class SideBoxDescriptorImpl implements UserSideBoxDescriptor
|
|||
|
||||
} // end getID
|
||||
|
||||
public int getSideBoxID()
|
||||
{
|
||||
return parent.getID();
|
||||
|
||||
} // end getSideBoxID
|
||||
|
||||
public int getSequence()
|
||||
{
|
||||
return sequence;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -84,6 +84,12 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end getID
|
||||
|
||||
public int getSideBoxID()
|
||||
{
|
||||
return id;
|
||||
|
||||
} // end getSideBoxID
|
||||
|
||||
public int getSequence()
|
||||
{
|
||||
return -1;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
112
src/com/silverwrist/venice/servlets/format/LogInOrCreate.java
Normal file
112
src/com/silverwrist/venice/servlets/format/LogInOrCreate.java
Normal 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
|
32
web/format/login_or_create.jsp
Normal file
32
web/format/login_or_create.jsp
Normal file
|
@ -0,0 +1,32 @@
|
|||
<%--
|
||||
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.*" %>
|
||||
<%
|
||||
LogInOrCreate data = LogInOrCreate.retrieve(request);
|
||||
RenderData rdat = RenderConfig.createRenderData(application,request,response);
|
||||
%>
|
||||
<% rdat.writeContentHeader(out,"Log In or Create Account",null); %>
|
||||
<%= rdat.getStdFontTag(ColorSelectors.CONTENT_FOREGROUND,2) %>
|
||||
You must log in or create an account before you can view this page.<P>
|
||||
Returning users <A HREF="<%= data.getTargetURL(rdat,"account?cmd=L&tgt=") %>">log in here</A>.<P>
|
||||
New users <A HREF="<%= data.getTargetURL(rdat,"account?cmd=C&tgt=") %>">create an account here.<P>
|
||||
</FONT>
|
Loading…
Reference in New Issue
Block a user