Blame SOURCES/smbbrowse-Force-NT1-protocol-version-for-workgroup-s.patch

7d234d
diff --git a/configure.ac b/configure.ac
7d234d
index 3b5836ff..daeee728 100644
7d234d
--- a/configure.ac
7d234d
+++ b/configure.ac
7d234d
@@ -546,6 +546,11 @@ if test "x$enable_samba" != "xno"; then
7d234d
   if test "x$msg_samba" = "xyes"; then
7d234d
     PKG_CHECK_MODULES([SAMBA], [smbclient])
7d234d
     AC_DEFINE([HAVE_SAMBA], 1, [Define to 1 if you have the samba libraries])
7d234d
+
7d234d
+    AC_CHECK_LIB(smbclient, smbc_setOptionProtocols,
7d234d
+        AC_DEFINE(HAVE_SMBC_SETOPTIONPROTOCOLS, 1, [Define to 1 if smbc_setOptionProtocols() is available]),
7d234d
+        []
7d234d
+    )
7d234d
   fi
7d234d
 fi
7d234d
 
7d234d
diff --git a/daemon/gvfsbackendsmbbrowse.c b/daemon/gvfsbackendsmbbrowse.c
7d234d
index f08d2988..3b11883e 100644
7d234d
--- a/daemon/gvfsbackendsmbbrowse.c
7d234d
+++ b/daemon/gvfsbackendsmbbrowse.c
7d234d
@@ -45,6 +45,7 @@
7d234d
 #include "gvfskeyring.h"
7d234d
 #include "gmounttracker.h"
7d234d
 #include "gvfsbackendsmbprivate.h"
7d234d
+#include "gvfsutils.h"
7d234d
 
7d234d
 #include <libsmbclient.h>
7d234d
 
7d234d
@@ -847,6 +848,47 @@ do_mount (GVfsBackend *backend,
7d234d
   else
7d234d
     op_backend->server = g_strdup (op_backend->mounted_server);
7d234d
 
7d234d
+#ifdef HAVE_SMBC_SETOPTIONPROTOCOLS
7d234d
+  /* Force NT1 protocol version if server can't be resolved (i.e. is not
7d234d
+   * hostname, nor IP address). This is needed for workgroup support, because
7d234d
+   * "client max protocol" has been changed from NT1 to SMB3 in recent samba
7d234d
+   * versions.
7d234d
+   */
7d234d
+
7d234d
+  if (op_backend->server != NULL)
7d234d
+    {
7d234d
+      GResolver *resolver;
7d234d
+      GList *addresses;
7d234d
+      GError *error = NULL;
7d234d
+      gchar *server;
7d234d
+
7d234d
+      resolver = g_resolver_get_default ();
7d234d
+
7d234d
+      /* IPv6 server includes brackets in GMountSpec, GResolver doesn't */
7d234d
+      if (gvfs_is_ipv6 (op_backend->server))
7d234d
+        server = g_strndup (op_backend->server + 1, strlen (op_backend->server) - 2);
7d234d
+      else
7d234d
+        server = g_strdup (op_backend->server);
7d234d
+
7d234d
+      addresses = g_resolver_lookup_by_name (resolver, server, NULL, &error);
7d234d
+      if (addresses == NULL)
7d234d
+        {
7d234d
+          if (error != NULL)
7d234d
+            {
7d234d
+              g_debug ("%s\n", error->message);
7d234d
+              g_error_free (error);
7d234d
+            }
7d234d
+
7d234d
+          g_debug ("Forcing NT1 protocol version\n");
7d234d
+          smbc_setOptionProtocols (smb_context, "NT1", "NT1");
7d234d
+        }
7d234d
+
7d234d
+      g_resolver_free_addresses (addresses);
7d234d
+      g_object_unref (resolver);
7d234d
+      g_free (server);
7d234d
+    }
7d234d
+#endif
7d234d
+
7d234d
   icon = NULL;
7d234d
   symbolic_icon = NULL;
7d234d
   if (op_backend->server == NULL)
7d234d
diff --git a/meson.build b/meson.build
7d234d
index 34600188..3a876172 100644
7d234d
--- a/meson.build
7d234d
+++ b/meson.build
7d234d
@@ -416,6 +416,8 @@ config_h.set10('HAVE_LIBUSB', enable_libusb)
7d234d
 enable_samba = get_option('smb')
7d234d
 if enable_samba
7d234d
   smbclient_dep = dependency('smbclient')
7d234d
+
7d234d
+  config_h.set('HAVE_SMBC_SETOPTIONPROTOCOLS', cc.has_function('smbc_setOptionProtocols', dependencies: smbclient_dep))
7d234d
 endif
7d234d
 
7d234d
 # *** Check for libarchive ***