Author: btellier
Date: Thu Dec 17 15:08:12 2015
New Revision: 1720590
URL: http://svn.apache.org/viewvc?rev=1720590&view=rev
Log:
JAMES-1618 Simplify error handling
Added:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ArgumentParser.java
Removed:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/LineToCore.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/LineToCoreToLine.java
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/
Modified:
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Authenticate.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/CheckScript.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/DeleteScript.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetActive.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetScript.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/HaveSpace.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/ListScripts.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/PutScript.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/RenameScript.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/SetActive.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Unauthenticate.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ManageSieveProcessor.java
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
Modified:
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
(original)
+++
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
Thu Dec 17 15:08:12 2015
@@ -21,8 +21,7 @@ package org.apache.james.mpt.host;
import org.apache.james.managesieve.core.CoreProcessor;
import org.apache.james.managesieve.jsieve.Parser;
-import org.apache.james.managesieve.transcode.LineToCore;
-import org.apache.james.managesieve.transcode.LineToCoreToLine;
+import org.apache.james.managesieve.transcode.ArgumentParser;
import org.apache.james.managesieve.transcode.ManageSieveProcessor;
import org.apache.james.mpt.api.Continuation;
import org.apache.james.mpt.api.Session;
@@ -39,7 +38,7 @@ public abstract class JamesManageSieveHo
public JamesManageSieveHostSystem(UsersRepository usersRepository,
SieveRepository sieveRepository) throws Exception {
this.usersRepository = usersRepository;
this.sieveRepository = sieveRepository;
- this.processor = new ManageSieveProcessor(new LineToCoreToLine(new
LineToCore(new CoreProcessor(sieveRepository, usersRepository, new Parser(new
ConfigurationManager())))));
+ this.processor = new ManageSieveProcessor(new ArgumentParser(new
CoreProcessor(sieveRepository, usersRepository, new Parser(new
ConfigurationManager()))));
}
@Override
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Authenticate.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Authenticate.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Authenticate.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Authenticate.java
Thu Dec 17 15:08:12 2015
@@ -20,9 +20,7 @@
package org.apache.james.managesieve.api.commands;
-import org.apache.james.managesieve.api.AuthenticationException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.managesieve.api.SyntaxException;
import org.apache.james.managesieve.api.UnknownSaslMechanism;
@@ -44,7 +42,7 @@ public interface Authenticate {
}
}
- String chooseMechanism(Session session, String mechanism) throws
AuthenticationException, UnknownSaslMechanism, SyntaxException;
+ String chooseMechanism(Session session, String mechanism);
- String authenticate(Session session, String suppliedData) throws
AuthenticationException, SyntaxException;
+ String authenticate(Session session, String suppliedData);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
Thu Dec 17 15:08:12 2015
@@ -22,11 +22,9 @@ package org.apache.james.managesieve.api
import org.apache.james.managesieve.api.Session;
-import java.util.Map;
-
public interface Capability {
- Map<Capabilities, String> capability(Session session);
+ String capability(Session session);
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.4>RFC 5804
CAPABILITY Command</a>
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/CheckScript.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/CheckScript.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/CheckScript.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/CheckScript.java
Thu Dec 17 15:08:12 2015
@@ -20,17 +20,13 @@
package org.apache.james.managesieve.api.commands;
-import java.util.List;
-
-import org.apache.james.managesieve.api.AuthenticationRequiredException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.managesieve.api.SyntaxException;
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.12>RFC 5804
CHECKSCRIPT Command</a>
*/
public interface CheckScript {
- List<String> checkScript(Session session, String content) throws
AuthenticationRequiredException, SyntaxException;
+ String checkScript(Session session, String content);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/DeleteScript.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/DeleteScript.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/DeleteScript.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/DeleteScript.java
Thu Dec 17 15:08:12 2015
@@ -20,16 +20,13 @@
package org.apache.james.managesieve.api.commands;
-import org.apache.james.managesieve.api.AuthenticationRequiredException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.sieverepository.api.exception.IsActiveException;
-import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.10>RFC 5804
DELETESCRIPT Command</a>
*/
public interface DeleteScript {
- void deleteScript(Session session, String name) throws
AuthenticationRequiredException, ScriptNotFoundException, IsActiveException;
+ String deleteScript(Session session, String name);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetActive.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetActive.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetActive.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetActive.java
Thu Dec 17 15:08:12 2015
@@ -33,6 +33,6 @@ import org.apache.james.sieverepository.
*/
public interface GetActive {
- String getActive(Session session) throws AuthenticationRequiredException,
ScriptNotFoundException, StorageException;
+ String getActive(Session session);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetScript.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetScript.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetScript.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetScript.java
Thu Dec 17 15:08:12 2015
@@ -20,16 +20,13 @@
package org.apache.james.managesieve.api.commands;
-import org.apache.james.managesieve.api.AuthenticationRequiredException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
-import org.apache.james.sieverepository.api.exception.StorageException;
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.9>RFC 5804
GETSCRIPT Command</a>
*/
public interface GetScript {
- String getScript(Session session, String name) throws
AuthenticationRequiredException, ScriptNotFoundException, StorageException;
+ String getScript(Session session, String name);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/HaveSpace.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/HaveSpace.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/HaveSpace.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/HaveSpace.java
Thu Dec 17 15:08:12 2015
@@ -20,17 +20,13 @@
package org.apache.james.managesieve.api.commands;
-import org.apache.james.managesieve.api.AuthenticationRequiredException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.sieverepository.api.exception.QuotaExceededException;
-import org.apache.james.sieverepository.api.exception.StorageException;
-import org.apache.james.sieverepository.api.exception.UserNotFoundException;
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.5>RFC 5804
HAVESPACE Command</a>
*/
public interface HaveSpace {
- void haveSpace(Session session, String name, long size) throws
AuthenticationRequiredException, QuotaExceededException, UserNotFoundException,
StorageException;
+ String haveSpace(Session session, String name, long size);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/ListScripts.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/ListScripts.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/ListScripts.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/ListScripts.java
Thu Dec 17 15:08:12 2015
@@ -20,17 +20,13 @@
package org.apache.james.managesieve.api.commands;
-import java.util.List;
-
-import org.apache.james.managesieve.api.AuthenticationRequiredException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.sieverepository.api.ScriptSummary;
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.7>RFC 5804
LISTSCRIPTS Command</a>
*/
public interface ListScripts {
- List<ScriptSummary> listScripts(Session session) throws
AuthenticationRequiredException;
+ String listScripts(Session session);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/PutScript.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/PutScript.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/PutScript.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/PutScript.java
Thu Dec 17 15:08:12 2015
@@ -20,18 +20,13 @@
package org.apache.james.managesieve.api.commands;
-import java.util.List;
-
-import org.apache.james.managesieve.api.AuthenticationRequiredException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.managesieve.api.SyntaxException;
-import org.apache.james.sieverepository.api.exception.QuotaExceededException;
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.6>RFC 5804
PUTSCRIPT Command</a>
*/
public interface PutScript {
- List<String> putScript(Session session, String name, String content)
throws AuthenticationRequiredException, SyntaxException, QuotaExceededException;
+ String putScript(Session session, String name, String content);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/RenameScript.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/RenameScript.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/RenameScript.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/RenameScript.java
Thu Dec 17 15:08:12 2015
@@ -20,16 +20,13 @@
package org.apache.james.managesieve.api.commands;
-import org.apache.james.managesieve.api.AuthenticationRequiredException;
import org.apache.james.managesieve.api.Session;
-import org.apache.james.sieverepository.api.exception.DuplicateException;
-import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.11>RFC 5804
RENAMESCRIPT Command</a>
*/
public interface RenameScript {
- void renameScript(Session session, String oldName, String newName) throws
AuthenticationRequiredException, ScriptNotFoundException, DuplicateException;
+ String renameScript(Session session, String oldName, String newName);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/SetActive.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/SetActive.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/SetActive.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/SetActive.java
Thu Dec 17 15:08:12 2015
@@ -31,6 +31,6 @@ import org.apache.james.sieverepository.
*/
public interface SetActive {
- void setActive(Session session, String name) throws
AuthenticationRequiredException, ScriptNotFoundException,
UserNotFoundException, StorageException;
+ String setActive(Session session, String name);
}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Unauthenticate.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Unauthenticate.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Unauthenticate.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Unauthenticate.java
Thu Dec 17 15:08:12 2015
@@ -22,7 +22,6 @@ package org.apache.james.managesieve.api
import org.apache.james.managesieve.api.Session;
-
/**
* @see <a href=http://tools.ietf.org/html/rfc5804#section-2.14.1>RFC 5804
UNAUTHENTICATE Command</a>
*/
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
Thu Dec 17 15:08:12 2015
@@ -22,15 +22,16 @@ package org.apache.james.managesieve.cor
import com.google.common.base.Function;
import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.base.Throwables;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.io.IOUtils;
import org.apache.james.managesieve.api.AuthenticationException;
import org.apache.james.managesieve.api.AuthenticationProcessor;
import org.apache.james.managesieve.api.AuthenticationRequiredException;
-import org.apache.james.managesieve.api.ManageSieveRuntimeException;
import org.apache.james.managesieve.api.Session;
import org.apache.james.managesieve.api.SessionTerminatedException;
import org.apache.james.managesieve.api.SieveParser;
@@ -43,7 +44,6 @@ import org.apache.james.sieverepository.
import org.apache.james.sieverepository.api.exception.IsActiveException;
import org.apache.james.sieverepository.api.exception.QuotaExceededException;
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.james.user.api.UsersRepository;
@@ -76,7 +76,16 @@ public class CoreProcessor implements Co
}
@Override
- public Map<Capabilities, String> capability(Session session) {
+ public String capability(Session session) {
+ return Joiner.on("\r\n").join(
+ Iterables.transform(computeCapabilityMap(session).entrySet(), new
Function<Map.Entry<Capabilities,String>, String>() {
+ public String apply(Map.Entry<Capabilities, String>
capabilitiesStringEntry) {
+ return
computeCapabilityEntryString(capabilitiesStringEntry);
+ }
+ })) + "\r\nOK";
+ }
+
+ private Map<Capabilities, String> computeCapabilityMap(Session session) {
Map<Capabilities, String> capabilities =
Maps.newHashMap(capabilitiesBase);
if (session.isAuthenticated()) {
capabilities.put(Capabilities.OWNER, session.getUser());
@@ -84,96 +93,188 @@ public class CoreProcessor implements Co
return capabilities;
}
+ private String computeCapabilityEntryString(Map.Entry<Capabilities,
String> entry) {
+ return "\"" + entry.getKey().toString() + "\"" +
+ ( entry.getValue() == null ? "" : " \"" + entry.getValue() + "\""
);
+ }
+
@Override
- public List<String> checkScript(Session session, String content) throws
AuthenticationRequiredException, SyntaxException {
- authenticationCheck(session);
- return parser.parse(content);
+ public String checkScript(Session session, String content) {
+ try {
+ authenticationCheck(session);
+ return manageWarnings(parser.parse(content));
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (SyntaxException ex) {
+ return sanitizeString("NO \"Syntax Error: " + ex.getMessage() +
"\"");
+ }
+ }
+
+ private String manageWarnings(List<String> warnings) {
+ if (!warnings.isEmpty()) {
+ return "OK (WARNINGS) " + Joiner.on('
').join(Iterables.transform(warnings, new Function<String, String>() {
+ public String apply(String s) {
+ return '\"' + s + '"';
+ }
+ }));
+ } else {
+ return "OK";
+ }
+ }
+
+ private String sanitizeString(String message) {
+ return Joiner.on("\r\n").join(Splitter.on('\n').split(message));
}
@Override
- public void deleteScript(Session session, String name) throws
AuthenticationRequiredException, ScriptNotFoundException, IsActiveException {
- authenticationCheck(session);
+ public String deleteScript(Session session, String name) {
try {
+ authenticationCheck(session);
sieveRepository.deleteScript(session.getUser(), name);
- } catch (StorageException ex) {
- throw new ManageSieveRuntimeException(ex);
- } catch (UserNotFoundException ex) {
- throw new ManageSieveRuntimeException(ex);
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (ScriptNotFoundException ex) {
+ return "NO (NONEXISTENT) \"There is no script by that name\"";
+ } catch (IsActiveException ex) {
+ return "NO (ACTIVE) \"You may not delete an active script\"";
+ } catch (UserNotFoundException e) {
+ return "NO : Invalid user " + session.getUser();
+ } catch (StorageException e) {
+ return "NO : Storage Exception : " + e.getMessage();
}
+ return "OK";
}
@Override
- public String getScript(Session session, String name) throws
AuthenticationRequiredException, ScriptNotFoundException, StorageException {
- authenticationCheck(session);
+ public String getScript(Session session, String name) {
try {
+ authenticationCheck(session);
String scriptContent =
IOUtils.toString(sieveRepository.getScript(session.getUser(), name));
- sieveRepository.getScript(session.getUser(), name);
- return "{" + scriptContent.length() + "}" + "\r\n" + scriptContent;
- } catch (UserNotFoundException ex) {
- throw new ManageSieveRuntimeException(ex);
- } catch (IOException ex) {
- // Unable to read script InputStream
- throw new ManageSieveRuntimeException(ex);
+ return "{" + scriptContent.length() + "}" + "\r\n" + scriptContent
+ "\r\nOK";
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (ScriptNotFoundException ex) {
+ return "NO (NONEXISTENT) \"There is no script by that name\"";
+ } catch (StorageException ex) {
+ return "NO \"" + ex.getMessage() + "\"";
+ } catch (UserNotFoundException e) {
+ return "NO : Invalid user " + session.getUser();
+ } catch (IOException e) {
+ return "NO \"" + e.getMessage() + "\"";
}
}
@Override
- public void haveSpace(Session session, String name, long size) throws
AuthenticationRequiredException, QuotaExceededException, UserNotFoundException,
StorageException {
- authenticationCheck(session);
- sieveRepository.haveSpace(session.getUser(), name, size);
+ public String haveSpace(Session session, String name, long size) {
+ try {
+ authenticationCheck(session);
+ sieveRepository.haveSpace(session.getUser(), name, size);
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (QuotaExceededException ex) {
+ return "NO (QUOTA/MAXSIZE) \"Quota exceeded\"";
+ } catch (UserNotFoundException e) {
+ return "NO user not found : " + session.getUser();
+ } catch (StorageException e) {
+ return "NO storage exception : " + e.getMessage();
+ }
+ return "OK";
}
@Override
- public List<ScriptSummary> listScripts(Session session) throws
AuthenticationRequiredException {
- authenticationCheck(session);
+ public String listScripts(Session session) {
try {
- return sieveRepository.listScripts(session.getUser());
- } catch (SieveRepositoryException ex) {
- throw new ManageSieveRuntimeException(ex);
+ authenticationCheck(session);
+ String list = Joiner.on("\r\n").join(
+
Iterables.transform(sieveRepository.listScripts(session.getUser()), new
Function<ScriptSummary, String>() {
+ public String apply(ScriptSummary scriptSummary) {
+ return '"' + scriptSummary.getName() + '"' +
(scriptSummary.isActive() ? " ACTIVE" : "");
+ }
+ }));
+ if (Strings.isNullOrEmpty(list)) {
+ return "OK";
+ } else {
+ return list + "\r\nOK";
+ }
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (UserNotFoundException e) {
+ return "NO user not found : " + session.getUser();
+ } catch (StorageException e) {
+ return "NO storage exception : " + e.getMessage();
}
}
@Override
- public List<String> putScript(Session session, String name, String
content) throws AuthenticationRequiredException, SyntaxException,
QuotaExceededException {
- authenticationCheck(session);
- List<String> warnings = parser.parse(content);
+ public String putScript(Session session, String name, String content) {
try {
+ authenticationCheck(session);
sieveRepository.putScript(session.getUser(), name, content);
- } catch (UserNotFoundException ex) {
- throw new ManageSieveRuntimeException(ex);
- } catch (StorageException ex) {
- throw new ManageSieveRuntimeException(ex);
+ return manageWarnings(parser.parse(content));
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (SyntaxException ex) {
+ return Joiner.on("\r\n").join(Splitter.on('\n').split("NO \"Syntax
Error: " + ex.getMessage() + "\""));
+ } catch (QuotaExceededException ex) {
+ return "NO (QUOTA/MAXSIZE) \"Quota exceeded\"";
+ } catch (UserNotFoundException e) {
+ return "NO user not found : " + session.getUser();
+ } catch (StorageException e) {
+ return "NO storage exception : " + e.getMessage();
}
- return warnings;
}
@Override
- public void renameScript(Session session, String oldName, String newName)
throws AuthenticationRequiredException, ScriptNotFoundException,
DuplicateException {
- authenticationCheck(session);
+ public String renameScript(Session session, String oldName, String
newName) {
try {
+ authenticationCheck(session);
sieveRepository.renameScript(session.getUser(), oldName, newName);
- } catch (UserNotFoundException ex) {
- throw new ManageSieveRuntimeException(ex);
- } catch (StorageException ex) {
- throw new ManageSieveRuntimeException(ex);
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (ScriptNotFoundException ex) {
+ return "NO (NONEXISTENT) \"There is no script by that name\"";
+ } catch (DuplicateException ex) {
+ return "NO (ALREADYEXISTS) \"A script with that name already
exists\"";
+ } catch (UserNotFoundException e) {
+ return "NO user not found : " + session.getUser();
+ } catch (StorageException e) {
+ return "NO storage exception : " + e.getMessage();
}
+ return "OK";
}
@Override
- public void setActive(Session session, String name) throws
AuthenticationRequiredException, ScriptNotFoundException,
UserNotFoundException, StorageException {
- authenticationCheck(session);
- sieveRepository.setActive(session.getUser(), name);
+ public String setActive(Session session, String name) {
+ try {
+ authenticationCheck(session);
+ sieveRepository.setActive(session.getUser(), name);
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (ScriptNotFoundException ex) {
+ return "NO (NONEXISTENT) \"There is no script by that name\"";
+ } catch (UserNotFoundException e) {
+ return "NO : User not found";
+ } catch (StorageException e) {
+ return "NO : Storage exception : " + e.getMessage();
+ }
+ return "OK";
}
@Override
- public String getActive(Session session) throws
AuthenticationRequiredException, ScriptNotFoundException, StorageException {
- authenticationCheck(session);
+ public String getActive(Session session) {
try {
- return
IOUtils.toString(sieveRepository.getActive(session.getUser()));
- } catch (UserNotFoundException ex) {
- throw new ManageSieveRuntimeException(ex);
+ authenticationCheck(session);
+ return
IOUtils.toString(sieveRepository.getActive(session.getUser())) + "\r\nOK";
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (ScriptNotFoundException ex) {
+ return "NO (NONEXISTENT) \"" + ex.getMessage() + "\"";
+ } catch (StorageException ex) {
+ return "NO \"" + ex.getMessage() + "\"";
+ } catch (UserNotFoundException e) {
+ return "NO : User not found";
} catch (IOException e) {
- throw new ManageSieveRuntimeException(e);
+ return "NO \"" + e.getMessage() + "\"";
}
}
@@ -186,32 +287,42 @@ public class CoreProcessor implements Co
}
@Override
- public String chooseMechanism(Session session, String mechanism) throws
AuthenticationException, UnknownSaslMechanism, SyntaxException {
- if (Strings.isNullOrEmpty(mechanism)) {
- throw new SyntaxException("You must specify a SASL mechanism as an
argument of AUTHENTICATE command");
- }
- String unquotedMechanism = unquotaIfNeeded(mechanism);
- SupportedMechanism supportedMechanism =
SupportedMechanism.retrieveMechanism(unquotedMechanism);
-
- session.setChoosedAuthenticationMechanism(supportedMechanism);
- session.setState(Session.State.AUTHENTICATION_IN_PROGRESS);
- AuthenticationProcessor authenticationProcessor =
authenticationProcessorMap.get(supportedMechanism);
- return authenticationProcessor.initialServerResponse(session);
+ public String chooseMechanism(Session session, String mechanism) {
+ try {
+ if (Strings.isNullOrEmpty(mechanism)) {
+ return "NO ManageSieve syntax is incorrect : You must specify
a SASL mechanism as an argument of AUTHENTICATE command";
+ }
+ String unquotedMechanism = unquotaIfNeeded(mechanism);
+ SupportedMechanism supportedMechanism =
SupportedMechanism.retrieveMechanism(unquotedMechanism);
+
+ session.setChoosedAuthenticationMechanism(supportedMechanism);
+ session.setState(Session.State.AUTHENTICATION_IN_PROGRESS);
+ AuthenticationProcessor authenticationProcessor =
authenticationProcessorMap.get(supportedMechanism);
+ return authenticationProcessor.initialServerResponse(session);
+ } catch (UnknownSaslMechanism unknownSaslMechanism) {
+ return "NO " + unknownSaslMechanism.getMessage();
+ }
}
@Override
- public String authenticate(Session session, String suppliedData) throws
AuthenticationException, SyntaxException {
- SupportedMechanism currentAuthenticationMechanism =
session.getChoosedAuthenticationMechanism();
- AuthenticationProcessor authenticationProcessor =
authenticationProcessorMap.get(currentAuthenticationMechanism);
- String authenticatedUsername =
authenticationProcessor.isAuthenticationSuccesfull(session, suppliedData);
- if (authenticatedUsername != null) {
- session.setUser(authenticatedUsername);
- session.setState(Session.State.AUTHENTICATED);
- return "OK authentication successfull";
- } else {
- session.setState(Session.State.UNAUTHENTICATED);
- session.setUser(null);
- return "NO authentication failed";
+ public String authenticate(Session session, String suppliedData) {
+ try {
+ SupportedMechanism currentAuthenticationMechanism =
session.getChoosedAuthenticationMechanism();
+ AuthenticationProcessor authenticationProcessor =
authenticationProcessorMap.get(currentAuthenticationMechanism);
+ String authenticatedUsername =
authenticationProcessor.isAuthenticationSuccesfull(session, suppliedData);
+ if (authenticatedUsername != null) {
+ session.setUser(authenticatedUsername);
+ session.setState(Session.State.AUTHENTICATED);
+ return "OK authentication successfull";
+ } else {
+ session.setState(Session.State.UNAUTHENTICATED);
+ session.setUser(null);
+ return "NO authentication failed";
+ }
+ } catch (AuthenticationException e) {
+ return "NO Authentication failed with " + e.getCause().getClass()
+ " : " + e.getMessage();
+ } catch (SyntaxException e) {
+ return "NO ManageSieve syntax is incorrect : " + e.getMessage();
}
}
Added:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ArgumentParser.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ArgumentParser.java?rev=1720590&view=auto
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ArgumentParser.java
(added)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ArgumentParser.java
Thu Dec 17 15:08:12 2015
@@ -0,0 +1,228 @@
+/*
+ * 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.managesieve.transcode;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import org.apache.james.managesieve.api.ArgumentException;
+import org.apache.james.managesieve.api.Session;
+import org.apache.james.managesieve.api.SessionTerminatedException;
+import org.apache.james.managesieve.api.commands.CoreCommands;
+import org.apache.james.managesieve.util.ParserUtils;
+
+import java.util.InputMismatchException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Scanner;
+
+/**
+ * Parses the user input and calls the underlying command processor
+ */
+public class ArgumentParser {
+
+ private final CoreCommands core;
+
+ public ArgumentParser(CoreCommands core) {
+ this.core = core;
+ }
+
+ public String capability(Session session, String args) {
+ if (!args.trim().isEmpty()) {
+ return "NO \"Too many arguments: " + args + "\"";
+ }
+ return core.capability(session);
+ }
+
+ public String noop(String args) {
+ return core.noop(args);
+ }
+
+ public String unauthenticate(Session session, String args) {
+ if (Strings.isNullOrEmpty(args)) {
+ return core.unauthenticate(session);
+ } else {
+ return "NO UNAUTHENTICATE do not take arguments";
+ }
+ }
+
+ public void logout() throws SessionTerminatedException {
+ core.logout();
+ }
+
+ public String chooseMechanism(Session session, String mechanism) {
+ return core.chooseMechanism(session, mechanism);
+ }
+
+ public String authenticate(Session session, String suppliedData) {
+ return core.authenticate(session, suppliedData);
+ }
+
+ public String deleteScript(Session session, String args) {
+ String scriptName = ParserUtils.getScriptName(args);
+ if (null == scriptName || scriptName.isEmpty()) {
+ return "NO \"Missing argument: script name\"";
+ }
+
+ Scanner scanner = new
Scanner(args.substring(scriptName.length()).trim()).useDelimiter("\\A");
+ if (scanner.hasNext()) {
+ return "NO \"Too many arguments: " + scanner.next() + "\"";
+ }
+ return core.deleteScript(session, ParserUtils.unquote(scriptName));
+ }
+
+ public String getScript(Session session, String args) {
+ String scriptName = ParserUtils.getScriptName(args);
+ if (scriptName == null || scriptName.isEmpty()) {
+ return "NO \"Missing argument: script name\"";
+ }
+ Scanner scanner = new
Scanner(args.substring(scriptName.length()).trim()).useDelimiter("\\A");
+ if (scanner.hasNext()) {
+ return "NO \"Too many arguments: " + scanner.next() + "\"";
+ }
+ return core.getScript(session, ParserUtils.unquote(scriptName));
+ }
+
+ public String checkScript(Session session, String args) {
+ Iterator<String> firstLine =
Splitter.on("\r\n").split(args.trim()).iterator();
+ Iterator<String> arguments = Splitter.on('
').split(firstLine.next().trim()).iterator();
+
+ if (! arguments.hasNext()) {
+ return "NO : Missing argument: script size";
+ } else {
+ try {
+ ParserUtils.getSize(arguments.next());
+ } catch (ArgumentException e) {
+ return "NO \"" + e.getMessage() + "\"";
+ }
+ }
+ if (arguments.hasNext()) {
+ return "NO \"Extra arguments not supported\"";
+ } else {
+ String content = Joiner.on("\r\n").join(firstLine);
+ if (Strings.isNullOrEmpty(content)) {
+ return "NO \"Missing argument: script content\"";
+ }
+ return core.checkScript(session, content);
+ }
+ }
+
+ public String haveSpace(Session session, String args) {
+ String scriptName = ParserUtils.getScriptName(args);
+ if (null == scriptName || scriptName.isEmpty()) {
+ return "NO \"Missing argument: script name\"";
+ }
+ Scanner scanner = new
Scanner(args.substring(scriptName.length()).trim());
+ long size;
+ try {
+ size = scanner.nextLong();
+ } catch (InputMismatchException ex) {
+ return "NO \"Invalid argument: script size\"";
+ } catch (NoSuchElementException ex) {
+ return "NO \"Missing argument: script size\"";
+ }
+ scanner.useDelimiter("\\A");
+ if (scanner.hasNext()) {
+ return "NO \"Too many arguments: " + scanner.next().trim() + "\"";
+ }
+ return core.haveSpace(session, ParserUtils.unquote(scriptName), size);
+ }
+
+ public String listScripts(Session session, String args) {
+ if (!args.trim().isEmpty()) {
+ return "NO \"Too many arguments: " + args + "\"";
+ }
+ return core.listScripts(session);
+ }
+
+ public String putScript(Session session, String args) {
+ Iterator<String> firstLine =
Splitter.on("\r\n").split(args.trim()).iterator();
+ Iterator<String> arguments = Splitter.on('
').split(firstLine.next().trim()).iterator();
+
+ String scriptName;
+ if (! arguments.hasNext()) {
+ return "NO \"Missing argument: script name\"";
+ } else {
+ scriptName = ParserUtils.unquote(arguments.next());
+ if (Strings.isNullOrEmpty(scriptName)) {
+ return "NO \"Missing argument: script name\"";
+ }
+ }
+ if (! arguments.hasNext()) {
+ return "NO \"Missing argument: script size\"";
+ } else {
+ try {
+ ParserUtils.getSize(arguments.next());
+ } catch (ArgumentException e) {
+ return "NO \""+ e.getMessage() + "\"";
+ }
+ }
+ if (arguments.hasNext()) {
+ return "NO \"Extra arguments not supported\"";
+ } else {
+ String content = Joiner.on("\r\n").join(firstLine);
+ return core.putScript(session, ParserUtils.unquote(scriptName),
content);
+ }
+ }
+
+ public String renameScript(Session session, String args) {
+ String oldName = ParserUtils.getScriptName(args);
+ if (null == oldName || oldName.isEmpty()) {
+ return "NO \"Missing argument: old script name\"";
+ }
+
+ String newName =
ParserUtils.getScriptName(args.substring(oldName.length()));
+ if (null == newName || newName.isEmpty()) {
+ return "NO \"Missing argument: new script name\"";
+ }
+
+ Scanner scanner = new Scanner(args.substring(oldName.length() + 1 +
newName.length()).trim()).useDelimiter("\\A");
+ if (scanner.hasNext()) {
+ return "NO \"Too many arguments: " + scanner.next() + "\"";
+ }
+ return core.renameScript(session, ParserUtils.unquote(oldName),
ParserUtils.unquote(newName));
+ }
+
+ public String setActive(Session session, String args) {
+ String scriptName = ParserUtils.getScriptName(args);
+ if (null == scriptName || scriptName.isEmpty()) {
+ return "NO \"Missing argument: script name\"";
+ }
+ Scanner scanner = new
Scanner(args.substring(scriptName.length()).trim()).useDelimiter("\\A");
+ if (scanner.hasNext()) {
+ return "NO \"Too many arguments: " + scanner.next() + "\"";
+ }
+ return core.setActive(session, ParserUtils.unquote(scriptName));
+ }
+
+ public String getActive(Session session, String args) {
+ Scanner scanner = new Scanner(args.trim()).useDelimiter("\\A");
+ if (scanner.hasNext()) {
+ return "NO \"Too many arguments: " + scanner.next() + "\"";
+ }
+ return core.getActive(session);
+ }
+
+ public String startTLS(Session session) {
+ return core.startTLS(session);
+ }
+
+}
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ManageSieveProcessor.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ManageSieveProcessor.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ManageSieveProcessor.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ManageSieveProcessor.java
Thu Dec 17 15:08:12 2015
@@ -43,10 +43,10 @@ public class ManageSieveProcessor {
public static final String STARTTLS = "STARTTLS";
public static final String UNAUTHENTICATE = "UNAUTHENTICATE";
- private final LineToCoreToLine lineToCoreToLine;
+ private final ArgumentParser argumentParser;
- public ManageSieveProcessor(LineToCoreToLine lineToCoreToLine) {
- this.lineToCoreToLine = lineToCoreToLine;
+ public ManageSieveProcessor(ArgumentParser argumentParser) {
+ this.argumentParser = argumentParser;
}
public String handleRequest(Session session, String request) throws
ManageSieveException, SieveRepositoryException {
@@ -82,38 +82,38 @@ public class ManageSieveProcessor {
private String matchCommandWithImplementation(Session session, String
arguments, String command) throws SessionTerminatedException {
if (session.getState() == Session.State.AUTHENTICATION_IN_PROGRESS) {
- return lineToCoreToLine.authenticate(session, arguments);
+ return argumentParser.authenticate(session, arguments);
}
if (command.equals(AUTHENTICATE)) {
- return lineToCoreToLine.chooseMechanism(session, arguments);
+ return argumentParser.chooseMechanism(session, arguments);
} else if (command.equals(CAPABILITY)) {
- return lineToCoreToLine.capability(session, arguments);
+ return argumentParser.capability(session, arguments);
} else if (command.equals(CHECKSCRIPT)) {
- return lineToCoreToLine.checkScript(session, arguments);
+ return argumentParser.checkScript(session, arguments);
} else if (command.equals(DELETESCRIPT)) {
- return lineToCoreToLine.deleteScript(session, arguments);
+ return argumentParser.deleteScript(session, arguments);
} else if (command.equals(GETACTIVE)) {
- return lineToCoreToLine.getActive(session, arguments);
+ return argumentParser.getActive(session, arguments);
} else if (command.equals(GETSCRIPT)) {
- return lineToCoreToLine.getScript(session, arguments);
+ return argumentParser.getScript(session, arguments);
} else if (command.equals(HAVESPACE)) {
- return lineToCoreToLine.haveSpace(session, arguments);
+ return argumentParser.haveSpace(session, arguments);
} else if (command.equals(LISTSCRIPTS)) {
- return lineToCoreToLine.listScripts(session, arguments);
+ return argumentParser.listScripts(session, arguments);
} else if (command.equals(LOGOUT)) {
- lineToCoreToLine.logout();
+ argumentParser.logout();
} else if (command.equals(NOOP)) {
- return lineToCoreToLine.noop(arguments);
+ return argumentParser.noop(arguments);
} else if (command.equals(PUTSCRIPT)) {
- return lineToCoreToLine.putScript(session, arguments);
+ return argumentParser.putScript(session, arguments);
} else if (command.equals(RENAMESCRIPT)) {
- return lineToCoreToLine.renameScript(session, arguments);
+ return argumentParser.renameScript(session, arguments);
} else if (command.equals(SETACTIVE)) {
- return lineToCoreToLine.setActive(session, arguments);
+ return argumentParser.setActive(session, arguments);
} else if (command.equals(STARTTLS)) {
- return lineToCoreToLine.startTLS(session);
+ return argumentParser.startTLS(session);
} else if (command.equals(UNAUTHENTICATE)) {
- return lineToCoreToLine.unauthenticate(session, arguments);
+ return argumentParser.unauthenticate(session, arguments);
}
return "NO unknown " + command + " command";
}
Modified:
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java?rev=1720590&r1=1720589&r2=1720590&view=diff
==============================================================================
---
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
(original)
+++
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
Thu Dec 17 15:08:12 2015
@@ -34,8 +34,7 @@ import com.google.common.collect.Lists;
import org.apache.james.managesieve.api.Session;
import org.apache.james.managesieve.api.SieveParser;
import org.apache.james.managesieve.core.CoreProcessor;
-import org.apache.james.managesieve.transcode.LineToCore;
-import org.apache.james.managesieve.transcode.LineToCoreToLine;
+import org.apache.james.managesieve.transcode.ArgumentParser;
import org.apache.james.managesieve.transcode.ManageSieveProcessor;
import org.apache.james.managesieve.util.SettableSession;
import org.apache.james.sieverepository.api.SieveRepository;
@@ -114,9 +113,7 @@ public class ManageSieveMailet extends G
setHelpURL(getInitParameter("helpURL"));
cache = getInitParameter("cache", true);
transcoder = new MessageToCoreToMessage(new ManageSieveProcessor(
- new LineToCoreToLine(
- new LineToCore(
- new CoreProcessor(sieveRepository, usersRepository,
sieveParser)))),
+ new ArgumentParser(new CoreProcessor(sieveRepository,
usersRepository, sieveParser))),
this);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]