1
2 package jsdsi;
3
4 import java.util.ArrayList;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import jsdsi.sexp.SexpList;
9 import jsdsi.sexp.SexpParseException;
10 import jsdsi.sexp.SexpUtil;
11
12 /***
13 * An ACL entry that specifies a permission (the Tag) and a set of
14 * principals (the Subject) that may access the object protected by this
15 * entry's ACL.
16 *
17 * @see Acl
18 *
19 * @author Sameer Ajmani
20 * @author Sean Radford
21 * @version $Revision: 1.4.2.1 $ $Date: 2005/11/08 03:12:52 $
22 */
23 public class AclEntry extends Obj {
24
25 private static final long serialVersionUID = -3020366729004164789L;
26
27 /***
28 * The subject of this <code>AclEntry</code>.
29 */
30 private transient final Subject subject;
31
32 /***
33 * The permission of this ACL entry.
34 */
35 private transient final Auth auth;
36
37 /***
38 * The validity of this <code>AclEntry</code>.
39 */
40 private transient final Validity validity;
41
42 /***
43 * The comment of this <code>AclEntry</code>.
44 */
45 private transient final String comment;
46
47 /***
48 * Creates a new <code>AclEntry</code> from a given subject, tag,
49 * delegation bit, validity, and comment.
50 *
51 * @param s subject of this <code>AclEntry</code>.
52 * @param t tag of this <code>AclEntry</code>.
53 * @param p delegation bit of this <code>AclEntry</code>.
54 * @param v validity of this <code>AclEntry</code>.
55 * @param c comment of this <code>AclEntry</code>.
56 */
57 public AclEntry(Subject s, Tag t, boolean p, Validity v, String c) {
58 assert(s != null) : "null subject";
59 assert(t != null) : "null tag";
60 subject = s;
61 auth = new Auth(t, p);
62 validity = v; // may be null
63 comment = c; // may be null
64 }
65
66 /***
67 * Returns the subject of this <code>AclEntry</code>.
68 *
69 * @return the subject of this <code>AclEntry</code>.
70 */
71 public Subject getSubject() {
72 return subject;
73 }
74
75 /***
76 * Returns the tag of this <code>AclEntry</code>'s auth.
77 *
78 * @return the tag of this <code>AclEntry</code>'s auth.
79 */
80 public Tag getTag() {
81 return auth.getTag();
82 }
83
84 /***
85 * Returns the delegation bit of this <code>AclEntry</code>'s auth.
86 *
87 * @return the delegation bit of this <code>AclEntry</code>' auth.
88 */
89 public boolean getPropagate() {
90 return auth.getPropagate();
91 }
92
93 /***
94 * Returns the validity of this <code>AclEntry</code>
95 * (may be <code>null</code>).
96 *
97 * @return the validity of this <code>AclEntry</code>.
98 */
99 public Validity getValidity() {
100 return validity;
101 }
102
103 /***
104 * Returns the comment of this <code>AclEntry</code>
105 * (may be <code>null</code>).
106 *
107 * @return the comment of this <code>AclEntry</code>.
108 */
109 public String getComment() {
110 return comment;
111 }
112
113 /***
114 * @see java.lang.Object#equals(Object)
115 */
116 public boolean equals(Object o) {
117 if (o instanceof AclEntry) {
118 AclEntry e = (AclEntry) o;
119 return subject.equals(e.subject)
120 && auth.equals(e.auth)
121 && Util.equals(validity, e.validity)
122 && Util.equals(comment, e.comment);
123 }
124 return false;
125 }
126
127 /***
128 * @see java.lang.Object#hashCode()
129 */
130 public int hashCode() {
131 return subject.hashCode()
132 ^ auth.hashCode()
133 ^ Util.hashCode(validity)
134 ^ Util.hashCode(comment);
135 }
136
137 /***
138 * Returns an <code>SexpList</code> that represents this
139 * <code>AclEntry</code>.
140 */
141 public SexpList toSexp() {
142 List l = new ArrayList(5);
143 l.add(getSubject().toSexp());
144 if (getPropagate()) {
145 l.add(SexpUtil.toSexpList("propagate"));
146 }
147 l.add(getTag().toSexp());
148 if (getValidity() != null) {
149 l.add(getValidity().toSexp());
150 }
151 if (getComment() != null) {
152 l.add(SexpUtil.toSexpComment(getComment()));
153 }
154 return SexpUtil.toSexp("entry", l);
155 }
156
157 /***
158 * Parses an <code>AclEntry</code> from a given <code>SexpList</code>.
159 *
160 * @param l the <code>SexpList</code> to parse.
161 * @return the <code>AclEntry</code> contained in <code>l</code>.
162 * @throws SexpParseException
163 */
164 static AclEntry parseAclEntry(SexpList l) throws SexpParseException {
165 Iterator ebody = SexpUtil.getBody(l);
166 // FIXME: same as Cert parsing!
167 // <sub-obj>
168 Subject subject = Subject.Default.parseSubject(
169 SexpUtil.getNextList(ebody,
170 "acl entry subject"));
171 // <deleg>? <tag>
172 boolean propagate = false;
173 SexpList propOrTag =
174 SexpUtil.getNextList(ebody, "cert propagate or tag");
175 String type = propOrTag.getType();
176 if (type.equals("propagate")) {
177 propagate = true;
178 SexpUtil.check(propOrTag.size() == 1, "extra fields in propagate");
179 propOrTag = SexpUtil.getNextList(ebody, "tag", "cert tag");
180 }
181 Tag tag = Tag.parseTag(propOrTag);
182 // <valid>? <comment>?
183 Validity validity = null;
184 String comment = null;
185 if (ebody.hasNext()) {
186 SexpList validOrComment =
187 SexpUtil.getNextList(ebody, "cert valid or comment");
188 type = validOrComment.getType();
189 if (type.equals("valid")) {
190 validity = Validity.parseValidity(validOrComment);
191 if (ebody.hasNext()) {
192 validOrComment =
193 SexpUtil.getNextList(ebody, "comment", "cert comment");
194 type = "comment"; // FIXME: ugly!
195 }
196 }
197 if (type.equals("comment")) {
198 Iterator combody = SexpUtil.getBody(validOrComment);
199 comment = SexpUtil.getNextString(combody, "comment body");
200 SexpUtil.checkDone(combody, "comment");
201 }
202 }
203 return new AclEntry(subject, tag, propagate, validity, comment);
204 }
205 }
This page was automatically generated by Maven