File indexing completed on 2024-04-21 05:01:38

0001 /*
0002     These are the private helper classes of the Smb4KGlobal namespace.
0003 
0004     SPDX-FileCopyrightText: 2007-2024 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 // application specific includes
0009 #include "smb4kglobal_p.h"
0010 #include "smb4knotification.h"
0011 #include "smb4ksettings.h"
0012 
0013 // Samba includes
0014 #include <libsmbclient.h>
0015 
0016 // Qt includes
0017 #include <QAbstractSocket>
0018 #include <QCoreApplication>
0019 #include <QDir>
0020 #include <QDirIterator>
0021 #include <QFile>
0022 #include <QHostAddress>
0023 #include <QHostInfo>
0024 
0025 Smb4KGlobalPrivate::Smb4KGlobalPrivate()
0026 {
0027     onlyForeignShares = false;
0028 
0029 #ifdef Q_OS_LINUX
0030     //
0031     // 2023-01-08: Updated to mount.cifs, version 7.0
0032     //
0033     // The options 'credentials', 'domainauto', 'intr', 'nointr'
0034     // and 'snapshot' were not included for various reasons.
0035     //
0036     allowedMountArguments << QStringLiteral("idsfromsid");
0037     allowedMountArguments << QStringLiteral("dynperm");
0038     allowedMountArguments << QStringLiteral("nostrictsync");
0039     allowedMountArguments << QStringLiteral("handlecache");
0040     allowedMountArguments << QStringLiteral("nohandlecache");
0041     allowedMountArguments << QStringLiteral("handletimeout");
0042     allowedMountArguments << QStringLiteral("rwpidforward");
0043     allowedMountArguments << QStringLiteral("mapposix");
0044     allowedMountArguments << QStringLiteral("hard");
0045     allowedMountArguments << QStringLiteral("soft");
0046     allowedMountArguments << QStringLiteral("noacl");
0047     allowedMountArguments << QStringLiteral("cifsacl");
0048     allowedMountArguments << QStringLiteral("backupuid");
0049     allowedMountArguments << QStringLiteral("backupgid");
0050     allowedMountArguments << QStringLiteral("ignorecase");
0051     allowedMountArguments << QStringLiteral("nocase");
0052     allowedMountArguments << QStringLiteral("seal");
0053     allowedMountArguments << QStringLiteral("rdma");
0054     allowedMountArguments << QStringLiteral("resilienthandles");
0055     allowedMountArguments << QStringLiteral("noresilienthandles");
0056     allowedMountArguments << QStringLiteral("persistenthandles");
0057     allowedMountArguments << QStringLiteral("nopersistenthandles");
0058     allowedMountArguments << QStringLiteral("forcemandatorylock");
0059     allowedMountArguments << QStringLiteral("locallease");
0060     allowedMountArguments << QStringLiteral("nolease");
0061     allowedMountArguments << QStringLiteral("sfu");
0062     allowedMountArguments << QStringLiteral("mfsymlinks");
0063     allowedMountArguments << QStringLiteral("echo_interval");
0064     allowedMountArguments << QStringLiteral("posix");
0065     allowedMountArguments << QStringLiteral("unix");
0066     allowedMountArguments << QStringLiteral("linux");
0067     allowedMountArguments << QStringLiteral("noposix");
0068     allowedMountArguments << QStringLiteral("nounix");
0069     allowedMountArguments << QStringLiteral("nolinux");
0070     allowedMountArguments << QStringLiteral("nouser_xattr");
0071     allowedMountArguments << QStringLiteral("nodfs");
0072     allowedMountArguments << QStringLiteral("noautotune");
0073     allowedMountArguments << QStringLiteral("nosharesock");
0074     allowedMountArguments << QStringLiteral("noblocksend");
0075     allowedMountArguments << QStringLiteral("rsize");
0076     allowedMountArguments << QStringLiteral("wsize");
0077     allowedMountArguments << QStringLiteral("bsize");
0078     allowedMountArguments << QStringLiteral("max_credits");
0079     allowedMountArguments << QStringLiteral("fsc");
0080     allowedMountArguments << QStringLiteral("multiuser");
0081     allowedMountArguments << QStringLiteral("actimeo");
0082     allowedMountArguments << QStringLiteral("noposixpaths");
0083     allowedMountArguments << QStringLiteral("posixpaths");
0084 #endif
0085 
0086     //
0087     // Create and init the SMB context and read the NetBIOS and
0088     // workgroup name of this machine.
0089     //
0090     SMBCCTX *smbContext = smbc_new_context();
0091 
0092     if (smbContext) {
0093         smbContext = smbc_init_context(smbContext);
0094 
0095         if (!smbContext) {
0096             smbc_free_context(smbContext, 1);
0097         } else {
0098             machineNetbiosName = QString::fromUtf8(smbc_getNetbiosName(smbContext), -1).toUpper();
0099             machineWorkgroupName = QString::fromUtf8(smbc_getWorkgroup(smbContext), -1).toUpper();
0100         }
0101     }
0102 
0103     //
0104     // Free the SMB context
0105     //
0106     smbc_free_context(smbContext, 1);
0107 
0108     //
0109     // Connections
0110     //
0111     connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), SLOT(slotAboutToQuit()));
0112 }
0113 
0114 Smb4KGlobalPrivate::~Smb4KGlobalPrivate()
0115 {
0116     //
0117     // Clear the workgroup list
0118     //
0119     while (!workgroupsList.isEmpty()) {
0120         workgroupsList.takeFirst().clear();
0121     }
0122 
0123     //
0124     // Clear the host list
0125     //
0126     while (!hostsList.isEmpty()) {
0127         hostsList.takeFirst().clear();
0128     }
0129 
0130     //
0131     // Clear the list of mounted shares
0132     //
0133     while (!mountedSharesList.isEmpty()) {
0134         mountedSharesList.takeFirst().clear();
0135     }
0136 
0137     //
0138     // Clear the list of shares
0139     //
0140     while (!sharesList.isEmpty()) {
0141         sharesList.takeFirst().clear();
0142     }
0143 }
0144 
0145 void Smb4KGlobalPrivate::slotAboutToQuit()
0146 {
0147     Smb4KSettings::self()->save();
0148 }