diff options
author | Martijn Kaijser <martijn@xbmc.org> | 2017-08-04 22:46:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-04 22:46:29 +0200 |
commit | b6bf39c8e622ee6a5f97bcdcfeac37db00c225fc (patch) | |
tree | 77ee67df23da5424efe4c3ad44129d9b56b18f48 | |
parent | e0175e9431df0914e2dbbb8f88c9839adc7e9e7b (diff) | |
parent | 91530b240d4a0df99a1fa5ec82eb01c32d5c3751 (diff) |
Merge pull request #12111 from chewitt/smbclient_krypton
smbclient: cleanup smbclient configuration
-rw-r--r-- | addons/resource.language.en_gb/resources/strings.po | 44 | ||||
-rw-r--r-- | system/settings/linux.xml | 9 | ||||
-rw-r--r-- | system/settings/settings.xml | 22 | ||||
-rw-r--r-- | xbmc/filesystem/SMBFile.cpp | 45 | ||||
-rw-r--r-- | xbmc/network/NetworkServices.cpp | 3 | ||||
-rw-r--r-- | xbmc/settings/Settings.cpp | 2 | ||||
-rw-r--r-- | xbmc/settings/Settings.h | 1 |
7 files changed, 105 insertions, 21 deletions
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index e0060d1fae..9009023f4d 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -19063,7 +19063,49 @@ 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 to negotiate when making connections. Forcing SMBv2 or SMBv1 compatibility may be required with older NAS and Windows shares." +msgstr "" + +#. Values for setting with label #36621 "Maximum protocol version" - none means "no protocol version is forced" +#: system/settings/settings.xml +msgctxt "#36623" +msgid "None" +msgstr "" + +#. Values for setting with label #36621 "Maximum protocol version" +#: system/settings/settings.xml +msgctxt "#36624" +msgid "SMBv1" +msgstr "" + +#. Values for setting with label #36621 "Maximum protocol version" +#: system/settings/settings.xml +msgctxt "#36625" +msgid "SMBv2" +msgstr "" + +#. Values for setting with label #36621 "Maximum protocol version" +#: system/settings/settings.xml +msgctxt "#36626" +msgid "SMBv3" +msgstr "" + +#. Label of a group, that allows configuration of the system SMB client +#: system/settings/settings.xml +msgctxt "#36627" +msgid "Client" +msgstr "" + +#empty strings from id 36628 to 36899 #: xbmc/media/MediaType.cpp msgctxt "#36900" diff --git a/system/settings/linux.xml b/system/settings/linux.xml index dee93a61d8..7cb276acdd 100644 --- a/system/settings/linux.xml +++ b/system/settings/linux.xml @@ -9,4 +9,13 @@ </group> </category> </section> + <section id="services"> + <category id="smb"> + <group id="2"> + <setting id="smb.maxprotocol"> + <visible>true</visible> + </setting> + </group> + </category> + </section> </settings> diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 301e7276e5..5ff71b9741 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -1944,15 +1944,31 @@ <category id="smb" label="1200" help="36346"> <requirement>HAS_FILESYSTEM_SMB</requirement> <group id="1" label="16000"> + <setting id="smb.workgroup" type="string" label="1202" help="36348"> + <level>2</level> + <default>WORKGROUP</default> + <control type="edit" format="string" /> + </setting> + </group> + <group id="2" label="36627"> <setting id="smb.winsserver" type="string" label="1207" help="36347"> <level>2</level> <default>0.0.0.0</default> <control type="edit" format="ip" /> </setting> - <setting id="smb.workgroup" type="string" label="1202" help="36348"> + <setting id="smb.maxprotocol" type="integer" label="36621" help="36622"> <level>2</level> - <default>WORKGROUP</default> - <control type="edit" format="string" /> + <visible>false</visible> + <default>0</default> + <constraints> + <options> + <option label="36623">0</option> + <option label="36624">1</option> + <option label="36625">2</option> + <option label="36626">3</option> + </options> + </constraints> + <control type="list" format="integer" /> </setting> </group> </category> diff --git a/xbmc/filesystem/SMBFile.cpp b/xbmc/filesystem/SMBFile.cpp index e53d5552cf..e5301b0452 100644 --- a/xbmc/filesystem/SMBFile.cpp +++ b/xbmc/filesystem/SMBFile.cpp @@ -27,6 +27,7 @@ #include "PasswordManager.h" #include "SMBDirectory.h" #include <libsmbclient.h> +#include "filesystem/SpecialProtocol.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "threads/SingleLock.h" @@ -91,34 +92,39 @@ void CSMB::Deinit() void CSMB::Init() { CSingleLock lock(*this); + if (!m_context) { - // Create ~/.smb/smb.conf. This file is used by libsmbclient. + // 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 ~/.kodi/.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) > 0) + { + 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 +141,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 +160,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 6c58426252..393dabc306 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 9b3372b13b..f76c152b4d 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 2921b7244f..ab6770997c 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -290,6 +290,7 @@ public: 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; |