From 53d241e4e39cae845b31eb2c1a9b3d1c4806fb9b Mon Sep 17 00:00:00 2001 From: Luca Milanesio Date: Mon, 27 Sep 2021 12:33:16 +0100 Subject: [PATCH] Enable renaming with flags (#652) * Enable renaming with flags The SFTP protocol allows to rename files by specifying extra flags: - OVERWRITE - ATOMIC - NATIVE The flags are exposed through a new RenameFlags enum and can be passed as parameters to the rename() method in SFTPClient/SFTPEngine. Relates to #563 * Update RenameFlags.java * Update RenameFlags.java * Align license header with all other files * Make RenameFlags parameter in line with OpenMode(s) Co-authored-by: Jeroen van Erp --- .../net/schmizz/sshj/sftp/RenameFlags.java | 32 +++++++++++++++++++ .../net/schmizz/sshj/sftp/SFTPClient.java | 8 +++-- .../net/schmizz/sshj/sftp/SFTPEngine.java | 10 ++++-- .../schmizz/sshj/sftp/StatefulSFTPClient.java | 4 +-- 4 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/schmizz/sshj/sftp/RenameFlags.java diff --git a/src/main/java/net/schmizz/sshj/sftp/RenameFlags.java b/src/main/java/net/schmizz/sshj/sftp/RenameFlags.java new file mode 100644 index 00000000..3a65bc8a --- /dev/null +++ b/src/main/java/net/schmizz/sshj/sftp/RenameFlags.java @@ -0,0 +1,32 @@ +/* + * Copyright (C)2009 - SSHJ Contributors + * + * Licensed 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 net.schmizz.sshj.sftp; + +public enum RenameFlags { + OVERWRITE(1), + ATOMIC(2), + NATIVE(4); + + private final long flag; + + RenameFlags(long flag) { + this.flag = flag; + } + + public long longValue() { + return flag; + } +} diff --git a/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java b/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java index 5610bbc3..c67009dc 100644 --- a/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java +++ b/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java @@ -115,9 +115,13 @@ public class SFTPClient } } - public void rename(String oldpath, String newpath) + public void rename(String oldpath, String newpath) throws IOException { + rename(oldpath, newpath, EnumSet.noneOf(RenameFlags.class)); + } + + public void rename(String oldpath, String newpath, Set renameFlags) throws IOException { - engine.rename(oldpath, newpath); + engine.rename(oldpath, newpath, renameFlags); } public void rm(String filename) diff --git a/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java b/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java index 9b770dda..17a4ca81 100644 --- a/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java +++ b/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java @@ -230,12 +230,18 @@ public class SFTPEngine return stat(PacketType.LSTAT, path); } - public void rename(String oldPath, String newPath) + public void rename(String oldPath, String newPath, Set flags) throws IOException { if (operativeVersion < 1) throw new SFTPException("RENAME is not supported in SFTPv" + operativeVersion); + + long renameFlagMask = 0L; + for (RenameFlags flag : flags) { + renameFlagMask = renameFlagMask | flag.longValue(); + } + doRequest( - newRequest(PacketType.RENAME).putString(oldPath, sub.getRemoteCharset()).putString(newPath, sub.getRemoteCharset()) + newRequest(PacketType.RENAME).putString(oldPath, sub.getRemoteCharset()).putString(newPath, sub.getRemoteCharset()).putUInt32(renameFlagMask) ).ensureStatusPacketIsOK(); } diff --git a/src/main/java/net/schmizz/sshj/sftp/StatefulSFTPClient.java b/src/main/java/net/schmizz/sshj/sftp/StatefulSFTPClient.java index 322bcf2a..a9475d7e 100644 --- a/src/main/java/net/schmizz/sshj/sftp/StatefulSFTPClient.java +++ b/src/main/java/net/schmizz/sshj/sftp/StatefulSFTPClient.java @@ -117,9 +117,9 @@ public class StatefulSFTPClient } @Override - public void rename(String oldpath, String newpath) + public void rename(String oldpath, String newpath, Set renameFlags) throws IOException { - super.rename(cwdify(oldpath), cwdify(newpath)); + super.rename(cwdify(oldpath), cwdify(newpath), renameFlags); } @Override