use of com.zimbra.soap.mail.type.Policy in project zm-mailbox by Zimbra.
the class PurgeTest method tagPurgePolicy.
@Test
public void tagPurgePolicy() throws Exception {
Mailbox mbox = MailboxManager.getInstance().getMailboxByAccountId(MockProvisioning.DEFAULT_ACCOUNT_ID);
// Create folder and test messages.
Tag tag = mbox.createTag(null, "tag", (byte) 0);
Folder inbox = mbox.getFolderById(null, Mailbox.ID_FOLDER_INBOX);
Message older = TestUtil.addMessage(mbox, inbox.getId(), "test1", System.currentTimeMillis() - (60 * Constants.MILLIS_PER_MINUTE));
Message newer = TestUtil.addMessage(mbox, inbox.getId(), "test2", System.currentTimeMillis() - (30 * Constants.MILLIS_PER_MINUTE));
Message notTagged = TestUtil.addMessage(mbox, inbox.getId(), "test3", System.currentTimeMillis() - (90 * Constants.MILLIS_PER_MINUTE));
mbox.setTags(null, older.getId(), older.getType(), 0, new String[] { tag.getName() });
mbox.setTags(null, newer.getId(), newer.getType(), 0, new String[] { tag.getName() });
// Run purge with default settings and make sure nothing was deleted.
mbox.purgeMessages(null);
assertEquals(3, inbox.getSize());
// Add retention policy.
Policy p = Policy.newUserPolicy("45m");
RetentionPolicy purgePolicy = new RetentionPolicy(null, Arrays.asList(p));
mbox.setRetentionPolicy(null, tag.getId(), MailItem.Type.TAG, purgePolicy);
// Purge the tag cache and make sure that purge policy is reloaded from metadata.
mbox.purge(MailItem.Type.TAG);
tag = mbox.getTagById(null, tag.getId());
List<Policy> purgeList = tag.getRetentionPolicy().getPurgePolicy();
assertEquals(1, purgeList.size());
assertEquals("45m", purgeList.get(0).getLifetime());
// Run purge and make sure one of the messages was deleted.
mbox.purgeMessages(null);
inbox = mbox.getFolderById(null, inbox.getId());
assertEquals(2, inbox.getSize());
mbox.getMessageById(null, newer.getId());
mbox.getMessageById(null, notTagged.getId());
try {
mbox.getMessageById(null, older.getId());
fail("Older message was not purged.");
} catch (NoSuchItemException e) {
}
// Remove purge policy and verify that the folder state was properly updated.
mbox.setRetentionPolicy(null, tag.getId(), MailItem.Type.TAG, null);
mbox.purge(MailItem.Type.TAG);
tag = mbox.getTagById(null, tag.getId());
assertEquals(0, tag.getRetentionPolicy().getKeepPolicy().size());
assertEquals(0, tag.getRetentionPolicy().getPurgePolicy().size());
}
use of com.zimbra.soap.mail.type.Policy in project zm-mailbox by Zimbra.
the class PurgeTest method completeRetentionPolicy.
/**
* Tests {@link RetentionPolicyManager#getCompleteRetentionPolicy(Account, RetentionPolicy). Confirms
* that system policy elements are updated with the latest values in LDAP.
*/
@Test
public void completeRetentionPolicy() throws Exception {
RetentionPolicyManager mgr = RetentionPolicyManager.getInstance();
Config config = Provisioning.getInstance().getConfig();
Policy keep1 = mgr.createSystemKeepPolicy(config, "keep1", "300d");
// Create mailbox policy that references the system policy, and confirm that
// lookup returns the latest values.
RetentionPolicy mboxRP = new RetentionPolicy(Arrays.asList(Policy.newSystemPolicy(keep1.getId())), null);
RetentionPolicy completeRP = mgr.getCompleteRetentionPolicy(getAccount(), mboxRP);
Policy latest = completeRP.getKeepPolicy().get(0);
assertEquals(keep1, latest);
// Modify system policy and confirm that the accessor returns the latest values.
mgr.modifySystemPolicy(config, keep1.getId(), "new keep1", "301d");
completeRP = mgr.getCompleteRetentionPolicy(getAccount(), mboxRP);
latest = completeRP.getKeepPolicy().get(0);
assertFalse(keep1.equals(latest));
assertEquals(keep1.getId(), latest.getId());
assertEquals("new keep1", latest.getName());
assertEquals("301d", latest.getLifetime());
}
use of com.zimbra.soap.mail.type.Policy in project zm-mailbox by Zimbra.
the class Mailbox method purgeMessages.
/**
* Purges messages in system folders based on user- and admin-level purge settings on the account.
* Returns {@code true} if all messages that meet the purge criteria were purged, {@code false} if the number of
* messages to purge in any folder exceeded {@code maxItemsPerFolder}.
*/
public boolean purgeMessages(OperationContext octxt) throws ServiceException {
Account acct = getAccount();
int maxItemsPerFolder = Provisioning.getInstance().getLocalServer().getMailPurgeBatchSize();
if (ZimbraLog.purge.isDebugEnabled()) {
ZimbraLog.purge.debug("System retention policy: Trash=%s, Junk=%s, All messages=%s, Dumpster=%s", acct.getMailTrashLifetimeAsString(), acct.getMailSpamLifetimeAsString(), acct.getMailMessageLifetimeAsString(), acct.getMailDumpsterLifetimeAsString());
ZimbraLog.purge.debug("User-specified retention policy: Inbox read=%s, Inbox unread=%s, Sent=%s, Junk=%s, Trash=%s, Versions=%s, VersionsEnabled=%s", acct.getPrefInboxReadLifetimeAsString(), acct.getPrefInboxUnreadLifetimeAsString(), acct.getPrefSentLifetimeAsString(), acct.getPrefJunkLifetimeAsString(), acct.getPrefTrashLifetimeAsString(), acct.getFileVersionLifetimeAsString(), acct.isFileVersioningEnabled());
}
long globalTimeout = acct.getMailMessageLifetime();
long systemTrashTimeout = acct.getMailTrashLifetime();
long systemJunkTimeout = acct.getMailSpamLifetime();
boolean dumpsterPurgeEnabled = acct.isDumpsterPurgeEnabled();
long systemDumpsterTimeoutMillis = dumpsterPurgeEnabled ? acct.getMailDumpsterLifetime() : 0;
long userInboxReadTimeout = acct.getPrefInboxReadLifetime();
long userInboxUnreadTimeout = acct.getPrefInboxUnreadLifetime();
long userTrashTimeout = acct.getPrefTrashLifetime();
long userJunkTimeout = acct.getPrefJunkLifetime();
long userSentTimeout = acct.getPrefSentLifetime();
long trashTimeout = pickTimeout(systemTrashTimeout, userTrashTimeout);
long spamTimeout = pickTimeout(systemJunkTimeout, userJunkTimeout);
boolean userFileVersioningEnabled = acct.isFileVersioningEnabled();
long userFileVersionLifeTime = acct.getFileVersionLifetime();
if (globalTimeout <= 0 && trashTimeout <= 0 && spamTimeout <= 0 && userInboxReadTimeout <= 0 && userInboxReadTimeout <= 0 && userInboxUnreadTimeout <= 0 && userSentTimeout <= 0 && systemDumpsterTimeoutMillis <= 0 && (!userFileVersioningEnabled || userFileVersionLifeTime <= 0)) {
ZimbraLog.purge.debug("Retention policy does not require purge.");
return true;
}
ZimbraLog.purge.info("Purging messages.");
// sanity-check the really dangerous value...
if (globalTimeout > 0 && globalTimeout < Constants.MILLIS_PER_MONTH) {
// this min is also used by POP3 EXPIRE command. update Pop3Handler.MIN_EPXIRE_DAYS if it changes.
ZimbraLog.purge.warn("global message timeout < 1 month; defaulting to 31 days");
globalTimeout = Constants.MILLIS_PER_MONTH;
}
// call to purge expired messages with IMAP \Deleted flag
// for expiration check, used zimbraMailTrashLifetime
purgeExpiredIMAPDeletedMessages(trashTimeout);
PurgeOldMessages redoRecorder = new PurgeOldMessages(mId);
boolean success = false;
try {
beginTransaction("purgeMessages", octxt, redoRecorder);
// get the folders we're going to be purging
Folder trash = getFolderById(ID_FOLDER_TRASH);
Folder spam = getFolderById(ID_FOLDER_SPAM);
Folder sent = getFolderById(ID_FOLDER_SENT);
Folder inbox = getFolderById(ID_FOLDER_INBOX);
boolean purgedAll = true;
if (globalTimeout > 0) {
int numPurged = Folder.purgeMessages(this, null, getOperationTimestampMillis() - globalTimeout, null, false, false, maxItemsPerFolder);
ZimbraLog.purge.debug("Purged %d messages from All Folders", numPurged);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
}
if (trashTimeout > 0) {
boolean useChangeDate = acct.getBooleanAttr(Provisioning.A_zimbraMailPurgeUseChangeDateForTrash, true);
int numPurged = Folder.purgeMessages(this, trash, getOperationTimestampMillis() - trashTimeout, null, useChangeDate, true, maxItemsPerFolder);
ZimbraLog.purge.debug("Purged %d messages from Trash", numPurged);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
}
if (spamTimeout > 0) {
boolean useChangeDate = acct.isMailPurgeUseChangeDateForSpam();
int numPurged = Folder.purgeMessages(this, spam, getOperationTimestampMillis() - spamTimeout, null, useChangeDate, false, maxItemsPerFolder);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
ZimbraLog.purge.debug("Purged %d messages from Spam", numPurged);
}
if (userInboxReadTimeout > 0) {
int numPurged = Folder.purgeMessages(this, inbox, getOperationTimestampMillis() - userInboxReadTimeout, false, false, false, maxItemsPerFolder);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
ZimbraLog.purge.debug("Purged %d read messages from Inbox", numPurged);
}
if (userInboxUnreadTimeout > 0) {
int numPurged = Folder.purgeMessages(this, inbox, getOperationTimestampMillis() - userInboxUnreadTimeout, true, false, false, maxItemsPerFolder);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
ZimbraLog.purge.debug("Purged %d unread messages from Inbox", numPurged);
}
if (userSentTimeout > 0) {
int numPurged = Folder.purgeMessages(this, sent, getOperationTimestampMillis() - userSentTimeout, null, false, false, maxItemsPerFolder);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
ZimbraLog.purge.debug("Purged %d messages from Sent", numPurged);
}
if (systemDumpsterTimeoutMillis > 0) {
int numPurged = purgeDumpster(getOperationTimestampMillis() - systemDumpsterTimeoutMillis, maxItemsPerFolder);
ZimbraLog.purge.debug("Purged %d messages from Dumpster", numPurged);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
}
if (userFileVersioningEnabled && userFileVersionLifeTime > 0) {
int numPurged = MailItem.purgeRevisions(this, getOperationTimestampMillis() - userFileVersionLifeTime);
ZimbraLog.purge.debug("Purged %d revisions", numPurged);
}
// Process any folders that have retention policy set.
for (Folder folder : getFolderList(octxt, SortBy.NONE)) {
RetentionPolicy rp = RetentionPolicyManager.getInstance().getCompleteRetentionPolicy(acct, folder.getRetentionPolicy());
for (Policy policy : rp.getPurgePolicy()) {
long folderLifetime;
try {
folderLifetime = DateUtil.getTimeInterval(policy.getLifetime());
} catch (ServiceException e) {
ZimbraLog.purge.error("Invalid purge lifetime set for folder %s.", folder.getPath(), e);
continue;
}
long folderTimeout = getOperationTimestampMillis() - folderLifetime;
int numPurged = Folder.purgeMessages(this, folder, folderTimeout, null, false, false, maxItemsPerFolder);
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
}
}
// Process any tags that have retention policy set.
for (Tag tag : getTagList(octxt)) {
RetentionPolicy rp = RetentionPolicyManager.getInstance().getCompleteRetentionPolicy(acct, tag.getRetentionPolicy());
for (Policy policy : rp.getPurgePolicy()) {
long tagLifetime;
try {
tagLifetime = DateUtil.getTimeInterval(policy.getLifetime());
} catch (ServiceException e) {
ZimbraLog.purge.error("Invalid purge lifetime set for tag %s.", tag.getName(), e);
continue;
}
long tagTimeout = getOperationTimestampMillis() - tagLifetime;
PendingDelete info = DbTag.getLeafNodes(this, tag, (int) (tagTimeout / 1000), maxItemsPerFolder);
MailItem.delete(this, info, null, false, false);
List<Integer> ids = info.itemIds.getIds(MailItem.Type.MESSAGE);
int numPurged = (ids == null ? 0 : ids.size());
purgedAll = updatePurgedAll(purgedAll, numPurged, maxItemsPerFolder);
}
}
// deletes have already been collected, so fetch the tombstones and write once
TypedIdList tombstones = collectPendingTombstones();
if (tombstones != null && !tombstones.isEmpty()) {
DbMailItem.writeTombstones(this, tombstones);
}
if (Threader.isHashPurgeAllowed(acct)) {
int convTimeoutSecs = (int) (LC.conversation_max_age_ms.longValue() / Constants.MILLIS_PER_SECOND);
DbMailItem.closeOldConversations(this, getOperationTimestamp() - convTimeoutSecs);
}
if (isTrackingSync()) {
int tombstoneTimeoutSecs = (int) (LC.tombstone_max_age_ms.longValue() / Constants.MILLIS_PER_SECOND);
int largestTrimmed = DbMailItem.purgeTombstones(this, getOperationTimestamp() - tombstoneTimeoutSecs);
if (largestTrimmed > getSyncCutoff()) {
currentChange().sync = largestTrimmed;
DbMailbox.setSyncCutoff(this, currentChange().sync);
}
}
// record the purge time.
if (purgedAll) {
DbMailbox.updateLastPurgeAt(this, System.currentTimeMillis());
}
success = true;
ZimbraLog.purge.debug("purgedAll=%b", purgedAll);
return purgedAll;
} finally {
endTransaction(success);
}
}
use of com.zimbra.soap.mail.type.Policy in project zm-mailbox by Zimbra.
the class TestPurge method testTagRetentionPolicy.
@Test
public void testTagRetentionPolicy() throws Exception {
ZMailbox mbox = TestUtil.getZMailbox(USER_NAME);
ZTag tag = mbox.createTag(NAME_PREFIX + "-testTagRetentionPolicy", null);
// Set user keep policy for folder.
TagActionSelector action = new TagActionSelector(tag.getId(), "retentionpolicy");
RetentionPolicy rp = new RetentionPolicy(Arrays.asList(Policy.newUserPolicy("30d")), null);
action.setRetentionPolicy(rp);
TagActionRequest req = new TagActionRequest(action);
TagActionResponse res = mbox.invokeJaxb(req);
Assert.assertEquals("retentionpolicy", res.getAction().getOperation());
Assert.assertEquals(tag.getId(), res.getAction().getSuccesses());
// Make sure that the retention policy is now set.
tag = mbox.getTagById(tag.getId());
rp = tag.getRetentionPolicy();
Assert.assertEquals(1, rp.getKeepPolicy().size());
Assert.assertEquals(0, rp.getPurgePolicy().size());
Policy p = rp.getKeepPolicy().get(0);
Assert.assertEquals(Policy.Type.USER, p.getType());
Assert.assertEquals("30d", p.getLifetime());
// Turn off keep policy and set purge policy.
action = new TagActionSelector(tag.getId(), "retentionpolicy");
rp = new RetentionPolicy(null, Arrays.asList(Policy.newUserPolicy("45d")));
action.setRetentionPolicy(rp);
req = new TagActionRequest(action);
res = mbox.invokeJaxb(req);
Assert.assertEquals("retentionpolicy", res.getAction().getOperation());
Assert.assertEquals(tag.getId(), res.getAction().getSuccesses());
// Make sure that the retention policy is now set.
tag = mbox.getTagById(tag.getId());
rp = tag.getRetentionPolicy();
Assert.assertEquals(0, rp.getKeepPolicy().size());
Assert.assertEquals(1, rp.getPurgePolicy().size());
p = rp.getPurgePolicy().get(0);
Assert.assertEquals(Policy.Type.USER, p.getType());
Assert.assertEquals("45d", p.getLifetime());
// Start a new session and make sure that the retention policy is still returned.
mbox = TestUtil.getZMailbox(USER_NAME);
tag = mbox.getTagById(tag.getId());
Assert.assertTrue(tag.getRetentionPolicy().isSet());
}
use of com.zimbra.soap.mail.type.Policy in project zm-mailbox by Zimbra.
the class TestPurge method testFolderRetentionPolicy.
/**
* Tests the SOAP API for setting retention policy on a folder.
*/
@Test
public void testFolderRetentionPolicy() throws Exception {
ZMailbox mbox = TestUtil.getZMailbox(USER_NAME);
ZFolder folder = TestUtil.createFolder(mbox, "/" + NAME_PREFIX + "-testFolderRetentionPolicy");
// Set user keep policy for folder.
FolderActionSelector action = new FolderActionSelector(folder.getId(), "retentionpolicy");
RetentionPolicy rp = new RetentionPolicy(Arrays.asList(Policy.newUserPolicy("30d")), null);
action.setRetentionPolicy(rp);
FolderActionRequest req = new FolderActionRequest(action);
FolderActionResponse res = mbox.invokeJaxb(req);
Assert.assertEquals("retentionpolicy", res.getAction().getOperation());
Assert.assertEquals(folder.getId(), res.getAction().getId());
// Make sure that the retention policy is now set.
folder = mbox.getFolderById(folder.getId());
rp = folder.getRetentionPolicy();
Assert.assertEquals(1, rp.getKeepPolicy().size());
Assert.assertEquals(0, rp.getPurgePolicy().size());
Policy p = rp.getKeepPolicy().get(0);
Assert.assertEquals(Policy.Type.USER, p.getType());
Assert.assertEquals("30d", p.getLifetime());
// Turn off keep policy and set purge policy.
action = new FolderActionSelector(folder.getId(), "retentionpolicy");
rp = new RetentionPolicy(null, Arrays.asList(Policy.newUserPolicy("45d")));
action.setRetentionPolicy(rp);
req = new FolderActionRequest(action);
res = mbox.invokeJaxb(req);
Assert.assertEquals("retentionpolicy", res.getAction().getOperation());
Assert.assertEquals(folder.getId(), res.getAction().getId());
// Make sure that the retention policy is now set.
folder = mbox.getFolderById(folder.getId());
rp = folder.getRetentionPolicy();
Assert.assertEquals(0, rp.getKeepPolicy().size());
Assert.assertEquals(1, rp.getPurgePolicy().size());
p = rp.getPurgePolicy().get(0);
Assert.assertEquals(Policy.Type.USER, p.getType());
Assert.assertEquals("45d", p.getLifetime());
// Start a new session and make sure that the retention policy is still returned.
mbox = TestUtil.getZMailbox(USER_NAME);
folder = mbox.getFolderById(folder.getId());
Assert.assertTrue(folder.getRetentionPolicy().isSet());
}
Aggregations