use of com.zimbra.client.ZFilterAction.ZFileIntoAction in project zm-mailbox by Zimbra.
the class ZFilterRule method parseFilterRule.
public static ZFilterRule parseFilterRule(String[] args) throws ServiceException {
String name = args[0];
boolean all = true;
boolean active = true;
List<ZFilterCondition> conditions = new ArrayList<ZFilterCondition>();
List<ZFilterAction> actions = new ArrayList<ZFilterAction>();
int i = 1;
while (i < args.length) {
String a = args[i++];
if (a.equals("active")) {
active = true;
} else if (a.equals("inactive")) {
active = false;
} else if (a.equals("any")) {
all = false;
} else if (a.equals("all")) {
all = true;
} else if (a.equals("addressbook")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String op = args[i++];
String header = args[i++];
conditions.add(new ZAddressBookCondition(AddressBookOp.fromString(op), header));
} else if (a.equals("contact_ranking")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String op = args[i++];
String header = args[i++];
conditions.add(new ZContactRankingCondition(ContactRankingOp.fromString(op), header));
} else if (a.equals("me")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String op = args[i++];
String header = args[i++];
conditions.add(new ZMeCondition(MeOp.fromString(op), header));
} else if (a.equals("attachment")) {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing exists arg", null);
}
conditions.add(new ZAttachmentExistsCondition(args[i++].equals("exists")));
} else if (a.equals("body")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String op = args[i++];
String nextArg = args[i++];
boolean caseSensitive = false;
if (ZFilterCondition.C_CASE_SENSITIVE.equals(nextArg)) {
caseSensitive = true;
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
nextArg = args[i++];
}
conditions.add(new ZBodyCondition(BodyOp.fromString(op), caseSensitive, nextArg));
} else if (a.equals("size")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
conditions.add(new ZSizeCondition(SizeOp.fromString(args[i++]), args[i++]));
} else if (a.equals("date")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
conditions.add(new ZDateCondition(DateOp.fromString(args[i++]), args[i++]));
} else if (a.equals("current_time")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
conditions.add(new ZCurrentTimeCondition(DateOp.fromString(args[i++]), args[i++]));
} else if (a.equals("current_day_of_week")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
conditions.add(new ZCurrentDayOfWeekCondition(SimpleOp.fromString(args[i++]), args[i++]));
} else if (a.equals("header")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String headerName = args[i++];
String op = args[i++];
if (op.equals("exists")) {
conditions.add(new ZHeaderExistsCondition(headerName, true));
} else if (op.equals("not_exists")) {
conditions.add(new ZHeaderExistsCondition(headerName, false));
} else {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String nextArg = args[i++];
boolean caseSensitive = false;
if (ZFilterCondition.C_CASE_SENSITIVE.equals(nextArg)) {
caseSensitive = true;
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
nextArg = args[i++];
}
conditions.add(new ZHeaderCondition(headerName, HeaderOp.fromString(op), caseSensitive, nextArg));
}
} else if (a.equals("mime_header")) {
if (i + 3 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String headerName = args[i++];
String op = args[i++];
String nextArg = args[i++];
boolean caseSensitive = false;
if (ZFilterCondition.C_CASE_SENSITIVE.equals(nextArg)) {
caseSensitive = true;
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
nextArg = args[i++];
}
conditions.add(new ZMimeHeaderCondition(headerName, HeaderOp.fromString(op), caseSensitive, nextArg));
} else if (a.equals("address")) {
if (i + 4 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String headerName = args[i++];
String part = args[i++];
String op = args[i++];
String nextArg = args[i++];
boolean caseSensitive = false;
if (ZFilterCondition.C_CASE_SENSITIVE.equals(nextArg)) {
caseSensitive = true;
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
nextArg = args[i++];
}
conditions.add(new ZAddressCondition(headerName, Sieve.AddressPart.fromString(part), HeaderOp.fromString(op), caseSensitive, nextArg));
} else if (a.equals("invite")) {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing exists arg", null);
}
ZInviteCondition cond = new ZInviteCondition(args[i++].equals("exists"));
if (i + 1 < args.length && args[i].equalsIgnoreCase("method")) {
// method
i++;
cond.setMethods(args[i++].split(","));
}
conditions.add(cond);
} else if (a.equals("conversation")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing where arg", null);
}
conditions.add(new ZFilterCondition.ZConversationCondition(ZFilterCondition.ConversationOp.fromString(args[i++]), args[i++]));
} else if (a.equals("facebook")) {
ZFilterCondition.SimpleOp op;
if (i + 1 < args.length && args[i].equalsIgnoreCase("not")) {
// not
i++;
op = ZFilterCondition.SimpleOp.NOT_IS;
} else {
op = ZFilterCondition.SimpleOp.IS;
}
conditions.add(new ZFilterCondition.ZFacebookCondition(op));
} else if (a.equals("linkedin")) {
ZFilterCondition.SimpleOp op;
if (i + 1 < args.length && args[i].equalsIgnoreCase("not")) {
// not
i++;
op = ZFilterCondition.SimpleOp.NOT_IS;
} else {
op = ZFilterCondition.SimpleOp.IS;
}
conditions.add(new ZFilterCondition.ZLinkedInCondition(op));
} else if (a.equals("socialcast")) {
ZFilterCondition.SimpleOp op;
if (i + 1 < args.length && args[i].equalsIgnoreCase("not")) {
// not
i++;
op = ZFilterCondition.SimpleOp.NOT_IS;
} else {
op = ZFilterCondition.SimpleOp.IS;
}
conditions.add(new ZFilterCondition.ZSocialcastCondition(op));
} else if (a.equals("twitter")) {
ZFilterCondition.SimpleOp op;
if (i + 1 < args.length && args[i].equalsIgnoreCase("not")) {
// not
i++;
op = ZFilterCondition.SimpleOp.NOT_IS;
} else {
op = ZFilterCondition.SimpleOp.IS;
}
conditions.add(new ZFilterCondition.ZTwitterCondition(op));
} else if (a.equals("list")) {
ZFilterCondition.SimpleOp op;
if (i + 1 < args.length && args[i].equalsIgnoreCase("not")) {
// not
i++;
op = ZFilterCondition.SimpleOp.NOT_IS;
} else {
op = ZFilterCondition.SimpleOp.IS;
}
conditions.add(new ZFilterCondition.ZListCondition(op));
} else if (a.equals("bulk")) {
ZFilterCondition.SimpleOp op;
if (i + 1 < args.length && args[i].equalsIgnoreCase("not")) {
// not
i++;
op = ZFilterCondition.SimpleOp.NOT_IS;
} else {
op = ZFilterCondition.SimpleOp.IS;
}
conditions.add(new ZFilterCondition.ZBulkCondition(op));
} else if (a.equals("importance")) {
if (i + 2 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
String op = args[i++];
String importance = args[i++];
conditions.add(new ZFilterCondition.ZImportanceCondition(SimpleOp.fromString(op), FilterTest.Importance.fromString(importance)));
} else if (a.equals("flagged")) {
ZFilterCondition.SimpleOp op;
if (i < args.length && args[i].equalsIgnoreCase("not")) {
// not
i++;
op = ZFilterCondition.SimpleOp.NOT_IS;
} else {
op = ZFilterCondition.SimpleOp.IS;
}
if (i >= args.length) {
throw ZClientException.CLIENT_ERROR("missing a flag name after 'flagged'", null);
}
conditions.add(new ZFilterCondition.ZFlaggedCondition(op, Sieve.Flag.fromString(args[i++])));
} else if (a.equals("keep")) {
actions.add(new ZKeepAction());
} else if (a.equals("discard")) {
actions.add(new ZDiscardAction());
} else if (a.equals("fileinto")) {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
actions.add(new ZFileIntoAction(args[i++]));
} else if (a.equals("tag")) {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
actions.add(new ZTagAction(args[i++]));
} else if (a.equals("mark")) {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
actions.add(new ZMarkAction(MarkOp.fromString(args[i++])));
} else if (a.equals("redirect")) {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
actions.add(new ZRedirectAction(args[i++]));
} else if (a.equals("reply")) {
if (i + 1 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
actions.add(new ZReplyAction(args[i++]));
} else if (a.equals("notify")) {
if (i + 3 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
if (!"RFC".equalsIgnoreCase(args[i])) {
String emailAddr = args[i++];
String subjectTemplate = args[i++];
String bodyTemplate = args[i++];
int maxBodyBytes = -1;
if (i + 1 <= args.length) {
try {
maxBodyBytes = Integer.valueOf(args[i]);
i++;
} catch (NumberFormatException ignored) {
}
}
actions.add(new ZNotifyAction(emailAddr, subjectTemplate, bodyTemplate, maxBodyBytes));
} else {
// "options".
if (i + 4 > args.length) {
throw ZClientException.CLIENT_ERROR("missing args", null);
}
// skip string "RFC"
i++;
String from = args[i++];
String importance = null;
String options = null;
if (i + 4 == args.length) {
// Now we check whether the notify string contains "importance" and "options" tokens
// If these two tokens are included, the remaining number of tokens at this point is 4,
// otherwise 2.
importance = args[i++];
options = args[i++];
}
String message = args[i++];
String method = args[i++];
if (importance != null && options != null) {
actions.add(new ZRFCCompliantNotifyAction(from, importance, options, message, method));
} else {
actions.add(new ZRFCCompliantNotifyAction(from, message, method));
}
}
} else if (a.equals("stop")) {
actions.add(new ZStopAction());
} else {
throw ZClientException.CLIENT_ERROR("unknown keyword: " + a, null);
}
}
if (name == null || name.length() == 0) {
throw ZClientException.CLIENT_ERROR("missing filter name", null);
}
if (actions.isEmpty()) {
throw ZClientException.CLIENT_ERROR("must have at least one action", null);
}
if (conditions.isEmpty()) {
throw ZClientException.CLIENT_ERROR("must have at least one condition", null);
}
return new ZFilterRule(name, active, all, conditions, actions);
}
use of com.zimbra.client.ZFilterAction.ZFileIntoAction in project zm-mailbox by Zimbra.
the class TestFilter method testMarkRead.
@Test
public void testMarkRead() throws Exception {
String folderName = NAME_PREFIX + " testMarkRead";
// if the subject contains "testMarkRead", file into a folder and mark read
List<ZFilterRule> rules = new ArrayList<ZFilterRule>();
List<ZFilterCondition> conditions = new ArrayList<ZFilterCondition>();
List<ZFilterAction> actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("subject", HeaderOp.CONTAINS, "testMarkRead"));
actions.add(new ZFileIntoAction(folderName));
actions.add(new ZMarkAction(MarkOp.READ));
rules.add(new ZFilterRule("testMarkRead", true, false, conditions, actions));
saveIncomingRules(mMbox, new ZFilterRules(rules));
// Deliver message.
String address = TestUtil.getAddress(USER_NAME);
String subject = NAME_PREFIX + " testMarkRead";
TestUtil.addMessageLmtp(subject, address, address);
// Check folder and unread state.
ZMessage msg = TestUtil.getMessage(mMbox, "in:\"" + folderName + "\" subject:\"" + subject + "\"");
String flags = msg.getFlags();
assertTrue("Unexpected flags: " + flags, flags == null || flags.indexOf(ZMessage.Flag.UNREAD.getFlagChar()) < 0);
}
use of com.zimbra.client.ZFilterAction.ZFileIntoAction in project zm-mailbox by Zimbra.
the class TestFilter method testSpam.
/**
* Confirms that spam filtering takes a higher precedence than
* custom user filtering (bug 23886).
*/
public void testSpam() throws Exception {
ZMailbox mbox = TestUtil.getZMailbox(USER_NAME);
String sender = TestUtil.getAddress(USER_NAME);
String[] recipients = new String[] { sender };
String message = TestUtil.getTestMessage(NAME_PREFIX + " testSpam", USER_NAME, USER_NAME, null);
Config config = Provisioning.getInstance().getConfig();
message = config.getAttr(Provisioning.A_zimbraSpamHeader) + ": " + config.getAttr(Provisioning.A_zimbraSpamHeaderValue) + "\r\n" + message;
// Make sure spam message doesn't already exist
assertEquals(0, TestUtil.search(mbox, "in:junk subject:testSpam").size());
// Deliver spam message without matching rule, make sure it gets delivered
// to the junk folder, and delete.
TestUtil.addMessageLmtp(recipients, sender, message);
ZMessage msg = TestUtil.getMessage(mbox, "in:junk subject:testSpam");
mbox.deleteMessage(msg.getId());
// Add matching filter rule: if subject contains "testSpam", file into folder1
ZFilterRules rules = getTestIncomingRules();
List<ZFilterCondition> conditions = new ArrayList<ZFilterCondition>();
List<ZFilterAction> actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("subject", HeaderOp.CONTAINS, "testSpam"));
actions.add(new ZFileIntoAction(FOLDER1_PATH));
rules.getRules().add(new ZFilterRule("testBug5455", true, false, conditions, actions));
saveIncomingRules(mMbox, rules);
// Set "apply user rules" attribute to TRUE and make sure the message gets filed into folder1
TestUtil.setAccountAttr(USER_NAME, Provisioning.A_zimbraSpamApplyUserFilters, LdapConstants.LDAP_TRUE);
TestUtil.addMessageLmtp(recipients, sender, message);
msg = TestUtil.waitForMessage(mbox, "in:" + FOLDER1_PATH + " subject:testSpam");
mbox.deleteMessage(msg.getId());
// Set "apply user rules" attribute to FALSE and make sure the message gets filed into junk
TestUtil.setAccountAttr(USER_NAME, Provisioning.A_zimbraSpamApplyUserFilters, LdapConstants.LDAP_FALSE);
TestUtil.addMessageLmtp(recipients, sender, message);
TestUtil.waitForMessage(mbox, "in:junk subject:testSpam");
}
use of com.zimbra.client.ZFilterAction.ZFileIntoAction in project zm-mailbox by Zimbra.
the class TestFilter method testBackslashEscape.
public void testBackslashEscape() throws Exception {
List<ZFilterCondition> conditions = new ArrayList<ZFilterCondition>();
List<ZFilterAction> actions = new ArrayList<ZFilterAction>();
List<ZFilterRule> rules = new ArrayList<ZFilterRule>();
String folderName = NAME_PREFIX + " testBackslashEscape";
TestUtil.createFolder(mMbox, folderName);
// if subject contains "a \ b", file into folder
ZFilterCondition condition = new ZHeaderCondition("subject", HeaderOp.CONTAINS, "a \\ b");
ZFilterAction action = new ZFileIntoAction(folderName);
conditions.add(condition);
actions.add(action);
rules.add(new ZFilterRule(folderName, true, false, conditions, actions));
ZFilterRules zRules = new ZFilterRules(rules);
saveIncomingRules(mMbox, zRules);
// Add a message and confirm it gets filed into the correct folder
String address = TestUtil.getAddress(USER_NAME);
String subject = NAME_PREFIX + " a \\ b y z";
TestUtil.addMessageLmtp(subject, address, address);
TestUtil.getMessage(mMbox, "in:\"" + folderName + "\" subject:\"" + subject + "\"");
}
use of com.zimbra.client.ZFilterAction.ZFileIntoAction in project zm-mailbox by Zimbra.
the class TestFilter method getTestIncomingRules.
private ZFilterRules getTestIncomingRules() throws Exception {
List<ZFilterRule> rules = new ArrayList<ZFilterRule>();
List<ZFilterCondition> conditions = new ArrayList<ZFilterCondition>();
List<ZFilterAction> actions = new ArrayList<ZFilterAction>();
// if subject contains "folder1", file into folder1 and tag with tag1
conditions = new ArrayList<ZFilterCondition>();
actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("subject", HeaderOp.CONTAINS, "folder1"));
actions.add(new ZFileIntoAction(FOLDER1_PATH));
actions.add(new ZTagAction(TAG1_NAME));
rules.add(new ZFilterRule("testMatchMultipleFilters1", true, false, conditions, actions));
// if from contains "multiplefilters", file into folder 2, tag with tag2 and flag
conditions = new ArrayList<ZFilterCondition>();
actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("from", HeaderOp.CONTAINS, "multiplefilters"));
actions.add(new ZFileIntoAction(FOLDER2_PATH));
actions.add(new ZTagAction(TAG2_NAME));
actions.add(new ZMarkAction(MarkOp.FLAGGED));
rules.add(new ZFilterRule("testMatchMultipleFilters2", true, false, conditions, actions));
// if subject contains bug5455, flag, file into folder1, tag with tag1, file into folder2
conditions = new ArrayList<ZFilterCondition>();
actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("subject", HeaderOp.CONTAINS, "bug5455"));
actions.add(new ZMarkAction(MarkOp.FLAGGED));
actions.add(new ZFileIntoAction(FOLDER1_PATH));
actions.add(new ZTagAction(TAG1_NAME));
actions.add(new ZFileIntoAction(FOLDER2_PATH));
rules.add(new ZFilterRule("testBug5455", true, false, conditions, actions));
// if subject contains "discard", discard the message
conditions = new ArrayList<ZFilterCondition>();
actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("subject", HeaderOp.CONTAINS, "doDiscard"));
actions.add(new ZDiscardAction());
rules.add(new ZFilterRule("testDiscard", true, false, conditions, actions));
// if subject contains "mountpointRoot", file into the mountpoint root folder
conditions = new ArrayList<ZFilterCondition>();
actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("subject", HeaderOp.CONTAINS, "mountpointRoot"));
actions.add(new ZFileIntoAction("/" + MOUNTPOINT_FOLDER_NAME));
rules.add(new ZFilterRule("testMountpoint", true, false, conditions, actions));
// if subject contains "mountpointSub", file into the mountpoint subfolder
conditions = new ArrayList<ZFilterCondition>();
actions = new ArrayList<ZFilterAction>();
conditions.add(new ZHeaderCondition("subject", HeaderOp.CONTAINS, "mountpointSub"));
actions.add(new ZFileIntoAction(MOUNTPOINT_SUBFOLDER_PATH));
rules.add(new ZFilterRule("testMountpointSubfolder", true, false, conditions, actions));
return new ZFilterRules(rules);
}
Aggregations