blob: 2e144eec61818c04371f378c82fd4b727cab9759 [file] [log] [blame]
Shuyi Chend7955ce2013-05-22 14:51:55 -07001/**
2 * $RCSfile$
3 * $Revision$
4 * $Date$
5 *
6 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18package org.jivesoftware.smack.packet;
19
20/**
21 * A privacy item acts a rule that when matched defines if a packet should be blocked or not.
22 *
23 * Privacy Items can handle different kind of blocking communications based on JID, group,
24 * subscription type or globally by:<ul>
25 * <li>Allowing or blocking messages.
26 * <li>Allowing or blocking inbound presence notifications.
27 * <li>Allowing or blocking outbound presence notifications.
28 * <li>Allowing or blocking IQ stanzas.
29 * <li>Allowing or blocking all communications.
30 * </ul>
31 * @author Francisco Vives
32 */
33public class PrivacyItem {
34 /** allow is the action associated with the item, it can allow or deny the communication. */
35 private boolean allow;
36 /** order is a non-negative integer that is unique among all items in the list. */
37 private int order;
38 /** rule hold the kind of communication ([jid|group|subscription]) it will allow or block and
39 * identifier to apply the action.
40 * If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID.
41 * If the type is "group", then the 'value' attribute SHOULD contain the name of a group
42 * in the user's roster.
43 * If the type is "subscription", then the 'value' attribute MUST be one of "both", "to",
44 * "from", or "none". */
45 private PrivacyRule rule;
46
47 /** blocks incoming IQ stanzas. */
48 private boolean filterIQ = false;
49 /** filterMessage blocks incoming message stanzas. */
50 private boolean filterMessage = false;
51 /** blocks incoming presence notifications. */
52 private boolean filterPresence_in = false;
53 /** blocks outgoing presence notifications. */
54 private boolean filterPresence_out = false;
55
56 /**
57 * Creates a new privacy item.
58 *
59 * @param type the type.
60 */
61 public PrivacyItem(String type, boolean allow, int order) {
62 this.setRule(PrivacyRule.fromString(type));
63 this.setAllow(allow);
64 this.setOrder(order);
65 }
66
67 /**
68 * Returns the action associated with the item, it MUST be filled and will allow or deny
69 * the communication.
70 *
71 * @return the allow communication status.
72 */
73 public boolean isAllow() {
74 return allow;
75 }
76
77 /**
78 * Sets the action associated with the item, it can allow or deny the communication.
79 *
80 * @param allow indicates if the receiver allow or deny the communication.
81 */
82 private void setAllow(boolean allow) {
83 this.allow = allow;
84 }
85
86
87 /**
88 * Returns whether the receiver allow or deny incoming IQ stanzas or not.
89 *
90 * @return the iq filtering status.
91 */
92 public boolean isFilterIQ() {
93 return filterIQ;
94 }
95
96
97 /**
98 * Sets whether the receiver allows or denies incoming IQ stanzas or not.
99 *
100 * @param filterIQ indicates if the receiver allows or denies incoming IQ stanzas.
101 */
102 public void setFilterIQ(boolean filterIQ) {
103 this.filterIQ = filterIQ;
104 }
105
106
107 /**
108 * Returns whether the receiver allows or denies incoming messages or not.
109 *
110 * @return the message filtering status.
111 */
112 public boolean isFilterMessage() {
113 return filterMessage;
114 }
115
116
117 /**
118 * Sets wheather the receiver allows or denies incoming messages or not.
119 *
120 * @param filterMessage indicates if the receiver allows or denies incoming messages or not.
121 */
122 public void setFilterMessage(boolean filterMessage) {
123 this.filterMessage = filterMessage;
124 }
125
126
127 /**
128 * Returns whether the receiver allows or denies incoming presence or not.
129 *
130 * @return the iq filtering incoming presence status.
131 */
132 public boolean isFilterPresence_in() {
133 return filterPresence_in;
134 }
135
136
137 /**
138 * Sets whether the receiver allows or denies incoming presence or not.
139 *
140 * @param filterPresence_in indicates if the receiver allows or denies filtering incoming presence.
141 */
142 public void setFilterPresence_in(boolean filterPresence_in) {
143 this.filterPresence_in = filterPresence_in;
144 }
145
146
147 /**
148 * Returns whether the receiver allows or denies incoming presence or not.
149 *
150 * @return the iq filtering incoming presence status.
151 */
152 public boolean isFilterPresence_out() {
153 return filterPresence_out;
154 }
155
156
157 /**
158 * Sets whether the receiver allows or denies outgoing presence or not.
159 *
160 * @param filterPresence_out indicates if the receiver allows or denies filtering outgoing presence
161 */
162 public void setFilterPresence_out(boolean filterPresence_out) {
163 this.filterPresence_out = filterPresence_out;
164 }
165
166
167 /**
168 * Returns the order where the receiver is processed. List items are processed in
169 * ascending order.
170 *
171 * The order MUST be filled and its value MUST be a non-negative integer
172 * that is unique among all items in the list.
173 *
174 * @return the order number.
175 */
176 public int getOrder() {
177 return order;
178 }
179
180
181 /**
182 * Sets the order where the receiver is processed.
183 *
184 * The order MUST be filled and its value MUST be a non-negative integer
185 * that is unique among all items in the list.
186 *
187 * @param order indicates the order in the list.
188 */
189 public void setOrder(int order) {
190 this.order = order;
191 }
192
193 /**
194 * Sets the element identifier to apply the action.
195 *
196 * If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID.
197 * If the type is "group", then the 'value' attribute SHOULD contain the name of a group
198 * in the user's roster.
199 * If the type is "subscription", then the 'value' attribute MUST be one of "both", "to",
200 * "from", or "none".
201 *
202 * @param value is the identifier to apply the action.
203 */
204 public void setValue(String value) {
205 if (!(this.getRule() == null && value == null)) {
206 this.getRule().setValue(value);
207 }
208 }
209
210 /**
211 * Returns the type hold the kind of communication it will allow or block.
212 * It MUST be filled with one of these values: jid, group or subscription.
213 *
214 * @return the type of communication it represent.
215 */
216 public Type getType() {
217 if (this.getRule() == null) {
218 return null;
219 } else {
220 return this.getRule().getType();
221 }
222 }
223
224 /**
225 * Returns the element identifier to apply the action.
226 *
227 * If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID.
228 * If the type is "group", then the 'value' attribute SHOULD contain the name of a group
229 * in the user's roster.
230 * If the type is "subscription", then the 'value' attribute MUST be one of "both", "to",
231 * "from", or "none".
232 *
233 * @return the identifier to apply the action.
234 */
235 public String getValue() {
236 if (this.getRule() == null) {
237 return null;
238 } else {
239 return this.getRule().getValue();
240 }
241 }
242
243
244 /**
245 * Returns whether the receiver allows or denies every kind of communication.
246 *
247 * When filterIQ, filterMessage, filterPresence_in and filterPresence_out are not set
248 * the receiver will block all communications.
249 *
250 * @return the all communications status.
251 */
252 public boolean isFilterEverything() {
253 return !(this.isFilterIQ() || this.isFilterMessage() || this.isFilterPresence_in()
254 || this.isFilterPresence_out());
255 }
256
257
258 private PrivacyRule getRule() {
259 return rule;
260 }
261
262 private void setRule(PrivacyRule rule) {
263 this.rule = rule;
264 }
265 /**
266 * Answer an xml representation of the receiver according to the RFC 3921.
267 *
268 * @return the text xml representation.
269 */
270 public String toXML() {
271 StringBuilder buf = new StringBuilder();
272 buf.append("<item");
273 if (this.isAllow()) {
274 buf.append(" action=\"allow\"");
275 } else {
276 buf.append(" action=\"deny\"");
277 }
278 buf.append(" order=\"").append(getOrder()).append("\"");
279 if (getType() != null) {
280 buf.append(" type=\"").append(getType()).append("\"");
281 }
282 if (getValue() != null) {
283 buf.append(" value=\"").append(getValue()).append("\"");
284 }
285 if (isFilterEverything()) {
286 buf.append("/>");
287 } else {
288 buf.append(">");
289 if (this.isFilterIQ()) {
290 buf.append("<iq/>");
291 }
292 if (this.isFilterMessage()) {
293 buf.append("<message/>");
294 }
295 if (this.isFilterPresence_in()) {
296 buf.append("<presence-in/>");
297 }
298 if (this.isFilterPresence_out()) {
299 buf.append("<presence-out/>");
300 }
301 buf.append("</item>");
302 }
303 return buf.toString();
304 }
305
306
307 /**
308 * Privacy Rule represents the kind of action to apply.
309 * It holds the kind of communication ([jid|group|subscription]) it will allow or block and
310 * identifier to apply the action.
311 */
312
313 public static class PrivacyRule {
314 /**
315 * Type defines if the rule is based on JIDs, roster groups or presence subscription types.
316 * Available values are: [jid|group|subscription]
317 */
318 private Type type;
319 /**
320 * The value hold the element identifier to apply the action.
321 * If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID.
322 * If the type is "group", then the 'value' attribute SHOULD contain the name of a group
323 * in the user's roster.
324 * If the type is "subscription", then the 'value' attribute MUST be one of "both", "to",
325 * "from", or "none".
326 */
327 private String value;
328
329 /**
330 * If the type is "subscription", then the 'value' attribute MUST be one of "both",
331 * "to", "from", or "none"
332 */
333 public static final String SUBSCRIPTION_BOTH = "both";
334 public static final String SUBSCRIPTION_TO = "to";
335 public static final String SUBSCRIPTION_FROM = "from";
336 public static final String SUBSCRIPTION_NONE = "none";
337
338 /**
339 * Returns the type constant associated with the String value.
340 */
341 protected static PrivacyRule fromString(String value) {
342 if (value == null) {
343 return null;
344 }
345 PrivacyRule rule = new PrivacyRule();
346 rule.setType(Type.valueOf(value.toLowerCase()));
347 return rule;
348 }
349
350 /**
351 * Returns the type hold the kind of communication it will allow or block.
352 * It MUST be filled with one of these values: jid, group or subscription.
353 *
354 * @return the type of communication it represent.
355 */
356 public Type getType() {
357 return type;
358 }
359
360 /**
361 * Sets the action associated with the item, it can allow or deny the communication.
362 *
363 * @param type indicates if the receiver allows or denies the communication.
364 */
365 private void setType(Type type) {
366 this.type = type;
367 }
368
369 /**
370 * Returns the element identifier to apply the action.
371 *
372 * If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID.
373 * If the type is "group", then the 'value' attribute SHOULD contain the name of a group
374 * in the user's roster.
375 * If the type is "subscription", then the 'value' attribute MUST be one of "both", "to",
376 * "from", or "none".
377 *
378 * @return the identifier to apply the action.
379 */
380 public String getValue() {
381 return value;
382 }
383
384 /**
385 * Sets the element identifier to apply the action.
386 *
387 * If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID.
388 * If the type is "group", then the 'value' attribute SHOULD contain the name of a group
389 * in the user's roster.
390 * If the type is "subscription", then the 'value' attribute MUST be one of "both", "to",
391 * "from", or "none".
392 *
393 * @param value is the identifier to apply the action.
394 */
395 protected void setValue(String value) {
396 if (this.isSuscription()) {
397 setSuscriptionValue(value);
398 } else {
399 this.value = value;
400 }
401 }
402
403 /**
404 * Sets the element identifier to apply the action.
405 *
406 * The 'value' attribute MUST be one of "both", "to", "from", or "none".
407 *
408 * @param value is the identifier to apply the action.
409 */
410 private void setSuscriptionValue(String value) {
411 String setValue;
412 if (value == null) {
413 // Do nothing
414 }
415 if (SUBSCRIPTION_BOTH.equalsIgnoreCase(value)) {
416 setValue = SUBSCRIPTION_BOTH;
417 }
418 else if (SUBSCRIPTION_TO.equalsIgnoreCase(value)) {
419 setValue = SUBSCRIPTION_TO;
420 }
421 else if (SUBSCRIPTION_FROM.equalsIgnoreCase(value)) {
422 setValue = SUBSCRIPTION_FROM;
423 }
424 else if (SUBSCRIPTION_NONE.equalsIgnoreCase(value)) {
425 setValue = SUBSCRIPTION_NONE;
426 }
427 // Default to available.
428 else {
429 setValue = null;
430 }
431 this.value = setValue;
432 }
433
434 /**
435 * Returns if the receiver represents a subscription rule.
436 *
437 * @return if the receiver represents a subscription rule.
438 */
439 public boolean isSuscription () {
440 return this.getType() == Type.subscription;
441 }
442 }
443
444 /**
445 * Type defines if the rule is based on JIDs, roster groups or presence subscription types.
446 */
447 public static enum Type {
448 /**
449 * JID being analyzed should belong to a roster group of the list's owner.
450 */
451 group,
452 /**
453 * JID being analyzed should have a resource match, domain match or bare JID match.
454 */
455 jid,
456 /**
457 * JID being analyzed should belong to a contact present in the owner's roster with
458 * the specified subscription status.
459 */
460 subscription
461 }
462}