From 882e5070f1a38e0cedd7b51f010ada5f297a04f6 Mon Sep 17 00:00:00 2001 From: chewitt Date: Fri, 23 Jun 2017 11:16:03 +0100 Subject: [PATCH] kodi: add PR12111 smbclient changes for samba4 --- ...PR12111-smbclient-changes-for-samba4.patch | 231 ++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 packages/mediacenter/kodi/patches/kodi-999.18-PR12111-smbclient-changes-for-samba4.patch diff --git a/packages/mediacenter/kodi/patches/kodi-999.18-PR12111-smbclient-changes-for-samba4.patch b/packages/mediacenter/kodi/patches/kodi-999.18-PR12111-smbclient-changes-for-samba4.patch new file mode 100644 index 0000000000..2126d32073 --- /dev/null +++ b/packages/mediacenter/kodi/patches/kodi-999.18-PR12111-smbclient-changes-for-samba4.patch @@ -0,0 +1,231 @@ +From 84eccc9a16867d1e06ca2b65da1cc41f050ca06b Mon Sep 17 00:00:00 2001 +From: chewitt +Date: Tue, 16 May 2017 12:51:32 +0100 +Subject: [PATCH] smbclient: cleanup smbclient configuration + +--- + .../resource.language.en_gb/resources/strings.po | 38 +++++++++++++++++++- + system/settings/settings.xml | 20 +++++++++-- + xbmc/filesystem/SMBFile.cpp | 40 ++++++++++++++-------- + xbmc/network/NetworkServices.cpp | 3 +- + xbmc/settings/Settings.cpp | 2 ++ + xbmc/settings/Settings.h | 1 + + 6 files changed, 84 insertions(+), 20 deletions(-) + +diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po +index e0060d1fae55..eb47be8cc723 100644 +--- a/addons/resource.language.en_gb/resources/strings.po ++++ b/addons/resource.language.en_gb/resources/strings.po +@@ -19063,7 +19063,43 @@ msgctxt "#36620" + msgid "Enable high quality downscaling of pictures (uses more memory and has moderate performance impact)." + msgstr "" + +-#empty strings from id 36621 to 36899 ++#. Label of a setting, allow the maximum smbclient protocol to be configured ++#: system/settings/settings.xml ++msgctxt "#36621" ++msgid "Maximum protocol version" ++msgstr "" ++ ++#. Description of setting with label #36621 "Maximum protocol version" ++#: system/settings/settings.xml ++msgctxt "#36622" ++msgid "Set the maximum SMB protocol version that can be negotiated (default SMBv3). Reduce to SMBv2 or SMBv1 for compatibility with older NAS and Windows shares if required." ++msgstr "" ++ ++#. Values for setting with label #36621 "Maximum protocol version" ++#: system/settings/settings.xml ++msgctxt "#36623" ++msgid "SMBv1" ++msgstr "" ++ ++#. Values for setting with label #36621 "Maximum protocol version" ++#: system/settings/settings.xml ++msgctxt "#36624" ++msgid "SMBv2" ++msgstr "" ++ ++#. Values for setting with label #36621 "Maximum protocol version" ++#: system/settings/settings.xml ++msgctxt "#36625" ++msgid "SMBv3" ++msgstr "" ++ ++#. Label of a group, that allows configuration of the system SMB client ++#: system/settings/settings.xml ++msgctxt "#36626" ++msgid "Client" ++msgstr "" ++ ++#empty strings from id 36627 to 36899 + + #: xbmc/media/MediaType.cpp + msgctxt "#36900" +diff --git a/system/settings/settings.xml b/system/settings/settings.xml +index 301e7276e5b7..de6f6055afb8 100644 +--- a/system/settings/settings.xml ++++ b/system/settings/settings.xml +@@ -1944,15 +1944,29 @@ + + HAS_FILESYSTEM_SMB + ++ ++ 2 ++ WORKGROUP ++ ++ ++ ++ + + 2 + 0.0.0.0 + + +- ++ + 2 +- WORKGROUP +- ++ 3 ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/xbmc/filesystem/SMBFile.cpp b/xbmc/filesystem/SMBFile.cpp +index e53d5552cf10..a51d1d383cb0 100644 +--- a/xbmc/filesystem/SMBFile.cpp ++++ b/xbmc/filesystem/SMBFile.cpp +@@ -27,6 +27,7 @@ + #include "PasswordManager.h" + #include "SMBDirectory.h" + #include ++#include "filesystem/SpecialProtocol.h" + #include "settings/AdvancedSettings.h" + #include "settings/Settings.h" + #include "threads/SingleLock.h" +@@ -91,34 +92,36 @@ void CSMB::Deinit() + void CSMB::Init() + { + CSingleLock lock(*this); ++ + if (!m_context) + { ++ // force libsmbclient to use our own smb.conf by overriding HOME ++ std::string truehome(getenv("HOME")); ++ setenv("HOME", CSpecialProtocol::TranslatePath("special://home").c_str(), 1); ++ + // Create ~/.smb/smb.conf. This file is used by libsmbclient. + // http://us1.samba.org/samba/docs/man/manpages-3/libsmbclient.7.html + // http://us1.samba.org/samba/docs/man/manpages-3/smb.conf.5.html +- char smb_conf[MAX_PATH]; ++ std::string smb_conf; + std::string home(getenv("HOME")); + URIUtils::RemoveSlashAtEnd(home); +- snprintf(smb_conf, sizeof(smb_conf), "%s/.smb", home.c_str()); +- if (mkdir(smb_conf, 0755) == 0) ++ smb_conf = home + "/.smb"; ++ int result = mkdir(smb_conf.c_str(), 0755); ++ if (result == 0 || (errno == EEXIST && IsFirstInit)) + { +- snprintf(smb_conf, sizeof(smb_conf), "%s/.smb/smb.conf", getenv("HOME")); +- FILE* f = fopen(smb_conf, "w"); ++ smb_conf += "/smb.conf"; ++ FILE* f = fopen(smb_conf.c_str(), "w"); + if (f != NULL) + { + fprintf(f, "[global]\n"); + +- // make sure we're not acting like a server +- fprintf(f, "\tpreferred master = no\n"); +- fprintf(f, "\tlocal master = no\n"); +- fprintf(f, "\tdomain master = no\n"); ++ fprintf(f, "\tlock directory = %s/.smb/\n", home.c_str()); + +- // use the weaker LANMAN password hash in order to be compatible with older servers +- fprintf(f, "\tclient lanman auth = yes\n"); +- fprintf(f, "\tlanman auth = yes\n"); +- +- fprintf(f, "\tsocket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536\n"); +- fprintf(f, "\tlock directory = %s/.smb/\n", getenv("HOME")); ++ // set maximum smbclient protocol version ++ if (CSettings::GetInstance().GetInt(CSettings::SETTING_SMB_MAXPROTOCOL) == 1) ++ fprintf(f, "\tclient max protocol = NT1\n"); ++ else ++ fprintf(f, "\tclient max protocol = SMB%d\n", CSettings::GetInstance().GetInt(CSettings::SETTING_SMB_MAXPROTOCOL)); + + // set wins server if there's one. name resolve order defaults to 'lmhosts host wins bcast'. + // if no WINS server has been specified the wins method will be ignored. +@@ -135,6 +138,9 @@ void CSMB::Init() + if (g_advancedSettings.m_sambadoscodepage.length() > 0) + fprintf(f, "\tdos charset = %s\n", g_advancedSettings.m_sambadoscodepage.c_str()); + ++ // include users configuration if available ++ fprintf(f, "\tinclude = %s/.smb/user.conf\n", home.c_str()); ++ + fclose(f); + } + } +@@ -151,6 +157,10 @@ void CSMB::Init() + + // setup our context + m_context = smbc_new_context(); ++ ++ // restore HOME ++ setenv("HOME", truehome.c_str(), 1); ++ + #ifdef DEPRECATED_SMBC_INTERFACE + smbc_setDebug(m_context, g_advancedSettings.CanLogComponent(LOGSAMBA) ? 10 : 0); + smbc_setFunctionAuthData(m_context, xb_smbc_auth); +diff --git a/xbmc/network/NetworkServices.cpp b/xbmc/network/NetworkServices.cpp +index 6c5842625202..393dabc3067d 100644 +--- a/xbmc/network/NetworkServices.cpp ++++ b/xbmc/network/NetworkServices.cpp +@@ -438,7 +438,8 @@ void CNetworkServices::OnSettingChanged(const CSetting *setting) + else + #endif // HAS_WEB_SERVER + if (settingId == CSettings::SETTING_SMB_WINSSERVER || +- settingId == CSettings::SETTING_SMB_WORKGROUP) ++ settingId == CSettings::SETTING_SMB_WORKGROUP || ++ settingId == CSettings::SETTING_SMB_MAXPROTOCOL) + { + // okey we really don't need to restart, only deinit samba, but that could be damn hard if something is playing + //! @todo - General way of handling setting changes that require restart +diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp +index 9b3372b13b15..f76c152b4d37 100644 +--- a/xbmc/settings/Settings.cpp ++++ b/xbmc/settings/Settings.cpp +@@ -333,6 +333,7 @@ const std::string CSettings::SETTING_SERVICES_AIRPLAYPASSWORD = "services.airpla + const std::string CSettings::SETTING_SERVICES_AIRPLAYVIDEOSUPPORT = "services.airplayvideosupport"; + const std::string CSettings::SETTING_SMB_WINSSERVER = "smb.winsserver"; + const std::string CSettings::SETTING_SMB_WORKGROUP = "smb.workgroup"; ++const std::string CSettings::SETTING_SMB_MAXPROTOCOL = "smb.maxprotocol"; + const std::string CSettings::SETTING_VIDEOSCREEN_MONITOR = "videoscreen.monitor"; + const std::string CSettings::SETTING_VIDEOSCREEN_SCREEN = "videoscreen.screen"; + const std::string CSettings::SETTING_VIDEOSCREEN_RESOLUTION = "videoscreen.resolution"; +@@ -1159,6 +1160,7 @@ void CSettings::InitializeISettingCallbacks() + settingSet.insert(CSettings::SETTING_SERVICES_ESCONTINUOUSDELAY); + settingSet.insert(CSettings::SETTING_SMB_WINSSERVER); + settingSet.insert(CSettings::SETTING_SMB_WORKGROUP); ++ settingSet.insert(CSettings::SETTING_SMB_MAXPROTOCOL); + m_settingsManager->RegisterCallback(&CNetworkServices::GetInstance(), settingSet); + + settingSet.clear(); +diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h +index 2921b7244fe7..ab6770997ce5 100644 +--- a/xbmc/settings/Settings.h ++++ b/xbmc/settings/Settings.h +@@ -290,6 +290,7 @@ class CSettings : public CSettingCreator, public CSettingControlCreator + static const std::string SETTING_SERVICES_AIRPLAYVIDEOSUPPORT; + static const std::string SETTING_SMB_WINSSERVER; + static const std::string SETTING_SMB_WORKGROUP; ++ static const std::string SETTING_SMB_MAXPROTOCOL; + static const std::string SETTING_VIDEOSCREEN_MONITOR; + static const std::string SETTING_VIDEOSCREEN_SCREEN; + static const std::string SETTING_VIDEOSCREEN_RESOLUTION;