Parcourir la source

Adds is_guest and server_name to session API. Moves internal fd management functions to their own file

Julien 'Lta' BALLET il y a 11 ans
Parent
commit
e9a8331d20
8 fichiers modifiés avec 238 ajouts et 148 suppressions
  1. 4 2
      Makefile.am
  2. 1 1
      bin/dsm.c
  3. 32 0
      include/bdsm/smb_fd.h
  4. 20 11
      include/bdsm/smb_session.h
  5. 151 0
      src/smb_fd.c
  6. 1 0
      src/smb_file.c
  7. 28 134
      src/smb_session.c
  8. 1 0
      src/smb_share.c

+ 4 - 2
Makefile.am

@@ -17,7 +17,8 @@ bdsm_HEADERS = \
     include/bdsm/netbios_utils.h	\
     include/bdsm/smb_file.h		\
     include/bdsm/smb_ntlm.h		\
-    include/bdsm/smb_session.h		\
+    include/bdsm/smb_session.h    \
+    include/bdsm/smb_fd.h    \
     include/bdsm/smb_trans2.h		\
     include/bdsm/hmac_md5.h		\
     include/bdsm/netbios_ns.h		\
@@ -41,7 +42,8 @@ libdsm_la_SOURCES = \
     src/netbios_session.c	\
     src/smb_utils.c		\
     src/smb_message.c		\
-    src/smb_session.c		\
+    src/smb_session.c   \
+    src/smb_fd.c   \
     src/smb_ntlm.c		\
     src/smb_share.c		\
     src/smb_file.c		\

+ 1 - 1
bin/dsm.c

@@ -142,7 +142,7 @@ int main(int ac, char **av)
     exit(42);
   }
 
-  if (smb_authenticate(session, host, login, password))
+  if (smb_session_login(session, host, login, password))
   {
     if (session->guest)
       printf("Login FAILED but we were logged in as GUEST \n");

+ 32 - 0
include/bdsm/smb_fd.h

@@ -0,0 +1,32 @@
+//---------------------------------------------------------------------------
+//  __________________    _________  _____            _____  .__         ._.
+//  \______   \______ \  /   _____/ /     \          /  _  \ |__| ____   | |
+//   |    |  _/|    |  \ \_____  \ /  \ /  \        /  /_\  \|  _/ __ \  | |
+//   |    |   \|    `   \/        /    Y    \      /    |    |  \  ___/   \|
+//   |______  /_______  /_______  \____|__  / /\   \____|__  |__|\___ |   __
+//          \/        \/        \/        \/  )/           \/        \/   \/
+//
+// This file is part of libdsm. Copyright © 2014 VideoLabs SAS
+//
+// Author: Julien 'Lta' BALLET <contact@lta.io>
+//
+// This program is free software. It comes without any warranty, to the extent
+// permitted by applicable law. You can redistribute it and/or modify it under
+// the terms of the Do What The Fuck You Want To Public License, Version 2, as
+// published by Sam Hocevar. See the COPYING file for more details.
+//----------------------------------------------------------------------------
+
+#ifndef __BDSM_SMB_FD_H_
+#define __BDSM_SMB_FD_H_
+
+#include "bdsm/smb_session.h"
+
+void            smb_session_share_add(smb_session_t *s, smb_share_t *share);
+smb_share_t     *smb_session_share_get(smb_session_t *s, smb_tid tid);
+smb_share_t     *smb_session_share_remove(smb_session_t *s, smb_tid tid);
+
+int             smb_session_file_add(smb_session_t *s, smb_tid tid, smb_file_t *f);
+smb_file_t      *smb_session_file_get(smb_session_t *s, smb_fd fd);
+smb_file_t      *smb_session_file_remove(smb_session_t *s, smb_fd fd);
+
+#endif

+ 20 - 11
include/bdsm/smb_session.h

@@ -169,15 +169,6 @@ void            smb_session_destroy(smb_session_t *s);
 int             smb_session_state(smb_session_t *s);
 
 
-// --------------------------------
-// Move me somewhere else !
-void            smb_session_share_add(smb_session_t *s, smb_share_t *share);
-smb_share_t     *smb_session_share_get(smb_session_t *s, smb_tid tid);
-smb_share_t     *smb_session_share_remove(smb_session_t *s, smb_tid tid);
-
-int             smb_session_file_add(smb_session_t *s, smb_tid tid, smb_file_t *f);
-smb_file_t      *smb_session_file_get(smb_session_t *s, smb_fd fd);
-smb_file_t      *smb_session_file_remove(smb_session_t *s, smb_fd fd);
 
 int             smb_negotiate(smb_session_t *s);
 int             smb_session_send_msg(smb_session_t *s, smb_message_t *msg);
@@ -216,7 +207,25 @@ int             smb_session_connect(smb_session_t *s, const char *name,
  * you are logged in with the user you requested. If guest are activated on
  * the remote host, when login fails, you are logged in as 'Guest'.
  */
-int             smb_authenticate(smb_session_t *s, const char *domain,
-                                 const char *user, const char *password);
+int             smb_session_login(smb_session_t *s, const char *domain,
+                                  const char *user, const char *password);
+
+/**
+ * @brief Am i logged in as Guest ?
+ *
+ * @param s The session object
+ * @return 1  -> Logged in as guest
+ * 0  -> Logged in as regular user
+ * -1 -> Error (not logged in, invalid session, etc.)
+ */
+int             smb_session_is_guest(smb_session_t *s);
+
+/**
+ * @brief Returns the server name with the <XX> type
+ *
+ * @param s The session object
+ * @return The server name or NULL. The memory is owned by the session object.
+ */
+const char      *smb_session_server_name(smb_session_t *s);
 
 #endif

+ 151 - 0
src/smb_fd.c

@@ -0,0 +1,151 @@
+//---------------------------------------------------------------------------
+//  __________________    _________  _____            _____  .__         ._.
+//  \______   \______ \  /   _____/ /     \          /  _  \ |__| ____   | |
+//   |    |  _/|    |  \ \_____  \ /  \ /  \        /  /_\  \|  _/ __ \  | |
+//   |    |   \|    `   \/        /    Y    \      /    |    |  \  ___/   \|
+//   |______  /_______  /_______  \____|__  / /\   \____|__  |__|\___ |   __
+//          \/        \/        \/        \/  )/           \/        \/   \/
+//
+// This file is part of libdsm. Copyright © 2014 VideoLabs SAS
+//
+// Author: Julien 'Lta' BALLET <contact@lta.io>
+//
+// This program is free software. It comes without any warranty, to the extent
+// permitted by applicable law. You can redistribute it and/or modify it under
+// the terms of the Do What The Fuck You Want To Public License, Version 2, as
+// published by Sam Hocevar. See the COPYING file for more details.
+//----------------------------------------------------------------------------
+
+#include <assert.h>
+
+#include "bdsm/smb_fd.h"
+
+void        smb_session_share_add(smb_session_t *s, smb_share_t *share)
+{
+  smb_share_t *iter;
+
+  assert(s != NULL && share != NULL);
+
+  if (s->shares == NULL)
+  {
+    s->shares = share;
+    return;
+  }
+
+  iter = s->shares;
+  while(iter->next != NULL)
+    iter = iter->next;
+  iter->next = share;
+}
+
+smb_share_t *smb_session_share_get(smb_session_t *s, smb_tid tid)
+{
+  smb_share_t *iter;
+
+  assert(s != NULL && tid);
+
+  iter = s->shares;
+  while(iter != NULL && iter->tid != tid)
+    iter = iter->next;
+
+  return (iter);
+}
+
+smb_share_t *smb_session_share_remove(smb_session_t *s, smb_tid tid)
+{
+  smb_share_t *iter, *keep;
+
+  assert(s != NULL && tid);
+  iter = s->shares;
+
+  if (iter == NULL)
+    return (NULL);
+  if (iter->tid == tid)
+  {
+    s->shares = s->shares->next;
+    return (iter);
+  }
+
+  while(iter->next != NULL && iter->next->tid != tid)
+    iter = iter->next;
+
+  if (iter->next != NULL) // We found it
+  {
+    keep = iter->next;
+    iter->next = iter->next->next;
+    return (keep);
+  }
+  return (NULL);
+}
+
+int         smb_session_file_add(smb_session_t *s, smb_tid tid, smb_file_t *f)
+{
+  smb_share_t *share;
+  smb_file_t  *iter;
+
+  assert(s != NULL && tid && f != NULL);
+
+  if ((share = smb_session_share_get(s, tid)) == NULL)
+    return (0);
+
+  if (share->files == NULL)
+    share->files = f;
+  else
+  {
+    iter = share->files;
+    while (iter->next != NULL)
+      iter = iter->next;
+    iter->next = f;
+  }
+
+  return (1);
+}
+
+smb_file_t  *smb_session_file_get(smb_session_t *s, smb_fd fd)
+{
+  smb_share_t *share;
+  smb_file_t  *iter;
+
+  assert(s != NULL && fd);
+
+  if ((share = smb_session_share_get(s, SMB_FD_TID(fd))) == NULL)
+    return (NULL);
+
+  iter = share->files;
+  while(iter != NULL && iter->fid != SMB_FD_FID(fd))
+    iter = iter->next;
+
+  return (iter);
+}
+
+smb_file_t  *smb_session_file_remove(smb_session_t *s, smb_fd fd)
+{
+  smb_share_t *share;
+  smb_file_t  *iter, *keep;
+
+  assert(s != NULL && fd);
+
+  if ((share = smb_session_share_get(s, SMB_FD_TID(fd))) == NULL)
+    return (NULL);
+
+  iter = share->files;
+
+  if (iter == NULL)
+    return (NULL);
+  if (iter->fid == SMB_FD_FID(fd))
+  {
+    share->files = iter->next;
+    return (iter);
+  }
+
+  while(iter->next != NULL && iter->next->fid != SMB_FD_TID(fd))
+    iter = iter->next;
+  if (iter->next != NULL)
+  {
+    keep = iter->next;
+    iter->next = iter->next->next;
+    return (keep);
+  }
+  else
+    return (NULL);
+}

+ 1 - 0
src/smb_file.c

@@ -22,6 +22,7 @@
 #include <string.h>
 #include <stdio.h>
 
+#include "bdsm/smb_fd.h"
 #include "bdsm/smb_utils.h"
 #include "bdsm/smb_file.h"
 

+ 28 - 134
src/smb_session.c

@@ -132,138 +132,6 @@ size_t          smb_session_recv_msg(smb_session_t *s, smb_message_t *msg)
 }
 
 
-void        smb_session_share_add(smb_session_t *s, smb_share_t *share)
-{
-  smb_share_t *iter;
-
-  assert(s != NULL && share != NULL);
-
-  if (s->shares == NULL)
-  {
-    s->shares = share;
-    return;
-  }
-
-  iter = s->shares;
-  while(iter->next != NULL)
-    iter = iter->next;
-  iter->next = share;
-}
-
-smb_share_t *smb_session_share_get(smb_session_t *s, smb_tid tid)
-{
-  smb_share_t *iter;
-
-  assert(s != NULL && tid);
-
-  iter = s->shares;
-  while(iter != NULL && iter->tid != tid)
-    iter = iter->next;
-
-  return (iter);
-}
-
-smb_share_t *smb_session_share_remove(smb_session_t *s, smb_tid tid)
-{
-  smb_share_t *iter, *keep;
-
-  assert(s != NULL && tid);
-  iter = s->shares;
-
-  if (iter == NULL)
-    return (NULL);
-  if (iter->tid == tid)
-  {
-    s->shares = s->shares->next;
-    return (iter);
-  }
-
-  while(iter->next != NULL && iter->next->tid != tid)
-    iter = iter->next;
-
-  if (iter->next != NULL) // We found it
-  {
-    keep = iter->next;
-    iter->next = iter->next->next;
-    return (keep);
-  }
-  return (NULL);
-}
-
-int         smb_session_file_add(smb_session_t *s, smb_tid tid, smb_file_t *f)
-{
-  smb_share_t *share;
-  smb_file_t  *iter;
-
-  assert(s != NULL && tid && f != NULL);
-
-  if ((share = smb_session_share_get(s, tid)) == NULL)
-    return (0);
-
-  if (share->files == NULL)
-    share->files = f;
-  else
-  {
-    iter = share->files;
-    while (iter->next != NULL)
-      iter = iter->next;
-    iter->next = f;
-  }
-
-  return (1);
-}
-
-smb_file_t  *smb_session_file_get(smb_session_t *s, smb_fd fd)
-{
-  smb_share_t *share;
-  smb_file_t  *iter;
-
-  assert(s != NULL && fd);
-
-  if ((share = smb_session_share_get(s, SMB_FD_TID(fd))) == NULL)
-    return (NULL);
-
-  iter = share->files;
-  while(iter != NULL && iter->fid != SMB_FD_FID(fd))
-    iter = iter->next;
-
-  return (iter);
-}
-
-smb_file_t  *smb_session_file_remove(smb_session_t *s, smb_fd fd)
-{
-  smb_share_t *share;
-  smb_file_t  *iter, *keep;
-
-  assert(s != NULL && fd);
-
-  if ((share = smb_session_share_get(s, SMB_FD_TID(fd))) == NULL)
-    return (NULL);
-
-  iter = share->files;
-
-  if (iter == NULL)
-    return (NULL);
-  if (iter->fid == SMB_FD_FID(fd))
-  {
-    share->files = iter->next;
-    return (iter);
-  }
-
-  while(iter->next != NULL && iter->next->fid != SMB_FD_TID(fd))
-    iter = iter->next;
-  if (iter->next != NULL)
-  {
-    keep = iter->next;
-    iter->next = iter->next->next;
-    return (keep);
-  }
-  else
-    return (NULL);
-}
-
-
-
 int             smb_negotiate(smb_session_t *s)
 {
   const char            *dialects[] = SMB_DIALECTS;
@@ -314,8 +182,8 @@ int             smb_negotiate(smb_session_t *s)
     return (0);
 }
 
-int             smb_authenticate(smb_session_t *s, const char *domain,
-                                 const char *user, const char *password)
+int             smb_session_login(smb_session_t *s, const char *domain,
+                                  const char *user, const char *password)
 {
   smb_message_t         answer;
   smb_message_t         *msg = NULL;
@@ -404,3 +272,29 @@ int             smb_authenticate(smb_session_t *s, const char *domain,
 
   return (1);
 }
+
+int             smb_session_is_guest(smb_session_t *s)
+{
+  // Invalid session object
+  if (s == NULL)
+    return (-1);
+
+  // We're not logged in yet.
+  if (smb_session_state(s) != SMB_STATE_SESSION_OK)
+    return (-1);
+
+  // We're logged in as guest
+  if (s->guest)
+    return (1);
+
+  // We're logged in as regular user
+  return (0);
+}
+
+const char      *smb_session_server_name(smb_session_t *s)
+{
+  if (s == NULL)
+    return (NULL);
+  else
+    return (s->srv.name);
+}

+ 1 - 0
src/smb_share.c

@@ -24,6 +24,7 @@
 
 #include "bdsm/debug.h"
 #include "bdsm/smb_utils.h"
+#include "bdsm/smb_fd.h"
 #include "bdsm/smb_share.h"
 #include "bdsm/smb_file.h"