diff --git a/src/adldap/CMakeLists.txt b/src/adldap/CMakeLists.txt index 134bf673..46fc0e22 100644 --- a/src/adldap/CMakeLists.txt +++ b/src/adldap/CMakeLists.txt @@ -89,6 +89,7 @@ set(ADLDAP_SAMBA_SOURCES samba/ndr_misc.c samba/libsmb_xattr.c samba/security_descriptor.c + samba/smb_context.cpp ) if (VERSION_SMB_MINOR LESS 20) diff --git a/src/adldap/ad_interface.cpp b/src/adldap/ad_interface.cpp index f8744919..bb109836 100644 --- a/src/adldap/ad_interface.cpp +++ b/src/adldap/ad_interface.cpp @@ -32,6 +32,7 @@ #include "samba/libsmb_xattr.h" #include "samba/ndr_security.h" #include "samba/security_descriptor.h" +#include "samba/smb_context.h" #include "ad_filter.h" @@ -96,7 +97,7 @@ QString AdInterfacePrivate::s_custom_domain = QString(); void *AdInterfacePrivate::s_sasl_nocanon = LDAP_OPT_ON; int AdInterfacePrivate::s_port = 0; CertStrategy AdInterfacePrivate::s_cert_strat = CertStrategy_Never; -SMBCCTX *AdInterfacePrivate::smbc = NULL; +SMBContext AdInterfacePrivate::s_smb_context = SMBContext(); QMutex AdInterfacePrivate::mutex; void get_auth_data_fn(const char *pServer, const char *pShare, char *pWorkgroup, int maxLenWorkgroup, char *pUsername, int maxLenUsername, char *pPassword, int maxLenPassword) { @@ -160,12 +161,8 @@ AdInterface::AdInterface() { return; } - // Initialize SMB context - - // NOTE: initialize only once, because otherwise - // wouldn't be able to have multiple active - // AdInterface's instances at the same time - if (!init_smb_context()) { + if (!d->s_smb_context.is_valid()) { + d->error_message(connect_error_context, tr("Failed to initialize SMB context.")); return; } @@ -1616,23 +1613,6 @@ void AdInterface::ldap_free() { } } -bool AdInterface::init_smb_context() { - const QString connect_error_context = tr("Failed to connect."); - - if (AdInterfacePrivate::smbc == NULL) { - AdInterfacePrivate::smbc = smbc_new_context(); - smbc_setOptionUseKerberos(AdInterfacePrivate::smbc, true); - smbc_setOptionFallbackAfterKerberos(AdInterfacePrivate::smbc, true); - if (!smbc_init_context(AdInterfacePrivate::smbc)) { - d->error_message(connect_error_context, tr("Failed to initialize SMB context.")); - - return false; - } - smbc_set_context(AdInterfacePrivate::smbc); - } - return true; -} - bool AdInterface::gpo_check_perms(const QString &gpo, bool *ok) { // NOTE: skip perms check for non-admins, because don't // have enough rights to get full sd @@ -1662,7 +1642,8 @@ bool AdInterface::gpo_check_perms(const QString &gpo, bool *ok) { const QString gpt_sd = [&]() { const QString filesys_path = gpc_object.get_string(ATTRIBUTE_GPC_FILE_SYS_PATH); const QString smb_path = filesys_path_to_smb_path(filesys_path); - const char *smb_path_cstr = cstr(smb_path); + QByteArray smb_path_array = smb_path.toUtf8(); + const char *smb_path_cstr = smb_path_array; // NOTE: the length of gpt sd string doesn't have a // well defined bound, so we have to use an @@ -1671,7 +1652,7 @@ bool AdInterface::gpo_check_perms(const QString &gpo, bool *ok) { char *buffer = (char *) malloc(buffer_size); while (true) { - const int getxattr_result = smbc_getxattr(smb_path_cstr, "system.nt_sec_desc.*", buffer, buffer_size); + const int getxattr_result = d->s_smb_context.smbcGetxattr(smb_path_cstr, "system.nt_sec_desc.*", buffer, buffer_size); // NOTE: for some reason getxattr() returns positive // non-zero return code on success, even though f-n @@ -2070,8 +2051,11 @@ void AdInterface::update_dc() { // Reinit ldap connection with updated DC ldap_free(); - d->is_connected = ldap_init(); - d->is_connected = init_smb_context(); + if (!d->s_smb_context.is_valid()) { + d->s_smb_context = SMBContext(); + } + + d->is_connected = ldap_init() && d->s_smb_context.is_valid(); } QList get_domain_hosts(const QString &domain, const QString &site) { diff --git a/src/adldap/ad_interface.h b/src/adldap/ad_interface.h index c5bd5cb6..5a5f02c7 100644 --- a/src/adldap/ad_interface.h +++ b/src/adldap/ad_interface.h @@ -189,7 +189,6 @@ private: bool ldap_init(); void ldap_free(); - bool init_smb_context(); }; QList get_domain_hosts(const QString &domain, const QString &site); diff --git a/src/adldap/ad_interface_p.h b/src/adldap/ad_interface_p.h index 66bf10b6..315c934d 100644 --- a/src/adldap/ad_interface_p.h +++ b/src/adldap/ad_interface_p.h @@ -25,11 +25,12 @@ #include #include +#include "samba/smb_context.h" + class AdInterface; class AdConfig; class QString; typedef struct ldap LDAP; -typedef struct _SMBCCTX SMBCCTX; class AdInterfacePrivate { Q_DECLARE_TR_FUNCTIONS(AdInterfacePrivate) @@ -70,7 +71,8 @@ private: static bool s_domain_is_default; static QString s_custom_domain; static CertStrategy s_cert_strat; - static SMBCCTX *smbc; + static SMBContext s_smb_context; + AdInterface *q; };