@@ -13,6 +13,7 @@ import com.hierynomus.smbj.auth.AuthenticationContext
13
13
import com.hierynomus.smbj.common.SMBRuntimeException
14
14
import com.hierynomus.smbj.session.Session
15
15
import com.hierynomus.smbj.share.Directory
16
+ import com.hierynomus.smbj.share.DiskEntry
16
17
import com.hierynomus.smbj.share.DiskShare
17
18
import com.hierynomus.smbj.share.Share
18
19
import com.rapid7.client.dcerpc.mssrvs.ServerService
@@ -162,21 +163,32 @@ class SMBClientImpl(private val entity: CloudEntity, private val extra: SMBExtra
162
163
}
163
164
}
164
165
165
- private fun openDirectory (src : String ): Directory = withDiskShare { diskShare ->
166
- diskShare.openDirectory (
166
+ private fun openOnRename (src : String ): DiskEntry = withDiskShare { diskShare ->
167
+ diskShare.open (
167
168
src,
168
- setOf (AccessMask .GENERIC_ALL ),
169
- null ,
169
+ setOf (AccessMask .DELETE ),
170
+ setOf (FileAttributes .FILE_ATTRIBUTE_NORMAL ),
171
+ SMB2ShareAccess .ALL ,
172
+ SMB2CreateDisposition .FILE_OPEN_IF ,
173
+ setOf (SMB2CreateOptions .FILE_RANDOM_ACCESS )
174
+ )
175
+ }
176
+
177
+ private fun openFileOnRead (src : String ): com.hierynomus.smbj.share.File = withDiskShare { diskShare ->
178
+ diskShare.openFile(
179
+ src,
180
+ setOf (AccessMask .FILE_READ_DATA , AccessMask .FILE_READ_ATTRIBUTES , AccessMask .FILE_READ_EA ),
181
+ setOf (FileAttributes .FILE_ATTRIBUTE_NORMAL ),
170
182
SMB2ShareAccess .ALL ,
171
- SMB2CreateDisposition .FILE_OPEN ,
172
- null
183
+ SMB2CreateDisposition .FILE_OPEN_IF ,
184
+ setOf ( SMB2CreateOptions . FILE_RANDOM_ACCESS )
173
185
)
174
186
}
175
187
176
- private fun openFile (src : String ): com.hierynomus.smbj.share.File = withDiskShare { diskShare ->
188
+ private fun openFileOnWrite (src : String ): com.hierynomus.smbj.share.File = withDiskShare { diskShare ->
177
189
diskShare.openFile(
178
190
src,
179
- setOf (AccessMask .GENERIC_ALL ),
191
+ setOf (AccessMask .FILE_WRITE_DATA , AccessMask . FILE_WRITE_ATTRIBUTES , AccessMask . FILE_WRITE_EA , AccessMask . DELETE ),
180
192
setOf (FileAttributes .FILE_ATTRIBUTE_NORMAL ),
181
193
SMB2ShareAccess .ALL ,
182
194
SMB2CreateDisposition .FILE_OPEN_IF ,
@@ -187,10 +199,10 @@ class SMBClientImpl(private val entity: CloudEntity, private val extra: SMBExtra
187
199
override fun renameTo (src : String , dst : String ): Unit = withDiskShare { diskShare ->
188
200
log { " renameTo: from $src to $dst " }
189
201
if (diskShare.folderExists(src)) {
190
- val dir = openDirectory (src)
202
+ val dir = openOnRename (src)
191
203
dir.rename(dst.replace(" /" , SymbolUtil .BACKSLASH .toString()), false )
192
204
} else if (diskShare.fileExists(src)) {
193
- val file = openFile (src)
205
+ val file = openOnRename (src)
194
206
file.rename(dst, false )
195
207
}
196
208
}
@@ -199,7 +211,7 @@ class SMBClientImpl(private val entity: CloudEntity, private val extra: SMBExtra
199
211
val name = PathUtil .getFileName(src)
200
212
val dstPath = " $dst /$name "
201
213
log { " upload: $src to $dstPath " }
202
- val dstFile = openFile (dstPath)
214
+ val dstFile = openFileOnWrite (dstPath)
203
215
val dstStream = dstFile.outputStream
204
216
val srcFile = File (src)
205
217
val srcFileSize = srcFile.length()
@@ -218,7 +230,7 @@ class SMBClientImpl(private val entity: CloudEntity, private val extra: SMBExtra
218
230
val dstPath = " $dst /$name "
219
231
log { " download: $src to $dstPath " }
220
232
val dstOutputStream = File (dstPath).outputStream()
221
- val srcFile = openFile (src)
233
+ val srcFile = openFileOnRead (src)
222
234
val countingStream = CountingOutputStreamImpl (dstOutputStream, - 1 ) { written, total -> onDownloading(written, total) }
223
235
srcFile.read(countingStream)
224
236
srcFile.close()
0 commit comments