Skip to content

Commit

Permalink
JAMES-1615 SieveMailet should use SieveRepository to retrieve user ac…
Browse files Browse the repository at this point in the history
…tive Sieve script - contribued by Erwan Guyomarc'h

git-svn-id: https://svn.apache.org/repos/asf/james/project/trunk@1720166 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
chibenwa committed Dec 15, 2015
1 parent 35b1219 commit e170e8e
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 106 deletions.
23 changes: 23 additions & 0 deletions server/data/data-api/src/main/resources/sieverepository.xml
@@ -0,0 +1,23 @@
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->

<!-- See http://james.apache.org/server/3/config.html for usage -->
<sieverepository class="org.apache.james.sieverepository.file">
</sieverepository>
4 changes: 4 additions & 0 deletions server/mailet/mailets/pom.xml
Expand Up @@ -171,6 +171,10 @@
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
Expand Down
Expand Up @@ -31,6 +31,7 @@
import org.apache.james.domainlist.api.DomainList;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.user.api.UsersRepository;
import org.apache.mailet.Mail;
import org.apache.mailet.MailetConfig;
Expand All @@ -51,7 +52,12 @@ public class LocalDelivery extends GenericMailet {
private UsersRepository usersRepository;
private MailboxManager mailboxManager;
private DomainList domainList;
private FileSystem fileSystem;
private SieveRepository sieveRepository;

@Inject
public void setSieveRepository(SieveRepository sieveRepository) {
this.sieveRepository = sieveRepository;
}

@Inject
public void setRrt(org.apache.james.rrt.api.RecipientRewriteTable rrt) {
Expand All @@ -72,11 +78,6 @@ public void setMailboxManager(@Named("mailboxmanager") MailboxManager mailboxMan
public void setDomainList(DomainList domainList) {
this.domainList = domainList;
}

@Inject
public void setFileSystem(FileSystem fileSystem) {
this.fileSystem = fileSystem;
}

private SieveMailet sieveMailet; // Mailet that actually stores the message
private RecipientRewriteTable recipientRewriteTable; // Mailet that applies RecipientRewriteTable
Expand Down Expand Up @@ -116,14 +117,8 @@ public void init() throws MessagingException {
recipientRewriteTable.setRecipientRewriteTable(rrt);
recipientRewriteTable.init(getMailetConfig());

sieveMailet = new SieveMailet();
sieveMailet.setUsersRepository(usersRepository);
sieveMailet.setMailboxManager(mailboxManager);
sieveMailet.setFileSystem(fileSystem);
sieveMailet = new SieveMailet(usersRepository, mailboxManager, sieveRepository, "INBOX");
sieveMailet.init(new MailetConfig() {
/*
* @see org.apache.mailet.MailetConfig#getInitParameter(java.lang.String)
*/
public String getInitParameter(String name) {
if ("addDeliveryHeader".equals(name)) {
return "Delivered-To";
Expand All @@ -133,9 +128,7 @@ public String getInitParameter(String name) {
return getMailetConfig().getInitParameter(name);
}
}
/*
* @see org.apache.mailet.MailetConfig#getInitParameterNames()
*/

public Iterator<String> getInitParameterNames() {
IteratorChain c = new IteratorChain();
Collection<String> h = new ArrayList<String>();
Expand All @@ -145,24 +138,18 @@ public Iterator<String> getInitParameterNames() {
c.addIterator(h.iterator());
return c;
}
/*
* @see org.apache.mailet.MailetConfig#getMailetContext()
*/

public MailetContext getMailetContext() {
return getMailetConfig().getMailetContext();
}
/*
* @see org.apache.mailet.MailetConfig#getMailetName()
*/

public String getMailetName() {
return getMailetConfig().getMailetName();
}

});
// Override the default value of "quiet"
sieveMailet.setQuiet(getInitParameter("quiet", true));
sieveMailet.setFolder("INBOX");

}

}
Expand Up @@ -19,33 +19,31 @@

package org.apache.james.transport.mailets;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
import org.apache.james.sieverepository.api.exception.SieveRepositoryException;
import org.apache.james.sieverepository.api.exception.StorageException;
import org.apache.james.sieverepository.api.exception.UserNotFoundException;
import org.apache.jsieve.mailet.ResourceLocator;

import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.IOException;
import java.io.InputStream;

import org.apache.james.filesystem.api.FileSystem;
import org.apache.jsieve.mailet.ResourceLocator;

/**
* To maintain backwards compatibility with existing installations, this uses
* the old file based scheme.
* <p> The scripts are stored in the <code>sieve</code> sub directory of the application
* installation directory.
*/
public class ResourceLocatorImpl implements ResourceLocator {

private final boolean virtualHosting;

private FileSystem fileSystem = null;
private final SieveRepository sieveRepository;

public ResourceLocatorImpl(boolean virtualHosting, FileSystem fileSystem) {
public ResourceLocatorImpl(boolean virtualHosting, SieveRepository sieveRepository) {
this.virtualHosting = virtualHosting;
this.fileSystem = fileSystem;
this.sieveRepository = sieveRepository;
}

public InputStream get(String uri) throws IOException {
public InputStream get(String uri) throws SieveRepositoryException {
System.out.println(uri);
// Use the complete email address for finding the sieve file
uri = uri.substring(2);

Expand All @@ -56,15 +54,6 @@ public InputStream get(String uri) throws IOException {
username = uri.substring(0, uri.indexOf("@"));
}

// RFC 5228 permits extensions: .siv .sieve
String sieveFilePrefix = FileSystem.FILE_PROTOCOL + "sieve/" + username + ".";
File sieveFile;
try {
sieveFile = fileSystem.getFile(sieveFilePrefix + "sieve");
} catch (FileNotFoundException ex) {
sieveFile = fileSystem.getFile(sieveFilePrefix + "siv");
}
return new FileInputStream(sieveFile);
return sieveRepository.getActive(username);
}

}
Expand Up @@ -18,21 +18,15 @@
****************************************************************/
package org.apache.james.transport.mailets;

import java.util.Date;

import javax.inject.Inject;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.apache.james.core.MimeMessageInputStream;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.exception.BadCredentialsException;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxConstants;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.transport.util.MailetContextLog;
import org.apache.james.user.api.UsersRepository;
import org.apache.james.user.api.UsersRepositoryException;
Expand All @@ -42,49 +36,31 @@
import org.apache.mailet.MailAddress;
import org.apache.mailet.MailetConfig;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Date;

/**
* Contains resource bindings.
*/
public class SieveMailet extends SieveMailboxMailet implements Poster {
private UsersRepository usersRepos;
private MailboxManager mailboxManager;
private FileSystem fileSystem;
private String folder;
private final UsersRepository usersRepos;
private final MailboxManager mailboxManager;
private final SieveRepository sieveRepository;
private final String folder;

@Inject
public void setUsersRepository(UsersRepository usersRepos) {
public SieveMailet(UsersRepository usersRepos, MailboxManager mailboxManager, SieveRepository sieveRepository, String folder) {
this.usersRepos = usersRepos;
}

@Inject
public void setMailboxManager(MailboxManager mailboxManager) {
this.mailboxManager = mailboxManager;
}

@Inject
public void setFileSystem(FileSystem fileSystem) {
this.fileSystem = fileSystem;
}

public void setFolder(String folder) {
this.sieveRepository = sieveRepository;
this.folder = folder;
}

public SieveMailet() {
super();
}

/*
* (non-Javadoc)
*
* @see org.apache.jsieve.mailet.SieveMailboxMailet#init(org.apache.mailet.
* MailetConfig)
*/
@Override
public void init(MailetConfig config) throws MessagingException {
// ATM Fixed implementation
try {
setLocator(new ResourceLocatorImpl(usersRepos.supportVirtualHosting(), fileSystem));
setLocator(new ResourceLocatorImpl(usersRepos.supportVirtualHosting(), sieveRepository));
} catch (UsersRepositoryException e) {
throw new MessagingException("Unable to access UsersRepository", e);
}
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.apache.commons.collections.iterators.IteratorChain;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.user.api.UsersRepository;
import org.apache.mailet.Mail;
import org.apache.mailet.MailetConfig;
Expand All @@ -54,24 +55,22 @@
public class ToRecipientFolder extends GenericMailet {

private MailboxManager mailboxManager;

private SieveRepository sieveRepository;
private UsersRepository usersRepository;

private FileSystem fileSystem;

@Inject
public void setMailboxManager(@Named("mailboxmanager")MailboxManager mailboxManager) {
this.mailboxManager = mailboxManager;
}

@Inject
public void setUsersRepository(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
public void setSetUsersRepository(SieveRepository setUsersRepository) {
this.sieveRepository = setUsersRepository;
}

@Inject
public void setFileSystem(FileSystem fileSystem) {
this.fileSystem = fileSystem;
public void setUsersRepository(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}

private SieveMailet sieveMailet; // Mailet that actually stores the message
Expand All @@ -94,10 +93,7 @@ public void service(Mail mail) throws MessagingException {
@Override
public void init() throws MessagingException {
super.init();
sieveMailet = new SieveMailet();
sieveMailet.setUsersRepository(usersRepository);
sieveMailet.setMailboxManager(mailboxManager);
sieveMailet.setFileSystem(fileSystem);
sieveMailet = new SieveMailet(usersRepository, mailboxManager, sieveRepository, "INBOX");
sieveMailet.init(new MailetConfig() {
/*
* @see org.apache.mailet.MailetConfig#getInitParameter(java.lang.String)
Expand Down Expand Up @@ -139,7 +135,6 @@ public String getMailetName() {
});
// Override the default value of "quiet"
sieveMailet.setQuiet(getInitParameter("quiet", true));
sieveMailet.setFolder(getInitParameter("folder", "INBOX"));
}

/* (non-Javadoc)
Expand Down
@@ -0,0 +1,57 @@
/****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF licenses this file *
* to you under the Apache License, Version 2.0 (the *
* "License"); you may not use this file except in compliance *
* with the License. You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, *
* software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
* KIND, either express or implied. See the License for the *
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/

package org.apache.james.transport.mailets;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
import org.junit.Before;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class ResourceLocatorImplTest {

private SieveRepository sieveRepository;
private ResourceLocatorImpl resourceLocator;

@Before
public void setUp() {
sieveRepository = mock(SieveRepository.class);
resourceLocator = new ResourceLocatorImpl(true, sieveRepository);
}

@Test(expected = ScriptNotFoundException.class)
public void resourceLocatorImplShouldPropagateScriptNotFound() throws Exception {
when(sieveRepository.getActive("receiver@localhost")).thenThrow(new ScriptNotFoundException());
resourceLocator.get("//receiver@localhost/sieve");
}

@Test
public void resourceLocatorImplShouldWork() throws Exception {
InputStream inputStream = new ByteArrayInputStream(new byte[0]);
when(sieveRepository.getActive("receiver@localhost")).thenReturn(inputStream);
assertThat(resourceLocator.get("//receiver@localhost/sieve")).isEqualTo(inputStream);
}
}

0 comments on commit e170e8e

Please sign in to comment.