Browse Source

SMB SESSION LOGOFF

Signed-off-by: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
Modified-by: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
Artem Meleshko 8 years ago
parent
commit
72fa7138a3
5 changed files with 37 additions and 2 deletions
  1. 3 0
      include/bdsm/smb_session.h
  2. 1 0
      src/libdsm.sym
  3. 1 0
      src/smb_defs.h
  4. 2 2
      src/smb_dir.c
  5. 30 0
      src/smb_session.c

+ 3 - 0
include/bdsm/smb_session.h

@@ -105,6 +105,9 @@ int             smb_session_connect(smb_session *s, const char *hostname,
  */
 int             smb_session_login(smb_session *s);
 
+
+int             smb_session_logoff(smb_session *s);
+
 /**
  * @brief Am i logged in as Guest ?
  *

+ 1 - 0
src/libdsm.sym

@@ -24,6 +24,7 @@ smb_session_destroy
 smb_session_get_nt_status
 smb_session_is_guest
 smb_session_login
+smb_session_logoff
 smb_session_new
 smb_session_server_name
 smb_session_set_creds

+ 1 - 0
src/smb_defs.h

@@ -68,6 +68,7 @@
 #define SMB_CMD_TREE_DISCONNECT 0x71
 #define SMB_CMD_NEGOTIATE       0x72
 #define SMB_CMD_SETUP           0x73 // Session Setup AndX
+#define SMB_CMD_LOGOFF          0x74 // Session Logoff AndX
 #define SMB_CMD_TREE_CONNECT    0x75 // Tree Connect AndX
 #define SMB_CMD_ECHO            0x2b
 #define SMB_CMD_READ            0x2e // Read AndX

+ 2 - 2
src/smb_dir.c

@@ -88,7 +88,7 @@ int smb_directory_rm(smb_session *s, smb_tid tid, const char *path)
     if ((resp->wct != 0) || (resp->bct != 0))
         return DSM_ERROR_NETWORK;
 
-    return 0;
+    return DSM_SUCCESS;
 }
 
 int smb_directory_create(smb_session *s, smb_tid tid, const char *path)
@@ -136,5 +136,5 @@ int smb_directory_create(smb_session *s, smb_tid tid, const char *path)
     if ((resp->wct != 0) || (resp->bct != 0))
         return DSM_ERROR_NETWORK;
 
-    return 0;
+    return DSM_SUCCESS;
 }

+ 30 - 0
src/smb_session.c

@@ -308,6 +308,36 @@ int             smb_session_login(smb_session *s)
                                        s->creds.password));
 }
 
+int        smb_session_logoff(smb_session *s)
+{
+    smb_message    *msg = NULL;
+
+    assert(s != NULL);
+
+    msg = smb_message_new(SMB_CMD_LOGOFF);
+    if (!msg)
+        return DSM_ERROR_GENERIC;
+
+    smb_message_put8(msg, 0x02);   // wct=2
+    smb_message_put8(msg, 0xff); //andx: no further commands
+    smb_message_put8(msg, 0); //reserved
+    smb_message_put16(msg, 0);  // andx offset
+    smb_message_put16(msg, 0);  // bct
+
+    if (!smb_session_send_msg(s, msg))
+    {
+        smb_message_destroy(msg);
+        BDSM_dbg("Unable to send Session Logoff AndX message\n");
+        return DSM_ERROR_NETWORK;
+    }
+    smb_message_destroy(msg);
+
+    s->srv.uid  = 0;
+    s->logged = false;
+    s->guest = false;
+
+    return DSM_SUCCESS;
+}
 
 int             smb_session_is_guest(smb_session *s)
 {