diff --git a/samples/contacts-tiger/.cvsignore b/samples/contacts-tiger/.cvsignore
new file mode 100644
index 0000000000..2471891f5e
--- /dev/null
+++ b/samples/contacts-tiger/.cvsignore
@@ -0,0 +1,6 @@
+classes
+dist
+api
+build.properties
+temporary
+target
diff --git a/samples/contacts-tiger/maven.xml b/samples/contacts-tiger/maven.xml
new file mode 100644
index 0000000000..3e11e6696f
--- /dev/null
+++ b/samples/contacts-tiger/maven.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+ The "war" goal is deprecated. Use "multiwar:multiwar" instead.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ multiproject:install doesn't install Contacts Samples WARs to local repo
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/contacts-tiger/project.properties b/samples/contacts-tiger/project.properties
new file mode 100644
index 0000000000..57bf00899c
--- /dev/null
+++ b/samples/contacts-tiger/project.properties
@@ -0,0 +1,26 @@
+# Ant properties for building the Contacts (Java 5) sample application.
+# $Id$
+
+name.filter=filter
+src.dir=src
+war.dir=war
+lib.dir=${basedir}/../../lib
+dist.lib.dir=${basedir}/../../dist
+build.dir=classes
+dist.dir=dist
+javadocs.dir=api
+jalopy.xml=${basedir}/../../jalopy.xml
+tmp.dir=temporary
+etc.dir=etc
+client.dir=client
+
+
+maven.war.src=${maven.src.dir}/main/webapp/common
+
+maven.multiproject.type=multiwar
+
+maven.xdoc.distributionType=war
+maven.xdoc.distributionUrl=http://acegisecurity.sourceforge.net/maven/acegisecurity/wars
+
+maven.compile.target=1.5
+maven.compile.source=1.5
diff --git a/samples/contacts-tiger/project.xml b/samples/contacts-tiger/project.xml
new file mode 100644
index 0000000000..3a33af2201
--- /dev/null
+++ b/samples/contacts-tiger/project.xml
@@ -0,0 +1,46 @@
+
+
+ ${basedir}/../project.xml
+ 3
+ acegi-security-sample-contacts-tiger
+ Acegi Security System for Spring - Contacts sample (Java 5)
+ acegisecurity
+ /home/groups/a/ac/acegisecurity/htdocs/multiproject/acegi-security-sample-contacts-tiger
+
+ scm:cvs:pserver:anonymous@cvs.sourceforge.net:/cvsroot/acegisecurity:acegisecurity
+ scm:cvs:ext:${maven.username}@cvs.sourceforge.net:/cvsroot/acegisecurity:acegisecurity
+ http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/acegisecurity/acegisecurity/samples/contacts-tiger/
+
+
+
+ hessian
+ hessian
+ 3.0.1
+ jar
+ http://www.caucho.com
+
+ true
+
+
+
+ burlap
+ burlap
+ 2.1.7
+ jar
+ http://www.caucho.com
+
+ true
+
+
+
+ acegisecurity
+ acegi-security-tiger
+ 0.9.0-SNAPSHOT
+ jar
+
+ true
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/java/sample/contact/annotation/ContactManagerBackend.java b/samples/contacts-tiger/src/main/java/sample/contact/annotation/ContactManagerBackend.java
new file mode 100644
index 0000000000..3e1ff7a8e2
--- /dev/null
+++ b/samples/contacts-tiger/src/main/java/sample/contact/annotation/ContactManagerBackend.java
@@ -0,0 +1,205 @@
+/* Copyright 2004, 2005 Acegi Technology Pty Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sample.contact.annotation;
+
+import java.util.List;
+import java.util.Random;
+
+import net.sf.acegisecurity.Authentication;
+import net.sf.acegisecurity.UserDetails;
+import net.sf.acegisecurity.acl.basic.AclObjectIdentity;
+import net.sf.acegisecurity.acl.basic.BasicAclExtendedDao;
+import net.sf.acegisecurity.acl.basic.NamedEntityObjectIdentity;
+import net.sf.acegisecurity.acl.basic.SimpleAclEntry;
+import net.sf.acegisecurity.annotation.Secured;
+import net.sf.acegisecurity.context.SecurityContextHolder;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.support.ApplicationObjectSupport;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import sample.contact.Contact;
+import sample.contact.ContactDao;
+import sample.contact.ContactManager;
+
+
+/**
+ * Concrete implementation of Java 5 Annotated {@link ContactManager}.
+ *
+ * @author Mark St.Godard
+ * @version $Id$
+ */
+@Transactional
+public class ContactManagerBackend extends ApplicationObjectSupport
+ implements ContactManager, InitializingBean {
+ //~ Instance fields ========================================================
+
+ private BasicAclExtendedDao basicAclExtendedDao;
+ private ContactDao contactDao;
+ private int counter = 100;
+
+ //~ Methods ================================================================
+
+ @Secured ({"ROLE_USER","AFTER_ACL_COLLECTION_READ"})
+ @Transactional(readOnly=true)
+ public List getAll() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Returning all contacts");
+ }
+
+ return contactDao.findAll();
+ }
+
+ @Secured ({"ROLE_USER"})
+ @Transactional(readOnly=true)
+ public List getAllRecipients() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Returning all recipients");
+ }
+
+ List list = contactDao.findAllPrincipals();
+ list.addAll(contactDao.findAllRoles());
+
+ return list;
+ }
+
+ public void setBasicAclExtendedDao(BasicAclExtendedDao basicAclExtendedDao) {
+ this.basicAclExtendedDao = basicAclExtendedDao;
+ }
+
+ public BasicAclExtendedDao getBasicAclExtendedDao() {
+ return basicAclExtendedDao;
+ }
+
+ @Secured ({"ROLE_USER","AFTER_ACL_READ"})
+ @Transactional(readOnly=true)
+ public Contact getById(Integer id) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Returning contact with id: " + id);
+ }
+
+ return contactDao.getById(id);
+ }
+
+ public void setContactDao(ContactDao contactDao) {
+ this.contactDao = contactDao;
+ }
+
+ public ContactDao getContactDao() {
+ return contactDao;
+ }
+
+ /**
+ * This is a public method.
+ *
+ * @return DOCUMENT ME!
+ */
+ public Contact getRandomContact() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Returning random contact");
+ }
+
+ Random rnd = new Random();
+ List contacts = contactDao.findAll();
+ int getNumber = rnd.nextInt(contacts.size());
+
+ return (Contact) contacts.get(getNumber);
+ }
+
+ @Secured ({"ACL_CONTACT_ADMIN"})
+ public void addPermission(Contact contact, String recipient,
+ Integer permission) {
+ SimpleAclEntry simpleAclEntry = new SimpleAclEntry();
+ simpleAclEntry.setAclObjectIdentity(makeObjectIdentity(contact));
+ simpleAclEntry.setMask(permission.intValue());
+ simpleAclEntry.setRecipient(recipient);
+ basicAclExtendedDao.create(simpleAclEntry);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Added permission " + permission + " for recipient "
+ + recipient + " contact " + contact);
+ }
+ }
+
+ public void afterPropertiesSet() throws Exception {
+ Assert.notNull(contactDao, "contactDao required");
+ Assert.notNull(basicAclExtendedDao, "basicAclExtendedDao required");
+ }
+
+ @Secured ({"ROLE_USER"})
+ public void create(Contact contact) {
+ // Create the Contact itself
+ contact.setId(new Integer(counter++));
+ contactDao.create(contact);
+
+ // Grant the current principal access to the contact
+ addPermission(contact, getUsername(),
+ new Integer(SimpleAclEntry.ADMINISTRATION));
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Created contact " + contact
+ + " and granted admin permission to recipient " + getUsername());
+ }
+ }
+
+ @Secured ({"ACL_CONTACT_DELETE"})
+ public void delete(Contact contact) {
+ contactDao.delete(contact.getId());
+
+ // Delete the ACL information as well
+ basicAclExtendedDao.delete(makeObjectIdentity(contact));
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Deleted contact " + contact
+ + " including ACL permissions");
+ }
+ }
+
+ @Secured ({"ACL_CONTACT_ADMIN"})
+ public void deletePermission(Contact contact, String recipient) {
+ basicAclExtendedDao.delete(makeObjectIdentity(contact), recipient);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Deleted contact " + contact
+ + " ACL permissions for recipient " + recipient);
+ }
+ }
+
+ public void update(Contact contact) {
+ contactDao.update(contact);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Updated contact " + contact);
+ }
+ }
+
+ protected String getUsername() {
+ Authentication auth = SecurityContextHolder.getContext()
+ .getAuthentication();
+
+ if (auth.getPrincipal() instanceof UserDetails) {
+ return ((UserDetails) auth.getPrincipal()).getUsername();
+ } else {
+ return auth.getPrincipal().toString();
+ }
+ }
+
+ private AclObjectIdentity makeObjectIdentity(Contact contact) {
+ return new NamedEntityObjectIdentity(contact.getClass().getName(),
+ contact.getId().toString());
+ }
+}
diff --git a/samples/contacts-tiger/src/main/resources/log4j.properties b/samples/contacts-tiger/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..a16a75a136
--- /dev/null
+++ b/samples/contacts-tiger/src/main/resources/log4j.properties
@@ -0,0 +1,37 @@
+# Global logging configuration
+log4j.rootLogger=WARN, stdout, fileout
+
+#log4j.logger.org.springframework.aop.framework.autoproxy=DEBUG, stdout, fileout
+#log4j.logger.org.springframework.aop.framework.autoproxy.metadata=DEBUG, stdout, fileout
+#log4j.logger.org.springframework.aop.framework.autoproxy.target=DEBUG, stdout, fileout
+#log4j.logger.org.springframework.transaction.interceptor=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.intercept=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.intercept.method=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.intercept.web=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.afterinvocation=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.acl=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.acl.basic=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.taglibs.authz=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.ui.basicauth=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.ui.rememberme=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.ui=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.afterinvocation=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.ui.rmi=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.ui.httpinvoker=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.util=DEBUG, stdout, fileout
+#log4j.logger.net.sf.acegisecurity.providers.dao=DEBUG, stdout, fileout
+log4j.logger.sample.contact=DEBUG, stdout, fileout
+
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.conversionPattern=[%p,%c{1},%t] %m%n
+
+# Rolling log file output...
+log4j.appender.fileout=org.apache.log4j.RollingFileAppender
+log4j.appender.fileout.File=contacts.log
+#log4j.appender.fileout.File=${webapp.root}/WEB-INF/log4j.log
+log4j.appender.fileout.MaxFileSize=1024KB
+log4j.appender.fileout.MaxBackupIndex=1
+log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
+log4j.appender.fileout.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1},%t:%L - %m%n
diff --git a/samples/contacts-tiger/src/main/resources/messages.properties b/samples/contacts-tiger/src/main/resources/messages.properties
new file mode 100644
index 0000000000..d869ef70b5
--- /dev/null
+++ b/samples/contacts-tiger/src/main/resources/messages.properties
@@ -0,0 +1,2 @@
+err.name.webContact.name=Name 3-50 characters is required.
+err.name.webContact.email=Email 3-50 characters is required.
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/.cvsignore b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/.cvsignore
new file mode 100644
index 0000000000..86e9501ee1
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/.cvsignore
@@ -0,0 +1,2 @@
+lib
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/applicationContext-common-authorization.xml b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/applicationContext-common-authorization.xml
new file mode 100644
index 0000000000..57c4d3b318
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/applicationContext-common-authorization.xml
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+ net.sf.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION
+
+
+ net.sf.acegisecurity.acl.basic.SimpleAclEntry.READ
+
+
+ net.sf.acegisecurity.acl.basic.SimpleAclEntry.DELETE
+
+
+
+
+
+
+
+
+ ACL_CONTACT_READ
+ sample.contact.Contact
+
+
+
+
+
+
+
+
+
+
+
+ ACL_CONTACT_DELETE
+ sample.contact.Contact
+
+
+
+
+
+
+
+
+
+
+
+ ACL_CONTACT_ADMIN
+ sample.contact.Contact
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sample.contact.ContactManager.create=ROLE_USER
+ sample.contact.ContactManager.getAllRecipients=ROLE_USER
+ sample.contact.ContactManager.getAll=ROLE_USER,AFTER_ACL_COLLECTION_READ
+ sample.contact.ContactManager.getById=ROLE_USER,AFTER_ACL_READ
+ sample.contact.ContactManager.delete=ACL_CONTACT_DELETE
+ sample.contact.ContactManager.deletePermission=ACL_CONTACT_ADMIN
+ sample.contact.ContactManager.addPermission=ACL_CONTACT_ADMIN
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/applicationContext-common-business.xml b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/applicationContext-common-business.xml
new file mode 100644
index 0000000000..6666a49cee
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/applicationContext-common-business.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+ org.hsqldb.jdbcDriver
+
+
+ jdbc:hsqldb:mem:contacts
+
+
+ sa
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sample.contact.ContactManager.create=PROPAGATION_REQUIRED
+ sample.contact.ContactManager.getAllRecipients=PROPAGATION_REQUIRED,readOnly
+ sample.contact.ContactManager.getAll=PROPAGATION_REQUIRED,readOnly
+ sample.contact.ContactManager.getById=PROPAGATION_REQUIRED,readOnly
+ sample.contact.ContactManager.delete=PROPAGATION_REQUIRED
+ sample.contact.ContactManager.deletePermission=PROPAGATION_REQUIRED
+ sample.contact.ContactManager.addPermission=PROPAGATION_REQUIRED
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sample.contact.ContactManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/contacts-servlet.xml b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/contacts-servlet.xml
new file mode 100644
index 0000000000..a796a6b16b
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/contacts-servlet.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+ messages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ publicIndexController
+ secureAddForm
+ secureIndexController
+ secureDeleteController
+ adminPermissionController
+ deletePermissionController
+ addPermissionForm
+
+
+
+
+
+
+
+
+
+ true
+ webContact
+ sample.contact.WebContact
+
+ add
+ index.htm
+
+
+
+
+
+
+ true
+ addPermission
+ sample.contact.AddPermission
+
+ addPermission
+ index.htm
+
+
+
+
+
+
+ /WEB-INF/jsp/
+ .jsp
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/add.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/add.jsp
new file mode 100644
index 0000000000..5b14a52275
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/add.jsp
@@ -0,0 +1,40 @@
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+Add New Contact
+
+Add Contact
+
+">Home
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/addPermission.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/addPermission.jsp
new file mode 100644
index 0000000000..52c05365ec
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/addPermission.jsp
@@ -0,0 +1,55 @@
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+Add Permission
+
+Add Permission
+
+
+">Admin Permission ">Manage
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/adminPermission.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/adminPermission.jsp
new file mode 100644
index 0000000000..d27ade53e0
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/adminPermission.jsp
@@ -0,0 +1,39 @@
+<%@ page import="net.sf.acegisecurity.acl.basic.SimpleAclEntry" %>
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+
+
Administer Permissions
+
+Administer Permissions
+
+
+
+
+
+
+
+
+
+
+
+ <%
+ SimpleAclEntry simpleAcl = ((SimpleAclEntry) pageContext.getAttribute("acl"));
+ String permissionBlock = simpleAcl.printPermissionsBlock();
+ %>
+ <%= permissionBlock %>
+ []
+
+
+ |
+
+
+ ">Del
+ |
+
+
+
+
+">Add Permission ">Manage
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/deletePermission.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/deletePermission.jsp
new file mode 100644
index 0000000000..70e69c35b6
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/deletePermission.jsp
@@ -0,0 +1,18 @@
+<%@ page import="net.sf.acegisecurity.acl.basic.SimpleAclEntry" %>
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+
+
Permission Deleted
+
+Permission Deleted
+
+
+
+
+
+
+
+
+
">Manage
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/deleted.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/deleted.jsp
new file mode 100644
index 0000000000..8fed87c4fd
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/deleted.jsp
@@ -0,0 +1,13 @@
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+
+
Deletion completed
+
+Deleted
+
+
+
+
+
">Manage
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/hello.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/hello.jsp
new file mode 100644
index 0000000000..2a40c618f9
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/hello.jsp
@@ -0,0 +1,51 @@
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+
+
Contacts Security Demo
+
+Contacts Security Demo
+Contacts demonstrates the following central Acegi Security capabilities:
+
+- Role-based security. Each principal is a member of certain roles,
+ which are used to restrict access to certain secure objects.
+- Domain object instance security. The
Contact
, the
+ main domain object in the application, has an access control list (ACL)
+ that indicates who is allowed read, administer and delete the object.
+- Method invocation security. The
ContactManager
service
+ layer bean has a number of secured (protected) and public (unprotected)
+ methods.
+- Web request security. The
/secure
URI path is protected
+ by Acegi Security from principals not holding the
+ ROLE_USER
granted authority.
+- Security unaware application objects. None of the objects
+ are aware of the security being implemented by Acegi Security. *
+- Security taglib usage. All of the JSPs use Acegi Security's
+ taglib to evaluate security information. *
+- Fully declarative security. Every capability is configured in
+ the application context using standard Acegi Security classes. *
+- Database-sourced security data. All of the user, role and ACL
+ information is obtained from an in-memory JDBC-compliant database.
+- Integrated form-based and BASIC authentication. Any BASIC
+ authentication header is detected and used for authentication. Normal
+ interactive form-based authentication is used by default.
+- Remember-me services. Acegi Security's pluggable remember-me
+ strategy is demonstrated, with a corresponding checkbox on the login form.
+
+
+* As the application provides an "ACL Administration" use case, those
+classes are necessarily aware of security. But no business use cases are.
+
+Please excuse the lack of look 'n' feel polish in this application.
+It is about security, after all! :-)
+
+
To demonstrate a public method on ContactManager
,
+here's a random Contact
:
+
+
+
+
+
Get started by clicking "Manage"...
+
">Manage
+">Debug
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/include.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/include.jsp
new file mode 100644
index 0000000000..96a45ec08f
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/include.jsp
@@ -0,0 +1,5 @@
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ taglib prefix="authz" uri="http://acegisecurity.sf.net/authz" %>
+
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/index.jsp b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/index.jsp
new file mode 100644
index 0000000000..12a96138ed
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/jsp/index.jsp
@@ -0,0 +1,32 @@
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+
+
Your Contacts
+
+'s Contacts
+
+
+">Add
">Logoff (also clears any remember-me cookie)
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/remoting-servlet.xml b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/remoting-servlet.xml
new file mode 100644
index 0000000000..cdc2ec7171
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/remoting-servlet.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sample.contact.ContactManager
+
+
+
+
+
+
+
+
+ sample.contact.ContactManager
+
+
+
+
+
+
+
+
+ sample.contact.ContactManager
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/WEB-INF/spring.tld b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/spring.tld
new file mode 100644
index 0000000000..a6f7bffac6
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/WEB-INF/spring.tld
@@ -0,0 +1,311 @@
+
+
+
+
+
+ 1.1.1
+
+ 1.2
+
+ Spring
+
+ http://www.springframework.org/tags
+
+ Spring Framework JSP Tag Library. Authors: Rod Johnson, Juergen Hoeller
+
+
+
+
+ htmlEscape
+ org.springframework.web.servlet.tags.HtmlEscapeTag
+ JSP
+
+
+ Sets default HTML escape value for the current page.
+ Overrides a "defaultHtmlEscape" context-param in web.xml, if any.
+
+
+
+ defaultHtmlEscape
+ true
+ true
+
+
+
+
+
+
+
+ escapeBody
+ org.springframework.web.servlet.tags.EscapeBodyTag
+ JSP
+
+
+ Escapes its enclosed body content, applying HTML escaping and/or JavaScript escaping.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+
+
+
+ htmlEscape
+ false
+ true
+
+
+
+ javaScriptEscape
+ false
+ true
+
+
+
+
+
+
+
+ message
+ org.springframework.web.servlet.tags.MessageTag
+ JSP
+
+
+ Retrieves the message with the given code, or text if code isn't resolvable.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+
+
+
+ code
+ false
+ true
+
+
+
+ arguments
+ false
+ true
+
+
+
+ text
+ false
+ true
+
+
+
+ var
+ false
+ true
+
+
+
+ scope
+ false
+ true
+
+
+
+ htmlEscape
+ false
+ true
+
+
+
+ javaScriptEscape
+ false
+ true
+
+
+
+
+
+
+
+ theme
+ org.springframework.web.servlet.tags.ThemeTag
+ JSP
+
+
+ Retrieves the theme message with the given code, or text if code isn't resolvable.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+
+
+
+ code
+ false
+ true
+
+
+
+ arguments
+ false
+ true
+
+
+
+ text
+ false
+ true
+
+
+
+ var
+ false
+ true
+
+
+
+ scope
+ false
+ true
+
+
+
+ htmlEscape
+ false
+ true
+
+
+
+ javaScriptEscape
+ false
+ true
+
+
+
+
+
+
+
+ hasBindErrors
+ org.springframework.web.servlet.tags.BindErrorsTag
+ JSP
+
+
+ Provides Errors instance in case of bind errors.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+
+
+
+ errors
+ org.springframework.validation.Errors
+
+
+
+ name
+ true
+ true
+
+
+
+ htmlEscape
+ false
+ true
+
+
+
+
+
+
+
+ nestedPath
+ org.springframework.web.servlet.tags.NestedPathTag
+ JSP
+
+
+ Sets a nested path to be used by the bind tag's path.
+
+
+
+ nestedPath
+ java.lang.String
+
+
+
+ path
+ true
+ true
+
+
+
+
+
+
+
+ bind
+ org.springframework.web.servlet.tags.BindTag
+ JSP
+
+
+ Provides BindStatus object for the given bind path.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+
+
+
+ status
+ org.springframework.web.servlet.support.BindStatus
+
+
+
+ path
+ true
+ true
+
+
+
+ ignoreNestedPath
+ false
+ true
+
+
+
+ htmlEscape
+ false
+ true
+
+
+
+
+
+
+
+ transform
+ org.springframework.web.servlet.tags.TransformTag
+ JSP
+
+
+ Provides transformation of variables to Strings, using an appropriate
+ custom PropertyEditor from BindTag (can only be used inside BindTag).
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+
+
+
+ value
+ true
+ true
+
+
+
+ var
+ false
+ true
+
+
+
+ scope
+ false
+ true
+
+
+
+ htmlEscape
+ false
+ true
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/index.jsp b/samples/contacts-tiger/src/main/webapp/common/index.jsp
new file mode 100644
index 0000000000..4c86e33093
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/index.jsp
@@ -0,0 +1,4 @@
+<%@ include file="/WEB-INF/jsp/include.jsp" %>
+
+<%-- Redirected because we can't set the welcome page to a virtual URL. --%>
+
diff --git a/samples/contacts-tiger/src/main/webapp/common/logoff.jsp b/samples/contacts-tiger/src/main/webapp/common/logoff.jsp
new file mode 100644
index 0000000000..1b291a5bab
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/logoff.jsp
@@ -0,0 +1,9 @@
+<%@ page import="javax.servlet.http.Cookie" %>
+<%@ page import="net.sf.acegisecurity.ui.rememberme.TokenBasedRememberMeServices" %>
+<%
+session.invalidate();
+Cookie terminate = new Cookie(TokenBasedRememberMeServices.ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE_KEY, null);
+terminate.setMaxAge(0);
+response.addCookie(terminate);
+response.sendRedirect("index.jsp");
+%>
\ No newline at end of file
diff --git a/samples/contacts-tiger/src/main/webapp/common/secure/debug.jsp b/samples/contacts-tiger/src/main/webapp/common/secure/debug.jsp
new file mode 100644
index 0000000000..50433fab66
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/common/secure/debug.jsp
@@ -0,0 +1,28 @@
+<%@ page import="net.sf.acegisecurity.context.SecurityContextHolder" %>
+<%@ page import="net.sf.acegisecurity.Authentication" %>
+<%@ page import="net.sf.acegisecurity.GrantedAuthority" %>
+<%@ page import="net.sf.acegisecurity.adapters.AuthByAdapter" %>
+
+<%
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ if (auth != null) { %>
+ Authentication object is of type: <%= auth.getClass().getName() %>
+ Authentication object as a String: <%= auth.toString() %>
+
+ Authentication object holds the following granted authorities:
+<% GrantedAuthority[] granted = auth.getAuthorities();
+ for (int i = 0; i < granted.length; i++) { %>
+ <%= granted[i].toString() %> (getAuthority(): <%= granted[i].getAuthority() %>)
+<% }
+
+ if (auth instanceof AuthByAdapter) { %>
+
SUCCESS! Your container adapter appears to be properly configured!
+<% } else { %>
+
SUCCESS! Your web filters appear to be properly configured!
+<% }
+
+ } else { %>
+ Authentication object is null.
+ This is an error and your Acegi Security application will not operate properly until corrected.
+<% }
+%>
diff --git a/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-acegi-security.xml b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-acegi-security.xml
new file mode 100644
index 0000000000..9bcbf0d711
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-acegi-security.xml
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
+ PATTERN_TYPE_APACHE_ANT
+ /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ userCache
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contacts Realm
+
+
+
+ foobar
+ anonymousUser,ROLE_ANONYMOUS
+
+
+
+ foobar
+
+
+
+
+
+
+
+
+
+
+
+ springRocks
+
+
+
+ springRocks
+
+
+
+
+
+
+
+
+
+
+ CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
+ \A/secure/.*\Z=REQUIRES_SECURE_CHANNEL
+ \A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL
+ \A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL
+ \A.*\Z=REQUIRES_INSECURE_CHANNEL
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /acegilogin.jsp?login_error=1
+ /
+ /j_acegi_security_check
+
+
+
+
+ /acegilogin.jsp
+ false
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
+ PATTERN_TYPE_APACHE_ANT
+ /index.jsp=ROLE_ANONYMOUS,ROLE_USER
+ /hello.htm=ROLE_ANONYMOUS,ROLE_USER
+ /logoff.jsp=ROLE_ANONYMOUS,ROLE_USER
+ /acegilogin.jsp*=ROLE_ANONYMOUS,ROLE_USER
+ /**=ROLE_USER
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-annotations.xml b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-annotations.xml
new file mode 100644
index 0000000000..1bac89db5e
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-annotations.xml
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+ net.sf.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION
+
+
+ net.sf.acegisecurity.acl.basic.SimpleAclEntry.READ
+
+
+ net.sf.acegisecurity.acl.basic.SimpleAclEntry.DELETE
+
+
+
+
+
+
+
+
+ ACL_CONTACT_READ
+ sample.contact.Contact
+
+
+
+
+
+
+
+
+
+
+
+ ACL_CONTACT_DELETE
+ sample.contact.Contact
+
+
+
+
+
+
+
+
+
+
+
+ ACL_CONTACT_ADMIN
+ sample.contact.Contact
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-business.xml b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-business.xml
new file mode 100644
index 0000000000..5469acf88a
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/applicationContext-business.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+ org.hsqldb.jdbcDriver
+
+
+ jdbc:hsqldb:mem:contacts
+
+
+ sa
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/web.xml b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/web.xml
new file mode 100644
index 0000000000..7b067cd65f
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/WEB-INF/web.xml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+ Contacts Sample Application
+
+
+
+ contextConfigLocation
+
+ /WEB-INF/applicationContext-acegi-security.xml
+ /WEB-INF/applicationContext-business.xml
+ /WEB-INF/applicationContext-annotations.xml
+
+
+
+
+ log4jConfigLocation
+ /WEB-INF/classes/log4j.properties
+
+
+
+ Acegi Filter Chain Proxy
+ net.sf.acegisecurity.util.FilterToBeanProxy
+
+ targetClass
+ net.sf.acegisecurity.util.FilterChainProxy
+
+
+
+
+ Acegi Filter Chain Proxy
+ /*
+
+
+
+
+ org.springframework.web.context.ContextLoaderListener
+
+
+
+ org.springframework.web.util.Log4jConfigListener
+
+
+
+
+ net.sf.acegisecurity.ui.session.HttpSessionEventPublisher
+
+
+
+
+ contacts
+ org.springframework.web.servlet.DispatcherServlet
+ 1
+
+
+
+
+ remoting
+ org.springframework.web.servlet.DispatcherServlet
+ 2
+
+
+
+ contacts
+ *.htm
+
+
+
+ remoting
+ /remoting/*
+
+
+
+ index.jsp
+
+
+
+ /spring
+ /WEB-INF/spring.tld
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/filter/acegilogin.jsp b/samples/contacts-tiger/src/main/webapp/filter/acegilogin.jsp
new file mode 100644
index 0000000000..322375f8cc
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/acegilogin.jsp
@@ -0,0 +1,48 @@
+<%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %>
+<%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %>
+<%@ page import="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter" %>
+<%@ page import="net.sf.acegisecurity.AuthenticationException" %>
+
+
+
+ Login
+
+
+
+ Login
+
+ Valid users:
+
+
username marissa, password koala
+
username dianne, password emu
+
username scott, password wombat
+
username peter, password opal (user disabled)
+
username bill, password wombat
+
username bob, password wombat
+
username jane, password wombat
+
+
+ <%-- this form-login-page form is also used as the
+ form-error-page to ask for a login again.
+ --%>
+
+
+ Your login attempt was not successful, try again.
+ Reason: <%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %>
+
+
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/filter/error.html b/samples/contacts-tiger/src/main/webapp/filter/error.html
new file mode 100644
index 0000000000..5d461b5a25
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/error.html
@@ -0,0 +1,5 @@
+
+ Access denied!
+ Access Denied
+ We're sorry, but you are not authorized to perform the requested operation.
+
\ No newline at end of file
diff --git a/samples/contacts-tiger/src/main/webapp/filter/exitUser.jsp b/samples/contacts-tiger/src/main/webapp/filter/exitUser.jsp
new file mode 100644
index 0000000000..52298bd469
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/exitUser.jsp
@@ -0,0 +1,45 @@
+<%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %>
+
+<%@ page import="net.sf.acegisecurity.context.SecurityContextHolder" %>
+<%@ page import="net.sf.acegisecurity.Authentication" %>
+<%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %>
+<%@ page import="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter" %>
+<%@ page import="net.sf.acegisecurity.AuthenticationException" %>
+
+
+
+ Exit User
+
+
+
+ Exit User
+
+
+
+ Your 'Exit User' attempt was not successful, try again.
+ Reason: <%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %>
+
+
+
+
+
+
+
diff --git a/samples/contacts-tiger/src/main/webapp/filter/switchUser.jsp b/samples/contacts-tiger/src/main/webapp/filter/switchUser.jsp
new file mode 100644
index 0000000000..28388869e8
--- /dev/null
+++ b/samples/contacts-tiger/src/main/webapp/filter/switchUser.jsp
@@ -0,0 +1,43 @@
+<%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %>
+<%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %>
+<%@ page import="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter" %>
+<%@ page import="net.sf.acegisecurity.AuthenticationException" %>
+
+
+
+ Switch User
+
+
+
+ Switch to User
+
+ Valid users:
+
+
username marissa, password koala
+
username dianne, password emu
+
username scott, password wombat
+
username bill, password wombat
+
username bob, password wombat
+
username jane, password wombat
+
+
+ <%-- this form-login-page form is also used as the
+ form-error-page to ask for a login again.
+ --%>
+
+
+ Your 'su' attempt was not successful, try again.
+ Reason: <%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %>
+
+
+
+
+
+
+