1 /** 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 */ 18 package 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 */ 33 public 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 } 463