Commit 85f07774 authored by WaeCo's avatar WaeCo Committed by GitHub

fix(rename,unlink): fix STATUS_ACCESS_DENIED by passing shareAccess see #18 (#21)

Related to #18 

This sets correct ShareAccess values for rename and unlink requests.
See https://msdn.microsoft.com/en-us/library/cc246502.aspx ShareAccess.

ShareAcess was always set to 0x00. For rename and delete requests
it is required to include the 0x04 flag.
parent d4c13404
var BigInt = require('../tools/bigint');
var SMB2Request = require('../tools/smb2-forge').request;
var FILE_OPEN = require('../structures/constants').FILE_OPEN;
var constants = require('../structures/constants');
/*
* rename
......@@ -31,7 +31,7 @@ module.exports = function rename(oldPath, newPath, options, cb) {
if (err)
SMB2Request(
'create',
{ path: oldPath, createDisposition: FILE_OPEN },
{ path: oldPath, createDisposition: constants.FILE_OPEN, shareAccess: constants.FILE_SHARE_DELETE },
connection,
function(err, file) {
if (err) cb && cb(err);
......
var SMB2Forge = require('../tools/smb2-forge');
var SMB2Request = SMB2Forge.request;
var BigInt = require('../tools/bigint');
var constants = require('../structures/constants');
/*
* unlink
* ======
......@@ -19,7 +19,7 @@ module.exports = function unlink(path, cb) {
var connection = this;
// SMB2 open file
SMB2Request('create', { path: path }, connection, function(err, file) {
SMB2Request('create', { path: path, shareAccess: constants.FILE_SHARE_DELETE }, connection, function(err, file) {
if (err) cb && cb(err);
// SMB2 query directory
else
......
......@@ -20,6 +20,7 @@ module.exports = message({
generate: function(connection, params) {
var buffer = Buffer.from(params.path, 'ucs2');
var createDisposition = params.createDisposition;
var shareAccess = params.shareAccess;
/* See: https://msdn.microsoft.com/en-us/library/cc246502.aspx
6 values for CreateDisposition. */
......@@ -27,6 +28,12 @@ module.exports = message({
createDisposition = constants.FILE_OVERWRITE_IF;
}
/* See: https://msdn.microsoft.com/en-us/library/cc246502.aspx
7 possible values for ShareAccess. */
if (!(shareAccess >= 0 && shareAccess <= 7)) {
shareAccess = constants.FILE_SHARE_NONE;
}
return new SMB2Message({
headers: {
Command: 'CREATE',
......@@ -38,7 +45,7 @@ module.exports = message({
Buffer: buffer,
DesiredAccess: desiredAccess,
FileAttributes: 0x00000080,
ShareAccess: 0x00000000,
ShareAccess: shareAccess,
CreateDisposition: createDisposition,
CreateOptions: 0x00000044,
NameOffset: 0x0078,
......
......@@ -14,6 +14,11 @@ module.exports = {
MAX_READ_LENGTH: 0x00010000,
MAX_WRITE_LENGTH: 0x00010000 - 0x71,
FILE_SHARE_NONE: 0x00000000,
FILE_SHARE_READ: 0x00000001,
FILE_SHARE_WRITE: 0x00000002,
FILE_SHARE_DELETE: 0x00000004,
/**
* 2.2.13.1.1 SMB2 File_Pipe_Printer_Access_Mask
* https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/77b36d0f-6016-458a-a7a0-0f4a72ae1534
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment