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.h b/smb/kio_smb.h --- a/smb/kio_smb.h +++ b/smb/kio_smb.h @@ -88,7 +88,6 @@ //=========================================================================== - class SMBSlave : public QObject, public KIO::SlaveBase { Q_OBJECT @@ -222,6 +221,10 @@ public: + mutable int smb_force_protocol = 0; + mutable const char* smb_min_proto = NULL; + mutable const char* smb_max_proto = NULL; + //----------------------------------------------------------------------- // smbclient authentication callback (note that this is called by the // global ::auth_smbc_get_data() call. diff --git a/smb/kio_smb_auth.cpp b/smb/kio_smb_auth.cpp --- a/smb/kio_smb_auth.cpp +++ b/smb/kio_smb_auth.cpp @@ -190,6 +190,13 @@ return false; } +#ifdef HAVE_SMBC_SETOPTIONPROTOCOLS + if (smb_force_protocol && (smb_min_proto || smb_max_proto)) { + smbc_setOptionProtocols(smb_context, smb_min_proto, smb_max_proto); + qCDebug(KIO_SMB) << "Executed smbc_setOptionProtocols"; + } +#endif + #ifdef DEPRECATED_SMBC_INTERFACE // defined by libsmbclient.h of Samba 3.2 /* New libsmbclient interface of Samba 3.2 */ 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,17 @@ } } 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. + qCDebug(KIO_SMB) << "Setting client max protocol = NT1 for browsing SMB network"; + smb_force_protocol = 1; + smb_min_proto = "NT1"; + smb_max_proto = "NT1"; +#endif return kurl; //unchanged }