JAMES-2472 remove uses of commons-codec
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/325cb7a7 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/325cb7a7 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/325cb7a7 Branch: refs/heads/master Commit: 325cb7a75572bf12abe813153c5dfcafe197c903 Parents: 1834083 Author: Matthieu Baechler <[email protected]> Authored: Tue Jul 17 17:35:59 2018 +0200 Committer: Matthieu Baechler <[email protected]> Committed: Fri Jul 20 10:03:52 2018 +0200 ---------------------------------------------------------------------- mailbox/api/pom.xml | 4 -- .../transport/mailets/ICalendarParser.java | 14 +----- pom.xml | 6 --- protocols/imap/pom.xml | 4 -- .../imap/processor/AuthenticateProcessor.java | 5 +- protocols/smtp/pom.xml | 48 -------------------- .../smtp/core/esmtp/AuthCmdHandler.java | 21 ++++++--- server/blob/blob-api/pom.xml | 4 -- server/blob/blob-cassandra/pom.xml | 4 -- server/data/data-cassandra/pom.xml | 4 -- server/data/data-hbase/pom.xml | 4 -- server/data/data-jpa/pom.xml | 4 -- server/protocols/jmap/pom.xml | 4 -- .../jmap/crypto/JamesSignatureHandler.java | 6 +-- .../jmap/crypto/JamesSignatureHandlerTest.java | 4 +- server/protocols/protocols-smtp/pom.xml | 5 -- server/queue/queue-jms/pom.xml | 4 -- .../james/queue/jms/JMSSerializationUtils.java | 8 ++-- server/queue/queue-rabbitmq/pom.xml | 5 -- 19 files changed, 27 insertions(+), 131 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/mailbox/api/pom.xml ---------------------------------------------------------------------- diff --git a/mailbox/api/pom.xml b/mailbox/api/pom.xml index d92acaa..8d76a45 100644 --- a/mailbox/api/pom.xml +++ b/mailbox/api/pom.xml @@ -66,10 +66,6 @@ <artifactId>javax.mail</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java ---------------------------------------------------------------------- diff --git a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java index 68da345..5755f55 100644 --- a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java +++ b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java @@ -27,7 +27,6 @@ import java.util.stream.Stream; import javax.mail.MessagingException; -import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang3.tuple.Pair; import org.apache.mailet.Mail; import org.apache.mailet.base.GenericMailet; @@ -37,7 +36,6 @@ import org.slf4j.LoggerFactory; import com.github.steveash.guavate.Guavate; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; - import net.fortuna.ical4j.data.CalendarBuilder; import net.fortuna.ical4j.data.ParserException; import net.fortuna.ical4j.model.Calendar; @@ -137,23 +135,15 @@ public class ICalendarParser extends GenericMailet { return Stream.of(Pair.of(key, builder.build(inputStream))); } catch (IOException e) { if (LOGGER.isErrorEnabled()) { - LOGGER.error("Error while reading input: " + icsContentToString(icsContent), e); + LOGGER.error("Error while reading input: " + new String(icsContent, StandardCharsets.UTF_8), e); } return Stream.of(); } catch (ParserException e) { if (LOGGER.isErrorEnabled()) { - LOGGER.error("Error while parsing ICal object: " + icsContentToString(icsContent), e); + LOGGER.error("Error while parsing ICal object: " + new String(icsContent, StandardCharsets.UTF_8), e); } return Stream.of(); } } - private static String icsContentToString(byte[] icsContent) { - try { - return new String(icsContent, StandardCharsets.UTF_8); - } catch (Exception e) { - LOGGER.error("Error while decoding ics content", e); - } - return new String(Hex.encodeHex(icsContent)); - } } http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 8a0997d..3bc991a 100644 --- a/pom.xml +++ b/pom.xml @@ -606,7 +606,6 @@ <commons-daemon.version>1.0.10</commons-daemon.version> <commons-collections.version>3.2.2</commons-collections.version> <commons-lang.version>2.6</commons-lang.version> - <commons-codec.version>1.7</commons-codec.version> <commons-cli.version>1.4</commons-cli.version> <commons-pool.version>1.6</commons-pool.version> <commons-configuration.version>1.9</commons-configuration.version> @@ -1749,11 +1748,6 @@ <version>${commons-cli.version}</version> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - <version>${commons-codec.version}</version> - </dependency> - <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>${commons-collections.version}</version> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/protocols/imap/pom.xml ---------------------------------------------------------------------- diff --git a/protocols/imap/pom.xml b/protocols/imap/pom.xml index 41bae24..79f2e31 100644 --- a/protocols/imap/pom.xml +++ b/protocols/imap/pom.xml @@ -56,10 +56,6 @@ <artifactId>javax.mail</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java index 0c6a302..3660f68 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java @@ -22,10 +22,10 @@ package org.apache.james.imap.processor; import java.io.Closeable; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Base64; import java.util.List; import java.util.StringTokenizer; -import org.apache.commons.codec.binary.Base64; import org.apache.james.imap.api.ImapCommand; import org.apache.james.imap.api.display.HumanReadableText; import org.apache.james.imap.api.message.response.StatusResponseFactory; @@ -107,8 +107,7 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq private AuthenticationAttempt parseDelegationAttempt(String initialClientResponse) { String token2; try { - - String userpass = new String(Base64.decodeBase64(initialClientResponse)); + String userpass = new String(Base64.getDecoder().decode(initialClientResponse)); StringTokenizer authTokenizer = new StringTokenizer(userpass, "\0"); String token1 = authTokenizer.nextToken(); // Authorization Identity token2 = authTokenizer.nextToken(); // Authentication Identity http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/protocols/smtp/pom.xml ---------------------------------------------------------------------- diff --git a/protocols/smtp/pom.xml b/protocols/smtp/pom.xml index 334dd97..f11b127 100644 --- a/protocols/smtp/pom.xml +++ b/protocols/smtp/pom.xml @@ -65,11 +65,6 @@ <artifactId>javax.mail</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - <optional>true</optional> - </dependency> - <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <scope>test</scope> @@ -107,47 +102,4 @@ </dependency> </dependencies> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-shade-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>shade</goal> - </goals> - <phase>package</phase> - <configuration> - <artifactSet> - <includes> - <include>commons-codec:commons-codec</include> - </includes> - </artifactSet> - <filters> - <filter> - <artifact>commons-codec:commons-codec</artifact> - <excludes> - <exclude>org/apache/commons/codec/*</exclude> - </excludes> - <includes> - <include>org/apache/commons/codec/binary/*</include> - </includes> - </filter> - </filters> - <relocations> - <relocation> - <pattern>org.apache.commons.codec.binary</pattern> - <shadedPattern>${project.groupId}.smtp.util</shadedPattern> - </relocation> - </relocations> - <transformers> - <transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer" /> - </transformers> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> </project> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java ---------------------------------------------------------------------- diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java index e24796e..97f8ced 100644 --- a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java +++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java @@ -23,7 +23,9 @@ package org.apache.james.protocols.smtp.core.esmtp; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Base64; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -31,7 +33,6 @@ import java.util.Locale; import java.util.Optional; import java.util.StringTokenizer; -import org.apache.commons.codec.binary.Base64; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.james.protocols.api.Request; @@ -246,13 +247,11 @@ public class AuthCmdHandler * @param session SMTP session object * @param initialResponse the initial response line passed in with the AUTH command */ - private Response doPlainAuthPass(SMTPSession session, String userpass) { + private Response doPlainAuthPass(SMTPSession session, String line) { String user = null; String pass = null; try { - if (userpass != null) { - userpass = new String(Base64.decodeBase64(userpass)); - } + String userpass = decodeBase64(line); if (userpass != null) { /* See: RFC 2595, Section 6 The mechanism consists of a single message from the client to the @@ -307,6 +306,14 @@ public class AuthCmdHandler return response; } + private String decodeBase64(String line) { + if (line != null) { + String lineWithoutTrailingCrLf = line.replace("\r\n", ""); + return new String(Base64.getDecoder().decode(lineWithoutTrailingCrLf), StandardCharsets.UTF_8); + } + return null; + } + /** * Carries out the Login AUTH SASL exchange. * @@ -316,7 +323,7 @@ public class AuthCmdHandler private Response doLoginAuthPass(SMTPSession session, String user) { if (user != null) { try { - user = new String(Base64.decodeBase64(user)); + user = new String(Base64.getDecoder().decode(user), StandardCharsets.UTF_8); } catch (Exception e) { // Ignored - this parse error will be // addressed in the if clause below @@ -356,7 +363,7 @@ public class AuthCmdHandler private Response doLoginAuthPassCheck(SMTPSession session, String user, String pass) { if (pass != null) { try { - pass = new String(Base64.decodeBase64(pass)); + pass = new String(Base64.getDecoder().decode(pass), StandardCharsets.UTF_8); } catch (Exception e) { // Ignored - this parse error will be // addressed in the if clause below http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/blob/blob-api/pom.xml ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/pom.xml b/server/blob/blob-api/pom.xml index 4afcd92..0289a00 100644 --- a/server/blob/blob-api/pom.xml +++ b/server/blob/blob-api/pom.xml @@ -42,10 +42,6 @@ <artifactId>guava</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>nl.jqno.equalsverifier</groupId> <artifactId>equalsverifier</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/blob/blob-cassandra/pom.xml ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/pom.xml b/server/blob/blob-cassandra/pom.xml index 407064c..f64dfea 100644 --- a/server/blob/blob-cassandra/pom.xml +++ b/server/blob/blob-cassandra/pom.xml @@ -62,10 +62,6 @@ <artifactId>guava</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>nl.jqno.equalsverifier</groupId> <artifactId>equalsverifier</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/data/data-cassandra/pom.xml ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/pom.xml b/server/data/data-cassandra/pom.xml index ef04a08..2b9cafc 100644 --- a/server/data/data-cassandra/pom.xml +++ b/server/data/data-cassandra/pom.xml @@ -90,10 +90,6 @@ <artifactId>guava</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/data/data-hbase/pom.xml ---------------------------------------------------------------------- diff --git a/server/data/data-hbase/pom.xml b/server/data/data-hbase/pom.xml index 46e3ff7..f904d75 100644 --- a/server/data/data-hbase/pom.xml +++ b/server/data/data-hbase/pom.xml @@ -71,10 +71,6 @@ <version>13.0</version><!--$NO-MVN-MAN-VER$--> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/data/data-jpa/pom.xml ---------------------------------------------------------------------- diff --git a/server/data/data-jpa/pom.xml b/server/data/data-jpa/pom.xml index 8a30b41..b0bdcc5 100644 --- a/server/data/data-jpa/pom.xml +++ b/server/data/data-jpa/pom.xml @@ -87,10 +87,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/protocols/jmap/pom.xml ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/pom.xml b/server/protocols/jmap/pom.xml index 5249585..7921b13 100644 --- a/server/protocols/jmap/pom.xml +++ b/server/protocols/jmap/pom.xml @@ -213,10 +213,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java index 5d3dd4f..37d3456 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java @@ -30,11 +30,11 @@ import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException; import java.security.cert.Certificate; +import java.util.Base64; import java.util.Optional; import javax.inject.Inject; -import org.apache.commons.codec.binary.Base64; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.jmap.JMAPConfiguration; import org.slf4j.Logger; @@ -89,7 +89,7 @@ public class JamesSignatureHandler implements SignatureHandler { Signature javaSignature = Signature.getInstance(ALGORITHM); javaSignature.initSign(privateKey); javaSignature.update(source.getBytes()); - return new Base64().encodeAsString(javaSignature.sign()); + return Base64.getEncoder().encodeToString(javaSignature.sign()); } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { throw new RuntimeException(e); } @@ -103,7 +103,7 @@ public class JamesSignatureHandler implements SignatureHandler { Signature javaSignature = Signature.getInstance(ALGORITHM); javaSignature.initVerify(publicKey); javaSignature.update(source.getBytes()); - return javaSignature.verify(new Base64().decode(signature)); + return javaSignature.verify(Base64.getDecoder().decode(signature)); } catch (NoSuchAlgorithmException | InvalidKeyException e) { throw new RuntimeException(e); } catch (SignatureException e) { http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerTest.java index e885f41..9c2723e 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerTest.java @@ -21,7 +21,9 @@ package org.apache.james.jmap.crypto; import static org.assertj.core.api.Assertions.assertThat; +import java.nio.charset.StandardCharsets; import java.security.KeyStoreException; +import java.util.Base64; import org.apache.james.jmap.JMAPConfiguration; import org.junit.Before; @@ -64,7 +66,7 @@ public class JamesSignatureHandlerTest { @Test public void incorrectLengthSignatureShouldReturnFalse() throws Exception { - assertThat(signatureHandler.verify(SOURCE, "signature")).isFalse(); + assertThat(signatureHandler.verify(SOURCE, "c2lnbmF0dXJl")).isFalse(); } @Test(expected = NullPointerException.class) http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/protocols/protocols-smtp/pom.xml ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-smtp/pom.xml b/server/protocols/protocols-smtp/pom.xml index 7e1e70b..5e20bd2 100644 --- a/server/protocols/protocols-smtp/pom.xml +++ b/server/protocols/protocols-smtp/pom.xml @@ -148,11 +148,6 @@ <artifactId>javax.mail</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - <scope>test</scope> - </dependency> - <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/queue/queue-jms/pom.xml ---------------------------------------------------------------------- diff --git a/server/queue/queue-jms/pom.xml b/server/queue/queue-jms/pom.xml index f208939..cff1b06 100644 --- a/server/queue/queue-jms/pom.xml +++ b/server/queue/queue-jms/pom.xml @@ -86,10 +86,6 @@ <artifactId>guava</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSSerializationUtils.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSSerializationUtils.java b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSSerializationUtils.java index 98a0ac7..1e14c3e 100644 --- a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSSerializationUtils.java +++ b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSSerializationUtils.java @@ -19,13 +19,11 @@ package org.apache.james.queue.jms; import java.io.Serializable; +import java.util.Base64; import java.util.Optional; -import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.SerializationUtils; -import com.github.fge.lambdas.Throwing; - /** * This class is similar to {@link SerializationUtils}. Unlike {@link SerializationUtils} this class operates with * {@code String}s and not byte arrays. @@ -45,7 +43,7 @@ public class JMSSerializationUtils { public static String serialize(Serializable obj) { return Optional.ofNullable(obj) .map(SerializationUtils::serialize) - .map(Base64::encodeBase64String) + .map(Base64.getEncoder()::encodeToString) .orElse(null); } @@ -59,7 +57,7 @@ public class JMSSerializationUtils { */ public static <T extends Serializable> T deserialize(String object) { return Optional.ofNullable(object) - .map(Throwing.function(Base64::decodeBase64)) + .map(Base64.getDecoder()::decode) .<T>map(SerializationUtils::deserialize) .orElse(null); } http://git-wip-us.apache.org/repos/asf/james-project/blob/325cb7a7/server/queue/queue-rabbitmq/pom.xml ---------------------------------------------------------------------- diff --git a/server/queue/queue-rabbitmq/pom.xml b/server/queue/queue-rabbitmq/pom.xml index 8fec592..032d40d 100644 --- a/server/queue/queue-rabbitmq/pom.xml +++ b/server/queue/queue-rabbitmq/pom.xml @@ -65,11 +65,6 @@ <artifactId>amqp-client</artifactId> </dependency> <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <scope>test</scope> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
