This is an automated email from the ASF dual-hosted git repository. lgoldstein pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mina-sshd.git
commit 72758b02989ce517ba7685a0cedace3c0aa4292d Author: Lyor Goldstein <lgoldst...@apache.org> AuthorDate: Tue Mar 23 12:12:50 2021 +0200 [SSHD-1132] Added SFTP client-side support for filename-translation-control extension --- CHANGES.md | 1 + .../extensions/BuiltinSftpClientExtensions.java | 3 +- .../FilenameTranslationControlExtension.java | 32 ++++++++++ .../FilenameTranslationControlExtensionImpl.java | 69 ++++++++++++++++++++++ .../org/apache/sshd/sftp/common/SftpConstants.java | 1 + 5 files changed, 105 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 6aef290..f10009f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -49,6 +49,7 @@ * [SSHD-1125](https://issues.apache.org/jira/browse/SSHD-1125) Added mechanism to throttle pending write requests in BufferedIoOutputStream * [SSHD-1127](https://issues.apache.org/jira/browse/SSHD-1127) Added capability to register a custom receiver for SFTP STDERR channel raw or stream data * [SSHD-1132](https://issues.apache.org/jira/browse/SSHD-1132) Added SFTP client-side support for 'filename-charset' extension +* [SSHD-1132](https://issues.apache.org/jira/browse/SSHD-1132) Added SFTP client-side support for 'filename-translation-control' extension * [SSHD-1133](https://issues.apache.org/jira/browse/SSHD-1133) Added capability to specify a custom charset for parsing incoming commands to the `ScpShell` * [SSHD-1133](https://issues.apache.org/jira/browse/SSHD-1133) Added capability to specify a custom charset for returning environment variables related data from the `ScpShell` * [SSHD-1133](https://issues.apache.org/jira/browse/SSHD-1133) Added capability to specify a custom charset for handling the SCP protocol textual commands and responses diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java index 4e15251..b531240 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java @@ -129,7 +129,8 @@ public enum BuiltinSftpClientExtensions implements SftpClientExtensionFactory { SftpClient client, RawSftpClient raw, Map<String, byte[]> extensions, Map<String, ?> parsed) { return new OpenSSHPosixRenameExtensionImpl(client, raw, extensions); } - }; + }, + ; public static final Set<BuiltinSftpClientExtensions> VALUES = Collections.unmodifiableSet(EnumSet.allOf(BuiltinSftpClientExtensions.class)); diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/FilenameTranslationControlExtension.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/FilenameTranslationControlExtension.java new file mode 100644 index 0000000..ab6446a --- /dev/null +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/FilenameTranslationControlExtension.java @@ -0,0 +1,32 @@ +/* + * 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.sshd.sftp.client.extensions; + +import java.io.IOException; + +/** + * Implements "filename-translation-control" extension + * + * @see <A HREF="https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#page-16">DRAFT 13 - page 16</A> + * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> + */ +public interface FilenameTranslationControlExtension extends SftpClientExtension { + void setFilenameTranslationControl(boolean doTranslate) throws IOException; +} diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/FilenameTranslationControlExtensionImpl.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/FilenameTranslationControlExtensionImpl.java new file mode 100644 index 0000000..575d17e --- /dev/null +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/FilenameTranslationControlExtensionImpl.java @@ -0,0 +1,69 @@ +/* + * 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.sshd.sftp.client.extensions.helpers; + +import java.io.IOException; +import java.io.StreamCorruptedException; +import java.util.Collection; +import java.util.Map; + +import org.apache.sshd.common.util.GenericUtils; +import org.apache.sshd.common.util.MapEntryUtils; +import org.apache.sshd.common.util.buffer.Buffer; +import org.apache.sshd.sftp.client.RawSftpClient; +import org.apache.sshd.sftp.client.SftpClient; +import org.apache.sshd.sftp.client.extensions.FilenameTranslationControlExtension; +import org.apache.sshd.sftp.common.SftpConstants; + +/** + * Implements "filename-translation-control" extension command + * + * @see <A HREF="https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#page-16">DRAFT 13 - page 16</A> + * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> + */ +public class FilenameTranslationControlExtensionImpl + extends AbstractSftpClientExtension + implements FilenameTranslationControlExtension { + public FilenameTranslationControlExtensionImpl(SftpClient client, RawSftpClient raw, Collection<String> extras) { + super(SftpConstants.EXT_FILENAME_XLATE_CONTROL, client, raw, + GenericUtils.isNotEmpty(extras) && extras.contains(SftpConstants.EXT_FILENAME_CHARSET)); + } + + public FilenameTranslationControlExtensionImpl(SftpClient client, RawSftpClient raw, Map<String, byte[]> extensions) { + super(SftpConstants.EXT_FILENAME_XLATE_CONTROL, client, raw, + MapEntryUtils.isNotEmpty(extensions) && extensions.containsKey(SftpConstants.EXT_FILENAME_CHARSET)); + } + + @Override + public void setFilenameTranslationControl(boolean doTranslate) throws IOException { + Buffer request = getCommandBuffer(Byte.SIZE); + request.putBoolean(doTranslate); + if (log.isDebugEnabled()) { + log.debug("setFilenameTranslationControl({}) doTranslate={}", getName(), doTranslate); + } + + int id = sendExtendedCommand(request); + Buffer response = receive(id); + response = checkExtendedReplyBuffer(response); + if (response != null) { + throw new StreamCorruptedException("Unexpected extended reply data"); + } + } +} diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpConstants.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpConstants.java index 8f3ed6e..b95a877 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpConstants.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpConstants.java @@ -251,6 +251,7 @@ public final class SftpConstants { public static final String EXT_VERSION_SELECT = "version-select"; public static final String EXT_COPY_FILE = "copy-file"; public static final String EXT_FILENAME_CHARSET = "filename-charset"; + public static final String EXT_FILENAME_XLATE_CONTROL = "filename-translation-control"; public static final String EXT_MD5_HASH = "md5-hash"; public static final String EXT_MD5_HASH_HANDLE = "md5-hash-handle";