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: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org