ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/experimental/server/ACL/ACL.java
Revision: 1.4
Committed: Sun Dec 23 00:29:33 2001 UTC (22 years, 10 months ago) by tdb
Branch: MAIN
Changes since 1.3: +3 -2 lines
Log Message:
Added serialization support to the ACL class. Also added testing of this feature
to the ACLTest class, which confirms it works nicely :-)

File Contents

# User Rev Content
1 tdb 1.1 //---PACKAGE DECLARATION---
2     //package uk.org.iscream.cms.server.util;
3    
4     //---IMPORTS---
5     import uk.org.iscream.cms.server.util.*;
6 tdb 1.3 import java.util.ArrayList;
7 tdb 1.1 import java.net.InetAddress;
8 tdb 1.4 import java.io.Serializable;
9 tdb 1.1
10     /**
11 tdb 1.2 * Access Control List for use primarily
12     * with the ACLServerSocket. It could, however
13     * have other uses as it has a fairly generic
14     * behaviour. Rules are added using the add
15     * method, and then checks can be made using
16     * the relevant check method.
17 tdb 1.1 *
18     * @author $Author$
19     * @version $Id$
20     */
21 tdb 1.4 public class ACL implements Serializable {
22 tdb 1.1
23     //---FINAL ATTRIBUTES---
24    
25     /**
26     * The current CVS revision of this class
27     */
28     public static final String REVISION = "$Revision$";
29 tdb 1.2
30     /**
31     * static to be used when adding an ALLOW rule to the ACL.
32     */
33 tdb 1.1 public static final boolean ALLOW = true;
34 tdb 1.2
35     /**
36     * static to be used when adding a DENY rule to the ACL.
37     */
38 tdb 1.1 public static final boolean DENY = false;
39    
40     //---STATIC METHODS---
41    
42     //---CONSTRUCTORS---
43    
44 tdb 1.2 /**
45     * Construct a new Access Control List. The default
46     * mode is to ALLOW anything that isn't explicitly
47     * blocked by a rule.
48     */
49 tdb 1.1 public ACL() {
50     // default to ACL.ALLOW
51     this(ACL.ALLOW);
52     }
53    
54 tdb 1.2 /**
55     * Construct a new Access Control List with a given
56     * default mode. This mode specifies what should
57     * happen if a check does not match any rules.
58     *
59     * @param defaultMode the default mode for non-matched checks
60     */
61 tdb 1.1 public ACL(boolean defaultMode) {
62     _defaultMode = defaultMode;
63     }
64    
65     //---PUBLIC METHODS---
66    
67 tdb 1.2 /**
68     * Add a new rule to the ACL immediately after the
69     * previous rule. The rule can either be an ACL.ALLOW
70     * rule, or an ACL.DENY rule. The expression can
71     * contain a wildcard (a * only). Rules can only be
72     * added to the end of the list.
73     *
74     * param allow whether this is an ALLOW or DENY rule
75     * param expression what this rule matches using wildcards
76     */
77 tdb 1.1 public void add(boolean allow, String expression) {
78 tdb 1.2 _acl.add(new ACLRule(allow, expression));
79 tdb 1.1 }
80    
81 tdb 1.2 /**
82     * Check to see if a string is permitted by the
83     * ACL. Useful for testing, and non-Socket uses
84     * of this class.
85     *
86     * @param address the string to check
87     * @return whether the address was permitted by the ACL
88     */
89 tdb 1.1 public boolean check(String address) {
90 tdb 1.3 for(int i=0; i < _acl.size(); i++) {
91     ACLRule rule = (ACLRule) _acl.get(i);
92     if(StringUtils.wildcardCheck(address, rule._expression)) {
93     return rule._allow;
94 tdb 1.1 }
95     }
96     return _defaultMode;
97     }
98    
99 tdb 1.2 /**
100     * Check to see if an InetAddress is permitted
101     * by the ACL. Perfect for Socket uses of this
102     * class. It should be made clear that this will
103     * check both the hostname AND IP address against
104     * each rule in turn. The hostname will always be
105     * checked BEFORE the IP address.
106     *
107     * @param address the InetAddress to check
108     * @return whether the InetAddress was permitted by the ACL
109     */
110 tdb 1.1 public boolean check(InetAddress address) {
111 tdb 1.3 for(int i=0; i < _acl.size(); i++) {
112     ACLRule rule = (ACLRule) _acl.get(i);
113     if(StringUtils.wildcardCheck(address.getHostName(), rule._expression)) {
114     return rule._allow;
115 tdb 1.1 }
116 tdb 1.3 if(StringUtils.wildcardCheck(address.getHostAddress(), rule._expression)) {
117     return rule._allow;
118 tdb 1.1 }
119     }
120     return _defaultMode;
121     }
122    
123 tdb 1.2 /**
124     * Gets the ACL as a String for debugging.
125     *
126     * @return A String representation of this ACL.
127     */
128     public String getStringACL() {
129 tdb 1.1 String acl = "";
130 tdb 1.3 for(int i=0; i < _acl.size(); i++) {
131     ACLRule rule = (ACLRule) _acl.get(i);
132     if(rule._allow) {
133     acl += "ALLOW:" + rule._expression + " ";
134 tdb 1.1 }
135     else {
136 tdb 1.3 acl += "DENY:" + rule._expression + " ";
137 tdb 1.1 }
138     }
139 tdb 1.3 if(_defaultMode) {
140     acl += "DEFAULT:ALLOW";
141     }
142     else {
143     acl += "DEFAULT:DENY";
144     }
145     return acl;
146 tdb 1.1 }
147    
148     /**
149     * Overrides the {@link java.lang.Object#toString() Object.toString()}
150     * method to provide clean logging (every class should have this).
151     *
152     * This uses the uk.org.iscream.cms.server.util.FormatName class
153     * to format the toString()
154     *
155     * @return the name of this class and its CVS revision
156     */
157     public String toString() {
158     return FormatName.getName(
159     _name,
160     getClass().getName(),
161     REVISION);
162     }
163    
164     //---PRIVATE METHODS---
165    
166     //---ACCESSOR/MUTATOR METHODS---
167    
168     //---ATTRIBUTES---
169    
170     /**
171     * This is the friendly identifier of the
172     * component this class is running in.
173     * eg, a Filter may be called "filter1",
174     * If this class does not have an owning
175     * component, a name from the configuration
176     * can be placed here. This name could also
177     * be changed to null for utility classes.
178     */
179     private String _name = null;
180 tdb 1.2
181     /**
182 tdb 1.3 * The ACL is stored in this ArrayList.
183 tdb 1.2 */
184 tdb 1.3 private ArrayList _acl = new ArrayList();
185 tdb 1.2
186     /**
187     * The default mode of this ACL.
188     */
189 tdb 1.1 private boolean _defaultMode;
190    
191     //---STATIC ATTRIBUTES---
192    
193     //---INNER CLASSES---
194    
195 tdb 1.2 /**
196     * Wrapper class for an ACL rule.
197     */
198 tdb 1.4 private class ACLRule implements Serializable {
199 tdb 1.1
200 tdb 1.2 /**
201     * Construct an ACL rule.
202     *
203     * @param allow whether this is an ALLOW or DENY rule
204     * @param expression what this rule matches
205     */
206     private ACLRule(boolean allow, String expression) {
207 tdb 1.1 _allow = allow;
208     _expression = expression;
209     }
210    
211 tdb 1.2 /**
212     * Whether this is an ALLOW or DENY rule.
213     */
214 tdb 1.1 private boolean _allow;
215 tdb 1.2
216     /**
217     * What this rule matches.
218     */
219 tdb 1.1 private String _expression;
220    
221     }
222    
223     }