diff --git a/cmake/FindSamba.cmake b/cmake/FindSamba.cmake --- a/cmake/FindSamba.cmake +++ b/cmake/FindSamba.cmake @@ -36,6 +36,8 @@ set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${SAMBA_INCLUDE_DIR}) check_symbol_exists(smbc_set_context "libsmbclient.h" SAMBA_HAVE_SMBC_SET_CONTEXT) check_symbol_exists(smbc_option_set "libsmbclient.h" SAMBA_HAVE_SMBC_OPTION_SET) + # exists in Samba >= 4.10 (since commit 0dae4e2f5c65) + check_symbol_exists(smbc_setOptionProtocols "libsmbclient.h" SAMBA_HAVE_SMBC_SETOPTIONPROTOCOLS) cmake_pop_check_state() # fail if smbc_set_context() was required but hasn't been found if (SAMBA_REQUIRE_SMBC_SET_CONTEXT AND NOT SAMBA_HAVE_SMBC_SET_CONTEXT) @@ -45,6 +47,9 @@ if (SAMBA_REQUIRE_SMBC_OPTION_SET AND NOT SAMBA_HAVE_SMBC_OPTION_SET) set(SAMBA_FOUND FALSE) endif (SAMBA_REQUIRE_SMBC_OPTION_SET AND NOT SAMBA_HAVE_SMBC_OPTION_SET) + if (SAMBA_HAVE_SMBC_SETOPTIONPROTOCOLS) + add_definitions(-DHAVE_SMBC_SETOPTIONPROTOCOLS) + endif (SAMBA_HAVE_SMBC_SETOPTIONPROTOCOLS) else(SAMBA_INCLUDE_DIR AND SAMBA_LIBRARIES) set(SAMBA_FOUND FALSE) set(SAMBA_HAVE_SMBC_SET_CONTEXT FALSE) diff --git a/smb/kio_smb_browse.cpp b/smb/kio_smb_browse.cpp --- a/smb/kio_smb_browse.cpp +++ b/smb/kio_smb_browse.cpp @@ -195,6 +195,16 @@ } } if (surl == QLatin1String("smb://")) { +#ifdef HAVE_SMBC_SETOPTIONPROTOCOLS + // Samba 4.8 changed default 'client max protocol' from NT1 to SMB3, + // together with fixes of Badlock, it broke browsing smb:// with + // default settings, because only NT1 (SMB1) protocol can browse network. + // Samba 4.10 made it possible to set min/max protocol version + // via libsmbclient API. + SMBCCTX *smb_context = smbc_set_context(nullptr); + qCDebug(KIO_SMB) << "Setting client max protocol = NT1 for browsing SMB network"; + smbc_setOptionProtocols(smb_context, "NT1", "NT1"); +#endif return kurl; //unchanged }