mirror of
https://github.com/samba-team/samba.git
synced 2025-03-12 20:58:37 +03:00
r12092: - add dummy functions for the missing SMB2 opcodes
- implement keepalive and logoff metze (This used to be commit 859ab627f45a5acca1deb66b8abdc38eaf49e5a2)
This commit is contained in:
parent
e5adca67f2
commit
2634f22bfc
@ -7,7 +7,8 @@ ADD_OBJ_FILES = \
|
|||||||
negprot.o \
|
negprot.o \
|
||||||
sesssetup.o \
|
sesssetup.o \
|
||||||
tcon.o \
|
tcon.o \
|
||||||
fileio.o
|
fileio.o \
|
||||||
|
keepalive.o
|
||||||
REQUIRED_SUBSYSTEMS = \
|
REQUIRED_SUBSYSTEMS = \
|
||||||
NTVFS LIBPACKET LIBCLI_SMB2
|
NTVFS LIBPACKET LIBCLI_SMB2
|
||||||
# End SUBSYSTEM SMB2_PROTOCOL
|
# End SUBSYSTEM SMB2_PROTOCOL
|
||||||
|
@ -33,6 +33,11 @@ void smb2srv_close_recv(struct smb2srv_request *req)
|
|||||||
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void smb2srv_flush_recv(struct smb2srv_request *req)
|
||||||
|
{
|
||||||
|
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
void smb2srv_read_recv(struct smb2srv_request *req)
|
void smb2srv_read_recv(struct smb2srv_request *req)
|
||||||
{
|
{
|
||||||
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
||||||
@ -43,6 +48,16 @@ void smb2srv_write_recv(struct smb2srv_request *req)
|
|||||||
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void smb2srv_lock_recv(struct smb2srv_request *req)
|
||||||
|
{
|
||||||
|
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
void smb2srv_ioctl_recv(struct smb2srv_request *req)
|
||||||
|
{
|
||||||
|
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
void smb2srv_cancel_recv(struct smb2srv_request *req)
|
void smb2srv_cancel_recv(struct smb2srv_request *req)
|
||||||
{
|
{
|
||||||
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
|
||||||
|
@ -123,8 +123,6 @@ static void smb2srv_negprot_send(struct smb2srv_request *req, struct smb2_negpro
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SIVAL(req->out.hdr, SMB2_HDR_STATUS, NT_STATUS_V(req->status));
|
|
||||||
|
|
||||||
SSVAL(req->out.body, 0x02, io->out._pad);
|
SSVAL(req->out.body, 0x02, io->out._pad);
|
||||||
SIVAL(req->out.body, 0x04, io->out.unknown2);
|
SIVAL(req->out.body, 0x04, io->out.unknown2);
|
||||||
memcpy(req->out.body+0x08, io->out.sessid, 16);
|
memcpy(req->out.body+0x08, io->out.sessid, 16);
|
||||||
|
@ -56,7 +56,7 @@ NTSTATUS smb2srv_setup_reply(struct smb2srv_request *req, uint_t body_fixed_size
|
|||||||
SIVAL(req->out.hdr, 0, SMB2_MAGIC);
|
SIVAL(req->out.hdr, 0, SMB2_MAGIC);
|
||||||
SSVAL(req->out.hdr, SMB2_HDR_LENGTH, SMB2_HDR_BODY);
|
SSVAL(req->out.hdr, SMB2_HDR_LENGTH, SMB2_HDR_BODY);
|
||||||
SSVAL(req->out.hdr, SMB2_HDR_PAD1, 0);
|
SSVAL(req->out.hdr, SMB2_HDR_PAD1, 0);
|
||||||
SIVAL(req->out.hdr, SMB2_HDR_STATUS, 0);
|
SIVAL(req->out.hdr, SMB2_HDR_STATUS, NT_STATUS_V(req->status));
|
||||||
SSVAL(req->out.hdr, SMB2_HDR_OPCODE, SVAL(req->in.hdr, SMB2_HDR_OPCODE));
|
SSVAL(req->out.hdr, SMB2_HDR_OPCODE, SVAL(req->in.hdr, SMB2_HDR_OPCODE));
|
||||||
SSVAL(req->out.hdr, SMB2_HDR_PAD2, 0);
|
SSVAL(req->out.hdr, SMB2_HDR_PAD2, 0);
|
||||||
SIVAL(req->out.hdr, SMB2_HDR_FLAGS, 0x00000001);
|
SIVAL(req->out.hdr, SMB2_HDR_FLAGS, 0x00000001);
|
||||||
@ -133,6 +133,9 @@ static NTSTATUS smb2srv_reply(struct smb2srv_request *req)
|
|||||||
case SMB2_OP_SESSSETUP:
|
case SMB2_OP_SESSSETUP:
|
||||||
smb2srv_sesssetup_recv(req);
|
smb2srv_sesssetup_recv(req);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
case SMB2_OP_LOGOFF:
|
||||||
|
smb2srv_logoff_recv(req);
|
||||||
|
return NT_STATUS_OK;
|
||||||
case SMB2_OP_TCON:
|
case SMB2_OP_TCON:
|
||||||
smb2srv_tcon_recv(req);
|
smb2srv_tcon_recv(req);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
@ -145,15 +148,27 @@ static NTSTATUS smb2srv_reply(struct smb2srv_request *req)
|
|||||||
case SMB2_OP_CLOSE:
|
case SMB2_OP_CLOSE:
|
||||||
smb2srv_close_recv(req);
|
smb2srv_close_recv(req);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
case SMB2_OP_FLUSH:
|
||||||
|
smb2srv_flush_recv(req);
|
||||||
|
return NT_STATUS_OK;
|
||||||
case SMB2_OP_READ:
|
case SMB2_OP_READ:
|
||||||
smb2srv_read_recv(req);
|
smb2srv_read_recv(req);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
case SMB2_OP_WRITE:
|
case SMB2_OP_WRITE:
|
||||||
smb2srv_write_recv(req);
|
smb2srv_write_recv(req);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
case SMB2_OP_LOCK:
|
||||||
|
smb2srv_lock_recv(req);
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
case SMB2_OP_IOCTL:
|
||||||
|
smb2srv_ioctl_recv(req);
|
||||||
|
return NT_STATUS_OK;
|
||||||
case SMB2_OP_CANCEL:
|
case SMB2_OP_CANCEL:
|
||||||
smb2srv_cancel_recv(req);
|
smb2srv_cancel_recv(req);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
case SMB2_OP_KEEPALIVE:
|
||||||
|
smb2srv_keepalive_recv(req);
|
||||||
|
return NT_STATUS_OK;
|
||||||
case SMB2_OP_FIND:
|
case SMB2_OP_FIND:
|
||||||
smb2srv_find_recv(req);
|
smb2srv_find_recv(req);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
@ -27,13 +27,6 @@
|
|||||||
#include "smb_server/smb2/smb2_server.h"
|
#include "smb_server/smb2/smb2_server.h"
|
||||||
#include "smbd/service_stream.h"
|
#include "smbd/service_stream.h"
|
||||||
|
|
||||||
struct smb2srv_session {
|
|
||||||
struct smb2srv_session *prev,*next;
|
|
||||||
uint64_t uid;
|
|
||||||
struct gensec_security *gensec_ctx;
|
|
||||||
struct auth_session_info *session_info;
|
|
||||||
};
|
|
||||||
|
|
||||||
static NTSTATUS smb2srv_sesssetup_backend(struct smb2srv_request *req, struct smb2_session_setup *io)
|
static NTSTATUS smb2srv_sesssetup_backend(struct smb2srv_request *req, struct smb2_session_setup *io)
|
||||||
{
|
{
|
||||||
NTSTATUS status = NT_STATUS_ACCESS_DENIED;
|
NTSTATUS status = NT_STATUS_ACCESS_DENIED;
|
||||||
@ -134,7 +127,6 @@ static void smb2srv_sesssetup_send(struct smb2srv_request *req, struct smb2_sess
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SIVAL(req->out.hdr, SMB2_HDR_STATUS, NT_STATUS_V(req->status));
|
|
||||||
SBVAL(req->out.hdr, SMB2_HDR_UID, io->out.uid);
|
SBVAL(req->out.hdr, SMB2_HDR_UID, io->out.uid);
|
||||||
|
|
||||||
SSVAL(req->out.body, 0x02, io->out._pad);
|
SSVAL(req->out.body, 0x02, io->out._pad);
|
||||||
@ -183,3 +175,52 @@ void smb2srv_sesssetup_recv(struct smb2srv_request *req)
|
|||||||
}
|
}
|
||||||
smb2srv_sesssetup_send(req, io);
|
smb2srv_sesssetup_send(req, io);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS smb2srv_logoff_backend(struct smb2srv_request *req)
|
||||||
|
{
|
||||||
|
/* TODO: call ntvfs backends to close file of this session */
|
||||||
|
talloc_free(req->session);
|
||||||
|
req->session = NULL;
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void smb2srv_logoff_send(struct smb2srv_request *req)
|
||||||
|
{
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
|
if (NT_STATUS_IS_ERR(req->status)) {
|
||||||
|
smb2srv_send_error(req, req->status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = smb2srv_setup_reply(req, 0x04, 0);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
smbsrv_terminate_connection(req->smb_conn, nt_errstr(status));
|
||||||
|
talloc_free(req);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSVAL(req->out.body, 0x02, 0);
|
||||||
|
|
||||||
|
smb2srv_send_reply(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
void smb2srv_logoff_recv(struct smb2srv_request *req)
|
||||||
|
{
|
||||||
|
uint16_t _pad;
|
||||||
|
|
||||||
|
if (req->in.body_size < 0x04) {
|
||||||
|
smb2srv_send_error(req, NT_STATUS_FOOBAR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_pad = SVAL(req->in.body, 0x02);
|
||||||
|
|
||||||
|
req->status = smb2srv_logoff_backend(req);
|
||||||
|
|
||||||
|
if (req->control_flags & SMB2SRV_REQ_CTRL_FLAG_NOT_REPLY) {
|
||||||
|
talloc_free(req);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
smb2srv_logoff_send(req);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user