diff options
Diffstat (limited to 'src/corelib/io/qfiledevice_p.h')
-rw-r--r-- | src/corelib/io/qfiledevice_p.h | 111 |
1 files changed, 73 insertions, 38 deletions
diff --git a/src/corelib/io/qfiledevice_p.h b/src/corelib/io/qfiledevice_p.h index aef3fca811..72b43ed5a1 100644 --- a/src/corelib/io/qfiledevice_p.h +++ b/src/corelib/io/qfiledevice_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QFILEDEVICE_P_H #define QFILEDEVICE_P_H @@ -52,8 +16,22 @@ // #include "private/qiodevice_p.h" +#include "qfiledevice.h" #include <memory> +#if defined(Q_OS_UNIX) +# include <sys/types.h> // for mode_t +# include <sys/stat.h> // for mode_t constants +#elif defined(Q_OS_WINDOWS) +# include <qt_windows.h> +# include <winnt.h> // for SECURITY_DESCRIPTOR +# include <optional> +# if defined(QT_BOOTSTRAPPED) +# define QT_FEATURE_fslibs -1 +# else +# define QT_FEATURE_fslibs 1 +# endif // QT_BOOTSTRAPPED +#endif QT_BEGIN_NAMESPACE @@ -98,6 +76,63 @@ inline bool QFileDevicePrivate::ensureFlushed() const return true; } +#ifdef Q_OS_UNIX +namespace QtPrivate { + +constexpr mode_t toMode_t(QFileDevice::Permissions permissions) +{ + mode_t mode = 0; + if (permissions & (QFileDevice::ReadOwner | QFileDevice::ReadUser)) + mode |= S_IRUSR; + if (permissions & (QFileDevice::WriteOwner | QFileDevice::WriteUser)) + mode |= S_IWUSR; + if (permissions & (QFileDevice::ExeOwner | QFileDevice::ExeUser)) + mode |= S_IXUSR; + if (permissions & QFileDevice::ReadGroup) + mode |= S_IRGRP; + if (permissions & QFileDevice::WriteGroup) + mode |= S_IWGRP; + if (permissions & QFileDevice::ExeGroup) + mode |= S_IXGRP; + if (permissions & QFileDevice::ReadOther) + mode |= S_IROTH; + if (permissions & QFileDevice::WriteOther) + mode |= S_IWOTH; + if (permissions & QFileDevice::ExeOther) + mode |= S_IXOTH; + return mode; +} + +} // namespace QtPrivate +#elif defined(Q_OS_WINDOWS) + +class QNativeFilePermissions +{ +public: + QNativeFilePermissions(std::optional<QFileDevice::Permissions> perms, bool isDir); + + SECURITY_ATTRIBUTES *securityAttributes(); + bool isOk() const { return ok; } + +private: + bool ok = false; + bool isNull = true; + + // At most 1 allow + 1 deny ACEs for user and group, 1 allow ACE for others + static constexpr auto MaxNumACEs = 5; + + static constexpr auto MaxACLSize = + sizeof(ACL) + (sizeof(ACCESS_ALLOWED_ACE) + SECURITY_MAX_SID_SIZE) * MaxNumACEs; + + SECURITY_ATTRIBUTES sa; +#if QT_CONFIG(fslibs) + SECURITY_DESCRIPTOR sd; + alignas(DWORD) char aclStorage[MaxACLSize]; +#endif +}; + +#endif // Q_OS_UNIX + QT_END_NAMESPACE #endif // QFILEDEVICE_P_H |